如果正确解决菜单动态生成和释放!(100分)

  • 主题发起人 主题发起人 coolqiang
  • 开始时间 开始时间
C

coolqiang

Unregistered / Unconfirmed
GUEST, unregistred user!
由于需要根据数据库中的具体内容来生成菜单项,所以必须动态生成。
我的代码如下:
PopupMenu := TPopupMenu.Create(Self);
try
for i:=0 to n-1 do
begin
PopupItems := TMenuItem.Create(Self);
PopupItems.Caption := '菜单'+IntToStr(i);
PopupMenu.Items.Add(PopupItems);
end;
......
finally
[blue] PopupMenu.Free;[/blue]
[green] for i := Low(PopupItems) to High(PopupItems) do
PopupItems.Free;[/green]
end;

我见过其它动态生成控件要设置其Owner属性,可以在其Owner释放时自动释放,但我用
PopupItems.Owner := PopupMenu
时,编译说不能给只读属性赋值。
上面代码运行后出错,但如果将蓝色那一行放到绿色那一段后面,就正常,我想知道为什
么?而且这样的方法是否就没问题?用Free可以保证释放资源吗?我看到还有用
FreeAndNil的,能不能请哪位高手系统地说一下资源的分配和释放?如果能说清楚,另有
高分相送!
 
PopupItem是继承至PopupMenu的啊!
如果PopupMenu都先Free,不出错才怪!
 
"人在边缘"说的没错。
如果说popupmenu是树,那么popupitem就是树干,
树都倒了,你说树干能不倒吗?
蓝色在下就对了。

---[purple]还需努力呀![/purple]
 
释放资源需要注意的一点就是有时候资源释放的超时问题!
 
>> PopupMenu := TPopupMenu.Create(Self);

>> PopupItems := TMenuItem.Create(Self);

你都让self帮你处理释放了,还释放什么呀!

你打算全权处理的话:(推荐)
PopupMenu := TPopupMenu.Create(nil);
PopupItems := TMenuItem.Create(nil);
然后free

要不
PopupMenu := TPopupMenu.Create(nil);
PopupItems := TMenuItem.Create(popupmenu);

只要free popupmenu

记住,create(XXX),这个xxx就是owner, owner负责释放,为nil就要自己控制
 
>> PopupMenu := TPopupMenu.Create(Self);

Create函数中的参数就是Owner,你当然不用设置了。所以说绿色代码是不用调用的。
其他动态生成的控件一般还要赋Parent指定显示的父对象.

如果要运行时改变Owner可以调用TComponent类的RemoveComponent方法
procedure ChangeOwner (Component, NewOwner: TComponent);
begin
Component.Owner.RemoveComponent (Component);
NewOwner.InsertComponent (Component);
end;

FreeAndNIL与调用对象的Free方法差不多,看看代码就知道
只不过FreeAndNIL如其名称所描述的一样,将对象指针在释
放后赋值为空,更安全而已

资源的分配和释放并不很难,多看看书就行了
 
多人接受答案了。
 
for i := Low(PopupItems) to High(PopupItems) do
是否for i := High(PopupItems) Downto Low(PopupItems) do
更安全些。

另PopupMenu 何必动态生成,放一个上去岂不更好。

 
后退
顶部