动态,你换一下下边的名子就可以了;
var
Form1: TForm1;
MyMainMenu : TMainMenu;
MyPopupMenu : TPopupMenu;
SubMainMenu :array [0..3] of TMenuItem ;
SubPopupMenu : array[0..3] of TMenuItem ;
I : Integer;implementation{$R *.DFM}procedure TForm1.MyClickHanedler(Sender: TObject);
begin
with Sender as TMenuItem do
begin
if TMenuItem(Sender).Items.MenuIndex = IntegerValue then
begin
{TODO...}
end;
end;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
Item : array [0..4] of TMenuItem;
J : Integer;
begin
MyMainMenu := TMainMenu.Create(self);
for I := 0 to 4 do
begin
Item[I] := TMenuItem.Create(Self);
Item[I].Caption := '第' + IntToStr(I) + '个动态菜单';
MyMainMenu.Items.Add(Item[I]);
end;
for J := 0 To 4 do
for I := 0 To 3 do
begin
SubMainMenu[I] := TMenuItem.Create(Self);
SubMainMenu[I].Caption := ' 子菜单' + IntToStr(I) + '-> 主菜单 ' + IntToStr(J); //您可以取数据库里的字段;
MyMainMenu.Items[J].Add(SubMainMenu[I]);
SubMainMenu[I].OnClick := MyClickHanedler;
end;
end;
var
Form1: TForm1;
MyMainMenu : TMainMenu;
MyPopupMenu : TPopupMenu;
SubMainMenu :array [0..3] of TMenuItem ;
SubPopupMenu : array[0..3] of TMenuItem ;
I : Integer;implementation{$R *.DFM}procedure TForm1.MyClickHanedler(Sender: TObject);
begin
with Sender as TMenuItem do
begin
if TMenuItem(Sender).Items.MenuIndex = IntegerValue then
begin
{TODO...}
end;
end;
end;procedure TForm1.BitBtn1Click(Sender: TObject);
var
Item : array [0..4] of TMenuItem;
J : Integer;
begin
MyMainMenu := TMainMenu.Create(self);
for I := 0 to 4 do
begin
Item[I] := TMenuItem.Create(Self);
Item[I].Caption := '第' + IntToStr(I) + '个动态菜单';
MyMainMenu.Items.Add(Item[I]);
end;
for J := 0 To 4 do
for I := 0 To 3 do
begin
SubMainMenu[I] := TMenuItem.Create(Self);
SubMainMenu[I].Caption := ' 子菜单' + IntToStr(I) + '-> 主菜单 ' + IntToStr(J); //您可以取数据库里的字段;
MyMainMenu.Items[J].Add(SubMainMenu[I]);
SubMainMenu[I].OnClick := MyClickHanedler;
end;
end;
MenuCaption : string;
begin
if sender is TMenuItem then begin
MenuCaption := TMenuItem(Sender).caption;
//在这里MenuCaption 应该是你要的值,你根据这个值再到库里查出FORM就可以处理了。
end;
end;还有一点就是在程序建立时把每个菜单的事件都指向这个程序。
其实楼主的设计思路是很好的,该系统有可能在以后还会增加功能模块,对于菜单而言,是动态的,只要改变数据记录变可以了。你先对一个菜单项的CLOCK事件编程,内容是我上面写的。
然后在建立菜单时菜每个MenuItem的ONCLICK事件都指向这个程序。b1.OnClick := a1Click;在这里a1Click是菜单a1的事件,b1新建的菜单。
MenuCaption : string;
begin
if sender is TMenuItem then begin
MenuCaption := TMenuItem(Sender).caption;
//在这里MenuCaption 应该是你要的值,你根据这个值再到库里查出FORM就可以处理了。
end;
end;还有一点就是在程序建立时把每个菜单的事件都指向这个程序。
其实楼主的设计思路是很好的,该系统有可能在以后还会增加功能模块,对于菜单而言,是动态的,只要改变数据记录变可以了。你先对一个菜单项的CLOCK事件编程,内容是我上面写的。
然后在建立菜单时菜每个MenuItem的ONCLICK事件都指向这个程序。b1.OnClick := a1Click;在这里a1Click是菜单a1的事件,b1新建的菜单。
您可能忽略了,系统会自己给caption加文字的;
而且,你那种更改的方式很容易出错;如果换成;
ModifyMenu(GetSystemMenu(Handle,False),200,...,200,'给值');
我没太理解你的意思,你说的细一些吧,或是告诉大家你要做什么功能?
又或者,在数据库中不存FORM的名字,存FORM其他的信息,这样能不能实现呢?
各位大虾.急啊!!
说清楚些
我认为:
1、主程序应该是很小的,它的功能只是负责菜单的建立和显示,以及取得用户选择的功能然后查询出对应的FORM名称。
2、其他的所有子功能FORM应该在对应的DLL中,而在每个DLL中都有一个显示该DLL中的所有FORM的过程。如果不是这样的话,你每增加一个FORM你的主程序就要重新编译,因为如果该FORM的单元没有被USE,那你的主程序是无法SHOW出其他的FORM的。
3、所以你的数据库应该还有一个字段是存储该FORM存在于哪个DLL中。
4、在主程序中只要将FORM的名字(字符串)传给该DLL的显示程序,让该DLL的显示子程序将真正的FORM SHOW出来。
5、只有这样处理才可能解决你的问题。
7、找到该DLL的显示子程序入口将窗体名字(字符串)传入。
8、将窗体显示出来。
hModule :Hinst;
hProc :procedure(frmName:string);
begin
hModule := LoadLibrary('LIB1.DLL');
hProc := GetProcAddress(hModule,'myshow');
hproc('Form1');
end;
我测试过,正确。
sorry,能不能再明白一点啊.你在DLL中的那个显示子程序入口的 procedure 是怎么写的呢?
还有,你写的代码好象和书上有点区别啊.
谢谢,再详细一点啊.
就用上面的程序调用,没有问题。
library DLL1;uses
SysUtils,
Classes,
UDLL in 'UDLL.pas' {Form1};{$R *.RES}
procedure Myshow(frmName:string);
begin
if frmName = 'Form1' then begin
form1 := Tform1.Create(nil);
form1.ShowModal;
form1.free;
end;
end;exports
Myshow;
begin
end.
你好,你发的贴我已经看过了,但是,我还是有一个问题.你写的那个DLL只是对FORM的SHOW.如果,我想在FORM里对数据库调用呢?我该怎样设计呢?感谢!!
已经不是你这个贴子讨论的问题了。OK?