【问题标题】:Is it possible to store a record in a ListBox's Item.Object property?是否可以在 ListBox 的 Item.Object 属性中存储记录?
【发布时间】:2010-11-16 04:02:20
【问题描述】:

我有一条记录,我想为添加到列表框中的每个项目存储它。我是否需要将记录改为类来完成此操作?

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;

【问题讨论】:

    标签: delphi listbox listboxitem


    【解决方案1】:

    不,但是您可以通过一些类型转换来存储指向该记录的指针。但是随后您将进入动态记录指针分配,这可能有点令人头疼。为什么不把 TServerRec 做成一个对象呢?

    【讨论】:

    • 没有真正的理由,我想我会走对象路线。我只是不确定我是否遗漏了一些记录。感谢回复
    【解决方案2】:

    尝试像这样声明你的结构

    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 函数来释放每个已分配对象的内存。

    【讨论】:

    • 感谢 RRUZ 的输入,我只是继续将 TServerRec 设为对象。没有太多工作要做,而且可能真的应该是一开始就做的。
    【解决方案3】:

    去过那里,做到了。我通过从 TListbox 类派生一个新类解决了类似的问题,其中包括我想要保持链接的记录的动态数组。您将需要重写几个 TListbox 方法以使动态数组与列表框中的项目保持同步,但它有一些优点。例如,动态记录数组不需要分配或取消分配内存。您只需将数组的长度设置为等于列表中的项目数。 (SetLength) 您不是通过指针而是通过索引访问记录。您只需将记录从列表中的一个位置复制到另一个位置,即可对其重新排序。
    缺点?它有很多功能需要被覆盖,而且检查代码中的错误并不容易,因为它需要在运行时和设计时工作。另请注意,您使用的是记录,而不是类。如果您改用类,那么您仍然需要释放数组中的每个元素。但是记录要简单得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多