Delphi 如何修改TList<;记录>;价值
德尔福2010 如何修改TListDelphi 如何修改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
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;