2008-10-24 29 views

Répondre

6

Bien sûr. Mettez une barre d'outils sur la page. Cliquez avec le bouton droit sur la barre d'outils, ajoutez un bouton. Définissez le style du bouton sur tbsDropDown. Mettez un PopupMenu sur la page. Double-cliquez sur le menu contextuel pour définir les éléments de menu. Ensuite, revenez au bouton que vous avez créé et définissez sa propriété DropdownMenu pour pointer vers le PopupMenu que vous venez de créer.

1

Si vous ne souhaitez pas utiliser une barre d'outils, les bibliothèques de raize (www.raize.com) et express editors (www.DevExpress.com) ont des composants capables de faire cela.

10

Je suppose que vous voulez dire un bouton qui descend d'un menu lorsque vous cliquez dessus.

Vous pouvez également coder manuellement votre bouton, cliquez pour dérouler un TPopupMenu en dessous.

Exemple: Supprimez n'importe quoi avec un TClickEvent (peut-être un TButton) et un TPopupMenu sur votre formulaire. Ajoutez des éléments de menu. Ajoutez ensuite le gestionnaire d'événement OnClick suivant:

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; 

Et viola! Juste comme de la magie. Vous pouvez envelopper tout dans un composant si vous envisagez de le réutiliser. Peut-être même le vendre en ligne.

Note: Si vous voulez un retard, puis extraire ce code dans une autre méthode, puis régler une minuterie Surclic et tournez la minuterie de OnMouseLeave. Ensuite, si la minuterie se déclenche, vous pouvez appeler la méthode extraite. Je ne sais pas comment vous le feriez en cliquant sur le clavier. Je ne sais pas si Firefox, etc.

+0

Le vrai problème existe si vous voulez que ce TButton soit un TSpeedButton qui reste en bas pendant que le menu est affiché et apparaisse lorsque l'utilisateur clique sur un élément du menu OU n'importe où ailleurs dans le formulaire. Mais c'est une question différente et un sujet différent ... – gabr

+0

Ne pourriez-vous pas simplement mettre un temporisateur dans l'événement onclick du speedbutton, et faire exécuter le test d'événement du temporisateur pour voir si le menu contextuel est toujours visible? – Argalatyr

+0

Si le bouton est placé près du bas de l'écran, le menu sera placé de bas en haut, à partir du bas du bouton, le couvrant ainsi, ce qui pourrait ne pas être ce que vous voulez. (Probablement pas de problème ici, je pensais juste que je le mentionnerais.) – dummzeuch

8

La réponse de Jim est géniale, mais n'a pas vraiment fonctionné pour moi au début. ClientToScreen utilise la méthode de Form86, qui n'est correcte que si le bouton est directement sur le formulaire. Il devrait être ClientToScreen du bouton de méthode qui est appelée, comme ceci:

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; 

Cela fonctionne, peu importe où le bouton est.

+0

Très bien - les deux pouces vers le haut! – user1580348

Questions connexes