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作为一个对象。没有太多的工作要做,也许一开始就应该做。