function TMainFrm.FindNode(PrNode: TTreeNode; NodeId: Integer): TTreeNode;
var
i: Integer;
begin
Result := nil;
if Assigned(PrNode) then
begin
for i := 0 to PrNode.Count - 1 do
if Integer(PrNode.Item[i].Data) = NodeId then
begin
Result := PrNode.Item[i];
Break;
end;
end;
end;
function TMainFrm.LoadRootNode: TTreeNode;
begin
RootNode.Active := False;
RootNode.Active := True;
TreeView1.Items.Clear;
if not RootNode.Eof then
begin
Result := TreeView1.Items.AddChildObject(nil,
RootNode.FieldByName('nodename').AsString,
Pointer(RootNode.FieldByName('nodeid').AsInteger));
end
else
Result := nil;
end;
function TMainFrm.LoadNodes(PrNode: TTreeNode): Integer;
var
Node: TTreeNode;
begin
Result := 0;
SubNodes.Active := False;
SubNodes.Parameters.ParamByName('pnd').Value := Integer(PrNode.Data);
SubNodes.Active := True;
SubCount.Active := False;
SubCount.Parameters.ParamByName('pnd').Value := Integer(PrNode.Data);
SubCount.Active := True;
SubNodes.First;
while not SubNodes.Eof do
begin
Node := TreeView1.Items.AddChildObject(PrNode,
SubNodes.FieldByName('nodename').AsString,
Pointer(SubNodes.FieldByName('nodeid').AsInteger));
if SubCount.Locate('nodeid', Integer(Node.Data), []) then
Node.HasChildren := SubCount.FieldByName('nodecount').AsInteger > 0
else
Node.HasChildren := False;
Result := Result + 1;
SubNodes.Next;
end;
end;
function TMainFrm.ReLoadNodes(PrNode: TTreeNode): Integer;
var
i, Nid: Integer;
ObjList: TList;
DNode: TTreeNode;
begin
Result := 0;
SubNodes.Active := False;
SubNodes.Parameters.ParamByName('pnd').Value := Integer(PrNode.Data);
SubNodes.Active := True;
SubCount.Active := False;
SubCount.Parameters.ParamByName('pnd').Value := Integer(PrNode.Data);
SubCount.Active := True;
SubNodes.First;
ObjList := TList.Create;
while not SubNodes.Eof do
begin
Nid := SubNodes.FieldByName('nodeid').AsInteger;
DNode := FindNode(PrNode, Nid);
if Assigned(DNode) then
begin
DNode.Text := SubNodes.FieldByName('nodename').AsString;
end
else
begin
DNode := TreeView1.Items.AddChildObject(PrNode,
SubNodes.FieldByName('nodename').AsString,
Pointer(SubNodes.FieldByName('nodeid').AsInteger));
end;
if SubCount.Locate('nodeid', Integer(DNode.Data), []) then
DNode.HasChildren := SubCount.FieldByName('nodecount').AsInteger > 0
else
DNode.HasChildren := False;
ObjList.Add(DNode);
Result := Result + 1;
SubNodes.Next;
end;
//此处删去不在列表中的节点
for i := PrNode.Count - 1 downto 0 do
begin
if ObjList.IndexOf(PrNode.Item[i]) < 0 then
PrNode.Item[i].Delete;
end;
ObjList.Free;
end;
是不是类似于:
查询所有节点记录
while Not query1.eof do
begin
query2.sql.text:='select * from table where parentid='+fieldbyname("id").AsString;
query2.open;
while not query2.eof do
begin
// 增加节点在这里
query2.next;
end;
Query1.next;
end;
procedure TfmTcas.setsys_tree(); //根据sys_tree灌树
var
IntNumber,IntOrder,IntItem,Intobject,IntNo:integer;
TrNdObject:TTreeNode;
begin
IntItem:=0;
Intorder:=1;
with QrySys do
begin
close;
sql.Clear;
sql.Add('select * from sys_tree order by treenumber');
prepare;
open;
end;
QrySys.First;
for IntObject:=1 to QrySys.RecordCount do
begin
intNumber:=QrySys.fieldbyname('treeOrder').asinteger;
if QrySys.FieldByName('TreeUseing').AsBoolean then
begin
if (IntNumber=IntOrder) then
begin
if IntItem=0 then
with TvXiangMu.Items do
begin
add(nil,QrySys.FieldByName('TreeObject').asstring);
IntItem:=IntItem+1;
end
else
with TvXiangMu.Items do
begin
TrNdObject:=TvXiangMu.Items[intItem-1].Parent;
addchild(TrNdObject,QrySys.FieldByName('TreeObject').asstring);
IntItem:=IntItem+1;
end;
end
else
begin
if (IntNumber>IntOrder) then
begin
with TvXiangMu.Items do
if QrySys.FieldByName('TreeUseing').AsBoolean then
addchild(TvXiangMu.Items[Intitem-1],QrySys.FieldByName('TreeObject').asstring);
IntItem:=IntItem+1;
end;
if (IntNumber<IntOrder) then
begin
if IntNumber=1 then
with TvXiangMu.Items do
begin
add(nil,QrySys.FieldByName('TreeObject').asstring);
IntItem:=IntItem+1;
end;
if IntNumber<> 1 then
begin
TrNdObject:=TvXiangMu.Items[Intitem-1];
for IntNo:=1 to IntOrder-IntNumber+1 do
begin
TrNdObject:=TrNdObject.Parent;
end;
with TvXiangMu.Items do
begin
addchild(TrNdObject,QrySys.fieldbyname('TreeObject').AsString);
IntItem:=IntItem+1;
end;
end;
end;
end;
IntOrder:=IntNumber;
QrySys.Next;
end
else
begin
QrySys.Next;
continue;
end;
end;
end;