Arrays TList中的数组

Arrays TList中的数组,arrays,delphi,tlist,Arrays,Delphi,Tlist,我把它列在字符串数组中,这里没有太大问题,但是我将抛出数组,我想列出所有将持续的值 它是每次列出的最后一个值。 我想要那样 值1q 值2q 值3q 等等。所以我想在数组中列出所有元素 对不起,我的英语不好 public var { Public declarations } Address : Array Of String; AddressList: Tlist; //Form Create AddressList := Tlist.Create; SetLength(A

我把它列在字符串数组中,这里没有太大问题,但是我将抛出数组,我想列出所有将持续的值

它是每次列出的最后一个值。 我想要那样

值1q

值2q

值3q

等等。所以我想在数组中列出所有元素

对不起,我的英语不好

public  var
  { Public declarations }
  Address : Array Of String;
  AddressList: Tlist;


//Form Create
 AddressList := Tlist.Create;
 SetLength(Address, 3);



//Copy Listview Button
var
  i : integer;
  AItem: TlistItem;
begin
  AddressList.Clear;

  for i := 0 to SelectedListView.Items.Count - 1 do
  begin
    AItem := SelectedListView.Items.Item[i];
    Address[0] := AItem.SubItems[0];
    Address[1] := AItem.Caption;
    Address[2] := AItem.SubItems[1];
    AddressList.Add(Address);
  end;

//Always being counted towards the last value
for i := 0 to AddressList.Count -1 do
    MultiUser.Text := TArrayStr(AddressList[i])[1]);

我在这里看到的问题是,动态数组是托管类型,它依赖于引用计数。只有当数组被正确类型的变量引用时,引用计数才起作用。当您存储到非类型化的
指针
,就像您对
TList
所做的那样,编译器无法正确计算引用

除了这个基本的设计缺陷之外,您的程序中实际上只有一个数组。每次调用
add
时,只需向
TList
对象添加相同的指针。请记住,动态数组是引用类型,没有任何写时拷贝。因此,它们的行为就像真正的参考

如果您有一个现代的Delphi,那么您可以使用一个类型安全的通用容器来解决这个问题。例如
TList
其中
TList
来自
Generics.Collections

对于旧版本的Delphi,您不能期望在
TList
中存储动态数组。那根本不会飞。你可以自己破解这个引用,但是你需要清楚的手和很好的理解。下一个遇到你的代码的程序员会鄙视你

因此,对于Delphi的旧版本,我建议您将
TList
替换为
TObjectList
。将
OwnsObjects
设置为
True
。并将
string
的动态数组替换为
TStringList


传统Delphi的另一种解决方案是使用多维数组:
字符串数组的数组

你的问题是什么?我可以看出你的代码明显的问题是没有正确管理内存。不能将托管对象存储在
t列表中。您真正需要的是
TList
@DavidHeffernan谢谢您的回答。它是每次列出的最后一个值。我想要这样的{Value1q}{Value2q}{Value3q}布拉布拉布拉布拉。所以我想在数组中列出所有元素。你使用哪个版本的Delphi?是的,Delphi版本在这里非常重要。