创建并释放TMenuItem用于TPopupMenu

7
在运行时创建TMenuItem如下所示: mi := TMenuItem.Create([owner]); 然后将其添加到TPopupMenu中,如下所示: PopupMenu1.Items.Add(mi); 我需要指定[owner]为PopupMenu1吗?还是可以使用nil?
如果使用nil,那么PopupMenu1会释放mi吗?如果是,我该如何验证?
1个回答

11

你可以将owner指定为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;

点击“按钮1”将项目添加到弹出菜单中。然后按“按钮2”释放弹出菜单。当该项目被销毁时,它将通知您的表单。


1
明白了。不过,如果我使用拥有者比如 Form1 本身,会有问题吗?这样做 Form1 是否会再次 Free TMenuItem 呢?(抱歉在初始问题中没有提到这点) - Vlad
1
@Vlad - 不会有问题。无论是释放表单还是父项,都会将该项从其父项中移除。 - Sertac Akyuz
еңЁйЎ№зӣ®жәҗд»Јз Ғдёӯж·»еҠ ReportMemoryLeaksOnShutdown := True;пјҢеҰӮжһңиҝҳдёҚеӨҹзҡ„иҜқ.. ;o) - Whiler
@Whiler,D7没有ReportMemoryLeaksOnShutdown :/ - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接