乱点鸳鸯谱---奇特的菜单问题。(100分)

  • 主题发起人 主题发起人 DNChen
  • 开始时间 开始时间
D

DNChen

Unregistered / Unconfirmed
GUEST, unregistred user!
很奇怪的问题,我从主程序中将一个函数地址传送给了
DLL,这个函数定义如下:

procedure insertmenuafter(name:pchar;menu:tmenuitem);

该函数自动读取主程序中的一个popupmenu,然后遍历查找
每个菜单及其子菜单,当找到第一个.name为name的菜单,将
menu插入在找到菜单后面(不是作为子菜单,是在同一级插
入)。写好测试插入一个菜单项通过,而后一次性插入了四个
就出了问题,第四个菜单项是一个分隔条,所以没有付onclick
事件(以上测试时所有菜单都是动态创建),运行程序时,该
popupmenu中的各个等级的菜单中第一项全部失效。

我找出第四个菜单的onclick加不加有很大关系,如果加了,
则其他菜单都正常了,即使这个菜单是一个分隔条。然后
我在这个基础上再次开始添加菜单,这次添加的菜单量更
大了, 有六个菜单分三组加入,这下子有趣了,乱掉了,
有些没有付过onclick事件的菜单被付上了其他菜单的操作,
而有些菜单则失去了onclick事件。

我现在想不到任何产生这种问题的可能原因,所以请教各位,能
不能帮忙给个建议。
 
DNChen: 我不太明白,你的意思是:有了ONCLICK就OK,没有就出错?
 
第一次出现问题时,有了Onclick就正常,没有onClick就导致所有的菜单中的
第一项失效,比如:
item1
item2 -> item 3
item 4
item5
item6
则item1,item3不再执行onclick的操作。

第二次出错,不论是否给onclick付值,结果都是这样,各个菜单之间的
onclick关系乱了。
 
可能是加入菜单项的时候代码有BUG?
 
我怀疑是你自己插入的代码有问题
请你写出
1、插入新菜单项的代码
2、生成新菜单项的代码
3、响应新菜单项的代码
 
我曾经和eyes在IRC里谈了一个多小时,把代码贴出
来给他看了,还是找不出问题。

现在我绕开了这个问题,放弃了动态创建。

原来的代码是

procedure tform1.doit;
var a:tmenuitem;
begin
a:=tmenuitem.create(self);
a.caption:='菜单名';
a.onclick:=action;
mainmenu.items.add(a);
a:=tmenuitem.create(self);
a.caption:='菜单二';
a.onclick:=action2;
end;
 
代码有错误,
TMenuItem.Create(Owner:TObject)
其中Owner指定错了,
应该是将要插入到的TMenu组件,
你指定为Form自己了,于是造成混乱。

这种错误在动态创建组件时常犯
 
can you finish the quis?
 
我觉得Owner是Form没有错。TMenu是不能作为Owner的。

创建第二级菜单时可以指定一下其Parent为上级菜单,试一试吧。
 
看来要强制结束了。
 
后退
顶部