2008-10-24 21 views

Respuesta

6

Sure. Pon una barra de herramientas en la página. Haga clic derecho en la barra de herramientas, agregue un botón. Establezca el estilo del botón en tbsDropDown. Pon un PopupMenu en la página. Haga doble clic en PopupMenu para definir los elementos del menú. Luego, regrese al botón que creó y establezca su propiedad DropdownMenu para señalar el PopupMenu que acaba de crear.

1

Si no desea utilizar una barra de herramientas, las bibliotecas de raize (www.raize.com) y de editores exprés (www.DevExpress.com) tienen componentes que pueden hacer esto.

10

Supongo que se refiere a un botón que aparece en un menú al hacer clic.

También puede simplemente codificar manualmente su botón hacer clic para desplegar un TPopupMenu debajo de él.

Ejemplo: Elimine cualquier cosa con un TClickEvent (quizás un TButton) y un TPopupMenu en su formulario. Agregue algunos elementos de menú. A continuación, agregue el siguiente controlador de eventos OnClick:

procedure TForm86.Button1Click(Sender: TObject); 
var 
    button: TControl; 
    lowerLeft: TPoint; 
begin 
    if Sender is TControl then 
    begin 
    button := TControl(Sender); 
    lowerLeft := Point(button.Left, button.Top + Button.Height); 
    lowerLeft := ClientToScreen(lowerLeft); 
    PopupMenu1.Popup(lowerLeft.X, lowerLeft.Y); 
    end; 
end; 

Y viola! Como la magia. Podría incluirlo todo en un componente si planea reutilizarlo. Quizás incluso lo venda en línea.

Nota: Si desea un retraso, a continuación, extraer el código en otro método y luego establecer un temporizador OnClick y gire el temporizador de OnMouseLeave. Luego, si el temporizador se dispara, puede llamar al método extraído. No estoy seguro de cómo lo haría con un clic en el teclado. No sé si Firefox, etc. lo admite.

+0

El problema real existe si usted quiere que este TButton sea un TSpeedButton que se queda abajo mientras se muestra el menú y aparece cuando el usuario hace clic en un elemento del menú O en cualquier otro lugar del formulario. Pero esa es una pregunta diferente y un tema diferente ... – gabr

+0

¿No podría simplemente poner un temporizador en el evento onclick del botón de velocidad, y hacer que la prueba de evento de ejecución del temporizador se vea si el menú emergente aún está visible? – Argalatyr

+0

Si el botón se coloca cerca de la parte inferior de la pantalla, el menú se desplegará desde abajo, comenzando desde la parte inferior del botón, cubriéndolo así, que podría no ser lo que desea. (Probablemente no haya problema aquí, solo pensé en mencionarlo). – dummzeuch

8

La respuesta de Jim es genial, pero al principio no funcionó para mí. ClientToScreen usa el método de Form86, que solo es correcto si el botón está directamente en el formulario. Debe ser el método del botón ClientToScreen que se llama, así:

procedure TForm86.Button1Click(Sender: TObject); 
var 
    button: TControl; 
    lowerLeft: TPoint; 
begin 
    if Sender is TControl then 
    begin 
    button := TControl(Sender); 
    lowerLeft := Point(0, button.Height); 
    lowerLeft := button.ClientToScreen(lowerLeft); 
    PopupMenu1.Popup(lowerLeft.X, lowerLeft.Y); 
    end; 
end; 

Esto funciona sin importar dónde está el botón.

+0

Muy bien, ambos pulgares arriba! – user1580348

Cuestiones relacionadas