Delphi 是否可以将记录存储在列表框中';对象属性?
我想为添加到列表框的每个项目存储一个记录。我是否需要将记录改为一个类来完成此任务Delphi 是否可以将记录存储在列表框中';对象属性?,delphi,listbox,listboxitem,Delphi,Listbox,Listboxitem,我想为添加到列表框的每个项目存储一个记录。我是否需要将记录改为一个类来完成此任务 TServerRec = record ID: integer; DisplayName: string; Address: string; Port: integer; end; procedure TMainForm.PopuplateServers; var server: TServerRec; begin for server in FServerList do
TServerRec = record
ID: integer;
DisplayName: string;
Address: string;
Port: integer;
end;
procedure TMainForm.PopuplateServers;
var
server: TServerRec;
begin
for server in FServerList do
begin
lbServers.AddObject(server.DisplayName, server);
end;
end;
没有,但是你可以存储一个指向这个记录的指针,并进行一些类型转换。但接下来您将进入动态记录指针分配,这可能有点令人头痛。为什么不将TServerRec变成一个对象?试着像这样声明您的结构
type
PServerRec = ^TServerRec;
TServerRec = record
ID: integer;
DisplayName: string[255];
Address: string[255];
Port: integer;
end;
//now filling your list of objects
procedure TForm1.Button1Click(Sender: TObject);
const
Max=10;
var
FServerList : Array [1..Max] of PServerRec;
server : PServerRec;
i : Integer;
begin
for i := 1 to Max do
begin
new(server);
server^.DisplayName:='Server '+IntToStr(i);
FServerList[i]:=server;
end;
for server in FServerList do
begin
lbServers.Items.AddObject(server.DisplayName, TObject(server));
end;
end;
//now to retrieve the info
procedure TForm1.lbServersDblClick(Sender: TObject);
var
server : TServerRec;
begin
server:=PServerRec(lbServers.Items.Objects[lbServers.ItemIndex])^;
ShowMessage(server.DisplayName);
end;
不要忘记调用
dispose
函数来释放分配的每个对象的内存。在那里,就这样做了。我通过从TListbox类派生一个新类解决了类似的问题,该类包含一个我希望保持链接的记录的动态数组。您需要重写几个TListbox方法,以使动态数组与列表框中的项保持同步,但它有一些优点。例如,记录的动态数组不需要分配或取消分配内存。您只需要将数组的长度设置为列表中的项目数。(SetLength
)您不是通过指针而是通过索引访问记录。您只需将记录从列表中的一个位置复制到另一个位置,即可对其重新排序。缺点是什么?有很多功能需要重写,而且检查代码中的错误并不容易,因为它需要在运行时和设计时工作。还要注意,您使用的是记录,而不是类。如果改用类,那么仍然需要释放数组中的每个元素。但是记录要简单得多。没有真正的原因,我想我会选择对象路线。我只是不确定我是否错过了一些有记录的东西。感谢您为输入RRUZ提供的ReplyTanks,我只是继续将TServerRec作为一个对象。没有太多的工作要做,也许一开始就应该做。