2008-10-24 13 views

Antwort

6

Sicher. Platzieren Sie eine Symbolleiste auf der Seite. Klicken Sie mit der rechten Maustaste auf die Symbolleiste und fügen Sie eine Schaltfläche hinzu. Legen Sie den Stil der Schaltfläche auf tbsDropDown fest. Setzen Sie ein PopupMenu auf die Seite. Doppelklicken Sie auf das PopupMenu, um Menüoptionen zu definieren. Kehren Sie dann zu der Schaltfläche zurück, die Sie erstellt haben, und legen Sie die DropDownMenu-Eigenschaft so fest, dass sie auf das PopupMenu verweist, das Sie gerade erstellt haben.

1

Wenn Sie keine Symbolleiste verwenden möchten, verfügen die Bibliotheken von Raize (www.raize.com) und Express Editoren (www.DevExpress.com) über Komponenten, die dies tun können.

10

Ich nehme an, Sie meinen eine Schaltfläche, die beim Klicken auf ein Menü herunterfährt.

Sie können den Button auch einfach manuell codieren, um ein TPopupMenu darunter anzuzeigen.

Beispiel: Lassen Sie alles mit einem TclickEvent (möglicherweise einem TButton) und einem TPopupMenu auf Ihrem Formular fallen. Fügen Sie einige Menüpunkte hinzu. Fügen Sie dann den folgenden OnClick-Ereignishandler hinzu:

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; 

Und Viola! Genau wie Magie. Sie könnten alles in eine Komponente einbinden, wenn Sie es wiederverwenden möchten. Vielleicht sogar online verkaufen.

Hinweis: Wenn Sie eine Verzögerung wollen, dann extrahieren, dass Code in einem anderen Verfahren und stellen Sie dann einen Timer OnClick und schalten Sie den Timer von OnMouseLeave. Wenn der Timer ausgelöst wird, können Sie die extrahierte Methode aufrufen. Nicht sicher, wie Sie es auf einer Tastatur klicken würden. Ich weiß nicht, ob Firefox usw. das auch unterstützt.

+0

Das eigentliche Problem besteht, wenn Sie möchten, dass dieser TButton ein TSpeedButton ist, der während der Anzeige des Menüs "Down" bleibt und beim Klicken auf ein Element aus dem Menü ODER an einer anderen Stelle im Formular auftaucht. Aber das ist eine andere Frage und ein anderes Thema ... – gabr

+0

Könntest du nicht einfach einen Timer in das Onclick-Ereignis der Speedbutton-Funktion setzen und den Event-Test des Timers ausführen lassen, um zu sehen, ob das Popup-Menü noch sichtbar ist? – Argalatyr

+0

Wenn sich die Schaltfläche in der Nähe des unteren Bildschirmrands befindet, wird das Menü von unten nach oben ausgerichtet und deckt es ab, was möglicherweise nicht Ihren Vorstellungen entspricht. (Wahrscheinlich kein Problem hier, ich dachte nur, ich würde es erwähnen.) – dummzeuch

8

Jims Antwort ist großartig, hat aber anfangs nicht ganz funktioniert. ClientToScreen verwendet die Methode von Form86, die nur dann korrekt ist, wenn sich die Schaltfläche direkt im Formular befindet. Es sollte auf die Schaltfläche des ClientToScreen Methode, die aufgerufen wird, wie folgt aus:

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; 

Dies funktioniert unabhängig davon, wo der Knopf ist.

+0

Sehr gut - beide Daumen hoch! – user1580348