Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Posicionar ventana emergente segun posicion de otro control (https://www.clubdelphi.com/foros/showthread.php?t=94845)

Caminante 20-08-2020 17:16:55

Posicionar ventana emergente segun posicion de otro control
 
Hola a todos, aqui de nuevo con una duda existencial :D. Espero hacerme entender.
Tengo una opcion para realizar busquedas en mi sistema, consiste en escribir en un edit y al hacer enter se muestra una ventana con los resultados de la busqueda. Ya esa parte esta implementada y se muestra asi:

Código Delphi [-]
TFrmBusqueda.Buscar(@VerResultados);

"@VerResultados" es un metodo que uso como callback para devolver los resultados de la busqueda ya que la ventana se muestra como no modal. Hasta ahi todo bien. Ahora mi duda.
En las pruebas todo ok ya lo tenia programado para que la ventana se muestre debajo del edit y si el edit esta en el lado de arriba a la izquierda. Mi duda viene porque en el sistema van a haber mas edits de busqueda como este y pueden estar en diferente posicion (A la derecha o en la parte inferior) y quiero que mi ventana se ubique de acuerdo a la posicion del edit. (Si esta abajo la ventana debe mostrarse arriba del edit, si esta a la derecha debe colocarse de manera que se pueda visualizar bien). Estaba pensando jugar con la propiedad boundsrect del edit, pero ahi empieza mi duda. Al ser una opcion que habra en varias ventanas y en algunas ventanas habra mas de un edit de busqueda seria escribir demasiado codigo. Asi que seria preferible que la ventana de busqueda base sea la que defina su posicion, entonces pense en enviarle el control edit en el parametro. Mi procedimiento para mostrar la ventana debajo del edit queda asi:

Código Delphi [-]
class procedure TFrmBusqueda.Buscar(AControl: Twincontrol; AResults: TGetResults );
var
  Frm:TFrmBusqueda;
  P:TPoint;
begin
  Frm:=TFrmBusqueda.Create(nil);
  frm.FProcRes:=AResults;
  P:=AControl.parent.ClientToScreen(point(AControl.Left,AControl.BoundsRect.Bottom));
  frm.Left:=p.X;
  frm.Top:=p.Y;
  frm.Show;
end;

Pero de ahi viendo como ver los demas casos estoy que le doy muchas vueltas en mi cabeza. No se si voy en buen camino o hay alguna sugerencia que puedan darme.
Uso Lazarus 2.0.1 con sus controles standar.

Gracias por su atencion

Casimiro Noteví 21-08-2020 12:25:08

Creo que está bien pasarle la posición del edit para que la ventana resultante de la búsqueda sepa dónde ubicarse.

Caminante 21-08-2020 22:40:46

Gracias Casimiro por tu observacion, entonces creo que voy en buen camino. Estuve probando algunas cosas y ya logre mostrar la ventana arriba si el edit esta en la parte inferior del form. Me quedo asi:

Código Delphi [-]
class procedure TFrmBusqueda.Buscar(AControl: Twincontrol; AResults: TGetResults
  );
var
  Frm:TFrmBusqueda;
  P:TPoint;
  T:TPoint;
begin
  Frm:=TFrmBusqueda.Create(nil);
  frm.FProcRes:=AResults;
  P:=AControl.parent.ClientToScreen(point(AControl.Left,AControl.BoundsRect.Bottom));
  T:=AControl.parent.ClientToScreen(point(AControl.Left,AControl.top));
  if (p.Y + frm.Height)>Screen.DesktopHeight then
    P.Y:=t.Y - frm.Height;
  frm.Left:=p.X;
  frm.Top:=p.Y;
  frm.Show;
end;

Ahora me falta el caso de verificar si el edit esta en el extremo derecho. Si consigo hacerlo lo pondre tambien aqui por si es de utilidad a alguien.

Saludos


La franja horaria es GMT +2. Ahora son las 03:59:03.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi