代码部分:
type
RecPersonArch = Record
ID: string;
Name: string;
...
end; TPersonArch = Class
private
FRPersonArch: RecPersonArch;
......
public
property RPersonArch: RecPersonArch read FRPersonArch write FRPersonArch;
......
end;.........
procedure SetPersonID(sPersonID: string);
var
PersonArch: TPersonArch;
begin
PersonArch:= TPersonArch.Create(nil);
try
PersonArch.RPersonArch.ID := sPersonID;
finally
PersonArch.Free;
end;
end;.........问题:在语法检查的时候报Left side can not be assigned to,请问各位我在类中不是已经将整个RPersonArch制成可读写的状态了吗,为什么还会有这个问题??谢谢。
type
RecPersonArch = Record
ID: string;
Name: string;
...
end; TPersonArch = Class
private
FRPersonArch: RecPersonArch;
......
public
property RPersonArch: RecPersonArch read FRPersonArch write FRPersonArch;
......
end;.........
procedure SetPersonID(sPersonID: string);
var
PersonArch: TPersonArch;
begin
PersonArch:= TPersonArch.Create(nil);
try
PersonArch.RPersonArch.ID := sPersonID;
finally
PersonArch.Free;
end;
end;.........问题:在语法检查的时候报Left side can not be assigned to,请问各位我在类中不是已经将整个RPersonArch制成可读写的状态了吗,为什么还会有这个问题??谢谢。
var
PersonArch: TPersonArch; TempRPersonArch: RecPersonArch; //定义一个临时的结构体成员
begin
PersonArch:= TPersonArch.Create();
try
TempRPersonArch.id := sPersonID;
PersonArch.RPersonArch:= TempRPersonArch;//间接赋值
finally
PersonArch.Free;
end;
end;解决方法2:
在类中输出一个接口函数, TPersonArch = Class
private
FRPersonArch: RecPersonArch;
......
public
property RPersonArch: RecPersonArch read FRPersonArch write FRPersonArch;
......
public
function fun_SetRPersonArchID(aId:String);
end;
function TPersonArch.fun_SetRPersonArchID(aId:String);
begin //不用这一句>>PersonArch.RPersonArch.ID := sPersonID;
FRPersonArch.ID := sPersonID;
end;
property RPersonArch: RecPersonArch read FRPersonArch write SETRPersonArch; procedure SetRPersonArch(val:string);
begin
FRPersonArch.ID:=val;
end;
//大体看了一下,不知这样行不
var
x: RecPersonArch;
//......
x.ID := 'abc';
x.Name:= '12345657';
PersonArch.RPersonArch := X;
//......
rec: RecPersonArch;
begin
PersonArch.RPersonArch:= rec; // 可以直接赋整个记录值,但不能对记录里面的数据赋值。
end;建议你用指针 PRecPersonArch = ^RecPersonArch;
RecPersonArch = Record
ID: string;
Name: string;
...
end; TPersonArch = Class
private
FRPersonArch: RecPersonArch;
function Get: PRecPersonArch;
public
property RPersonArch: PRecPersonArch read Get;
......
end; .........
function Get: PRecPersonArch;
begin
Result:= @FRPersonArch;
end;procedure SetPersonID(sPersonID: string);
var
PersonArch: TPersonArch;
begin
PersonArch:= TPersonArch.Create(nil);
try
PersonArch.RPersonArch^.ID := sPersonID; // 这样就可以
finally
PersonArch.Free;
end;
end;
用这种写法
type
PRecPersonArch = ^RecPersonArch;
RecPersonArch = Record
ID: string;
Name: string;
...
end; 赋值:
PRecPersonArch(@PersonArch.RPersonArch)^.ID := ......
做一个Temp的变量似乎是比较好,不过不知道是不是我的系统问题,用CopyMemory的时候有时候会出错。
其实,如果把record改成class,并将所有变量都声明称public,也能解决这个问题。
我特想知道,是什么原因造成record在Class会变成只能读的。
record的声明的出来的结构体为什么不能和普通的变量一样用嘛??
C中的Struct有这个问题吗??
请大家帮我解惑。谢谢。
string本身也可以当作是一个指针,你自己sizeof(string)看看不管多长的string都是4个字节。
RecPersonArch = Record
ID: string;
Name: string;
...
end;
应该改为
type
RecPersonArch = Record
ID: string;
Name: string[1024];
...
end;
string类在Record里面是要定长的,你的写法不行.