Delphi 2010 如何修改TList<记录>价值?
type TTest = record a,b,c:Integer end;
var List:TList<TTest>;
A:TTest;
P:Pointer;
....
....
List[10] := A; <- OK
List[10].a:=1; <- Here compiler error : Left side cannot be assined to
P:=@List[10]; <- Error: Variable requied
答案 0 :(得分:10)
A := List[10];
A.a := 1;
list[10] := A;
您不必对对象执行此操作,因为它们是引用类型,(通过编译器在内部管理的指针访问以防止它脱离您的头发),但记录是值类型,因此它不起作用那样。
答案 1 :(得分:9)
你使用记录遇到了麻烦。
考虑以下代码:
function Test: TTest;
begin
...
end;
Test.a := 1;
编译器的代码实际上是这样的:
TTest temp := Test;
temp.a := 1;
编译器通过错误消息告诉您,赋值是没有意义的,因为它只会为临时记录值分配一个新值,这将立即被遗忘。
此外,@List[10]
无效,因为List[10]
只返回一个临时记录值,因此获取该记录的地址毫无意义。
然而,读取和写入整个记录是可以的。
总结一下:
List[10] := A; <- writing a whole record is OK
List[10].a:=1; <- List[10] returns a temporary record, pointless assignment
P:=@List[10]; <- List[10] returns a temporary record, its address is pointless
答案 2 :(得分:2)
如果要存储记录,动态数组更适合处理它们:
type TTest = record a,b,c : Integer end;
type TTestList = array of TTest;
var List:TTestList;
A:TTest;
P:Pointer;
....
....
SetLength( List, 20 );
List[10] := A; //<- OK
List[10].a := 1; //<- Ok
P := @List[10]; //<- Not advised (the next SetLength(List,xx) will blow the address away),
// but technically works
如果需要添加方法来操作这些数据,可以将此数组存储为类的字段,并将方法添加到此类中。
答案 3 :(得分:0)
如果您需要操作该表单中的对象,最好使用TObjectList而不是TList,并将结构定义为类而不是记录:
type TTest = class a,b,c:Integer end;
var List:TObjectList<TTest>;
A:TTest; // A is an object so there's no need for a pointer
....
....
List.Add(TTest.Create);
List.Last.a := 1;
A:=List.Last;