谁能教我一下动态加载菜单具体过程。网上看了很多,可是没有具体一点的例子有些地方还是不清楚。谁能讲一下具体应该注意的一些细节。最好能有一个程序的例子。

解决方案 »

  1.   

    type
      TForm2 = class(TForm)
        MainMenu1: TMainMenu;
        procedure MenuItemClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation
    {$R *.dfm}
    procedure TForm2.FormCreate(Sender: TObject);
    var
      mi, mi2: TMenuItem;
    begin
      mi := MainMenu1.CreateMenuItem;
      mi.Caption := 'abc';
      MainMenu1.Items.Add(mi);  mi2 := MainMenu1.CreateMenuItem;
      with mi2 do
      begin
        Caption := '&def';
        OnClick := MenuItemClick;
        mi.Add(mi2);
      end;  mi2 := MainMenu1.CreateMenuItem;
      with mi2 do
      begin
        Caption := '&ghi';
        OnClick := MenuItemClick;
        mi.Add(mi2);
      end;
    end;procedure TForm2.MenuItemClick(Sender: TObject);
    begin
      ShowMessage(TMenuItem(Sender).Caption);
    end;
      

  2.   

    还是不是很清楚,你把全部代码发过来吗!
    [email protected]
    我想这想能好好的研究研究。
    谢了。
      

  3.   

    你在Form上加一个TMainMenu,上面的已经是全部代码了啊-_-#
      

  4.   

    我试过了。可以,可是我现在想做的事,是从数据库中加载到FORM里去。谁能帮帮教一下我。先谢了。
      

  5.   

    delphi自带的例子中有的,
    里面写得很全,
    可以看看。
      

  6.   

    那个例子我看过了。我现在是要从数据库里加载菜单的名称和他的click.楼上的怎么样用数组去作啊. 请说清楚一点。谢谢。
      

  7.   

    我程序中的一部份:一、创建菜单(用数据库)
    procedure TMainForm.MyMenu;
    var
      x, y, n: Integer;
      tex, qxx, getqx: string;
      MyItem: array of array of TMenuItem;
    begin
      if Dm.atuser.Locate('编码', func.User_id, []) then
      begin
        getqx := Dm.ATuser.fieldbyname('权限').AsString;
      end;
      try
        MMenu.Free;
        MMenu := TMainMenu.Create(self);
      except
        MMenu := TMainMenu.Create(self);
      end;
      Menu := nil;
      Dm.AQBM.Close;
      Dm.AQBM.SQL.Clear;
      Dm.AQBM.SQL.Add('select * from 菜单 where ((Len(编码)=2))  ORDER BY 编码');
      Dm.AQBM.Open;
      DM.AQBM.First;
      X := DM.AQBM.RecordCount;
      setlength(MyItem, x);
      for x := 0 to Dm.AQBM.RecordCount - 1 do
      begin
        tex := copy(Dm.AQBM.fieldbyname('编码').AsString, 1, 2);
        tex := 'select * from 菜单 where (编码 like ''' + tex + '%'')  ORDER BY 编码';
        Dm.AQmenu.Close;
        Dm.AQmenu.SQL.Clear;
        Dm.AQmenu.SQL.Add(tex);
        Dm.AQmenu.Open;
        Dm.AQmenu.First;
        y := Dm.AQmenu.RecordCount;
        setlength(MyItem[x], y);
        for y := 0 to Dm.AQmenu.RecordCount - 1 do
        begin
          MyItem[x, y] := TMenuItem.Create(Self);
          MyItem[x, y].Name := Dm.AQmenu.fieldbyname('模块').AsString;
          MyItem[x, y].Caption := Dm.AQmenu.fieldbyname('菜单').AsString;
          qxx := '"' + Dm.AQmenu.fieldbyname('模块').AsString + '"';
          n := Pos(qxx, getqx);
          if n = 0 then
            if Dm.AQmenu.fieldbyname('权限').AsBoolean then
              MyItem[x, y].Enabled := false
            else
              MyItem[x, y].Enabled := true
          else
            MyItem[x, y].Enabled := not Dm.AQmenu.fieldbyname('禁用').AsBoolean;
          if Dm.AQmenu.fieldbyname('模块').AsString = 'getid' then
            MyItem[x, y].Visible := func.getzc
          else
            MyItem[x, y].Visible := not Dm.AQmenu.fieldbyname('隐藏').AsBoolean;
          if Dm.AQmenu.fieldbyname('模块').AsString = 'Menu' then
            MyItem[x, y].Visible := ShowMenu;
          if y = 0 then
            MMenu.Items.Add(MyItem[x, y])
          else
          begin
            MyItem[x, y].OnClick := MyPopupHandler;
            MyItem[x, 0].Add(MyItem[x, y]);
          end;
          Dm.AQmenu.Next;
        end;
        Dm.AQBM.Next;
      end;
      ToolBar1.Menu := MMenu;
    end;
      

  8.   

    三、click处理
    procedure TMainForm.MyPopupHandler(Sender: TObject);
    var mk: string;
    begin
      Dm.AQmenu.Close;
      Dm.AQmenu.SQL.Clear;
      Dm.AQmenu.SQL.Add('select * from 菜单  ORDER BY 编码');
      Dm.AQmenu.Open;
      Dm.AQmenu.First;
      with Sender as TMenuItem do
      begin
        mk := trim(name);
        if Dm.AqMenu.Locate('模块', MK, []) then
        begin
          mk := trim(Dm.AQmenu.fieldbyname('模块').AsString);
          menuren(mk);  //执行菜单命令
        end
        else
          MsgBox('没有这个模块' + Caption, '注意', MB_OK); //MsgBox是我自己的提示窗口
      end;
    end;
      

  9.   

    上面是二,这个才是三
    三、procedure menuren(mk:string);
    begin
          if mk = 'exit' then MainForm.Close;//退出
          if mk = 'myhelp' then MainForm.myhelp;//帮助
          if mk = 'about' then myabout;  //关于
          if mk = 'webup' then webupd;   //在线升级
          if mk = 'cllb' then menuexe('材料类别', false);//这块是用一个窗口做的编码管理
          if mk = 'bzbm' then menuexe('班组', false);
          if mk = 'bmwf' then menuexe('部门', false);
          if mk = 'gzlb' then menuexe('工资类别', false);
          if mk = 'htlb' then menuexe('合同类别', false);
          if mk = 'mzlb' then menuexe('民族', false);
          if mk = 'qymc' then menuexe('区域名称', false);
          if mk = 'whcd' then menuexe('文化程度', false);
          if mk = 'zzlb' then menuexe('暂住证类别', false);
          if mk = 'zclb' then menuexe('职称', false);
          if mk = 'yglb' then menuexe('职工类别', false);
          if mk = 'zwlb' then menuexe('职务', false);
          if mk = 'zzmm' then menuexe('政治面貌', false);
          if mk = 'fyzq' then menuexe('婚姻状况', false);
          if mk = 'rkyy' then menuexe('入库原因', false);
          if mk = 'ckyy' then menuexe('出库原因', false);//编码管理完成
          if mk = 'opendata' then dateopen;  //重新联接数据库
          if mk = 'Menu' then menue;         //菜单编辑
          if mk = 'ygzl' then ygzl;          //员工资料
          if mk = 'clrk' then clrkd;         //材料入库
    ...................
    end;
    三部份完成,其他的我不多说了,自己看看,这个菜单管理把权限管理也综合在一起了,
      

  10.   

    对了,上面菜单创建里有些功能是不一定要的,
     if Dm.AQmenu.fieldbyname('模块').AsString = 'getid' then
            MyItem[x, y].Visible := func.getzc  //如果已注册成功,就不显示注册菜单
          else
            MyItem[x, y].Visible := not Dm.AQmenu.fieldbyname('隐藏').AsBoolean;
          if Dm.AQmenu.fieldbyname('模块').AsString = 'Menu' then
            MyItem[x, y].Visible := ShowMenu;  //要用特殊命令才能看到菜单编辑菜单的数据库中主要有,编码:用定级编码的方式,我只用了两级,可以再加的,如01  0101 02 0201等
    菜单名,就是菜单显示出来的名字,“-”是菜单分隔,模块名用于程序调用相应菜单模块。
      

  11.   

    先谢 tanqth(青蛙) 了。
    我回头就去试试看。