是否可以将记录存储在ListBox的Item.Object属性中?

时间:2010-11-16 04:02:21

标签: 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
  begin
    lbServers.AddObject(server.DisplayName, server);
  end;
end;

3 个答案:

答案 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)您不是通过指针访问记录,而是通过索引访问记录。您只需将记录从一个位置复制到列表中的另一个位置即可重新排序。
缺点是什么?它需要覆盖许多功能,并且检查代码中的错误并不容易,因为它需要在运行时和设计时工作。另请注意,您使用的是记录,而不是类。如果您使用类,则仍需要释放数组中的每个元素。但是记录要复杂得多。