2012-05-16 15 views
7

Podczas tworzenia środowiska wykonawczego TMenuItem jak pokazano poniżej:Tworzenie i uwolnienie TMenuItem używany przez TPopupMenu

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

i dodając do TPopupMenu tak:

PopupMenu1.Items.Add(mi);

Czy muszę określić [owner] jako PopupMenu1 lub czy mogę użyć nil?

Czy w takim przypadku będzie dostępne bezpłatne oprogramowanie PopupMenu1, a jeśli tak, w jaki sposób mogę je zweryfikować?

Odpowiedz

11

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.

+1

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

+1

@Vlad - Nie, nie będzie problemu. Po zwolnieniu elementu (formularza lub elementu nadrzędnego) przedmiot zostanie usunięty z pozycji jego rodziców. –

+0

Dziękuję za bardzo dobrą odpowiedź! – Vlad

Powiązane problemy