动态,你换一下下边的名子就可以了;
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;

解决方案 »

  1.   

    var
      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新建的菜单。
      

  2.   

    var
      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新建的菜单。
      

  3.   

    楼上的兄弟,您不觉的您犯了一个错误吗?
    您可能忽略了,系统会自己给caption加文字的;
    而且,你那种更改的方式很容易出错;如果换成;
    ModifyMenu(GetSystemMenu(Handle,False),200,...,200,'给值');
      

  4.   

    不用呀,好象你在子form上做个菜单,内容就是你要动态生成的那个菜单,在了form创建的时候你的那个MDI主窗体的菜单就变了,
      

  5.   

    各位老大,我想的菜单功能是要把FORM SHOW出来.但是,在数据库里找到的是FORM的名字是一个字符串啊.怎么对它进行操作呢?就是在ONCLICK的事件中写什么代码呢?
      

  6.   

    你事先应该有这么一个窗体呀(要显示的窗体)要不然你找到了Form的名字也没有用呀(它只是一个字符串),这样你就在onclick中把这个窗体创建出来就可以了
    我没太理解你的意思,你说的细一些吧,或是告诉大家你要做什么功能?
      

  7.   

    我的意思就是,和楼上的那位仁兄差不多.就是我的一个应用程序发布以后,但是,又要加入新的功能,于是在数据库中加入新的功能和菜单.就是菜单是靠数据库中的数据来维护的.如果,数据库中的数据不对的话.那么,新的功能是不能显示出来,可以出一个MESSAGE.('没有这个模块')难道,我有一个字符串'FORM1',就不能对FORM1 进行操作吗?DELPHI能不能实现这个功能呢?
    又或者,在数据库中不存FORM的名字,存FORM其他的信息,这样能不能实现呢?
    各位大虾.急啊!!
      

  8.   

    难道,我有一个字符串'FORM1',就不能对FORM1 进行操作吗?DELPHI能不能实现这个功能呢?
    说清楚些
      

  9.   

    你在数据库中如果有一个'form1'的数据串用作动态菜单,这样会造成变量重名问题,虽然一个是菜单项,一个是窗体,这样你无法调用这个窗体,你完全可以避免这种情况的>
      

  10.   

    看来你的设计和我的想法还是有差距的。
    我认为:
    1、主程序应该是很小的,它的功能只是负责菜单的建立和显示,以及取得用户选择的功能然后查询出对应的FORM名称。
    2、其他的所有子功能FORM应该在对应的DLL中,而在每个DLL中都有一个显示该DLL中的所有FORM的过程。如果不是这样的话,你每增加一个FORM你的主程序就要重新编译,因为如果该FORM的单元没有被USE,那你的主程序是无法SHOW出其他的FORM的。
    3、所以你的数据库应该还有一个字段是存储该FORM存在于哪个DLL中。
    4、在主程序中只要将FORM的名字(字符串)传给该DLL的显示程序,让该DLL的显示子程序将真正的FORM SHOW出来。
    5、只有这样处理才可能解决你的问题。
      

  11.   

    6、用LoadLibrary将库载入
    7、找到该DLL的显示子程序入口将窗体名字(字符串)传入。
    8、将窗体显示出来。
      

  12.   

    var
      hModule :Hinst;
      hProc   :procedure(frmName:string);
    begin
      hModule := LoadLibrary('LIB1.DLL');
      hProc := GetProcAddress(hModule,'myshow');
      hproc('Form1');
    end;
    我测试过,正确。
      

  13.   

    mrzho(mrzhou):
    sorry,能不能再明白一点啊.你在DLL中的那个显示子程序入口的 procedure 是怎么写的呢?
    还有,你写的代码好象和书上有点区别啊.
    谢谢,再详细一点啊.
      

  14.   

    这是我的DLL1源代码,只有一个FORM1。
    就用上面的程序调用,没有问题。
    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.
      

  15.   

    mrzho(mrzhou) 
      你好,你发的贴我已经看过了,但是,我还是有一个问题.你写的那个DLL只是对FORM的SHOW.如果,我想在FORM里对数据库调用呢?我该怎样设计呢?感谢!!
      

  16.   

    你不会要我把所有的程序代码都贴给你吧?在FORM里面处理数据库你该怎样处理就怎样处理,这个问题应该是很简单的了。
    已经不是你这个贴子讨论的问题了。OK?