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

解决方案 »

  1.   

    先把顶级数据读取,然后创建对应菜单,每个菜单的tag保存记录的id,然后再取出其他数据,然后循环数据集,对应每一条记录到菜单中循环找到id值为记录父id值的菜单,然后创建子菜单当然还可以写个递归循环创建菜单
      

  2.   

    先建表如下
    菜单ID   菜单文本   上级菜单
    1       AAA       0
    2       BBB       0
    3       CCC       0
    11      AAAa      1
    12      AAAb      1
    111     AAAaA     11
    112     AAAaB     11
    先建立一级菜单   如下:
    select * from menut where 上级菜单=0
    用一个循环将文本写到mainmenu中去如下:    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;
        
      //==============================================================================
      // 根据数据库里MENU表自动创建左导航条的选项 ====================================
      //==============================================================================
        OutLookBar1.ClearHeaders;    ADOQM.Close;
        ADOQM.SQL.Text:='SELECT MNBH,MNNAME,SHOW,BUTTON,TO_EXE,BEIZHU FROM MENU_LIST where Len(MNBH)=3 AND SHOW=''1'' AND BUTTON=''1''';
        ADOQM.Open;    ADOQM.First;
        for I:=0 to ADOQM.RecordCount-1 do
        begin
          OutLookBar1.AddHeader;
          OutLookBar1.Header[I].Name := ADOQMMNBH.Value;
          OutLookBar1.Header[I].Caption := '['+ADOQMMNNAME.Value+']';      ADOQM.Next;
        end;
        for I:=0 to OutLookBar1.HeaderCount-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 BUTTON=''1'' AND MNBH LIKE '''+ OutLookBar1.Header[I].Name + '%''';
          ADOQM.Open;
          ADOQM.First;      for I1:=0 to ADOQM.RecordCount-1 do
          begin
            OutLookBar1.Header[I].AddButton;
            OutLookBar1.Header[I].Button[I1].Name := ADOQMMNBH.Value;
            OutLookBar1.Header[I].Button[I1].Caption := ADOQMMNNAME.Value;        ADOQM.Next;
          end;
        end;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
      

  3.   

    TO haochinMM.Name := ADOQMMNBH.Value;
    代码中类似的很多
    ADOQMMNBH 是什么??笔误吗 看整理的挺规整的又不像
    不懂这语法。。MARK...
      

  4.   

    建三张表:
    CREATE TABLE [dbo].[S_MenuFirst] (
    [MenuFirstID] [int] IDENTITY (1, 1) NOT NULL ,
    [MenuFirstName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [MenuFirstUse] [varchar] (1) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[S_MenuSecond] (
    [MenuSecondID] [int] IDENTITY (1, 1) NOT NULL ,
    [MenuSecondName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [MenuFirstID] [int] NULL ,
    [MeunSecondUse] [varchar] (1) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GOCREATE TABLE [dbo].[S_MenuThird] (
    [MenuThirdID] [int] IDENTITY (1, 1) NOT NULL ,
    [MenuThirdName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
    [MenuSecondID] [int] NULL ,
    [MenuThirdUse] [varchar] (1) COLLATE Chinese_PRC_CI_AS NULL 
    ) ON [PRIMARY]
    GO
    procedure TfrmMain.FormShow(Sender: TObject);
    var
      mmMain: TMainMenu;
      MMF,MMS,MMT:TMenuItem;
      i,j:Integer;
    begin
      with Datacomm do
      begin
        con1.Close;
        con1.ConnectionString:='Provider=SQLOLEDB.1;Password=sa;Persist Security Info=True;User ID=sa;Initial Catalog=Database1;Data Source=(local)';
        con1.Open;
        //一级大菜单
        qry1.close;
        qry1.SQL.Clear;
        qry1.SQL.CommaText:='Select * From S_MenuFirst';
        qry1.Open;
        mmMain:=TMainMenu.Create(Self);
        mmMain.AutoHotkeys:=maManual;
        while not qry1.Eof do
        begin
          MMF:=TMenuItem.Create(Self);
          MMF.Name:='MMF'+qry1.fieldbyname('MenuFirstID').AsString;
          MMF.Caption:=qry1.fieldbyname('MenuFirstName').AsString;
          mmMain.Items.Add(MMF);
          qry1.Next;
        end;
        //二级子菜单
        for i:=0 to mmMain.Items.Count-1 do
        begin
          qry2.close;
          qry2.SQL.Clear;
          qry2.SQL.Add('Select * From (Select *,(Select MenuFirstName From S_MenuFirst B where A.MenuFirstID=B.MenuFirstID) AS MenuFirstName From S_MenuSecond A) T where MenuFirstName like ''%'+mmMain.Items[i].Caption+'%''');
          qry2.Open;
          while not qry2.Eof do
          begin
            MMS:=TMenuItem.Create(Self);
            MMS.Name:='MMS'+qry2.fieldbyname('MenuSecondID').AsString;
            MMS.Caption:=qry2.fieldbyname('MenuSecondName').AsString;
            mmMain.Items[i].Add(MMS);
            qry2.Next;
          end;
        end;
        //三级菜单
        for i:=0 to mmMain.Items.Count-1 do
        begin
          for j:=0 to mmMain.Items[i].Count-1 do
          begin
            qry3.close;
            qry3.SQL.Clear;
            qry3.SQL.Add('Select * From (Select *,(Select MenuSecondName From S_MenuSecond B where A.MenuSecondID=B.MenuSecondID) AS MenuSecondName From S_MenuThird A) T where MenuSecondName like ''%'+mmMain.Items[i].Items[j].Caption+'%''');
            qry3.Open;
            while NOT qry3.Eof do
            begin
              MMT:=TMenuItem.Create(Self);
              MMT.Name:='MMT'+qry3.fieldbyname('MenuThirdID').AsString;
              MMT.Caption:=qry3.fieldbyname('MenuThirdName').AsString;
              mmMain.Items[i].Items[j].Add(MMT);
              qry3.Next;
            end;
          end;
        end;
      end;
    end;