请教大侠,怎样根据这种表结构生成菜单? ( 积分: 200 )

  • 主题发起人 主题发起人 QDseashore
  • 开始时间 开始时间
Q

QDseashore

Unregistered / Unconfirmed
GUEST, unregistred user!
ID号 菜单名称 父菜单号

1 系统管理(&Q) 0
2 注册登陆 1
3 退出登陆 1
4 - 1
5 更换皮肤 1
6 蓝色梦想 5
7 金色收获 5
8 绿色希望 5
9 - 1
10 软件注册 1
11 用户管理 1
12 - 1
13 退出 1
14 基础信息(&R) 0
15 商品品种录入 14
16 - 14
17 供应商录入 14
18 客户录入 14
19 - 14
20 系统参数录入 14
21 - 14
22 员工管理 14
23 员工档案 22
24 考勤管理 22
25 计划管理(&S) 0
26 计划录入 25
27 计划查询 25
28 - 25
29 计划汇总 25
30 采购单形成 25
31 入库管理(&T) 0
32 入库录入 31
33 入库查询 31
34 - 31
35 退库录入 31
36 退库查询 31
37 库存管理(&U) 0
38 商品盘点 37
39 库存查询 37
40 库存调整 37
41 - 37
42 预警查询 37
43 销售管理(&V) 0
44 销售录入 43
45 销售查询 43
46 - 43
47 交班 43
48 出库管理(&W) 0
49 出库录入 48
50 出库查询 48
51 - 48
52 财务管理(&X) 0
53 凭证录入 52
54 凭证查询 52
55 - 52
56 月末结账 52
57 - 52
58 帐务查询 52
59 数据传送(&Y) 0
60 订单上传 59
61 销售上传 59
62 - 59
63 信息下载 59
64 帮助(&Z) 0
65 销售系统帮助 64
66 远见主页 64
67 - 64
68 关于 64
 
ID号 菜单名称 父菜单号

1 系统管理(&Q) 0
2 注册登陆 1
3 退出登陆 1
4 - 1
5 更换皮肤 1
6 蓝色梦想 5
7 金色收获 5
8 绿色希望 5
9 - 1
10 软件注册 1
11 用户管理 1
12 - 1
13 退出 1
14 基础信息(&R) 0
15 商品品种录入 14
16 - 14
17 供应商录入 14
18 客户录入 14
19 - 14
20 系统参数录入 14
21 - 14
22 员工管理 14
23 员工档案 22
24 考勤管理 22
25 计划管理(&S) 0
26 计划录入 25
27 计划查询 25
28 - 25
29 计划汇总 25
30 采购单形成 25
31 入库管理(&T) 0
32 入库录入 31
33 入库查询 31
34 - 31
35 退库录入 31
36 退库查询 31
37 库存管理(&U) 0
38 商品盘点 37
39 库存查询 37
40 库存调整 37
41 - 37
42 预警查询 37
43 销售管理(&V) 0
44 销售录入 43
45 销售查询 43
46 - 43
47 交班 43
48 出库管理(&W) 0
49 出库录入 48
50 出库查询 48
51 - 48
52 财务管理(&X) 0
53 凭证录入 52
54 凭证查询 52
55 - 52
56 月末结账 52
57 - 52
58 帐务查询 52
59 数据传送(&Y) 0
60 订单上传 59
61 销售上传 59
62 - 59
63 信息下载 59
64 帮助(&Z) 0
65 销售系统帮助 64
66 远见主页 64
67 - 64
68 关于 64
 
假设 Fields[0]是菜单名称,Fields[1]是父菜单号,Fields[2]是菜单的ID号,并且按父菜单号做升序排列!
procedure CreateMenus(Dataset:TDataset; Parent:TMenuItem; Main:TMainMenu);
Var
CurLevel:Integer;
Function FindParent(ID:Integer):TMenuItem;
Var
i:Integer;
begin
For i:=0 to Main.ComponentCount-1 do
begin
if Not (Main.Components is TMenuItem) then
Continue;
if ID=Main.Components.Tag then
begin
Result:=Main.Items;
break;
end;
end;
end;

procedure Add;
Var
Item:TMenuItem;
begin
Item:=TMenuItem.Create(Main);
Item.Caption:=Dataset.Fields[0].AsString;
Item.Tag:=Dataset.Fields[2].AsInteger;
if Assigned(Parent) then
Parent.Add(Item)
else
Main.Items.Add(Item);
end;
begin
With Dataset do
begin
CurLevel:=Fields[1].AsInteger;
While Not Eof do
begin
Add;
Next;
if Fields[1].AsInteger>CurLevel then
CreateMenus(Dataset,FindParent(Fields[1].AsInteger),Main);
end;
end;

end;
编译通过了,应该差不多!
 
呵呵,谢谢了。我自己已经解决了。分送你~ 谢谢[:D]
我这个是从数据库中读取的:
procedure TMenuTreeRight.DBCreateAllMenu;
var
i,s,x,y,m,n:integer;
strSQL:String;
ParentItems,ChildFItems,ChildSItems:TMenuItem;
begin
//主菜单
x:=0;
strSQL:='Select * from MenuFun Where RightNode=0';
FDataBase.OpenSql(strSQL);
if FDataBase.RecordCount>0 then
begin
x:=FDataBase.RecordCount;
for I:=0 to FDataBase.RecordCount-1 do
begin
ParentItems:=TMenuItem.Create(nil);
ParentItems.Caption:=FDataBase.DataSet.FieldByname('RightName').AsString;
FMenu.Items.Add(ParentItems);
FDataBase.Next;
end;
end;
//子菜单
strSQL:='Select * from MenuFun Where rightNode in(Select RightID from MenuFun where rightNode=0)';
FDataBase.OpenSql(strSQL);
strSQL:='Select * from MenuFun Where rightNode in (Select RightID from MenuFun Where rightNode in(Select RightID from MenuFun where rightNode=0))';
FDataBase.MenuQueryOpenSQL(strSQL);
if FDataBase.RecordCount>0 then
begin
y:=0;
n:=0;
for i:=0 to FDataBase.RecordCount-1 do
begin
s:=FDataBase.DataSet.FieldByname('rightNode').AsInteger;
ChildFItems:=TMenuItem.Create(nil);
ChildFItems.Caption:= FDataBase.DataSet.FieldByname('RightName').AsString;
FMenu.Items[y].Add(ChildFItems);
for m:=0 to FDataBase.MenuDataSet.RecordCount-1 do //二级菜单
begin
if (FDataBase.MenuDataSet.FieldByName('RightNode').AsInteger= FDataBase.DataSet.FieldByname('rightID').AsInteger) and (Not FDataBase.MenuDataSet.Eof) then
begin
ChildSItems:=TMenuItem.Create(nil);
ChildSItems.Caption:=FDataBase.MenuDataSet.FieldByName('RightName').AsString;
FMenu.Items[y].Items[n].Add(ChildSItems);
FDataBase.MenuDataSet.Next;
end
else
Break;
end;
FDataBase.Next;
if (s<>FDataBase.DataSet.FieldByname('rightNode').AsInteger) and (y<=x) then
begin
y:=y+1;
n:=0;
end
else
begin
y:=y;
n:=n+1;
end;
end;
end;
end;
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
630
import
I
I
回复
0
查看
536
import
I
I
回复
0
查看
418
import
I
后退
顶部