gpt4 book ai didi

delphi - 在 Delphi XE 中高效更改泛型中的记录成员

转载 作者:行者123 更新时间:2023-12-03 15:26:00 25 4
gpt4 key购买 nike

据我所知,如果所述记录处于通用结构中,我们无法直接为记录成员分配值。

例如,具有:

type

TMyRec = record
Width: integer;
Height: integer;
end;

var
myList: TList<TMyRec>;


...
myList[888].Width:=1000; //ERROR here: Left side cannot be assigned.
...

到目前为止,我使用了临时变量来克服这个问题:

var
...
temp: TMyRec;
...

begin
...
temp:=myList[999];
temp.Width:=1000;
myList[999]:=temp;
...
end;

丑陋、缓慢,但有效。但现在我想向 TMyRec 添加一个动态数组:

type
TMyRec = record
Width: integer;
Height: integer;
Points: array or TPoint;
end;

...或任何其他可能变得很大的数据结构,因此在临时变量中来回复制不是一个可行的选择。

问题是:当记录处于通用结构中时,如何更改记录的成员而不需要将其复制到临时变量中?

TIA 寻求您的反馈

最佳答案

动态数组变量只是对数组的引用。它作为单个指针存储在记录中。因此,您可以继续当前的方法,而无需进行过多的复制。将元素复制到临时变量仅复制对数组的引用,而不复制数组的内容。更好的是,如果您要分配给数组的项目,那么您根本不需要副本。你可以写:

myList[666].Points[0] := ...

如果您确实有一条很大的记录,那么您最好使用类而不是记录。因为类的实例是引用,所以与上面相同的论点适用。对于这种方法,您可能更喜欢 TObjectList<> 而不是 TList<>。 TObjectList<>的优点是你可以将OwnsObjects属性设置为True并让列表负责销毁其成员。

然后你可以写

var
myList: TObjectList<TMyClass>
....
myList[666].SomeProp := NewValue;

关于delphi - 在 Delphi XE 中高效更改泛型中的记录成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9715300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com