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.
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
@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. –
Vielen Dank für eine sehr gute Antwort! – Vlad