Możesz określić zero jako właściciela, element nadrzędny zwolni swoje własne elementy.
chodzi o sprawdzenie, najłatwiej jest zobaczyć kod w TMenuItem.Destroy
:
destructor TMenuItem.Destroy;
begin
..
while Count > 0 do Items[0].Free;
..
end;
Jeśli to nie wystarczy, aby zobaczyć go w akcji można wykorzystać mechanizm powiadamiania:
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;
Naciśnij przycisk 1, aby najpierw dodać pozycję do menu podręcznego. Następnie naciśnij przycisk 2, aby zwolnić komunikat Popup. Przedmiot powiadomi Cię, gdy formularz zostanie zniszczony.
Zrozumiano. Czy jednak wystąpi problem, jeśli * * * użyję właściciela, na przykład samego Form1? Czy też Form1 Free the TMenuItem również - znowu? (przepraszam, że o tym nie wspomniałem) – Vlad
@Vlad - Nie, nie będzie problemu. Po zwolnieniu elementu (formularza lub elementu nadrzędnego) przedmiot zostanie usunięty z pozycji jego rodziców. –
Dziękuję za bardzo dobrą odpowiedź! – Vlad