Puede especificar nil como propietario, el elemento principal liberará sus propios elementos.
En cuanto a la verificación, lo más fácil es para ver el código en TMenuItem.Destroy
:
destructor TMenuItem.Destroy;
begin
..
while Count > 0 do Items[0].Free;
..
end;
Si eso no es suficiente, al verlo en acción se puede utilizar el mecanismo de notificación:
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;
Presione el botón 1 para agregar primero el elemento al menú emergente. Luego presione Button2 para liberar Popup. El artículo notificará a su formulario cuando se destruye.
Entendido. Sin embargo, ¿habrá un problema si * uso * un propietario, por ejemplo, el Form1 mismo? ¿El Form1 no liberaría el TMenuItem también, de nuevo? (perdón por no mencionar esto en la pregunta inicial) – Vlad
@Vlad - No, no habrá ningún problema. Después de lo que libere el artículo (formulario o artículo principal), el artículo se eliminará de los artículos de sus padres. –
¡Gracias por una muy buena respuesta! – Vlad