Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
PopupMenu con SpeedButton

Este es un viejo problema que nunca he podido resolver.

Tengo un SpeedButton y quiero desplegar un PopupMenu al oprimirlo. Con exactitud lo que deseo es lo siguiente:

1. Al oprimir el botón éste debe aparecer sumido y el menú desplegado
2. Al cancelar el menú o seleccionar una opción el botón debe volver a su posicion normal
3. Si el menú está desplegado y se hace click sobre el botón entonces el menú debe cerrarse y el botón regresar a su posición normal.

Los resultados que obtengo son:

1. Si uso el evento OnClick del botón para desplegar el menú, el botón se sume pero recupera inmediatamente su posición normal mientras el menú está desplegado.

2. Si uso el evento OnMouseDown el botón no se sume y cuando cierro el menú el botón se queda sumido.

3. Si uso el evento OnMouseUp el botón se sume mienras se despliega el menú y recupera su posición al cerrarse el menú pero si el menú está desplegado y hago click en el botón entonces el menú se cierra pero se abre inmediatamente de nuevo.

En otras palabras, quiero que el comportamiento sea como el de un ToolButton en una ToolBar pero no me apetece usar una ToolBar.

// Gracias
Responder Con Cita
  #2  
Antiguo 18-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
Cita:
Empezado por roman
En otras palabras, quiero que el comportamiento sea como el de un ToolButton en una ToolBar pero no me apetece usar una ToolBar.
Pero mira que haces cosas raritas, eh!!!

A ver, lo máximo que he conseguido es esto, a lo mejor te ayuda

Código:
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  if SpeedButton1.GroupIndex = 0 then
    SpeedButton1.GroupIndex := 1
  else
  begin
    PopupMenu1.Popup(Self.Left + SpeedButton1.Left,
                   Self.Top + SpeedButton1.Top + (SpeedButton1.Height*2));
    SpeedButton1.GroupIndex := 0;
  end;
end;
Problema: que si haces los clics rápidos, no funciona, han de ser a camara lenta
Responder Con Cita
  #3  
Antiguo 18-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por cadetill
Pero mira que haces cosas raritas, eh!!!
¿Por qué raritas? ¡Sólo quiero que un speedbutton se comporte como cualquier botón decente que despliega un menú!

Cita:
Empezado por cadetill
A ver, lo máximo que he conseguido es esto, a lo mejor te ayuda
Gracias, pero el comportamiento resulta errático: lo hace a veces y a veces no, o mejor dicho, lo hace una vez y depués no.

Bueno, seguiré intentando.

Te mando un saludo
Responder Con Cita
  #4  
Antiguo 18-03-2004
Amilius Amilius is offline
No confirmado
 
Registrado: ene 2004
Posts: 138
Poder: 0
Amilius Va por buen camino
Cita:
Empezado por roman
En otras palabras, quiero que el comportamiento sea como el de un ToolButton en una ToolBar pero no me apetece usar una ToolBar.
Que tal si usas on mouse up, controlas el estado en "tag" que tienen todos los componentes, el problema es que tendrías que colocar el tag en estado normal al cerrar el menú, el tag del menu sería una referencia al botón y controlar si no es nil y es un referencia a un objeto de la clase boton.
Responder Con Cita
  #5  
Antiguo 18-03-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Gracias Amilius

Verás, intenté algo similar usado una variable booleana:

Código:
if not MenuAbierto then
begin
  MenuAbierto := true;
  PopupMenu.Popup(...);
  MenuAbierto := false;
end;
pero el problema es que para cuando vuelvo a hacer click en el botón, el Popup ya terminó y por tanto MenuAbierto vuelve a false.

// Saludos
Responder Con Cita
  #6  
Antiguo 13-12-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
Ya sé que es un hilo un poco antiguo, pero me he topado con él buscando sobre algo parecido a lo que plantea Roman... y yo lo tengo resuelto (creo).

Si tenemos un formulario (wPrincipal), un SpeedButton (btPruebas) y un PopupMenu (pmPruebas) al que le he añadido un par de Items..
Código Delphi [-]
//OnClick del botón
procedure TwPrincipal.btPruebaClick(Sender: TObject); 
var
  Punto:TPoint;
begin
  if btPrueba.Down then
    begin
      GetCursorPos(Punto);
      pmPrueba.Popup(Punto.X,Punto.Y);
      btPrueba.Down := False;
    end;
end;

//Se lo asigno al OnClick de ambos Items:
procedure TwPrincipal.ItemA1Click(Sender: TObject); 
begin
  //Sólo para que hagan algo
  ShowMessage('Item: ' + TComponent(Sender).Name);
  //Aquí puede ponerse btPrueba.Down := False; para que no se levante ...
end;

Creo que esto es lo que se busca...

Yo, partiendo de aquí, tengo otro problemilla... pero primero intentaré buscar (¡lo que se aprende buscando!) y si no consigo nada ya postearé un hilo para buscar ayuda
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
  #7  
Antiguo 13-12-2005
Avatar de Ohcan
[Ohcan] Ohcan is offline
Miembro Premium
 
Registrado: ago 2004
Ubicación: Madrid (España)
Posts: 119
Poder: 20
Ohcan Va por buen camino
Wink

Bueno, pues ya está :
Código Delphi [-]
//OnClick del botón
procedure TwPrincipal.btPruebaClick(Sender: TObject); 
var
  Punto:TPoint;
begin
  if btPrueba.Down then
    begin
      GetCursorPos(Punto);
      pmPrueba.Popup(Punto.X,Punto.Y);
      Application.ProcessMessages; //Esto me faltaba
      btPrueba.Down := False; //Por si no selecciono nada del menu
    end;
end;

//Se lo asigno al OnClick de ambos Items:
procedure TwPrincipal.ItemA1Click(Sender: TObject); 
begin
  //Sólo para que hagan algo
  ShowMessage('Item: ' + TComponent(Sender).Name);
  //Aquí puede ponerse btPrueba.Down := False; 
  //para que no se levante ... o no hacerlo y así quedrá pulsado
  //mientras vemos el mensaje y se levantará al aceptarlo
end;
¿Porqué todo esto?
Tenía, como Román, un SpeedButton que me despliega un Popup y lo que quería: si no se seleccionaba nada en el menú, levantar el botón. Y si se seleccionaba algo que saliera un formulario pero que se viera que el botón seguía abajo...
Al principio, sin el ProcessMessages, puse un btPrueba.Down := False antes del ShowMessage del click del menu, pero eso causaba que se viera al botón levantarse y volverse a presionar... y no me gustaba.

Pues esa es la historia... espero que no haya aburrido a nadie

Saludos,
__________________
La violencia es el último recurso del incompetente. (Salvor Hardin)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 04:04:28.


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
Copyright 1996-2007 Club Delphi