主题:MainMenu里能看见的最上级菜单的parent是什么?
punkrocker
[专家分:720] 发布于 2007-09-17 22:09:00
建了一个菜单,比如
File Edit Help
New Cut TxtHelp
Open Copy About
Save Paste
Exit
然后看每个MenuItem的parent,可以看到每个MenuItem的Parent就是他的上一级,比如
New、Open、Save、Exit的parent都是File
问题是:
File、Edit、Help的parent是什么?
通过.parent.classname可以知道也是个MenuItem,但是没Name没Caption?
回复列表 (共3个回复)
沙发
长尾兔 [专家分:3630] 发布于 2007-09-18 10:18:00
研究了一下:
添加一级菜单项时,实际上使用的是TTreeView.Items.Add方法,与添加二级菜单项时使用的TMenuItem.Add方法是同一方法;
而Add方法又是间接执行的TMenuItem.Insert方法;
看一下TMenuItem.Insert方法:
procedure TMenuItem.Insert(Index: Integer; Item: TMenuItem);
begin
if Item.FParent <> nil then Error(@SMenuReinserted);
if FItems = nil then FItems := TList.Create;//注意这句
if (Index - 1 >= 0) and (Index - 1 < FItems.Count) then
if Item.GroupIndex < TMenuItem(FItems[Index - 1]).GroupIndex then
Item.GroupIndex := TMenuItem(FItems[Index - 1]).GroupIndex;
VerifyGroupIndex(Index, Item.GroupIndex);
FItems.Insert(Index, Item);
Item.FParent := Self;//注意这句
Item.FOnChange := SubItemChanged;
if FHandle <> 0 then RebuildHandle;
MenuChanged(Count = 1);
end;
当添加二级菜单项时,很好理解:
ItemX.Add(MyItem); // 于是MyItem.Parent就是ItemX;
当添加一级菜单项时,注意:
TreeView1.Items.Add(ItemX);//这时,ItemX.Parent实际上是TreeView1.Items
而TreeView1.Items是什么?当然就是TTreeView的私有成员FItems了;
而FItems又是什么?
if FItems = nil then FItems := TList.Create;//呵呵,其实是一个TList对象
当TreeView1被Create时,FItems应该是nil,当添加第一个菜单项(即TreeView1.Items[0])时,FItems立即被构造(FItems := TList.Create)
于是,TreeView1.Items[0].Parent就是FItems私有成员,虽然看起来它是一个TMenuItem对象,但实质上它是一个TList对象。
我说的对吗? :)
板凳
punkrocker [专家分:720] 发布于 2007-09-18 14:47:00
showmessage(mnifile.parent.classname)
可以看到,vmnifile的parent就是一个menuitem
一个我们看不见的menuitem???
3 楼
长尾兔 [专家分:3630] 发布于 2007-09-18 16:07:00
前面我的描述有几处错误,明眼人帮忙指出来并展开分析吧,呵呵,我这里的确是没时间长篇大论了。
按楼主的理解,一个看不见的MenuItem也是可以的。
我来回复