在类中创建弹出菜单 PopUpMenu1 := TPopupMenu.Create(self);
PopUpMenu := PopUpMenu1; setlength(PopItems, TotalCurves - 1);
for i := 0 to X - 1 do
begin
PopItems[i] := TMenuItem.Create(self);
PopItems[i].Caption := C[i].DataName;
PopUpMenu1.Items.Add(PopItems[i]);
end;
PopUpMenu1.Items[0].OnClick := myclick;在类的释放中
for i := totalcurves - 1 downto 0 do
begin
c[i].Free;
PopUpMenu1.Items[i].Free; //行1
end;
PopUpMenu1.Free; //行2
inherited Destroy;没有和有 行1及行2,释放类实例时有无效指针, 只有行2也不行关闭了全部菜单代码一切ok
PopUpMenu := PopUpMenu1; setlength(PopItems, TotalCurves - 1);
for i := 0 to X - 1 do
begin
PopItems[i] := TMenuItem.Create(self);
PopItems[i].Caption := C[i].DataName;
PopUpMenu1.Items.Add(PopItems[i]);
end;
PopUpMenu1.Items[0].OnClick := myclick;在类的释放中
for i := totalcurves - 1 downto 0 do
begin
c[i].Free;
PopUpMenu1.Items[i].Free; //行1
end;
PopUpMenu1.Free; //行2
inherited Destroy;没有和有 行1及行2,释放类实例时有无效指针, 只有行2也不行关闭了全部菜单代码一切ok
另外,没必要手工销毁TPopupMenu的子项,直接PopupMenu*.Free它会删除所有子菜单的,不会造成memleak。
改为如下试试: 在类中创建弹出菜单 PopUpMenu1 := TPopupMenu.Create(self);
PopUpMenu := PopUpMenu1; setlength(PopItems, TotalCurves - 1);
for i := 0 to X - 1 do
begin
PopItems[i] := TMenuItem.Create(self);
PopItems[i].Caption := C[i].DataName;
PopUpMenu1.Items.Add(PopItems[i]);
end;
PopUpMenu1.Items[0].OnClick := myclick; 在类的释放中 for i := totalcurves - 1 downto 0 do
begin
//c[i].Free;
if Assign(PopUpMenu1.Items[i]) then
PopUpMenu1.Items[i].Free; //行1
end;
if Assign(PopUpMenu1);
PopUpMenu1.Free; //行2
inherited Destroy;
->
if Assign(PopUpMenu1) then
是Assigned,不是Assign