Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con PopupMenu (https://www.clubdelphi.com/foros/showthread.php?t=20508)

Sotrono 17-04-2005 23:09:11

Problema con PopupMenu
 
Hola, como va?
Tengo un problema con un Popup: con el evento OnMouseUp o Down del form o cualquier otro componente muestro el Popup en las coordenadas X e Y del mouse.
El problema es que el el Popup me sale en cualquier lado: Cuando el Form esta a maximizado me sale un poquito mas arriba del puntero del mouse, pero cuando la ventana es mas chica me sale mucho mas a la izquierda y arriba.
Probe haciendo lo mismo pero en vez de mostrar el PopupMenu muevo un Edit a las coordenadas X e Y y funciona bien, asique el problema esta en el PopupMenu.

dec 17-04-2005 23:25:25

¿Y si lo asignas a la propiedad PopupMenu ?
 
Hola,

Esto es una obviedad, así que no puedo sino pensar que algo se me escapa: me disculpo de antemano contigo, pero, ¿porqué no asignas el PopupMenu a la propiedad correspondiente del formulario y/o componente en cuestión?

En todo caso, y, aunque creo recordar que en algún sitio he visto lo mismo hecho de otro modo (tal vez mejor) puedes probar con esto:

Código Delphi [-]
  
  procedure TForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
  begin
    // if(Button = mbRight) then
    PopupMenu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
  end;

roman 18-04-2005 02:00:06

No es que el menú salga en cualquier lado sino que sale desplazado de la posición donde esperas que aparezca. Prueba haciendo click sucesivamente en distintos puntos y verás que el desplazamiento siempre es el mismo.

Lo que sucede es que los eventos OnMouseDown y OnMouseUp te pasan las coordenadas relativas al control mientras que el método Popup del menú espera coordenadas relativas a la pantalla.

Así, si das el click en las coordenadas (10, 10) del control, el menú aparecerá en las coordenadas (10, 10) pero de la pantalla.

Para remediar esto basta que conviertas las coordenadas.

Por ejemplo, si el control es un ListBox:


Código Delphi [-]
procedure ListBox1MouseUp(...);
var
  Pt: TPoint;

begin
  Pt := Point(X, Y);
  Pt := ListBox1.ClientToScreen(Pt);

  PopupMenu1.PopUp(Pt.X, Pt.Y);
end;

// Saludos

dec 18-04-2005 03:36:22

Así es como roman dice
 
Hola,

Antes me referí a otra forma de conseguir lo mismo acaso más acertada y que no recordaba exactamente. Pues bien, lo que no recordaba era justamente lo que roman ha indicado en el código que ha escrito y se puede ver más arriba.


La franja horaria es GMT +2. Ahora son las 18:26:53.

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