Joh*_*mas 4 delphi generics records
如果所述记录在通用结构中,我们不能直接为记录成员分配值.
例如,拥有:
type
TMyRec = record
Width: integer;
Height: integer;
end;
var
myList: TList<TMyRec>;
...
myList[888].Width:=1000; //ERROR here: Left side cannot be assigned.
...
Run Code Online (Sandbox Code Playgroud)
直到现在,我使用了一个临时变量来克服这个问题:
var
...
temp: TMyRec;
...
begin
...
temp:=myList[999];
temp.Width:=1000;
myList[999]:=temp;
...
end;
Run Code Online (Sandbox Code Playgroud)
丑陋,缓慢,但有效.但现在我想添加TMyRec一个动态数组:
type
TMyRec = record
Width: integer;
Height: integer;
Points: array or TPoint;
end;
Run Code Online (Sandbox Code Playgroud)
...或任何其他可能变大的数据结构,因此在临时变量中来回复制不是一个可行的选择.
问题是:如果此记录在通用结构中而不需要在临时var中复制它,如何更改记录的成员?
TIA的反馈意见
动态数组变量只是对数组的引用.它作为单个指针存储在记录中.因此,您可以继续使用当前的方法,而无需过多的复制.将元素复制到临时变量只会复制对数组的引用,而不会复制数组的内容.更好的是,如果您要分配数组的项目,那么您根本不需要副本.你可以写:
myList[666].Points[0] := ...
Run Code Online (Sandbox Code Playgroud)
如果你确实有一个非常大的记录,那么你最好使用一个类而不是一个记录.因为类的实例是引用,所以应用与上述相同的参数.对于这种方法,您可能更喜欢TObjectList <>到TList <>.TObjectList <>的优点是您可以将OwnsObjects属性设置为True并让列表负责销毁其成员.
然后你可以写
var
myList: TObjectList<TMyClass>
....
myList[666].SomeProp := NewValue;
Run Code Online (Sandbox Code Playgroud)