2012-05-16 13 views
7

bir TMenuItem çalışma zamanını oluşturarak kullanılan bir TMenuItem açma:aşağıda gösterildiği gibi oluşturma ve TPopupMenu

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

ve şöyle bir TPopupMenu ekleyerek:

PopupMenu1.Items.Add(mi);

ben gerekiyor mu [owner]'u PopupMenu1 olarak belirtmek için nil kullanabilir miyim?

mi Bu durumda PopupMenü1 tarafından ücretsiz olacak ve eğer öyleyse nasıl doğrulayabilirim?

cevap

11

Nil'i sahip olarak belirtebilirsiniz, ana öğe kendi öğelerini serbest bırakır.

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; 

: O bildirim mekanizmasını kullanabilir eylem görmek için, yeterli değilse

destructor TMenuItem.Destroy; 
begin 
    .. 
    while Count > 0 do Items[0].Free; 
    .. 
end; 


: doğrulayarak gelince

, en kolay TMenuItem.Destroy kodu görmektir Öğeyi önce açılır menüye eklemek için Düğme1'e basın. Ardından, Popup'u boşaltmak için Button2'ye basın. Öğe, yok edildiğinde formunuzu bildirir.

+1

Anlaşıldı. Bununla birlikte, bir formun örneğin Form1'i kullanması durumunda * bir sorun olur mu? Form1 Free TMenuItem de tekrar olmaz mıydı? (ilk soruda bahsetmediğim için üzgünüm) – Vlad

+1

@ Vlad - Hayır, bir problem olmayacak. Öğeyi (form veya ana öğe) serbest bıraktıktan sonra, öğe ebeveynlerinin öğelerinden kaldırılacaktır. –

+0

Çok iyi bir cevap için teşekkür ederim! – Vlad

İlgili konular