“Left side cannot be assigned to” for record type properties in Delphi

前端 未结 8 1010
夕颜
夕颜 2020-12-01 16:09

I\'m curious to know why Delphi treats record type properties as read only:

  TRec = record
    A : integer;
    B : string;
  end;

  TForm1 = class(TForm)
         


        
8条回答
  •  没有蜡笔的小新
    2020-12-01 16:45

    Because you have implicit getter and setter functions and you cannot modify the Result of a function as it is a const parameter.

    (Note: In case you transform the record in an object, the result would actually be a pointer, thus equivalent to a var parameter).

    If you want to stay with a Record, you have to use an intermediate variable (or the Field variable) or use a WITH statement.

    See the different behaviors in the following code with the explicit getter and setter functions:

    type
      TRec = record
        A: Integer;
        B: string;
      end;
    
      TForm2 = class(TForm)
      private
        FRec : TRec;
        FRec2: TRec;
        procedure SetRec2(const Value: TRec);
        function GetRec2: TRec;
      public
        procedure DoSomething(ARec: TRec);
        property Rec: TRec read FRec write FRec;
        property Rec2: TRec  read GetRec2 write SetRec2;
      end;
    
    var
      Form2: TForm2;
    
    implementation
    
    {$R *.dfm}
    
    { TForm2 }
    
    procedure TForm2.DoSomething(ARec: TRec);
    var
      LocalRec: TRec;
    begin
      // copy in a local variable
      LocalRec := Rec2;
      LocalRec.A := Arec.A; // works
    
      // try to modify the Result of a function (a const) => NOT ALLOWED
      Rec2.A := Arec.A; // compiler refused!
    
      with Rec do
        A := ARec.A; // works with original property and with!
    end;
    
    function TForm2.GetRec2: TRec;
    begin
      Result:=FRec2;
    end;
    
    procedure TForm2.SetRec2(const Value: TRec);
    begin
      FRec2 := Value;
    end;
    

提交回复
热议问题