在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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |