Delphi如何动态加载菜单用Delphi作一个小程序,如何在程序启动时动态的从数据库中(SQL Server)加载菜单?比方说 数据库中存在一张 菜单表,如何将这个表中的字段自动加载到Delphi程序启动时的菜单项?

解决方案 »

  1.   

    很简单的问题:
    下面是我从程序中给你粘贴的比较重要的一段代码
    procedure Tform_Main.menuFlash;
    var
      i,j,k:integer;
      menuitem:Tmenuitem;
      imageIndex:integer;
    begin
      for i:=menu_Main.Items.Count-1 downto 0 do
      begin
        menuitem:=Menu_Main.Items[i];
        menuitem.Free;
      end;
      if bMainShow then getRootMenu('gnmc','gnbh','gnState','gnmenu',sUserNo,'sys_Function',menu_Main,form_Main.sta_Progress)
        else getRootMenu('gnmc','gnbh','gnState','gnmenu',sUserNo,'sys_Function',menu_Main,form_Splash.Progress,true);
      for i:=0 to menu_Main.Items.Count-1 do
      begin
        if menu_Main.Items[i].Count>0 then
          for j:=0 to menu_Main.Items[i].Count-1 do
            if menu_Main.Items[i].Items[j].Count>0 then
              for k:=0 to menu_Main.Items[i].Items[j].Count-1 do
              begin
                menu_Main.Items[i].Items[j].Items[k].OnClick:=MenuClick;
                menu_Main.Items[i].Items[j].Items[k].ImageIndex:=strtoint(trim(changefield('gnmc','menuImage','sys_Function',trim(menu_Main.Items[i].Items[j].Items[k].caption))));
              end
            else
            begin
              menu_Main.Items[i].Items[j].OnClick:=MenuClick;
              menu_Main.Items[i].Items[j].ImageIndex:=strtoint(trim(changefield('gnmc','menuImage','sys_Function',trim(menu_Main.Items[i].Items[j].caption))));
            end
        else
        begin
          menu_Main.Items[i].OnClick:=MenuClick;
          menu_Main.Items[i].ImageIndex:=strtoint(trim(changefield('gnmc','menuImage','sys_Function',trim(menu_Main.Items[i].caption))));
        end;
      end;
    end;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      files,edit:tmenuitem;{要有实例的声明}
    begin
      files:=tmenuitem.Create(self);
      edit:=tmenuitem.create(self);
      files.Caption:='文件';
      edit.caption:='编辑';
      mainmenu1.AutoHotkeys:=mamanual;{此句代码为不让系统自动设置快捷键}
      form1.MainMenu1.Items.Add(files);
      form1.mainmenu1.items.add(edit);
    end; 
    方法大概就是这样的。 
      

  3.   

    //动态菜单类
    type
      //菜单类继承自object
      TGDynamicMenu=class
      private
      //指定的窗体类实例
      FForm:TForm;
      //指定的菜单类实例
      FMainMenu:TMainMenu;
      //指定系统权限表连接数据库字符串
      FConStr:String;
      //登陆用户名
      FUserName:String;
      //登录用户密码
      FPassWord:string;
      //清除原有项
      FFirstClear:Boolean;
      public
      //动态创建菜单
      procedure CreateMenu;
      //动态菜单项的单击事件
      procedure MenuItemOnClick(Sender:TObject);
      //清楚菜单子项
      procedure Clear;
      //指定窗体实例属性
      property  aForm:TForm read FForm write FForm default nil ;
      //指定菜单实例属性
      property  MainMenu:TMainMenu read FMainMenu write FMainMenu default nil;
      //指定连接字符串属性
      property  ConnectionString:String read FConStr write FConStr;
      //指定用户帐号属性
      property  UserName:String read FUserName write FUserName;
      //指定用户密码属性
      property  PassWord:String read FPassWord write FPassWord;
      //是否清除原指定对象原有的内容
      property  FirstClear:Boolean read FFirstClear write FFirstClear default True;
    end;//******************************************************************************
    // 类模块功能: 创建菜单
    // 类模块名称: TGDynamicMenu.CreateMenu
    // 类模块方法: CreateMenu:建立菜单
    // 类模块属性:
    //   返回值: 无
    //******************************************************************************
    procedure TGDynamicMenu.CreateMenu;
    var
    objMenuItem, objPMenuItem: TMenuItem;
    objADOQuery:TADOQuery;
    strSQL:String;
    begin
      if (FForm=nil) or (not Assigned(FForm)) or (FMainMenu=nil) or (Not Assigned(FMainMenu)) or (Trim(FUserName)='') or (Trim(FConstr)='') then
      begin
      gcf_MsgBox('获取不到用户帐号!请检查是否给模块类赋值用户帐号!',0,FForm.Handle);
      Abort;
      Exit;
      end;  //检测用户帐号合法性
      if Not gcf_DBCheckUserLogin(FConStr,FUserName,FPassWord,FForm.Handle) then
      begin
       gcf_MsgBox('对不起,非法的登录用户!',0,FForm.Handle);
       Abort;
       Exit;
      end; try
      if FFirstClear then
      FMainMenu.Items.Clear;
     //建立数据查询实例
      objADOQuery:=TADOQuery.Create(nil);
      objADOQuery.ConnectionString:=FConstr;
      objADOQuery.SQL.Clear;
      strSQL:='SELECT u.UserID, u.UserPassword, m.*, u.UserStatus, g.GroupID, g.GroupStatus ' +
     ' FROM Sys_GroupModule gm INNER JOIN ' +
              ' Sys_Module m ON gm.ModuleID = m.ModuleID INNER JOIN  ' +
              ' Sys_Group g ON gm.GroupID = g.GroupID INNER JOIN  ' +
              ' Sys_User u ON g.GroupID = u.GroupID Where UserID=' + quotedstr(FUserName) +
              ' and u.UserStatus=1 and g.GroupStatus=1 ' + 
              ' Order By m.ModuleAssNo ';
      objADOQuery.SQL.Add(strSQL);
      objADOQuery.Open;
      if (Not objADOQuery.IsEmpty) or (objADOQuery.RecordCount>0) then
      begin
       objADOQuery.First;
       if FFirstClear then  FMainMenu.Items.Clear;
       while not objADOQuery.Eof  do
       begin
        objMenuItem := TMenuItem.Create(FForm);
        objMenuItem.Name:='MIT' +objADOQuery.FieldByName('ModuleID').asString;
        //分隔线
        if objADOQuery.FieldByName('ModuleType').AsInteger=4 then
        begin
        objMenuItem.Caption:='-';
        end else
          //模块名称
          objMenuItem.Caption:=objADOQuery.FieldByName('ModuleCName').AsString;
          //保存ID号值
          objMenuItem.Tag:=StrToIntDef(objADOQuery.FieldByName('ModuleID').asString,0);
          objMenuItem.ImageIndex:=StrToIntDef(objADOQuery.FieldByName('ModuleImageIndex').asString,-1);
          //父菜单
          if  objADOQuery.FieldByName('ModulePID').AsString='0' then
          begin
             FMainMenu.Items.Add(objMenuItem);
          end else begin
          //子菜单项
           objPMenuItem:=gcf_FindMenuItem('MIT'+objADOQuery.FieldByName('ModulePID').asString ,FForm);
           if objPMenuItem<>nil then
            objPMenuItem.Add(objMenuItem)
           else
           //单击事件else
           FMainMenu.Items.Add(objMenuItem);
           objMenuItem.OnClick:=MenuItemOnClick;
          end;
        objADOQuery.Next;
       end;
      end;
     finally
      objADOQuery.Free;
     end;
    end;
    //******************************************************************************
    // 类模块功能: 创建菜单
    // 类模块名称: TGDynamicMenu.MenuItemOnClick
    // 类模块方法: 动态赋值菜单子项按钮单击事件.
    // 类模块属性:
    //   返回值: 无
    //******************************************************************************
    procedure TGDynamicMenu.MenuItemOnClick(Sender: TObject);
    var
     strSQL,sMenuID:String;
     objADOQuery:TADOQuery;
    begin
      //菜单ID号
      sMenuID:=Copy(TMenuItem(Sender).Name,Length('MIT')+1,Length(TMenuItem(Sender).Name));  if sMenuID='' then
      begin
        Exit;
        Abort;
      end;
      objADOQuery:=TADOQuery.Create(nil);
      try
        objADOQuery.ConnectionString:=FConstr;
        objADOQuery.SQL.Clear;
        strSQL:='Select ModuleClassFrm from Sys_Module Where ModuleID=' +  sMenuID;
        objADOQuery.SQL.Add(strSQL);
        objADOQuery.Open;
        if (Not objADOQuery.IsEmpty) or (objADOQuery.RecordCount>0) then
        begin
         objADOQuery.First;
         gcf_StrShowFormClass(objADOQuery.FieldByName('ModuleClassFrm').AsString,'-1');
        end;
      finally
        objADOQuery.Free;
      end;
    end;