PDA

Ver la Versión Completa : Menu DropDown en Boton


lafirma
07-08-2004, 01:51:42
Que tal grupo, estoy intentando desplegar un menu cuando hago clic en un boton (algo similar a lo que se consigue con los toolbutton de las toolbar), pero sucede que me aparece totalmente desalineado, quisiera alinear el popup menu para que aparezca justo arriba del boton, para que se vea mas 'pulido', pero el boton esta en un panel, asi que las propiedades Left y Top que uso para llamar al popup menu son relativas al panel y no al formulario por lo que aparece muy distante el menu del boton... como puedo solucionarlo?

jachguate
07-08-2004, 02:27:53
boton.left + boton.parent.left
boton.top + boton.parent.top

¿no te serviria?

Hasta luego.

;)

Lepe
07-08-2004, 10:41:04
var p:Tpoint;
begin
p:= panel1.clienttoscreen(Point(boton.left,boton.top)); // pasamos coordenadas relativas a pantalla.
popupmenu1.popup(p.x,p.y);
end;


saluditos

lafirma
07-08-2004, 17:13:30
Cheke leke, agradezco a ambos, funciona bien, la verdad ya se me habia ocurrido algo como lo de Juan, pero queria corroborar otras posibles soluciones... :D

Lepe
09-08-2004, 18:28:01
nada mejor que un foro para ese propósito no? :):d

DarkByte
10-08-2004, 00:52:41
No vale poniendo el popupMenu en Left el TrackButton y asignando el Poppup al botón ???

roman
10-08-2004, 01:26:51
No vale poniendo el popupMenu en Left el TrackButton y asignando el Poppup al botón ???

Según la ayuda de Delphi la propiedad TrackButton sólo funciona cuando el menú está asociado a un ToolBar Button. Por otro lado, aun suponiendo que funciona el problema es justo que el resultado no se vería muy 'pulido' ya que la posición del menú variaría según el punto específico donde el usuario presione el botón. Con la solución expuesta por Lepe el menú aparece siempre con su esquina superior izquierda alineada con la correspondiente esquina del botón, lo cual me parece era el objetivo original de lafirma.

// Saludos

lafirma
10-08-2004, 18:13:04
En realidad lo que deseaba era que la esquina inferior izquierda del menu apareciera alineada con la esquina superior izquierda del boton, pero no lo he logrado, con las soluciones actuales aparece a veces, y a veces no, depende del numero de items (es que seran muchos botones con sus respectivos menus, es una clase). Supongo que deberia calcular el alto del menu para restarlo a la posicion del boton y que aparezca exactamente alineada, pero la propiedad height no existe en el popup menu.
Lo que busco es exactamente lo que se logra al asignar la propiedad PopupMenu del boton y activar dicho Popup mediante la tecla aplicacion de windows, de esa forma sale correctamente alineado (Solo cuando el boton tiene el enfoque). He estado explorando el codigo de la VCL y he visto que lo del popup menu es un mensaje de Windows, que Delphi captura en la clase TControl (no sé si se genera este mensaje al activar el popup mediante la tecla aplicacion :( ), pero no he encontrado nada de la tecla aplicacion y no he podido ver como lo logra al activar el menu mediante esta tecla.

Lepe
11-08-2004, 11:51:24
Segun mis investigaciones un MenuItem tiene 20 pixeles de alto, y el popup menú es una ventana sin bordes, así que intenta partir de ahí, para contar los items y alinearlo como quieras.

Mis investigaciones han consistido en medir en tiempo de diseño el alto de un TmenuItem con un programa que realicé hace mucho tiempo, unas simples reglas horizontales y verticales en pixeles :D. No es nada científico, pero si un popup tiene 7 elementos, el alto final me daba 141 pixel, y el que tenia el foco, medía exactamente 20, useasé, que no va mal encaminado. Ojo: si utiliza las fuentes grandes pasa a ser 23 o 24 pixeles, esto no lo he corroborado "científicamente" :D por no querer reiniciar, si quieres pidemelo y te lo miro bien.

Comentas que a veces no sale bien.... la verdad, uso el ClientToScreen bastante y cuando no sale correctamente es porque he intercambiado los parámetros X e Y al pasarlo al método ClientToScreen :D .También puede que interfiera algo de lo que haces desde que calculas el punto y hasta que ordenas que salga el popup.

Saludos, espero te sirva de punto de partida.