一个表,三个字段
Id : 结点的ID,整型的
ParentId : 父结点的ID,没有父结点则为0
Name : 结点的文本。{ 装入目录 }
procedure TMainForm.LoadFolder;
function GetParentNode(Id: integer): TTreeNode;
var
i, iCount:integer;
begin
result := nil;
with TreeView do
begin
iCount := Items.Count - 1;
for i := iCount downto 0 do
if integer(Items[i].Data) = Id then
begin
result := Items[i];
break;
end;
end;
end;var
i, iCount: integer;
iFolderId, iParentId: integer;
sFolderName: string;
begin
with tblFolder, TreeView1 do
begin
iCount := RecordCount;
Items.BeginUpdate;
Items.Clear;
for i := 1 to iCount do
begin
RecNo := i;
iFolderId := FieldByName('Id').AsInteger;
iParentId := FieldByName('ParentId').AsInteger;
sFolderName := FieldByName('Name').AsString;
Items.AddChild(GetParentNode(iParentId), sFolderName);
Items[i - 1].Data := Pointer(iFolderId);
end;
Items.EndUpdate;
end;
end;{ 重新保存TreeView中的索引 }
procedure TMainForm.ReSaveFolderIndex;
var
i, iCount: integer;
begin
with tblFolder, TreeView1 do
begin
iCount := RecordCount;
for i := 0 to iCount - 1 do
begin
RecNo := i + 1;
Edit;
FieldByName('Id').AsInteger := integer(Items[i].Data);
FieldByName('Name').AsString := Items[i].Text;
if Items[i].Parent = nil then
FieldByName('ParentId').AsInteger := 0
else
FieldByName('ParentId').AsInteger := integer(Items[i].Parent.Data);
Post;
end;
end;
end;
//当你新增、移动、删除结点时执行过程ReSaveFolderIndex;
Id : 结点的ID,整型的
ParentId : 父结点的ID,没有父结点则为0
Name : 结点的文本。{ 装入目录 }
procedure TMainForm.LoadFolder;
function GetParentNode(Id: integer): TTreeNode;
var
i, iCount:integer;
begin
result := nil;
with TreeView do
begin
iCount := Items.Count - 1;
for i := iCount downto 0 do
if integer(Items[i].Data) = Id then
begin
result := Items[i];
break;
end;
end;
end;var
i, iCount: integer;
iFolderId, iParentId: integer;
sFolderName: string;
begin
with tblFolder, TreeView1 do
begin
iCount := RecordCount;
Items.BeginUpdate;
Items.Clear;
for i := 1 to iCount do
begin
RecNo := i;
iFolderId := FieldByName('Id').AsInteger;
iParentId := FieldByName('ParentId').AsInteger;
sFolderName := FieldByName('Name').AsString;
Items.AddChild(GetParentNode(iParentId), sFolderName);
Items[i - 1].Data := Pointer(iFolderId);
end;
Items.EndUpdate;
end;
end;{ 重新保存TreeView中的索引 }
procedure TMainForm.ReSaveFolderIndex;
var
i, iCount: integer;
begin
with tblFolder, TreeView1 do
begin
iCount := RecordCount;
for i := 0 to iCount - 1 do
begin
RecNo := i + 1;
Edit;
FieldByName('Id').AsInteger := integer(Items[i].Data);
FieldByName('Name').AsString := Items[i].Text;
if Items[i].Parent = nil then
FieldByName('ParentId').AsInteger := 0
else
FieldByName('ParentId').AsInteger := integer(Items[i].Parent.Data);
Post;
end;
end;
end;
//当你新增、移动、删除结点时执行过程ReSaveFolderIndex;
解决方案 »
- 程序结束后进程没有关闭.
- 你有这样的控件?
- 想更改edit的消息,但是我的edit不接受任何消息。请看看
- 如何捕捉SendAppMessage发的消息
- 如何调用sql sever2000中dts的导入导出
- 如何下载局域网中某目录下的所有文件
- 怎样得到另外一个程序中的某一edit控件的句柄?
- 找遍了互连网,找不到答案,那位高人帮帮我,当重分相谢!!
- 怎样用installshield for delphi做一个安装程序啊,我用的是delphi+sqlserver2000,我想在一台没安装delphi的电脑上运行我的程序该怎么做
- ADO 与 ODBC?
- 急急急急急!怎样通过程序在 treeview 中指定某一个item[]展开,并且象是被拖动了旁边的滚动条一样将它显示在treeview可见范围的最上面?
- 如何通过PopupMenu动态创建TreeView?
1。加一个父节点字段(Parent),用来存父节点的关键字,最顶级的父节点字段用个特殊的字符或编号表示
2。加一体现自己祖先链的字段(这里命名为A),最顶级的节点的A字段值为起关键字,后代节点的A字段为“父节点的A字段+自己的关键字”
这样就可以很方便地存储和操作你的TreeView了
SaveToStream
LoadFromStream
搞定:)
不过我还有一个问题http://www.csdn.net/expert/Topic/412/412780.shtm,该怎么解决呢?请高手帮忙!
回复人: joney1(不懂编程) (2001-12-10 13:31:52) 得0分
最简单的办法
SaveToStream
LoadFromStream
搞定:)
///////End 非常同意在数据表里用memo(text)类型的字段var
vStream: TMemoryStream;
begin
vStream := TMemoryStream.Create;
try
TreeView1.SaveToStream(vStream);
vStream.Position := 0;
Table1.Edit;
TBlobField(Table1.FieldByName('<树>')).LoadFromStream(vStream);
Table1.Post;
finally
vStream.Free;
end;
end;