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 public 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
Narses hat folgendes geschrieben : |
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. ;-)
Martok hat folgendes geschrieben : |
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!
Martok hat folgendes geschrieben : |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!