是不是得根据node的数目(n)分配n个空间指针呢?谢谢,请帮我分析一下,如果能多给分,我将....function TForm1.LoadCode(crTbl:TDBDataSet):Integer; var NowID,sName,ShowTxt:String; i,Level:Integer; MyNode:array[0..6]of TTreeNode; datap:^string; begin Level:=0; With crTbl do begin new(datap); try if not Active then Open; First; tvwCode.Items.Clear; MyNode[Level]:=tvwCode.Items.Add (tvwCode.TopItem,SFirstNodeTxt); MyNode[Level].ImageIndex:=0; MyNode[Level].SelectedIndex:=0; While Not Eof do begin NowID:=Trim(FieldByName('maxtbh').AsString); ShowTxt:=NowID+' '+FieldByName('mahtbh').AsString; Level:=GetLevel(SCodeFormat,NowID); datap^:=nowid; if Level>0 then//确保代码符合标准 begin tvwCode.Items.BeginUpdate; MyNode[Level]:=tvwCode.Items.AddChildObject (MyNode[Level-1],ShowTxt,datap ); MyNode[Level].ImageIndex:=1; MyNode[Level].SelectedIndex:=2; tvwCode.Items.EndUpdate; end; Next; end; finally Close; end; end;
天,代码懒的看了。 procedure TForm1.LoadCode(DataSet: TQuery); var S: string; begin with DataSet do begin Close; SQL.Clear; SQL.Text := 'select Field1 from TableName'; Open; First; while not Eof do begin S := FieldByName('Field1').AsString; //加在根结点。 TreeView1.Items.AddObject(nil, S, Pointer(S)); Next; end; end; end;然后通过类型转换来访问它的Data属性。 var Node: TTreeNode; begin Node := TreeView1.Selected; //如果没有,会raise if Assigned(Node.Data) then ShowMessage(String(Pointer(Node.Data^)); end;
To copy_paste(木石三) 好象不行,还是请看原程吧,老兄 我要得是每个node.data携带一个数据,需要的时候我能取到他,利用他进行别的查询条件。 类似《良友》
我用结构做了,没有问题,结构是我所长,其它的,呵呵, 下面的我调试过了。type TMyNode = packed record sString: string; end; PMyNode = ^TMyNode;procedure TForm1.FormCreate(Sender: TObject); var S1,S: string; P: PMyNode; Node: TTreeNode; begin TreeView1.Items.Clear; with Table1 do begin First; while not Eof do begin S1 := FieldByName('Name').AsString; new(P); P.sString := FieldByName('AREA').AsString; Node := TreeView1.Items.Add(nil, S1); Node.Data := P; Next; end; end; end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin if Assigned(Node.data) then Self.Caption := TMyNode(Node.Data^).sString; end;
var NowID,sName,ShowTxt:String;
i,Level:Integer;
MyNode:array[0..6]of TTreeNode;
datap:^string;
begin
Level:=0;
With crTbl do
begin
new(datap);
try
if not Active then Open;
First;
tvwCode.Items.Clear;
MyNode[Level]:=tvwCode.Items.Add
(tvwCode.TopItem,SFirstNodeTxt);
MyNode[Level].ImageIndex:=0;
MyNode[Level].SelectedIndex:=0;
While Not Eof do
begin
NowID:=Trim(FieldByName('maxtbh').AsString);
ShowTxt:=NowID+' '+FieldByName('mahtbh').AsString;
Level:=GetLevel(SCodeFormat,NowID);
datap^:=nowid;
if Level>0 then//确保代码符合标准
begin
tvwCode.Items.BeginUpdate;
MyNode[Level]:=tvwCode.Items.AddChildObject
(MyNode[Level-1],ShowTxt,datap );
MyNode[Level].ImageIndex:=1;
MyNode[Level].SelectedIndex:=2;
tvwCode.Items.EndUpdate;
end;
Next;
end;
finally
Close;
end;
end;
procedure TForm1.LoadCode(DataSet: TQuery);
var
S: string;
begin
with DataSet do
begin
Close; SQL.Clear;
SQL.Text := 'select Field1 from TableName';
Open; First;
while not Eof do
begin
S := FieldByName('Field1').AsString;
//加在根结点。
TreeView1.Items.AddObject(nil, S, Pointer(S));
Next;
end;
end;
end;然后通过类型转换来访问它的Data属性。
var
Node: TTreeNode;
begin
Node := TreeView1.Selected;
//如果没有,会raise
if Assigned(Node.Data) then
ShowMessage(String(Pointer(Node.Data^));
end;
好象不行,还是请看原程吧,老兄
我要得是每个node.data携带一个数据,需要的时候我能取到他,利用他进行别的查询条件。
类似《良友》
下面的我调试过了。type
TMyNode = packed record
sString: string;
end;
PMyNode = ^TMyNode;procedure TForm1.FormCreate(Sender: TObject);
var
S1,S: string;
P: PMyNode;
Node: TTreeNode;
begin
TreeView1.Items.Clear;
with Table1 do
begin
First;
while not Eof do
begin
S1 := FieldByName('Name').AsString;
new(P);
P.sString := FieldByName('AREA').AsString;
Node := TreeView1.Items.Add(nil, S1);
Node.Data := P;
Next;
end;
end;
end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Assigned(Node.data) then
Self.Caption := TMyNode(Node.Data^).sString;
end;