PDA

Ver la Versión Completa : StatusBar con Hints en cada Panels


hgiacobone
08-07-2003, 16:51:46
Eso... alguien tiene idea de cómo asignar Hints a cada Panel de la StatusBar (modo Text o OnDraw), tal cual lo hace por ejemplo el IExplorer.

__cadetill
08-07-2003, 16:56:01
bueno, creo que el explorer pone los hints en el panel grande, lo demas que pone, no diria que son hints, sino texto que él pone segun combiene en cada momento con una simple asignacion y luego borrando su contenido

De hecho, en mis aplicaciones suelo poner en reloj, el dia, si es un programa multiusuario, el usuario, si es multiempresa, la empresa,.... vamos, lo que necesite en cada caso

hgiacobone
08-07-2003, 22:26:49
Posteado originalmente por cadetill
bueno, creo que el explorer pone los hints en el panel grande, lo demas que pone, no diria que son hints, sino texto que él pone .... vamos, lo que necesite en cada caso

¿Que cosa?...
Tal vez no me expliqué bien.
El objeto TSatusBar permite tener un unico "item" de tipo Hint, el del propio objeto TStatusBar.

Cuando adicionamos más de un TSatusPanel (independientemente de si está en modo Text o en OnOwnerDraw), estos no disponen de la propiedad Hint individual.

Por allí escuché que puede "dibujarse" un Hint por programación (un ejemplo de Marco Cantu o de Francisco Charte), pero realmente no logro pezcarlo.

Tal vez alguien tiene un poco de código de cómo hacer un hint para cada panel de mi StatusBar.

delphi.com.ar
08-07-2003, 22:34:17
Te recomiendo investigar la clase THintWindow, seguramente encontrarás unos cuantos ejemplos en la Web.

Saludos!

hgiacobone
08-07-2003, 22:39:56
Posteado originalmente por delphi.com.ar
Te recomiendo investigar la clase THintWindow, seguramente encontrarás unos cuantos ejemplos en la Web. Saludos!

Gracias DelphiMan por tu respuesta técnica tan elaborada.
¿Te refieres a ESTE sitio web o cualquier otro?

andres1569
08-07-2003, 22:40:50
Hola:

Tengo aquí el libro de Marco Cantú y lo que explica no es exactamente lo que tu deseas, sino que muestra en un Panel del StatusBar el Hint que está activo en ese momento. Eso se logra interceptando el evento OnHint del objeto Application, si tienes Delphi 5 o superior, puedes usar un componente TApplicationEvents, interceptar dicho evento y escribir algo así:

StatusBar1.Panels[0].Text := Application.Hint;

Es una forma de que el usuario siempre pueda ver la ayuda relacionada con un componente, aunque éste tenga la propiedad ShowHint a FALSE.

Como ves, no es lo mismo que pedías pero te puede resultar útil.

hgiacobone
08-07-2003, 22:53:05
Posteado originalmente por andres1569
Hola:

Tengo aquí el libro de Marco Cantú ...
Es una forma de que el usuario siempre pueda ver la ayuda relacionada con un componente, aunque éste tenga la propiedad ShowHint a FALSE. Como ves, no es lo mismo que pedías pero te puede resultar útil.

Si es cierto, pero de todas formas gracias Andrés por responder.
Ese ejemplo ya lo había visto en el libro, pero yo necesito generar Hint individuales para cada Panel.

Te explico un uso posible de esto:
Uno de esos paneles muestra la fecha en formato dd/mm/aaaa; cuando pozás el puntero sobre esta leyenda debería aparecer el Hint: "Domingo, 12 de Enero de 2003" por poner un ejemplo.

Tambien donde aparece el nombre del usuario (en entorno multiusuario, como explicaba el amigo CADETILL) podría aparecer el Hint: "Usuario Nivel 4" o "Usuario con restricciones" o "Grupo Vendedores" o "Doble clic cierra su sesión de usuario".

Así podríamos seguir toda la noche, ¿no?

delphi.com.ar
08-07-2003, 23:02:21
Solo puse THintWindow en Google.com, y salieron unas cuántas páginas, una de ellas tiene este ejemplo:
var
h : THintWindow;
r : TRect;
begin
with r do
begin
//
// set the position and size
// of the hint window
//
left := 10;
top := 50;
right := 200;
bottom := 100;
end;
h := THintWindow.Create( Self );
with h do
begin
//
// set the background color
//
Color := clRed;

ActivateHint( r, 'hi there!' );

//
// perform your tasks here
// before closing the hint window
//
MessageBox( 0,
'Press any key to close the '
+ 'hint window',
'THintWindow',
MB_OK );

ReleaseHandle;
Free;
end;
end;

andres1569
08-07-2003, 23:31:31
Por cierto, veo que Delphi.Com.Ar crea un THintWindows adrede para poder mostrar el Hint, ¿os sucede lo mismo que a mí (Delphi 4 y 5) que la propiedad Hint y ShowHint del StatusBar no hace ni caso cuando pasas el Mouse por encima del mismo?

Ruben_Cu
08-07-2003, 23:53:00
Hola hgiacobone y demás compañeros voy a proponer una solución a partir de propiedades de los objetos la he probado en delphi 6 no se cual usas tu a partir de lo que comenta andres.
Yo lo he implementado de la manera siguiente:

procedure TForm1.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
with statusbar1 do begin
if x<Panels[0].Width then Hint:=Panels[0].Text;
if (x>Panels[0].Width)and(x<(Panels[0].Width+Panels[1].Width))then Hint:=Panels[1].Text;
if (x>(Panels[0].Width+Panels[1].Width)) then Hint:=Panels[2].Text;
end;
end;

O sea utilizando el evento OnMove del mouse... inconvenientes:
1.- Al moverte de un panel a otro debes abandonar el statusbar y entrar de nuevo
2.- Debes tener tantas sentencias if como paneles declares
Lo veo como una alternativa que puede servirte, el contenido del Hint en este caso es el texto del panel pero puede ser cualquier string incluso el contenido del registro de un campo.
Saludos y ojala aparezca una mejor

delphi.com.ar
10-07-2003, 15:36:36
Posteado originalmente por andres1569
Por cierto, veo que Delphi.Com.Ar crea un THintWindows adrede para poder mostrar el Hint...
En realidad, le envié este código por esto:
Posteado originalmente por hgiacobone
Por allí escuché que puede "dibujarse" un Hint por programación
La verdad que no tengo ese problema, y trabajo normalmete con Delphi 5.

Saludos!

andres1569
10-07-2003, 21:14:23
Hola:

Delphi.Com.Ar, te aseguro que anoche, cuando posteé, lo había probado en Delphi 4 y 5 y no aparecía el Hint por ningún lado, igual era yo que estaba dormido.

Ahora mismito lo acabo de probar y no da problemas, no sé si se me nubló la vista ...

Volviendo al tema, la solución que proponía Rubén Acosta me pareció buena, yo tenía hecho algo parecido, y funciona para lo que pide hgiacobone:
procedure TForm1.StatusBar1MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
w, i : Integer;
begin
w := 0;
for i:=0 to StatusBar1.Panels.Count - 1 do
with StatusBar1.Panels[i] do
begin
if X <= w + Width then
begin
StatusBar1.Hint := Text;
Break;
end;
Inc (w, Width);
end;
end;

Por cierto, todo el codigo que posteé del libro de Marco Cantú para mostrar en el StatusBar los hints de programa, es innecesario, para eso ya existe la propiedad AutoHint en el TStatusBar.