TList中的数组

时间:2014-03-22 11:42:13

标签: arrays delphi tlist

我在这里输入字符串数组并不是什么大问题,但是我要抛出数组我希望列出所有值将会持续。

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

Value1q

Value2q

Value3q

bla bla。所以在数组中的TList我想列出所有元素。

抱歉我的英文不好

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]);

1 个答案:

答案 0 :(得分:7)

我在这里看到的问题是动态数组是托管类型,它依赖于引用计数。只要数组由正确类型的变量引用,引用计数才有效。当您使用Pointer存储到无类型TList时,编译器无法正确计算引用。

除了基本的设计缺陷之外,你的程序实际上只有一个数组。每次调用TList时,只需向Add对象添加相同的指针即可。请记住,动态数组是引用类型,没有任何写入时复制。所以他们表现得像真正的参考。

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

对于旧版本的Delphi,您不能指望在TList中存储动态数组。那根本不会飞。你可以自己破解引用计数,但你需要清楚地掌握并理解。遇到代码的下一个编码器会鄙视你。

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

传统Delphi的另一种解决方案是使用多维数组:array of array of string