加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:24:53 所属栏目:大数据 来源:网络整理
导读:如果所述记录在通用结构中,我们不能直接为记录成员分配值. 例如,拥有: typeTMyRec = record Width: integer; Height: integer;end;var myList: TListTMyRec;... myList[888].Width:=1000; //ERROR here: Left side cannot be assigned.... 直到现在,我使用
如果所述记录在通用结构中,我们不能直接为记录成员分配值.

例如,拥有:

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;

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

问题是:如果此记录在通用结构中而不需要在临时var中复制它,如何更改记录的成员?

TIA的反馈意见

解决方法

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

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

如果你确实有一个非常大的记录,那么你最好使用一个类而不是一个记录.因为类的实例是引用,所以应用与上述相同的参数.对于这种方法,您可能更喜欢TObjectList<>到TList<>. TObjectList<>的优势是你可以将OwnsObjects属性设置为True并让列表负责销毁其成员.

然后你可以写

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读