在Delphi XE中有效地更改Generics中的Record成员

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的反馈意见

Dav*_*nan 6

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

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)

  • @teran哇,DLL进入哪里?而这个全新的约束也会排除记录中的TList <>和动态数组. (4认同)
  • +1但你使用的数组索引清除了我一直怀疑的东西...... <g> (3认同)