Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Problem mit record
1aa - Do 17.01.13 00:44
Titel: Problem mit record
Arbeite mich gerade etwas weiter in die OOP ein und dazu jetzt eine frage:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| unit U_Personen;
[...] Type TStamm = Record Anrede : String; Nachname : String; Vorname : String; Geburtsname : String; Geburtsdatum : TDate; Namenszusatz : String; end;
[...] End;
TPersonen = Class Private [...] iStamm : TStamm Protected function getStamm: TStamm; procedure SetStamm(Const Value :TStamm); public [...] property Stamm : TStamm read getStamm write setStamm; end;
implementation
[...]
Function TPersonen.getStamm:TStamm; begin result.Anrede:=''; end;
Procedure TPersonen.SetStamm; begin end;
[...] |
wenn ich jetzt versuche einen wert zu setzen bekomme ich die fehlermeldung der linken seite kann nichts zu gewiesen werden...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| unit Unit1;
interface
uses U_Personen [...]
type TForm1 = class(TForm) Button1: TButton; [...] procedure Button1Click(Sender: TObject); [...] private [...] public Personen : TPersonen; end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Personen:=TPersonen.create; Personen.Stamm.Anrede := Edit1.text;
end;
[...] |
bestimmt nur wieder ein Denkfehler....
danke für eure Hilfe
Tranx - Do 17.01.13 05:40
1aa hat folgendes geschrieben : |
| Arbeite mich gerade etwas weiter in die OOP ein und dazu jetzt eine frage: |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Function TPersonen.getStamm:TStamm; begin Result := iStamm; end;
Procedure TPersonen.SetStamm(Value : TStamm); begin iStamm := Value; end;
[...] |
Versuche es mal damit.
Am Besten nach dem Schreiben der Property-Zeile in der Klasse CTRL+SHIFT+C drücken. Dann werden sowohl die notwendigen Deklarationen von ReadStamm und SetStamm erzeugt, sowie im Implementation-Teil die Funktion und Prozedur (leer) angelegt.
Und das mit dem Result.Anrede := '' bitte weglassen, weil es dann bei dem Aufruf Stamm := jedesmal sofort die Anrede löscht. Das heißt, dass eine Zuweisung Stamm.Anrede := 'Frau ' nicht funktionert, vor allem, wenn nachher Stamm.Vorname := 'Vera' steht. Du hast a) bei der Funktion nicht wirklich iStamm übergeben und b) dem Wert iStamm etwas übergeben.
Blup - Do 17.01.13 10:56
Der Setter sollte den Record-Parameter schon als "const" übergeben bekommen.
Delphi-Quelltext
1:
| procedure SetStamm(const Value: TStamm); |
Sonst wird zwei mal eine Kopie von TStamm erzeugt, einmal beim Aufruf der Funktion und einmal bei der Zuweisung von iStamm.
Membervariablen werden üblicherweise mit einem "F" am Anfang gekennzeichnet (also eigentlich FStamm).
Diese Zuweisung kann aber dennoch nicht funktionieren:
Delphi-Quelltext
1:
| Personen.Stamm.Anrede := Edit1.text; |
Es erfolgt keine direkte Zuweisung auf Personen.Stamm, deshalb wird hier nur der Getter aufgerufen.
Dieser erzeugt eine Kopie von iStamm und die Anrede der Kopie würde verändert werden, nicht die von iStamm.
Aktuelle Delphiversionen erkennen das als Unfug und zeigen eine Fehlermeldung.
Wenn TStamm ebenfalls eine Klasse währe, würde die direkte Zuweisung auf Anrede funktionieren, da Objekte immer als Referenz übergeben werden.
Eine Möglichkeit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var lStamm: TStamm; begin lStamm := Personen.Stamm; lStamm.Anrede := Edit1.text; Personen.Stamm := lStamm; end; |
1aa - Do 17.01.13 14:48
Danke jetzt Funktioniert es....
| Zitat: |
| Membervariablen werden üblicherweise mit einem "F" am Anfang gekennzeichnet (also eigentlich FStamm) |
wusste ichs doch.... bin immer noch zu blöd zum lesen.... :D ... gleich mal mit korrigiert
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!