本人不是专业编程,问题很菜。TreeView的 Items需要携带几个整数,用Items.AddChildObject(Node,Str,Pointer(ID)即使分段也不够,Items又是动态的,携带数组也麻烦,于是把ComCtrls.pas复制到我的目录,修改源码ComCtrls.pas
TNodeInfo = record
ImageIndex: Integer;
SelectedIndex: Integer;
StateIndex: Integer;
OverlayIndex: Integer;
Data: Integer;
Count: Integer;
Text: string[255];
AdditionalProperty1:integer; //添加几条就能携带几个数据
....
end;+读写事件
然后把ComCtrls.pas加入工程编译,这种方法可以吗?
是否需要派生一个新的控件?会不会把原始的ComCtrls.pas的和修改的ComCtrls.pas都编译到执行代码?编程
TNodeInfo = record
ImageIndex: Integer;
SelectedIndex: Integer;
StateIndex: Integer;
OverlayIndex: Integer;
Data: Integer;
Count: Integer;
Text: string[255];
AdditionalProperty1:integer; //添加几条就能携带几个数据
....
end;+读写事件
然后把ComCtrls.pas加入工程编译,这种方法可以吗?
是否需要派生一个新的控件?会不会把原始的ComCtrls.pas的和修改的ComCtrls.pas都编译到执行代码?编程
比如:
TObj = class
a,b,c: Integer;//一下就包含了3个整数!
end;
我前面的方式是不是简单一些?
新旧版本的确比较麻烦一个string可以包含几乎任意的record(所有field)了,通过编码的方式(ini或base64)
function AddData(node:TTreeNode):TStrings;
begin
Result := TStringList.Create;
node.Data := Pointer(Result);
end;function GetData(node:TTreeNode):TStrings;
begin
if node.Data <> nil then
Result := TStrings(node.Data);
end;procedure TForm1.FormCreate(Sender: TObject);
var
ts : TStrings;
begin
ts := AddData(TreeView1.Items[0]);
ts.Add('1');
ts.Add('2');
end;procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
ts : TStrings;
begin
ts := GetData(TreeView1.Items[0]);
for i:=0 to ts.Count-1 do
begin
ShowMessage(ts[i]);
end;
end;procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
var
ts : TStrings;
begin
ts := GetData((node);
if ts<>nil then
begin
ts.Free;
node.Data := nil;
end;
end;
只有string是完全自动的