Autor Beitrag
Nostromo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33
Erhaltene Danke: 1

Win 7 Pro 64bit, Win XP SP3
Delphi 7 Ent
BeitragVerfasst: Fr 05.08.11 21:24 
Ich habe extra wegen dieses Problems eine eigene Form erstellt und folgendes definiert:

ausblenden 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 05.08.11 23:33 
Moin!

Was allerdings geht:
ausblenden 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):
ausblenden Delphi-Quelltext
1:
2:
begin
  T.FTest.x := 1;
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.

Für diesen Beitrag haben gedankt: BenBE, Martok
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 07.08.11 03:06 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Moin!

Was allerdings geht:
ausblenden 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

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 33
Erhaltene Danke: 1

Win 7 Pro 64bit, Win XP SP3
Delphi 7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.