Ir al contenido


Foto

Mostrar un popupmenu encima de un botón


  • Por favor identifícate para responder
15 respuestas en este tema

#1 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2009 - 12:55

hola de nuevo amigos, tengo un problema tratando de mostrar un popupmenu encima de un botón, como lo hace el winamp cuando agregas una canción, tengo lo siguiente:



delphi
  1. procedure TForm1.btAddPClick(Sender: TObject);
  2. var
  3.   p : TPoint;
  4. begin
  5.   with Sender as TSpeedButton do
  6.   begin
  7.       if pmAdd = nil then
  8.         beep
  9.       else
  10.         begin
  11.             GetCursorPos( p );
  12.             p.x := btAddP.Left + 1;
  13.             p.y := btAddP.Top + btAddP.Height + 1;
  14.             p := Self.ClientToScreen( p );
  15.             pmAdd.popup( p.x, p.y );
  16.         end;
  17.   end;
  18. end;



Pero no me furula, ¿alguien me puede ayudar?.

Fleon xD
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 noviembre 2009 - 01:42

Pues a mi si me funciona:


delphi
  1. procedure TForm1.btAddPClick(Sender: TObject);
  2. var
  3.   p : TPoint;
  4. begin
  5.   if Sender is TSpeedButton then
  6.   with Sender as TSpeedButton do
  7.   begin
  8.       if pmAdd = nil then
  9.         beep
  10.       else
  11.         begin
  12.             p.x := btAddP.Left + 1;
  13.             p.y := btAddP.Top + btAddP.Height + 1;
  14.             p := Self.ClientToScreen( p );
  15.             pmAdd.popup( p.x, p.y );
  16.         end;
  17.   end;
  18. end;



Dejo un ejemplo con un botón (btAddP), el popupmenu (pmAdd) y un SpeedButton.

Saludos.

Archivos adjuntos


  • 0

#3 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2009 - 02:21

Hola escafandra pues no, no me funciona, me lo pone en la parte superior izquierda del formulario y no encima del botón, ¿será porque el formulario está transparente?, porque así lo tengo :s.
  • 0

#4 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2009 - 02:34

ahora que veo tu ejemplo, no es lo que busco, pues lo pone debajo de otro botón y no del mismo, os dejo una muestra de como debería ser.

Fleon xD
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 noviembre 2009 - 03:03

ahora que veo tu ejemplo, no es lo que busco, pues lo pone debajo de otro botón y no del mismo


Por tu código entendí que lo querías debajo de otro.  :s

Mira este ejemplo, ¿se ajusta mas a lo que dices?:


delphi
  1. procedure TForm1.btAddPClick(Sender: TObject);
  2. var
  3.   p : TPoint;
  4. begin
  5.   if pmAdd = nil then
  6.       beep
  7.   else
  8.       begin
  9.         p.x := btAddP.Left + 1;
  10.         p.y := btAddP.Top + btAddP.Height + 1;
  11.         p := Self.ClientToScreen( p );
  12.         pmAdd.popup( p.x, p.y );
  13.       end;
  14. end;



Saludos.

Archivos adjuntos


  • 0

#6 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2009 - 04:24

Hola escafandra, ¿seguro que el último ejemplo no es el mismo?, porque me hace el mismo efecto :p
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 01 noviembre 2009 - 05:05

En un principio al pulsar un botón mostraba un menú debajo de oro, siguiendo el ejemplo de tu primer post.

ahora que veo tu ejemplo, no es lo que busco, pues lo pone debajo de otro botón y no del mismo, os dejo una muestra de como debería ser.

Entonces lo cambié para que se mostrara el menú bajo el botón pulsado.

...¿seguro que el último ejemplo no es el mismo?, porque me hace el mismo efecto :p

Bueno el mismo efecto no es, se muestra en el botón que pulsas. Si bien es cierto que mirando bíen lo que subí, era el mismo código (lo corrijo). :$ Pero el post mostraba el correcto.  :D

Ahora pienso que quizás quieres que lo muestre arriba del botón. Te mando un ejemplo de eso también.

Saludos.

Archivos adjuntos


  • 0

#8 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 noviembre 2009 - 05:07

Es el mismo ejemplo. o por lo menos hace lo mismo, ademas si presionas en cualquier lugar del formulario, te sale el popup


  • 0

#9 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 noviembre 2009 - 05:12

Los dos ultimos funcionan segun lo que dices
  • 0

#10 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2009 - 05:26

Hola escafandra, vi los nuevos code y sí funcionan, aparte de que ahora se me ha infectado el Delphi ^o|, pero me sigue sin funcionar, definitivamente creo que el problema viene con que mi form tiene el Brush en Clear, ¿será por eso?, déjame hacer unas pruebas.
  • 0

#11 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 01 noviembre 2009 - 05:44

Efectivamente el problema venía con el ClientToScreen, como el Form tiene su Brush en Clear tomaba como base la pantalla completa y no del form, así que lo que hice fue poner el ClientToScreen del Panel donde está el botón y así lo pone encima, aunque no me la pone pegado, no sé si se debe a que el panel es del mismo alto que el botón :s, ¿será?.

Fleon xD
  • 0

#12 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 noviembre 2009 - 11:49

Si el botón está metido en un TPanel, sus coordenadas Left y Top, son relativas al TPanel, por lo tanto el ajuste a las coordenadas de Pantalla sería Panel1.ClientToScreen



delphi
  1. procedure TForm1.btAddPClick(Sender: TObject);
  2. var
  3.   p : TPoint;
  4. begin
  5.   if pmAdd = nil then
  6.       beep
  7.   else
  8.       begin
  9.         p.x := btAddP.Left + 1;
  10.         p.y:= btAddP.Top - GetSystemMetrics(SM_CYMENUSIZE)*pmAdd.Items.Count-1;
  11.         p := Panel1.ClientToScreen( p );
  12.         pmAdd.popup( p.x, p.y );
  13.       end;
  14. end;



Saludos.

Archivos adjuntos


  • 0

#13 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 02 noviembre 2009 - 01:41

Hola escafandra, efectivamente así lo tengo :(. Aunque no es gran cosa, la distancia es casi casi un CM, diría que 0.8 CM.

Fleon xD
  • 0

#14 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 noviembre 2009 - 02:25

Hola escafandra, efectivamente así lo tengo :(. Aunque no es gran cosa, la distancia es casi casi un CM, diría que 0.8 CM.


¿Bajaste mi ejemplo?. En él no se separa el menú del botón.

Imagen Enviada

Saludos.
  • 0

#15 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 02 noviembre 2009 - 04:33

Si, baje el ejemplo, pero aún así no sale pegado, insisto que debe ser problema de la transparencia del form. Pero de todos modos, la distancia no es notable. ;)

Fleon xD
  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 02 noviembre 2009 - 04:49

Pues mas bien ha de ser algo en tu programa amigo, porque yo lo veo bien tal y como se muestra en la imagen de escafandra.

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.