function GetCard(Ds:TDataset;Cardid:integer;ts:TStrings):Boolean;
var
ind,NowParentId:integer;
begin
ts.Clear;
ds.DisableControls;
try
ds.First;
Result := ds.Locate('类型',CardId,[]);
if Result then
begin
ts.AddObject(Ds.fieldbyname('名称').asstring,TObject(Cardid));
ind := 0;
NowParentId := Cardid;
function GetCardDepth(Ds:TDataset;Cardid:integer;ts:TStrings):Boolean;
var
ind,NowParentId:integer;
begin
ts.Clear;
ds.DisableControls;
try
ds.First;
Result := ds.Locate('类型',CardId,[]);
if Result then
begin
ts.AddObject(Ds.fieldbyname('名称').asstring,TObject(Cardid));
ind := 0;
NowParentId := Cardid;
呵呵,我老看错题目。如果用Dataset查子类型,比查父类型要麻烦。父类型一级一级递归上去就好查了,子类型的话,必须形成一颗树,然后遍历这个节点下的所有节点。譬如在Delphi下遍历,可以用如下代码:
procedure traveltreeNode(aTreeNode: TTreeNode);
var
i: Integer;
begin
// do treeNode thing
for i := 0 to aTreeNode.Count - 1 do
traveltreeNode(aTreeNode.Item[i])
end;
用它来遍历,不过这是我很久前瞎写的一个,没有优化,但能遍历
function TForm1.FFindLastChild(TreeNode1:TTreeNode):TTreeNode;
begin
if TreeNode1.getLastChild=nil then
result:=TreeNode1
else
result:=FFindLastChild(TreeNode1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
TreeNode1:TTreeNode;
i:integer;
begin
TreeNode1:=TreeView1.Items[0];
While TreeNode1.getNextSibling<>nil do
TreeNode1:=TreeNode1.getNextSibling;
TreeNode1:=FFindLastChild(TreeNode1);
for i:=0 to TreeNode1.AbsoluteIndex do
ShowMessage(TreeView1.Items[i].Text);
end;