PDA

Ver la Versión Completa : Problema con PopupMenu


Sotrono
17-04-2005, 23:09:11
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
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:



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:



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
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.