property - Setxxx wird nicht aufgerufen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6914
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

property - Setxxx wird nicht aufgerufen

Beitrag von Mathias »

Wieso wird beim Button-Click SetVec nicht aufgerufen ?
Aber der Wert Vec.b wird trotzdem angenommen.

Code: Alles auswählen

  { TVec }
 
  TVec = class
    a, b, c: integer;
  end;
 
  { TTest }
 
  TTest = class
  private
    FVec: TVec;
    procedure SetVec(AValue: TVec);
  public
    property Vec: TVec read FVec write SetVec;
 
    constructor Create;
    destructor Destroy; override;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TTest }
 
procedure TTest.SetVec(AValue: TVec);
begin
  WriteLn('SetVec');
  FVec := AValue;
  with FVec do begin
    WriteLn(a, ' ', b, ' ', c);
  end;
end;
 
constructor TTest.Create;
begin
  inherited Create;
  FVec := TVec.Create;
end;
 
destructor TTest.Destroy;
begin
  FVec.Free;
  inherited Destroy;
end;
 
var
  Test: TTest;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Test.Vec.b := 10;
 
  with Test.Vec do begin
    WriteLn('Click: ', a, ' ', b, ' ', c);
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Test := TTest.Create;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: property - Setxxx wird nicht aufgerufen

Beitrag von mse »

Weil nur ein Feld einer gelesenen record-Property angesprochen wird.

Mathias
Beiträge: 6914
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: property - Setxxx wird nicht aufgerufen

Beitrag von Mathias »

Kann man dies umgehen, das SetVec trotzdem aufgerufen wird ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: property - Setxxx wird nicht aufgerufen

Beitrag von theo »

Getten und dann setten?

AVec:=Test.Vec;
AVec.blah:=blah,
Test.Vec:=AVec;

Nicht getestet.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: property - Setxxx wird nicht aufgerufen

Beitrag von mse »

Code: Alles auswählen

 
procedure TForm1.Button1Click(Sender: TObject);
var
 vec1: tvec;
begin
 vec1:= Test.Vec;
 vec1.b:= 10;
 Test.Vec := vec1;
 
Nicht sehr effizient. Effizienter wäre für die record-Felder einzelne properties einzuführen.

Antworten