回 帖 发 新 帖 刷新版面

主题:MainMenu里能看见的最上级菜单的parent是什么?

建了一个菜单,比如
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个回复)

沙发

研究了一下:

添加一级菜单项时,实际上使用的是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对象。

我说的对吗? :)

板凳

showmessage(mnifile.parent.classname)
可以看到,vmnifile的parent就是一个menuitem
一个我们看不见的menuitem???

3 楼

前面我的描述有几处错误,明眼人帮忙指出来并展开分析吧,呵呵,我这里的确是没时间长篇大论了。

按楼主的理解,一个看不见的MenuItem也是可以的。

我来回复

您尚未登录,请登录后再回复。点此登录或注册