如何使用Delphi連接sql server建立一個三級動態菜單
求算法 及思想

解决方案 »

  1.   

    就是在數據庫里建立一個菜單表 包括菜單名 父菜單 menu_id 然後Delphi通過讀取表內容
    在form內動態建立菜單
      

  2.   

    procedure TMainForm.MainMenuCreate;
    var
      i: Integer;
      SubMenu1: TMenuItem;
      SubMenu2: TMenuItem;
    begin
      for i := MainMenu1.Items.Count - 1 downto 0 do
      begin
        MainMenu1.Items[i].Free;
      end;  with DM.CaiDan1_Q do
      begin
        Close;
        SQL.Clear;
        SQL.Add('SELECT CD_ID,CD_BT_CN AS CD_BT,CD_TB,CD_KJJ');
        SQL.Add('FROM t_a_QuanXian INNER JOIN t_a_CaiDan ON QX_CDID=CD_ID');
        SQL.Add('WHERE QX_SQ=1 AND QX_YHID=''' + UserID + ''' AND CD_SJID IS Null');
        Open;
      end;
        { 创建菜单 }
        SubMenu1 := TMenuItem.Create(self);
        SubMenu1.Caption := DM.CaiDan1_Q.FieldByName('CD_BT').AsString + DM.CaiDan1_Q.FieldByName('CD_KJJ').AsString;
        SubMenu1.Tag := DM.CaiDan1_Q.FieldByName('CD_ID').AsInteger;
        MainMenu1.Items.Add(SubMenu1);    with DM.CaiDan2_Q do
        begin
          Close;
          SQL.Clear;
          if LangID = 950 then
            SQL.Add('SELECT QX_CDID,QX_ZD,CD_BT_TW AS CD_BT,CD_TB,CD_KJJ')
          else
            SQL.Add('SELECT QX_CDID,QX_ZD,CD_BT_CN AS CD_BT,CD_TB,CD_KJJ');
          SQL.Add('FROM t_a_QuanXian a INNER JOIN t_a_CaiDan b ON a.QX_CDID=b.CD_ID');
          SQL.Add('WHERE QX_SQ=1 AND QX_YHID=''' + UserID + ''' AND CD_SJID = ''' + DM.CaiDan1_Q.FieldByName('CD_ID').AsString + '''');
          Open;
        end;
          { 创建菜单 }
          SubMenu2 := TMenuItem.Create(self);
          SubMenu2.Caption := DM.CaiDan2_Q.FieldByName('CD_BT').AsString + DM.CaiDan2_Q.FieldByName('CD_KJJ').AsString;
          SubMenu2.Tag := DM.CaiDan2_Q.FieldByName('QX_CDID').AsInteger;
          SubMenu2.OnClick := OnClickItem;
          SubMenu1.Add(SubMenu2);      DM.CaiDan2_Q.Next;
        end;
        DM.CaiDan1_Q.Next;
      end;
    end;这是动态创建两级,你变通下
      

  3.   

    一,先建表如下:
    菜单编号  菜单文本
    1        AAA
    2        BBB
    3        CCC
    11       AAAa
    12       AAAb
    111      AAAaA
    112      AAAaB二:  //==============================================================================
      // 根据数据库里MENU表自动创建主菜单的选项  一级菜单
      //==============================================================================
        ADOQM.Close;
        ADOQM.SQL.Text:='SELECT MNBH,MNNAME,SHOW,BUTTON,TO_EXE,BEIZHU FROM MENU_LIST where Len(MNBH)=3 AND SHOW=''1''';
        try
          ADOQM.Open;
        except
          Application.MessageBox('连接数据库错误,请检查服务器是否正常启动或重新配置连接。', '连接数据库错误', MB_OK + MB_ICONWARNING);
          MYEXE:=ExtractFilePath(Paramstr(0))+'Con_Config.EXE';
          winexec(Pchar(MYEXE),sw_showmaximized);
          ExitProcess(0);
          Application.Terminate;
        end;
        ADOQM.First;
        for I:=0 to ADOQM.RecordCount-1 do
        begin
          MM:=TMenuItem.Create(Self);
          MM.Name := ADOQMMNBH.Value;
          MM.Caption := '['+ADOQMMNNAME.Value+']';
          MM.Enabled := False;
          Main_Menu.Items.Add(MM);      ADOQM.Next;
        end;
      //==============================================================================
      // 根据数据库里MENU表自动创建主菜单的选项  二级菜单
      //==============================================================================
        for I:=0 to Main_Menu.Items.Count-1 do
        begin
          ADOQM.Close;
          ADOQM.SQL.Text := 'SELECT MNBH,MNNAME,SHOW,BUTTON,TO_EXE,BEIZHU FROM MENU_LIST WHERE LEN(MNBH)=5 AND SHOW=''1'' AND MNBH LIKE '''+Main_Menu.Items[I].Name+'%''';
          ADOQM.Open;
          for I1:=0 to ADOQM.RecordCount-1 do
          begin
            MM:=TMenuItem.Create(Self);
            MM.Name := ADOQMMNBH.Value;
            MM.Caption := ADOQMMNNAME.Value;
            MM.Enabled := False;
            MM.OnClick := MClick;
            Main_Menu.Items[I].Add(MM);
            
            ADOQM.Next;
          end;
        end;
      //==============================================================================
      // 根据数据库里MENU表自动创建主菜单的选项  三级菜单
      //==============================================================================
        for I:=0 to Main_Menu.Items.Count-1 do
        begin
          for I1:=0 to Main_Menu.Items[I].Count-1 do
          begin
            ADOQM.Close;
            ADOQM.SQL.Text:='SELECT MNBH,MNNAME,SHOW,BUTTON,TO_EXE,BEIZHU FROM MENU_LIST WHERE LEN(MNBH)=7 AND SHOW=''1'' AND MNBH LIKE '''+Main_Menu.Items[I].Items[I1].Name+'%''';
            ADOQM.Open;
            while NOT ADOQM.Eof do
            begin
              MM:=TMenuItem.Create(Self);
              MM.Name:=ADOQMMNBH.Value;
              MM.Caption:=ADOQMMNNAME.Value;
              MM.Enabled:=False;
              MM.OnClick:=MClick;
              Main_Menu.Items[I].Items[I1].Add(MM);
              ADOQM.Next;
            end;
          end;
        end;
      

  4.   

    递归
    mnuID,mnuCapthin,mnuParentID