我想将字符串存入treeview节点的Data属性里,然后双击节点时再将Data里存的字符串提取出来。我是这样存的,不知对不对?
myNodeChild.Data := Pointer(ADOQuery2.FieldByName('CP_ID').AsString);如果这样写对的话,那如何提取出来赋值给字符窜变量呢?谢谢!
myNodeChild.Data := Pointer(ADOQuery2.FieldByName('CP_ID').AsString);如果这样写对的话,那如何提取出来赋值给字符窜变量呢?谢谢!
PMyData=^TMyData;
TMyData=record
id:string;
end;
var
p:PMyData;
begin
new(p);
p^.id:=ADOQuery2.FieldByName('CP_ID').AsString;
myNodeChild.Data:=p;.......使用时:
str:=PMyData(myNodeChild.Data)^.id;
type
TMyData = record //申明一个自定义类型, 用于存放Data数据
ID: String; //这里可以多个记录域, 可以不仅仅只有ID
end;
PMyData = ^TMyData;var
MyData : PMyData;
begin
......
new(MyData);
MyData^.ID := ADOQuery2.FieldByName('CP_ID').AsString; //注: MyData^.ID可以省略写成MyData.ID
myNodeChild.Data := MyData;
......
end;
另外, 要在TreeView组件的OnDeletion事件中加上以下代码, 以释放Data数据所占的空间:procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
if Node.Data <> nil then
begin
Dispose(Node.Data);
Node.Data := nil;
end;
end;
如果存入Data属性是integer类型我用下面语句可以提取的
IntToStr(integer(TreeView1.Selected.Data))
Data本身是Pointer类型, 占据4字节空间, Integer(TreeView1.Selected.Data) 是把它强制转换为Integer类型来使用,这个没问题。myNodeChild.Data := Pointer(ADOQuery2.FieldByName('CP_ID').AsString);
保存在myNodeChild.Data里的是 ADOQuery2.FieldByName('CP_ID').AsString 这个字符串的地址,而这个字符串在你下次访问 myNodeChild.Data里的地址已经不存在了,这个有问题。
MyData : PMyData;
begin
......
new(MyData); //这里要申请一个保存ADOQuery2.FieldByName('CP_ID').AsString内容的空间
MyData^.ID := ADOQuery2.FieldByName('CP_ID').AsString;
myNodeChild.Data := MyData; //然后把空间地址保存在myNodeChild.Data中
......
end;
同时,要在回收这个空间,否则会内存泄漏:procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
if Node.Data <> nil then
begin
Dispose(Node.Data);
Node.Data := nil;
end;
end;
str := PChar(myNodeChild.Data)
不好意思!再问一下type
TMyData = record //申明一个自定义类型, 用于存放Data数据
ID: String; //这里可以多个记录域, 可以不仅仅只有ID
end;
PMyData = ^TMyData;这个应该写在那个域里
你可以在TreeView.Data下挂载多个相关信息。只需要修改一下TMyData这个记录类型的定义就行了,比如:
type
TMyData = record
ID: String;
No: Integer;
Checked: Boolean;
end;
PMyData = ^TMyData;
在调用时,相应的代码为(下面以TreeView组件的OnChange事件为例):procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
var
MyData : PMyDaya;
begin
MyData := PMyData(Node.Data);
ShowMessage ('ID :' + MyData.ID);
ShowMessage ('No :' + IntToStr(MyData.No));
......
end;
找到单元里type这部分(一般都在单元的前面), 把
type
TMyData = record
ID: String;
end;
PMyData = ^TMyData;
写进去
unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes;type
TMyData = record //申明一个自定义类型, 用于存放Data数据
ID: String; //这里可以多个记录域, 可以不仅仅只有ID
end;implementationend.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}end.要是在本窗体单元应写那里
PMyData=^TMyData;
TMyData=record
id:string;
end ; TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
p:Pstring;
begin
new(p);
try
p:=adoquery.fieldbyname('XX').asstring;
myNodeChild.Data;
except
delete(p);
end;
...
..
end;
type
PMyData=^TMyData;
TMyData=record
id:string;
end ; TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;