如何修改TList <record>值?</record>

时间:2010-04-30 20:24:41

标签: delphi generics

Delphi 2010 如何修改TList&lt;记录&gt;价值?

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

4 个答案:

答案 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;