2009-08-10 24 views
6

Deseo un TPageControl y algunas TTabSheets, con sugerencias de información sobre la herramienta por hoja de cálculo visibles mientras deslizo el cursor sobre cada pestaña.Sugerencias de TTabSheet en Delphi

¿Hay alguna forma de obtener este efecto en Delphi 2009?

+2

Firefox también hace esto –

Respuesta

6

Simplemente enganche el evento Mover el mouse del control de página y use la propiedad TabAtPos para determinar en qué pestaña se está moviendo el mouse. A continuación, asigne la sugerencia de esa pestaña a la propiedad de sugerencia del control de página.

procedure TForm.PageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer); 
var 
    tabindex: integer; 
begin 
    tabindex := PageControl.IndexOfTabAt(X, Y); 
    if (tabindex >= 0) and (PageControl.Hint <> PageControl.Pages[tabindex].Hint) then 
    begin 
    Application.CancelHint; 
    PageControl.Hint := PageControl.Pages[tabindex].Hint; 
    PageControl.ShowHint := true; 
    end; 
end; 

CancelHint/ShowHint se encargará de la actualización de la ventana de la pista cuando se mueve directamente de una pestaña a otra.

La versión mejorada pero fea a continuación también cambia temporalmente HintPause a 0 cuando el mouse se mueve directamente de una pestaña a otra para que la sugerencia se vuelva a mostrar inmediatamente. (La parte "fea" de la solución va a llamar los Application.ProcessMessages que las fuerzas insinúan mensajes para ser procesados ​​antes de HintPause se restaura.)

procedure TForm.PagesMouseMove(Sender: TObject; Shift: TShiftState; X, Y: integer); 
var 
    hintPause: integer; 
    tabindex: integer; 
begin 
    tabindex := PageControl.IndexOfTabAt(X, Y); 
    if (tabindex >= 0) and (PageControl.Hint <> PageControl.Pages[tabindex].Hint) then 
    begin 
    hintPause := Application.HintPause; 
    try 
     if PageControl.Hint <> '' then 
     Application.HintPause := 0; 
     Application.CancelHint; 
     PageControl.Hint := PageControl.Pages[tabindex].Hint; 
     PageControl.ShowHint := true; 
     Application.ProcessMessages; // force hint to appear 
    finally Application.HintPause := hintPause; end; 
    end; 
end; 

Para ocultar la pista sobre el cuerpo principal de la página, asignar el siguiente método al evento OnMouseLeave del control de página.

procedure TForm.PageMouseLeave(Sender: TObject); 
begin 
    PageControl.Hint := ''; 
    PageControl.ShowHint := false; 
end; 
+0

TabAtPos no existe, significaba IndexOfTabAt (x, Y). Esto * tan * casi funciona bien. Excepto que a medida que se mueve de una pestaña a otra, la pista no se actualiza ni se vuelve a mostrar. – Roddy

+0

Disculpas; Estaba usando TRzTabSheet (Raize Components) que tiene una propiedad TabAtPos y funciona bien. Simplemente podría mostrar programáticamente la sugerencia sobre un cambio de tabindex utilizando la clase THintWindow. Establezca la propiedad Mostrar sugerencia del control de página en falso y cree la suya propia. – Gerard

1

1 - complete la propiedad .Hint y establezca la propiedad .ShowHint en True para PageControl (suponiendo que cada hoja de tarta tenga ParentShowHint establecido en verdadero, de lo contrario, tendrá que configurar cada página individualmente).

2 - Asignar a este evento controlador de eventos OnChange del PageControl:

procedure TForm1.PageControl1Change(Sender: TObject); 
begin 
    PageControl1.Hint := PageControl1.ActivePage.Hint; 
end; 

Después de hacer eso, la pista será cualquiera que sea la pestaña activa es. No estoy seguro de cómo hacer que cambie la pista en función de dónde se mueve el mouse: es un fenómeno interesante que nunca antes había notado.

+0

Creo que la pregunta era sobre mostrar sugerencias específicas de la página sin cambiar la página activa. – Wolf

5

En Raize Components, esto se puede lograr mediante el establecimiento de la propiedad trzpagecontrol.tabhints a true. Los buenos componentes pueden ahorrarle mucho tiempo (por lo tanto, dinero).

(sólo un cliente satisfecho, por cierto)

+2

+1 - La inversión en componentes Raize bien vale la pena. El soporte es de primera clase, y las opciones de estilo visual realmente pueden diferenciar su aplicación de otras utilizando controles estándar. – skamradt

+0

De acuerdo. Usamos Raize casi exclusivamente para todo el trabajo de diseño de UI.Grandes componentes y buen soporte. – Gerard