You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中TBoek对象数组赋值重复问题求助

为什么我的TBoek数组所有元素值都完全相同?

这问题我太熟了——你踩了Delphi里引用类型的经典坑!

看你的MaakArray代码,你只在循环外面创建了一次TBoek实例:boek := TBoek.Create;。这意味着整个循环过程中,你始终在操作同一个对象。每次循环把这个对象的引用赋值给arrBoeke[i],然后修改它的属性——本质上,数组里的所有元素都指向同一个内存地址的对象。最后不管你访问数组哪个索引,看到的都是最后一次循环修改后的属性值,自然全一样。

修复方法很简单:把对象创建移到循环内部

每次循环都生成一个全新的TBoek实例,这样数组的每个元素都会指向独立的对象,修改各自的属性就不会互相影响了。修改后的代码如下:

procedure TBoek.MaakArray;
var
  i: integer;
  sTitel, sOuteur, sISBN, sUitgewer, sPrys, sI: string;
  boek: TBoek;
begin
  for i := 0 to 9 do
  begin
    // 关键:每次循环创建新的TBoek实例
    boek := TBoek.Create;
    {$REGION 'Parse JSON om eienskappe van boek te kry'}
    sI := IntToStr(i);
    sTitel := JSONFile.GetValue<string>('items[' + sI + '].volumeInfo.title');
    try
      sOuteur := JSONFile.GetValue<string> ('items[' + sI + '].volumeInfo.authors[0]');
    except
      sOuteur := '<none>'
    end;
    try
      sISBN := JSONFile.GetValue<string> ('items[' + sI + '].volumeInfo.industryIdentifiers[1].identifier');
    except
      sISBN := '<none>'
    end;
    try
      sUitgewer := JSONFile.GetValue<string> ('items[' + sI + '].volumeInfo.publisher');
    except
      sUitgewer := '<none>'
    end;
    try
      sPrys := JSONFile.GetValue<string> ('items[' + sI + '].saleInfo.listPrice.amount');
    except
      sPrys := '0';
    end;
    {$ENDREGION}
    arrBoeke[i] := boek;
    with arrBoeke[i] do
    begin
      SetTitel(sTitel);
      SetOuteur(sOuteur);
      SetISBN(sISBN);
      SetUitgewer(sUitgewer);
      SetPrys(sPrys);
    end;
  end;///end of for loop
end;

额外提醒:注意内存泄漏

因为你手动创建了TBoek实例,记得在不需要这个数组的时候,循环释放每个元素,避免内存泄漏:

var
  i: Integer;
begin
  for i := 0 to High(arrBoeke) do
  begin
    arrBoeke[i].Free;
    arrBoeke[i] := nil;
  end;
end;

简单总结一下:对象是引用类型,你之前的代码相当于给数组的每个位置都贴了同一个对象的地址标签,修改的都是同一个东西。把创建对象的代码移到循环里,每个位置才会对应独立的对象,问题就解决了。

内容的提问来源于stack exchange,提问作者Janrich Cronje

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:37:51