2008-09-25 4 views
6

Ich verwende ein Popup-Menü in Delphi. Ich möchte es in einer "Radio-Gruppe" -Mode verwenden, wo, wenn der Benutzer ein Element auswählt, es überprüft wird und die anderen Elemente nicht überprüft werden. Ich habe versucht, die AutoCheck-Eigenschaft zu verwenden, aber dies ermöglicht die Überprüfung mehrerer Elemente. Gibt es eine Möglichkeit, das Popup-Menü so einzustellen, dass nur ein Element überprüft werden kann?Delphi Popup Menü überprüft

Antwort

5

Zartog hat Recht, aber wenn Sie das Kontrollkästchen beibehalten möchten, weisen Sie dieses Ereignis jedem Element im Popup-Menü zu.

Beachten Sie, dass dieser Code etwas haarig aussieht, da es nicht darauf ankommt, den Namen Ihres Popup-Menüs zu kennen (daher nachschlagen mit "GetParentComponent").

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //if they just checked something... 
    if Checked then begin 
     //go through the list and *un* check everything *else* 
     for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     if i <> MenuIndex then begin //don't uncheck the one they just clicked! 
      (GetParentComponent as TPopupMenu).Items[i].Checked := False; 
     end; //if not the one they just clicked 
     end; //for each item in the popup 
    end; //if we checked something 
    end; //with 
end; 

Sie die Veranstaltung wie diese zur Laufzeit zu jedem Popup-Fenster auf dem Formular zuweisen können (wenn Sie das tun wollen):

procedure TForm2.FormCreate(Sender: TObject); 
var 
    i,j: integer; 
begin 
    inherited; 

    //look for any popup menus, and assign our custom checkbox handler to them 
    if Sender is TForm then begin 
    with (Sender as TForm) do begin 
     for i := 0 to ComponentCount - 1 do begin 
     if (Components[i] is TPopupMenu) then begin 
      for j := 0 to (Components[i] as TPopupMenu).Items.Count - 1 do begin 
      (Components[i] as TPopupMenu).Items[j].OnClick := OnPopupItemClick; 
      end; //for every item in the popup list we found 
     end; //if we found a popup list 
     end; //for every component on the form 
    end; //with the form 
    end; //if we are looking at a form 
end; 

Als Reaktion auf einen Kommentar unterhalb dieser Antwort: Wenn Sie Sie möchten, dass mindestens ein Element überprüft wird, und verwenden Sie dieses anstelle des ersten Codeblocks. Möglicherweise möchten Sie ein standardmäßig überprüftes Element im oncreate-Ereignis festlegen.

procedure TForm2.OnPopupItemClick(Sender: TObject); 
var 
    i : integer; 
begin 
    with (Sender as TMenuItem) do begin 
    //go through the list and make sure *only* the clicked item is checked 
    for i := 0 to (GetParentComponent as TPopupMenu).Items.Count - 1 do begin 
     (GetParentComponent as TPopupMenu).Items[i].Checked := (i = MenuIndex); 
    end; //for each item in the popup 
    end; //with 
end; 
+0

Er sollte auch Fügen Sie den Code hinzu, der überprüft, dass mindestens ein Menüelement aktiviert ist, und fügt den Checkback-Benutzer hinzu, der den aktivierten Eintrag deaktiviert. Das sollte mit Ihren Beispielen einfach sein. – gabr

+0

Ich bin mir nicht sicher, ob das sein Ziel ist, aber ich habe einen Block hinzugefügt, um das in der Antwort zu behandeln. Es vereinfacht die Dinge tatsächlich ein wenig. – JosephStyons

+1

Dies ist definitiv nicht der Weg zu gehen: Diese Funktionalität ist bereits eingebaut. Sieh dir Zartogs und Gerrys Beiträge an und kombiniere die beiden. – onnodb

12

Um das Popup (oder andere) Menüpunkte wie Radio-Gruppenelemente, stellen Sie den ‚RadioItem‘ Eigenschaft auf true für jedes Element, das Sie in der Radiogruppe haben wollen zu behandeln.

Anstatt ein Häkchen zu zeigen, zeigt es eine Kugel nach dem ausgewählten Element, aber es funktioniert wie Sie wollen, und das visuelle Stichwort wird tatsächlich einem Windows-Standard entsprechen.

4

Um auf Zartogs Beitrag zu erweitern: Popup-Menüs in Delphi (ab mindestens D6) haben eine GroupIndex-Eigenschaft, mit der Sie mehrere Sätze von Radio-Elementen innerhalb eines Menüs haben können. Stellen Sie Groupindex auf 1 für die erste Gruppe, 2 für eine zweite usw.

So: Set Autocheck = True Set RadioItem = True Set Group wenn Sie brauchen mehr als eine Gruppe von Funk Artikel