怎样把treeview里的数据添加到表里去呢?

andyfing 2002-06-13 03:43:10
这段代码可以显示,但是在后面的CalacMoney函数中,却会跳出循环,不执行递归,没有修改表。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, ADODB, ComCtrls;

type
tmydata=class
node:string[3];
parent:string[3];
ps:real;
added:boolean;
end;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
Query1: TADOQuery;
TreeView1: TTreeView;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
procedure loaddatasfromquery;
function addanode(adata:tmydata):ttreenode;
procedure BuildTree;
procedure calacanodemoney(anode:ttreenode);
procedure CalacMoney;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public

end;

var
Form1: TForm1;
mydatas:tlist;

implementation

{$R *.DFM}

procedure TForm1.loaddatasfromquery;
var
adata:tmydata;
i:integer;
begin
if not assigned(mydatas) then
mydatas:=tlist.create
else
begin
for i:=0 to mydatas.count-1 do
begin
adata:=mydatas[i];
adata.free;
end;
mydatas.clear;
end;
if not query1.active then query1.open;
query1.first;
while not query1.eof do
begin
adata:=tmydata.create;
adata.node:=query1.fieldbyname('id').asstring;
adata.parent:=query1.fieldbyname('sx').asstring;
adata.added:=false;
mydatas.add(adata);
query1.next;
end;
query1.close;
end;

function tform1.addanode(adata:tmydata):ttreenode;
var
anode:ttreenode;
i:integer;
begin
anode:=nil;
if adata.added then
begin
anode:=treeview1.items.getfirstnode();
while adata<>tmydata(anode.data) do
anode:=anode.getnext();
result:=anode;
exit;
end;
if trim(adata.parent) <>'' then
for i:=0 to mydatas.count-1 do
if tmydata(mydatas[i]).node=adata.parent then
begin
anode:=addanode(tmydata(mydatas[i]));
break;
end;
result:=treeview1.items.addchildobject(anode,adata.node,adata);
adata.added:=true;
end;

procedure TForm1.BuildTree;
var
i : integer;
begin
TreeView1.Items.BeginUpdate;
TreeView1.Items.Clear;
LoadDatasFromQuery;
for i := 0 to MyDatas.Count - 1 do
if not TMyData(MyDatas[i]).Added then AddANode(MyDatas[i]);
TreeView1.Items.EndUpdate;

end;

procedure TForm1.calacanodemoney(anode:ttreenode);
var
achild:ttreenode;
adata:tmydata;
scale:real;
begin
achild:=anode.getfirstchild;
while achild<>nil do
begin
Case (aNode.level) of
0: scale := 0.5;
1: scale := 0.4;
2: scale := 0.3;
3: scale := 0.2;
end;
if achild.haschildren then calacanodemoney(achild);
adata.ps:=adata.ps+tmydata(achild.data).ps*scale;
achild:=achild.getnextsibling;
end;
end;

procedure TForm1.CalacMoney;
var
aNode : TTreeNode;
begin
aNode:=TreeView1.Items.GetFirstNode;//找到第一个顶结点
while aNode<> nil do
begin
if aNode.HasChildren then CalacANodeMoney(aNode); //计算Money
aNode := aNode.GetNextSibling; //找下一个顶结点
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
aNode : TTreeNode;
begin
BuildTree;
aNode:=TreeView1.Items.GetFirstNode;
label1.caption:=anode.text;
label2.caption:=anode.text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CalacMoney;
end;

end.
...全文
69 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
一点点凋落 2002-06-14
  • 打赏
  • 举报
回复
递归写错了
见下个例子
function SetChildFlag(node: TTreeNode; Flag: Integer): TTreeNode;
var
myNode: TTreeNode;
begin
MyNode:=Node.getFirstChild;
while myNode<>nil do
MyNode:=SetChildFlag(MyNode,Flag);
Node.ImageIndex:=Flag;
Result:=Node.GetNextChild(Node);
end;
mv66_ren 2002-06-13
  • 打赏
  • 举报
回复
while aNode<> nil do//逻辑错
begin
if aNode.HasChildren then CalacANodeMoney(aNode); //计算Money
aNode := aNode.GetNextSibling; //找下一个顶结点
end;
end;
BES 2002-06-13
  • 打赏
  • 举报
回复
//過程
procedure TForm1.calacanodemoney(anode:ttreenode);
//中的
achild:=anode.getfirstchild;語句出現在遞歸中好像邏輯上有錯誤。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧