PDA

Ver la Versión Completa : Mostrar Form pero Desactivado


donsenior
14-04-2008, 17:20:35
Hola! mi primer post... :p
Me preguntaba si alguien sabe como hacer un Form.Show pero que no se active.
Tengo dos TForm, sean Form1 y Form2, mi idea es hacer una especie de Hint customizado (para ponerle Imagenes, Labels con colores, etc) , entonces en el OnMouseMove del Form1 hago Form2.Show pero esto, si bien me muestra el Form2, tambien lo activa desactivando el Form1, lo que da un efecto que no me gusta :mad: (en realidad tampoco es para tanto, pero si se puede solucionar...).
Intenté usar Windows.ShowWindow(Form2.Handle, SW_SHOWNOACTIVATE) y casi funciona, pero me muestra el Form sin su contenido...

En fin, si alguien se le ocurre algo, bienvenido!

Gracias!

Caral
14-04-2008, 18:13:15
Hola
Bienvenido al club.
La verdad no termino de entender el concepto de lo que quieres hacer.
Tal vez usando un panel en vez del form2 o usar un frame.
La verdad si te explicas con mas detalle tal vez entendamos mejor el concepto.
Saludos

Lepe
14-04-2008, 18:16:18
Haya varias formas:
- Heredar de la clase ThintWindow que es la clase original de delphi para mostrar los hints. De esta forma sólo tienes que hacer la ventana de hint y Delphi se encargará de activarla cuando haga falta mostrar el hint sobre un control.

- Tal y como lo tienes pero en el evento OnMouseWheel añades:

Form2.Show;
Form1.SetFocus;


Se notará un pequeño flash en la barra de título del Form2. Lo más sano es quitarle la barra de titulo al Form2 :D.

Saludos

donsenior
14-04-2008, 18:45:11
La idea es que el "Hint" siga el cursor del Mouse, por eso uso el OnMouseMove para ir actualizando la posicion del "Hint". Usando SetFocus se produce flickering (Nota: el Form2.BorderStyle = bsNone).
Por otro lado la clase Hint de delphi tiene el metodo ActivateHintAt(...), pero yo lo que necesitaria es el metodo, por ejemplo, MoveHintAt(...) ya que el metodo anterior "cierra" cualquier Hint previamente activado, lo cual tambien produce una especie de flicker al llamarlo, porque se cierra y se vuelve a abrir en la nueva posicion, cuando lo que yo necesitaría es moverlo a la nueva posicion sin cerrarlo...
Ademas usando un TForm como hint, le puedo agregar imagenes, paneles con bevels, etc, cosa que heredando un hint debería ser un experto en componentes para lograrlo, cosa que no soy :p

En resumen, SetFocus lamentablemente no me sirve...

Gracias por la respuesta!
Saludos

donsenior
14-04-2008, 19:01:44
A ver si me puedo explicar un poco mejor... Tengo un TChart, al pasar el cursor por arriba de una serie pretendo mostrar una ventana con datos (Label de la serie, valor, alguna imagen, configurarle transparencia, etc). Esta ventana quiero que siga la posicion del mouse a medida que lo muevo, entonces hago lo siguiente en el OnMouseMove del chart:


GetCursorPos(P);
SPIndex:= PieChartSeries.GetCursorValueIndex;

if (SPIndex > -1) then
begin
if (SPIndex <> PieChartSeries.Tag) then
//Si cambio de serie actualizo los datos del "Hint"
begin
PieChartSeries.Tag:= SPIndex;
SPName:= PieChartSeries.XLabel[SPIndex];
HintForm.Hide;
HintForm.SetHeader(SPName);
//SetHeader es un metodo propio que setea un Label
end;
end;
HintForm.Left:= P.X;
HintForm.Top:= P.Y;
HintForm.Show
end
else
HintForm.Hide

Esto funciona bastante bien, el problema es que HintForm.Show desactiva el Form principal y HintForm.Hide, lo vuelve activar, lo cual produce un efecto que no me gusta (sobre todo si es un grafico de Barras ya que SPIndex:= BarChartSeries.GetCursorValueIndex casi siempre da < 0)

Eso es todo, espero que se entienda :)

donsenior
14-04-2008, 19:30:52
Bueno finalmente lo logré, aunque no se si está muy bien ya que no tengo mucha ciencia al respecto sino más bien es algo empírico...
Lo que hice fue lo siguiente:

public
{ Public declarations }
procedure ShowNoActivate;
procedure HideNoActivate;
end;

procedure THintForm.ShowNoActivate;
begin
Windows.ShowWindow(Handle, SW_SHOWNOACTIVATE);
Windows.ShowWindow(Panel1.Handle, SW_SHOWNOACTIVATE);
Windows.ShowWindow(Panel2.Handle, SW_SHOWNOACTIVATE);
Windows.ShowWindow(Panel3.Handle, SW_SHOWNOACTIVATE);
//Hay que hacer un ShowWindow por cada panel que contenga el Form
end;

procedure THintForm.HideNoActivate;
begin
Windows.ShowWindow(Handle, SW_HIDE);
end;



Como decía, no se si estará muy bien, pero funciona :p

Si alguien sabe de alguna forma mejor, o piensa que esta forma tiene algún defecto por algun motivo, me gustaría saberlo...

Saludos!