以下に示すようにTMenuItemランタイムを作成する場合:
mi := TMenuItem.Create([owner]);
次のようにTPopupMenuに追加します。
PopupMenu1.Items.Add(mi);
[owner]
PopupMenu1として指定する必要がありますか、それとも使用できますnil
か?
mi
その場合、PopupMenu1によって無料になります。無料の場合、どうすれば確認できますか?
所有者としてnilを指定できます。親アイテムは、それ自体のアイテムを解放します。
検証に関しては、最も簡単なのは次のコードを確認することですTMenuItem.Destroy
。
destructor TMenuItem.Destroy;
begin
..
while Count > 0 do Items[0].Free;
..
end;
それだけでは不十分な場合は、実際の動作を確認するために、通知メカニズムを使用できます。
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;
Button1を押して、最初にアイテムをポップアップメニューに追加します。次に、Button2を押してポップアップを解放します。アイテムは、破棄されるとフォームに通知されます。