MainMenu1的部分item的caption 需要从数据库里读取,所以,刚开始这些item是没有 onclick事件的,但是读取结束后,怎样给他添加onclick事件呢?请多多指点呀
解决方案 »
- 救命,fastreport 4.2 有些中文显示不出来.
- 在服务程序中如何显示指定的窗体?急急急
- 每张磁卡是不是都有一个唯一的号码?
- (unsigned char *)"0917" 这一句c++ 如何用DELPHI表示
- 诚聘:DELPHI高级开发工程师
- 如何将dbgrid的纪录字段的特定值显示不同的颜色?
- 100分请高手留步!!关于socket传送数据!
- 问一个简单的问题:关于Point
- luoweicaisd(笑三少)请进。
- 郁闷中...,放分喽!以后不会很多时间来了,分留着没用,需要可用分的就说个数!斑竹留情,我想也许技术区才有人需要可用分!(顺便提升
- pagecontrol 高难度问题高分
- 这句话怎么理解啊IdTCPClient1.IOHandler.CheckForDataOnSource(250);
procedure MyMenuItemClick(Sender: TObject);动态生成MenuItem的时候,将MenuItem的OnClick指向这个函数,并赋一个不同的Tag值,作为区别。
mi.OnClick := MyMenuItemClick;
mi.Tag := i;最后MyMenuItemClick函数中根据Sender转化成TMenuItem的Tag,分别作不同的操作处理。以上是伪代码,我只讲了讲思路。具体代码自己写吧。
即然會寫動態創建了,其它底下就是一個指針的問題了。var
item : TMenuItem; Item := TmeunItem.create(Menu);
Item.onclick := myclick;
procedure TForm1.MyClick(Sender:Tobject);
begin
ShowMessage('click');
end;上面是直接手寫的偽代碼,應該能看懂吧?
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, 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
item,subitem : TMenuItem;
begin
item := TMenuItem.Create(nil);
item.Caption := '文件';
MainMenu1.Items.Add(item);
subitem := TMenuItem.Create(nil);
subitem.Caption := '下级菜单1';
subitem.OnClick := MyClick;
item.Add(subitem);
end;procedure TForm1.MyClick(Sender: TObject);
begin
ShowMessage(TMenuItem(Sender).Caption);
end;end.
Item.tag := ? // 模塊通過一個MODULEID來區分。 procedure TForm1.MyClick(Sender:Tobject);
begin
TMenuItem(Sender).tag ; //來獲得窗體,調出
end;
为什么不自己去揣摩一下呢,看到这句了吗
TMenuItem(Sender).tag ,sender表示你所点击的那个菜单,TMenuItem(Sender).tag就是你所点击的那个菜单的tag属性,你只要为每个菜单设置不同的tag,那么根据TMenuItem(Sender).tag来判断,去执行哪个具体的显示窗体的代码
if TMenuItem(Sender).Tag = 1 then
begin
Form8.show;
end;
{if TMenuItem(Sender).Tag = 2 then
begin
Form9.show;
end;
}但是1和Form8对应关系,是否也要预先存在一个表里!
var
i: Integer;
AItem: TMenuItem;
begin
for i := 0 to lstConn.Count - 1 do
begin
ConnInfo := TConnInfo(lstConn[i]);
AItem := TMenuItem.Create( nil );
AItem.Caption := ConnInfo.Name;
AItem.Tag := i; //这里给tag赋值,调用时要用
AItem.OnClick := SubMenuClick;
mnDataBase.Add( AItem ); //mnDataBase是这些子菜单的父菜单
end;
end;procedure TForm1.SubMenuClick( ASender: TObject );
var
i: Integer;
AItem: TMenuItem;
begin
AItem := ASender as TMenuItem;
AItem.Checked := True;
sConnName := TConnInfo(lstConn[AItem.Tag]).Name; //只要灵活运用这个Tag的值就行了
end;
这些就完全通过代码实现,你写的思路是对的,就是判断tag,然后去调用不同的窗体
你的思路是对的,就是要把Tag和Form建立一个关联关系
这个是获的窗体的Name 吗?
你要问具体的实现,就先说说你那些Form和菜单是什么联系
你把菜单的Tag的值设置为List的Index不就可以了吗?procedure TForm1.LoadFormMenu( );
var
AFormInfo: TFormInfo;
begin
for i := 0 to lstFormInfo.count - 1 do
begin
AFormInfo := TFormInfo(lstFormInfo[i]);
AItem := TMenuItem.Create( self );
AItem.Caption := AFormInfo.MenuCaption;
AItem.Tag := i;
AItem.OnClick := SubMenuClick;
mnParent.Add( AItem );
end;
end;procedure TForm1.SubMenuClick( ASender: TObject );
var
i: Integer;
AItem: TMenuItem;
AForm: TForm;
sFormName: string;
begin
AItem := ASender as TMenuItem;
sFormName := TFormInfo(lstFormInfo[AItem.Tag]).FormName;
//根据sFormName创建Form
end;