使用的Access数据库结构是:
ID Name parentID Memo IsDirectory
1 项目管理 0 根 TRUE
2 软件开发管理 1 软件管理 TRUE
3 人员修改 2 人员修改管理 TRUE
4 增加人员 3 增加人员 FALSE
5 减少人员 3 减少人员 FALSE
6 成本管理 2 人员修改管理 TRUE设计意图如下:
点击《项目管理》->《软件开发管理》->《人员修改》->《增加人员》->具体操作界面
->《减少人员》->具体操作界面
->《成本管理》等等类似的操作每一节点下的子节点都不定,因为数据库随时都可能增加;只有记录的IsDirectory值为false才实现具体的操作。
琢磨了挺长时间,就是不知道这个界面如何实现?谁使用过TreeView控件?不知道用它行不行?
除此以为还有其他实现方式吗?对我来说真是超难啊~~~不知道这个帖子该放在“数据库”还是“VCL”分坛,只好都发一贴了,好在现在分数每天都增加,呵呵~
ID Name parentID Memo IsDirectory
1 项目管理 0 根 TRUE
2 软件开发管理 1 软件管理 TRUE
3 人员修改 2 人员修改管理 TRUE
4 增加人员 3 增加人员 FALSE
5 减少人员 3 减少人员 FALSE
6 成本管理 2 人员修改管理 TRUE设计意图如下:
点击《项目管理》->《软件开发管理》->《人员修改》->《增加人员》->具体操作界面
->《减少人员》->具体操作界面
->《成本管理》等等类似的操作每一节点下的子节点都不定,因为数据库随时都可能增加;只有记录的IsDirectory值为false才实现具体的操作。
琢磨了挺长时间,就是不知道这个界面如何实现?谁使用过TreeView控件?不知道用它行不行?
除此以为还有其他实现方式吗?对我来说真是超难啊~~~不知道这个帖子该放在“数据库”还是“VCL”分坛,只好都发一贴了,好在现在分数每天都增加,呵呵~
Email:[email protected]
研究一下ONEXPANDING和ONDELETE事件.
currentFolder: String): TTreeNode;
procedure ClearFolderTree(tree: TTreeView);
procedure RClearSubs(TreeNode: TTreeNode);
var
tmpFolder: TftsFolder;
begin
if TreeNode = nil then exit;
while TreeNode.Count > 0 do
begin
tmpfolder := Tftsfolder(TreeNode.item[0].Data);
RClearSubs(TreeNode.Item[0]);
TreeNode.Owner.Delete(TreeNode.Item[0]);
tmpFolder.Free;
end;
end;
var
tmpFolder: TftsFolder;
begin
while tree.Items.Count > 0 do
begin
tmpFolder := TftsFolder(tree.Items[0].Data);
RClearSubs(tree.Items[0]);
tree.Items.Delete(tree.Items[0]);
tmpFolder.Free;
end;
end;
var
tqr: TADOQuery;
tmpNode: TTreeNode;
tmpFolder: TFtsFolder;
curFolderNode : TtreeNode;
begin
curFolderNode := nil;
ClearFolderTree(tree);
tqr := TADOQuery.Create(nil);
tqr.Connection := pubCnn;
try
tqr.SQL.Add('select * from folders where parent_id=''''');
tqr.Open;
while not tqr.Eof do
begin
ftsFolderGeter.Get(tqr, TftsObject(tmpFolder));
tmpNode := tree.Items.Add(nil, tmpFolder.name);
tmpNode.Text := tmpFolder.name;
tmpNode.Data := tmpFolder;
if curFolderNode = nil then
begin
curFolderNode := tmpNode;
tmpNode.StateIndex := ord(ftsfsOpen);
end
else
tmpNode.StateIndex := ord(ftsfsClose);
LoadSubFolders(tmpFolder.id, tmpNode);
tqr.Next;
end;
finally
result := curFolderNode;
tqr.Free;
end;
end;
procedure LoadSubFolders(parentFolder: String; Node: TTreeNode);
var
tqr: TADOQuery;
tmpFolder: TFtsFolder;
tmpNode: TTreeNode;
begin
tqr := TADOQuery.Create(nil);
tqr.Connection := pubCnn;
try
tqr.SQL.Add('select * from folders where parent_id=''' + parentFolder + '''');
tqr.Open;
while not tqr.Eof do
begin
FtsFolderGeter.Get(tqr, TftsObject(tmpFolder));
tmpNode := node.Owner.AddChild(node, tmpFolder.name);
tmpNode.Text := tmpFolder.name;
tmpNode.Data := tmpFolder;
tmpNode.StateIndex := ord(ftsfsClose);
LoadSubFolders(tmpFolder.id, tmpNode);
tqr.Next;
end;
finally
tqr.Free;
end;
end;
if self.TreeView1.Selected.HasChildren=false then
repeat
begin
name:=copy(Self.Query.FieldByName(‘你的字段名’).asstring,0,2);
TreeView1.Items.AddChild(TreeView1.Selected, name).ImageIndex:=1;
Query.Next;
i:=i+1;
end;
until i= Query.RecordCount
//pubCnn是一个全局的数据连接,可以使用一个返回数据连接的函数取代他。
procedure LoadFolders(tree: TTreeView);
var
tqr: TADOQuery;
tmpNode: TTreeNode;
begin
Tree.Items.Clear;
tqr := TADOQuery.Create(nil);
tqr.Connection := pubCnn;
try
tqr.SQL.Add('select * from ##表名## where parentID=''0'''); //此处假设parentID为0的是顶级结点
tqr.Open;
while not tqr.Eof do
begin
tmpNode := tree.Items.Add(nil, tqr.FieldByName('name').asString);
tmpNode.Text := tqr.FieldByName('name').asString;
LoadSubFolders(tqr.FieldByName('id').AsString, tmpNode);
tqr.Next;
end;
finally
tqr.Free;
end;
end;
procedure LoadSubFolders(parentID: String; Node: TTreeNode);
var
tqr: TADOQuery;
tmpNode: TTreeNode;
begin
tqr := TADOQuery.Create(nil);
tqr.Connection := pubCnn;
try
tqr.SQL.Add('select * from ##表名## where parentID=''' + parentID + '''');
tqr.Open;
while not tqr.Eof do
begin
tmpNode := node.Owner.AddChild(node, tqr.fieldByName('name').asstring);
tmpNode.Text := tqr.fieldByName('name').asstring;
LoadSubFolders(tqr.fieldByName('id').asstring, tmpNode);
tqr.Next;
end;
finally
tqr.Free;
end;
end;
看来只有用TreeView控件了~~