2012-05-16 14 views
7

verwendet Befreit Wenn eine Laufzeit TMenuItem erstellen, wie unten dargestellt:erstellen und TMenuItem von einem TPopupMenu

mi := TMenuItem.Create([owner]);

und wie so zu einem TPopupMenu Zugabe:

PopupMenu1.Items.Add(mi);

Muss ich die [owner] als PopupMenu1 angeben oder kann ich nil verwenden?

Wird in diesem Fall mi frei von PopupMenu1 sein, und wenn ja, wie kann ich es verifizieren?

Antwort

11

Sie können nil als Eigentümer angeben, das übergeordnete Element wird seine eigenen Elemente freigeben.

Wie für die Überprüfung ist die am einfachsten, den Code in TMenuItem.Destroy zu sehen:

destructor TMenuItem.Destroy; 
begin 
    .. 
    while Count > 0 do Items[0].Free; 
    .. 
end; 


Wenn das nicht genug ist, um es in Aktion sehen Sie den Benachrichtigungsmechanismus verwenden können:

type 
    TForm1 = class(TForm) 
    PopupMenu1: TPopupMenu; 
    Button1: TButton; 
    Button2: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    private 
    mi: TMenuItem; 
    protected 
    procedure Notification(AComponent: TComponent; Operation: TOperation); 
     override; 
    end; 

    .. 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    mi := TMenuItem.Create(nil); 
    mi.FreeNotification(Self); 
    PopupMenu1.Items.Add(mi); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    PopupMenu1.Free; 
end; 

procedure TForm1.Notification(AComponent: TComponent; Operation: TOperation); 
begin 
    inherited; 
    if (AComponent = mi) and (Operation = opRemove) then 
    ShowMessage('mi freed'); 
end; 

Drücken Sie Button1, um das Element zuerst dem Popup-Menü hinzuzufügen. Drücken Sie dann Button2, um das Popup freizugeben. Das Element benachrichtigt Ihr Formular, wenn es zerstört wird.

+1

Verstanden. Wird es jedoch ein Problem geben, wenn ich einen Eigentümer zum Beispiel das Form1 selbst verwende? Würde das Form1 nicht auch das TMenuItem freigeben - schon wieder? (Entschuldigung dafür, dies in der ersten Frage nicht zu erwähnen) – Vlad

+1

@Vlad - Nein, es wird kein Problem geben. Nach dem Freigeben des Elements (Formular oder des übergeordneten Elements) wird das Element aus den Elementen der übergeordneten Elemente entfernt. –

+0

Vielen Dank für eine sehr gute Antwort! – Vlad