Delphi 如何修改TList<;记录>;价值

Delphi 如何修改TList<;记录>;价值,delphi,generics,Delphi,Generics,德尔福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]; <- Er

德尔福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
type TTest=记录a、b、c:整数结束;
var列表:TList;
A:测试;
P:指针;
....
....
列表[10]:=A;

您不必对对象执行此操作,因为它们是引用类型(通过编译器内部管理的指针进行访问,以使其远离您的头发),但记录是值类型,因此它不会以这种方式工作。

您在使用记录时遇到了一个障碍

考虑以下代码:

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

List[10]:=A 如果要存储记录,动态数组更适合处理它们:

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
type TTest=记录a、b、c:整数结束;
类型TTestList=TTest的数组;
变量列表:TTestList;
A:测试;
P:指针;
....
....
设置长度(列表,20);

列表[10]:=A// 如果需要操作该表单中的对象,最好使用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;
type TTest=a类、b类、c类:整数端;
var列表:TObjectList;
答:t测试;//A是一个对象,因此不需要指针
....
....
列表.添加(测试.创建);
List.Last.a:=1;
A:=List.Last;

但是属性项是读写的,我认为delphi可以理解items[1]。a:=123 meens items[1]:=TType(123,oldval2,oldval3),但它不。。。重要的不是编译器能做什么,而是它实际能做什么。@Astronavigator:是的,属性是R/W,但您不能直接访问字段。它只返回字段的一个副本。看看梅森的答案,这是一个简单而有力的方法。但是,当记录的大小非常大时,由于局部变量A,堆栈溢出,如果在一个或多个循环中工作,则速度非常慢。荒谬的错误。没有人愿意教它。他们这样做真是太可惜了。
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;