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;这是动态创建两级,你变通下
一,先建表如下: 菜单编号 菜单文本 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;
在form內動態建立菜單
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;这是动态创建两级,你变通下
菜单编号 菜单文本
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;
mnuID,mnuCapthin,mnuParentID