2012-05-16 5 views
7

Al crear un tiempo de ejecución TMenuItem como se muestra a continuación:La creación y la liberación de un TMenuItem utilizado por un TPopupMenu

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

y añadiendo a un TPopupMenu así:

PopupMenu1.Items.Add(mi);

¿Necesito especificar el [owner] como PopupMenu1 o puedo usar nil?

mi será gratis por PopupMenu1 en ese caso, y en caso afirmativo, ¿cómo puedo verificarlo?

Respuesta

11

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.

+1

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

+1

@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. –

+0

¡Gracias por una muy buena respuesta! – Vlad

Cuestiones relacionadas