Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Record-Problem: linker Seite kann nichts zugewiesen werden


Nostromo - Fr 05.08.11 21:24
Titel: Record-Problem: linker Seite kann nichts zugewiesen werden
Ich habe extra wegen dieses Problems eine eigene Form erstellt und folgendes definiert:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  TTestRec = record
    x,y : integer;
  end;

  TTestClass = class
  public
    FTest: TTestRec;
  published
    property What : TTestRec read FTest write FTest;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    T : TTestClass;
  end;


Im OnCreate mache ich dann folgendes:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.FormCreate(Sender: TObject);
begin
  T := TTestClass.Create;
  T.What.x := 1;
  T.Free;
end;


Dieser Code kompiliert nicht, denn für die Zeile
T.What.x := 1;
wird behauptet dass der linken Seite nichts zugewiesen werden kann.
WTF????

Ist mein Delphi kaputt?
Oder seh ich den Wald nicht?

Für jeden Kommentar dankbar.


jaenicke - Fr 05.08.11 21:29

Bei T.What.x rufst du zuerst eine Kopie des Records ab und versuchst dann in der Kopie etwas zu ändern. Da das ins Nirwana verschwinden würde, kommt diese Fehlermeldung.

Benutze statt eines Records einfach eine Klasse, dann bekommst du in der Property eine Referenz auf das Objekt und kannst auch darin etwas ändern.


Narses - Fr 05.08.11 23:33

Moin!

Was allerdings geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TTestRec = record
    x,y : integer;
  end;

  TTestClass = class
  public
    FTest: TTestRec;
  published
    property WhatX : Integer read FTest.x write FTest.x;
  end;

begin
  T.WhatX := 1;
Getter/Setter können keine Strukturen bearbeiten, aber durchreichen! :idea:

Oder natürlich direkt (ist ja public):

Delphi-Quelltext
1:
2:
begin
  T.FTest.x := 1;
cu
Narses


Martok - So 07.08.11 03:06

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

Was allerdings geht:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
type
  TTestRec = record
    x,y : integer;
  end;

  TTestClass = class
  public
    FTest: TTestRec;
  published
    property WhatX : Integer read FTest.x write FTest.x;
  end;

begin
  T.WhatX := 1;
Getter/Setter können keine Strukturen bearbeiten, aber durchreichen! :idea:

Wow, das geht?
Das ist ja mal nicht schlecht. Haben wir heute doch noch was gelernt :zustimm:
Sowas hätte ich öfter schonmal gebrauchen können, aber auf sowas kommt man ja nicht :wall:

cu,
Martok


jaenicke - So 07.08.11 08:06

Das geht immer, wenn du ohne Property auf ein Feld zugreifst, weil es dann wie eine einfache Variable ist. Auch an Inc, SetLength usw. kann man das übergeben.

Allerdings finde ich eine Unterklasse in Fällen wie diesem übersichtlicher. ;-)

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Haben wir heute doch noch was gelernt :zustimm:
Ja, das geht mir auch ständig so. In der Branche lernst du nie aus. :mrgreen:


Nostromo - Mo 08.08.11 11:16

Auch wieder was dazu gelernt.
Danke für die Antworten.

Ich muss allerdings records einsetzen, da diese von OpenGL her so übersetzt sind.
Ist halt nur die Frage ob man kapseln will/muss oder nicht.


Narses - Mo 08.08.11 11:45

Moin!

user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Sowas hätte ich öfter schonmal gebrauchen können, aber auf sowas kommt man ja nicht
Steht IIRC sogar in der DOH (D7), da wäre ich von selber auch nicht drauf gekommen. ;) Hab aber leider gerade keine Zeit, das rauszusuchen... :? :nixweiss:

cu
Narses