我有一个记录,我想为添加到列表框的每个项目存储。我是否需要将记录改为课程才能完成此任务?
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;
答案 0 :(得分:5)
不,但您可以通过一些类型转换存储指向此记录的指针。但是,你进入动态记录指针分配,这可能有点令人头疼。为什么不将TServerRec变成对象?
答案 1 :(得分:5)
尝试声明你这样的结构
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
函数来释放每个分配对象的内存。
答案 2 :(得分:0)
去过那里,做到了。我通过从TListbox类派生一个新类来解决类似的问题,该类包括我想要保持链接的记录的动态数组。您需要覆盖几个TListbox方法,以使动态数组与列表框中的项保持同步,但它有一些优点。例如,动态记录数组不需要分配或取消分配内存。您只需将数组的长度设置为等于列表中的项目数。 (SetLength
)您不是通过指针访问记录,而是通过索引访问记录。您只需将记录从一个位置复制到列表中的另一个位置即可重新排序。
缺点是什么?它需要覆盖许多功能,并且检查代码中的错误并不容易,因为它需要在运行时和设计时工作。另请注意,您使用的是记录,而不是类。如果您使用类,则仍需要释放数组中的每个元素。但是记录要复杂得多。