如使用Treeview控件通過讀取文件來制作菜單!(100分)

  • 主题发起人 主题发起人 Blaze
  • 开始时间 开始时间
B

Blaze

Unregistered / Unconfirmed
GUEST, unregistred user!
請教各位大俠,小弟想用Treeview控件讀DSMenu.mnu文件制作菜單,請教我要如何做呢?

;下面是DSMenu.mnu源文件;

[Menu]
Version=1.00

[Folder]
1=主系統架構圖,1,
2=管理維護系統,4,
2-1=基本資料管理,0,
2-2=批次作業,0,
2-3=清單與明細表,0,
3=基本資料管理系統,4,
3-1=建立作業,0,
3-2=清單與明細表,0,
3-3=批次作業,0,
4=庫存管理系統,4,
4-1=基本資料管理,0,
4-2=日常異動處理,0,
4-3=異動單據憑證,0,
4-4=清單與明細表,0,
4-5=報表列印,0,
 
4-5=報表列印,0,
最后一个0是什么意思啊!
 
用TIniFile读入这些字符串.
然后分析字符串.TMenuItem.Create()
动态生成菜单.
 
能說具體點嗎?

 
用xml吧,菜单的层次结构比较容易分析清楚,呵呵
 
1、在trview下建立一个根“menu"
2、根下建立二级节点,对应:1、2、3
3、二季节殿下建立三级节点,对应:2-1,2-2,2-3等等。
4、读取时分层读取。
 
ti := tmenuitem;
ti := tmainmenu.items.add;
ti.caption := copy(s,1,pos(',',s)-1);
....
 
给你一段代码作为参考,这段代码就是用来读取一些分层信息的.

这是读取的

var
dlg:TOpenDialog;
streamTree:TMemoryStream;
openStream:TMemoryStream;
openHead:TGeoLegendFileHead;
openFile:string;
begin
openFile:='';
dlg := TOpenDialog.Create(Self);
try
dlg.Filter:='sd';
dlg.DefaultExt:='.sd';
//dlg.Options:=[ofOverwritePrompt];
if dlg.Execute then
openFile:=dlg.FileName;
finally
dlg.Free;
end;
if openFile='' then Exit;
streamTree := TMemoryStream.Create;
try
openStream := TMemoryStream.Create;
try
openStream.LoadFromFile(openFile);
openStream.read(openHead,SizeOf(openHead));
streamTree.CopyFrom(openStream,openHead.TreeSize);
//note first load meta array, or raise error
//because first load treeview will start draw treeview
//but no data in meta array
FLegendCount:=openHead.Count;
SetLength(FLegends,openHead.Count);
openStream.read(FLegends[0],openHead.MetaSize);
streamTree.Position:=0;
TreeView.LoadFromStream(streamTree);
finally
openStream.Free;
end;
finally
streamTree.Free;
end;
这是保存的.

var
dlg:TSaveDialog;
streamTree:TMemoryStream;
saveStream:TMemoryStream;
saveHead:TGeoLegendFileHead;
saveFile:string;
begin
saveFile:='';
dlg := TSaveDialog.Create(Self);
try
dlg.Filter:='sd';
dlg.DefaultExt:='.sd';
dlg.Options:=[ofOverwritePrompt];
if dlg.Execute then
saveFile:=dlg.FileName;
finally
dlg.Free;
end;
if saveFile='' then Exit;
saveHead.Identification:='Legend';
saveHead.Version:='2.0';
saveHead.Count:=FLegendCount;
streamTree := TMemoryStream.Create;
try
TreeView.SaveToStream(streamTree);
streamTree.Position:=0;
saveStream := TMemoryStream.Create;
try
saveStream.Write(saveHead,SizeOf(saveHead));
saveHead.TreeAddress:=saveStream.Position;
saveHead.TreeSize:=streamTree.Size;
saveStream.CopyFrom(streamTree,saveHead.TreeSize);
saveHead.MetaAddress:=saveStream.Position;
saveHead.MetaSize:=FLegendCount*SizeOf(TGeoMeta);
saveStream.Write(FLegends[0],FLegendCount*SizeOf(TGeoMeta));
saveStream.Position:=0;
saveStream.Write(savehead,SizeOf(saveHead));
saveStream.SaveToFile(saveFile);
FEdit:=False;
finally
saveStream.Free;
end;
finally
streamTree.Free;
end;
我不但保存了Treeview的信息,还保存了我自己需要保存的一些信息.保存时首先把所有信息
写到一个Stream里,然后存到文件里.读取时相反,先把文件读取Stream里,读出我的信息,然后
再读出TreeView的信息.我在我自已的信息里记了对应Treeview的每个节点的Index,你懂了没有.



 
谢了!我搞定!
 
后退
顶部