动态创建一组菜单问题?(100分)

  • 主题发起人 主题发起人 kinlee
  • 开始时间 开始时间
K

kinlee

Unregistered / Unconfirmed
GUEST, unregistred user!

首先建了一个菜单表,包含每个菜单的name及caption位置编码等
字段(字符型)。按位置编码动态创建这一组菜单,如何将动态创
建的菜单与其对应的click事件关联。
例如:动态生成了一个菜单,name=newmenu,caption=新建,
如何将newmenuclick过程赋值给这个菜单newmenu的click事件
(newmenuclick过程以预先设置好了)。不能使用newmenu.onclick=newmenuclick,因为动态创建菜单时,name的名字是不确定的,是由数据表的name字段提供的。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Menus;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure MyClick(Sender:TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
MM:TMenuItem;
begin
MM:=TMenuItem.Create(Self);
MM.Caption:='&shenqw';
// MM.OnClick:=MyClick;
MainMenu1.Items.Add(MM);
MM:=TMenuItem.Create(Self);
MM.Caption:='&shenqw2';
MM.OnClick:=MyClick;
MainMenu1.Items[0].Add(MM);
end;

procedure TForm1.MyClick(Sender: TObject);
begin
ShowMessage('OK');
end;

end.
 
动态创建很多菜单,每个菜单对应不同的click事件,怎样判断哪一个
菜单对应哪一个过程。
我的想法是:每个菜单的name后加上click,即为这个菜单对应的过程名。
即:有个菜单为newmenu,则其对应的过程名为newmenuclick。
 
如果你的菜单name不确定,而你的click的过程名却必须都先写好,
这不是有点矛盾吗?如果你的过程名能写好,那么,也就相当于你
可能的菜单是已知的,只会少不会多,就用一个
if menuitem.name = 'newmenu' then
menuitem.onclick := newmenuclick
else
if ...
来赋值算了。
 
DreamTiger说得很对,我就是这个问题想请教。
但如果照你这样去判断的话,要写的代码就太多了。
能否有其他更好的方法?
 
另外,我能否将所有的菜单都指向一个过程,在这个过程中
再判断。单击菜单打开不同的窗口,这就是我想要的功能。
 
首先一点,你的所有过程都必然是确定的。就是说,菜单是有限的,而不是
随意增加的。
那么:
在菜单表中再增加一项:整型的menuTag,不同的menuTag对应不同的过程,
按你的说法,就是打开不同的窗口。比如0对应的就是newMenu,1对应的是
openMenu等等。
然后就有两种方法:
1、在动态创建菜单时,根据不同的menuTag,将菜单的onclick与不同的过程
对应。
2、动态创建菜单的时候,此菜单的Tag=菜单表中的menuTag,而所有菜单
onclick都对应同一个过程。在这个过程中用
case((sender as TMenuItem).Tag of
0:newMenuClick(Self);
1:openMenuClick(Self);
...
end;
实现调用不同的过程,打开不同的窗口。
建议使用第二种。我觉得这样比较清楚。
 
看来这个问题我又得不到分了。 kinlee,你怎么开始不说清楚呢? (开玩笑)
 
接收答案。
 
后退
顶部