代码部分:
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制成可读写的状态了吗,为什么还会有这个问题??谢谢。

解决方案 »

  1.   

    解决方法1:
    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;
      

  2.   

    //这样写
    property RPersonArch: RecPersonArch read FRPersonArch write SETRPersonArch; procedure SetRPersonArch(val:string);
    begin
      FRPersonArch.ID:=val;
    end;
      

  3.   


    //大体看了一下,不知这样行不
    var
      x: RecPersonArch;
    //......
      x.ID := 'abc';
      x.Name:= '12345657';
      PersonArch.RPersonArch := X;
    //......
      

  4.   

    晕,你的可写状态是指 FRPersonArchvar
      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; 
      

  5.   

    http://www.delphibbs.com/keylife/iblog_show.asp?xid=6094
    用这种写法
    type 
      PRecPersonArch = ^RecPersonArch;
      RecPersonArch = Record 
        ID: string; 
        Name: string; 
        ... 
      end; 赋值:
    PRecPersonArch(@PersonArch.RPersonArch)^.ID := ......
      

  6.   

    感谢大家的发言,不过我的record中的字段太多,不太适合做接口函数。
    做一个Temp的变量似乎是比较好,不过不知道是不是我的系统问题,用CopyMemory的时候有时候会出错。
    其实,如果把record改成class,并将所有变量都声明称public,也能解决这个问题。
    我特想知道,是什么原因造成record在Class会变成只能读的。
    record的声明的出来的结构体为什么不能和普通的变量一样用嘛??
    C中的Struct有这个问题吗??
    请大家帮我解惑。谢谢。
      

  7.   

    记录中包含了string类型的话,你直接对该record copymemory肯定是不对的。
    string本身也可以当作是一个指针,你自己sizeof(string)看看不管多长的string都是4个字节。
      

  8.   

    感谢slxx0712为我找出了一个让我迷惑的CopyMemory的问题。
      

  9.   

    记录直接赋值给属性是会这样的,解决方法上面都说了,一用指针,二用Set方法赋值。但是我建议还是用对象比较好,实体对象比记录好的是:1、可以带方法;2、多态
      

  10.   

    type 
      RecPersonArch = Record 
        ID: string; 
        Name: string; 
        ... 
      end;
    应该改为
    type 
      RecPersonArch = Record 
        ID: string; 
        Name: string[1024]; 
        ... 
      end;
    string类在Record里面是要定长的,你的写法不行.