Delphi Dyncamically创建弹出菜单项 - 无效的指针操作/访问冲突

时间:2012-05-20 11:56:27

标签: delphi

我遇到错误消息“无效浮点运算”的问题。弹出菜单是一个设计时控件,名为NavPop。它没有分配菜单项。它被指定为Panel1的弹出菜单。

然后,我从列表框动态创建菜单项,并分配标题和点击事件。就我想要完成的事情而言,一切都是100%有效。即它有效。

只有当我关闭程序时,才能获得

  

无效的浮点运算

或其他:

  

访问违规地址000007355.读取Addrss 0000007355。

请注意,除关闭程序时的错误外,一切都运行正常。我将不胜感激任何帮助。

 //  I declare the Array of TMenuItems
 private
    { Private declarations }
    ItemArray : array of TMenuItem;

...    

procedure TMainForm.Button1Click(Sender: TObject);
begin
  CreateNavPop;
end;

//  Create the menu items from listbox(Navlist) items and Link them 
//  to events on a navigation bar.
procedure TMainForm.CreateNavPop;
var
  I:  Integer;
  NavIndex:  Integer;
begin
  SetLength(ItemArray, NavList.Items.Count);
  NavIndex:=0;
  For I:=0 to NavList.Items.Count-1 do
  begin
    NavIndex:=NavBar1.Items.ItemByCaption(NavList.Items.Strings[i]).Index;
    ItemArray[i]:=TMenuItem.create(Nil);
    ItemArray[i].Caption:=NavList.Items.Strings[i];
    ItemArray[i].OnClick:=NavBar1.Items.Items[Navindex].OnClick;
    NavPop.Items.Add(ItemArray[i]);
  end;
end;

//  Call the Items free on program close
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeItems(ItemArray);
end;

//  Free Dynamically created Menu Items on Form Close
procedure TMainForm.FreeItems(MItems : array of TMenuItem);
var
  cnt : integer;
begin
  for cnt := High(MItems) downto Low(MItems) do
  begin
    MItems[cnt].Free;
    MItems[cnt] := nil;
  end;
end;

1 个答案:

答案 0 :(得分:2)

发生这种情况是因为TPopupMenu已经释放了这些物品,并且您可以再次释放它们。

此代码导致“无效指针操作”:

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to 3 do
    PopupMenu1.Items.Add(TMenuItem.Create(nil));
end;

destructor TForm1.Destroy;
var
  I: Integer;
begin
  for I := 3 downto 0 do
    PopupMenu1.Items.Free;
  inherited;
end;

Items属性是一个TMenuItem实例,如果你看它的析构函数,它已经释放了你添加的所有项目。

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

保持简短,你不需要在FreeItems方法中再做一次。

我使用ReportMemoryLeaksOnShutdown测试:= True并且没有发生内存泄漏。