Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - linke Seite kann nicht zugewisen werden
MH - Di 09.12.08 00:21
Titel: linke Seite kann nicht zugewisen werden
Moin,
Ich will eine Datenbank über typisierte Dateien realiesieren. Dafür habe ich eine Unit geschrieben die das anlegen und ververwalten der Datensätze übernimmt. Mein Problem liegt jetzt bei dieser Deklaration:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| TGeburt = record Datum: TDate; Bemerkung: TMyString50; end;
TFile = record Geburt: TGeburt end;
TTier = class private fTier: TFile;
public property Geburt: TGeburt read fTier.Geburt write fTier.Geburt; end; |
Und über mein Formular möchte ich jetzt das Geburtsdatum festlegen:
Delphi-Quelltext
1: 2:
| Tier := TTier.Create; Tier.Geburt.Datum := 01.01.2000; |
Sicherlich wieder blöß ein dummer fehler :oops:
Ich hoffe das mir hierbei geholfen werden kann :D
Dann erstma
Marco
Logikmensch - Di 09.12.08 06:48
Hallo,
ich glaube, der Compiler ist einfach verwirrt, denn eine Zuweisung wie
Delphi-Quelltext
1:
| Tier.Geburt.Datum := 01.01.2000; |
mit einer direkten Datumseingabe lässt Delphi nicht zu. Benutze lieber eine Konvertierfunktion, die aus einem Datumsstring ein TDate macht. Such mal unter "Datum" hier im Forum.
Zyklame - Di 09.12.08 11:21
Abgesehen davon das das Datum konvertiert werden muss, funktioniert das nicht, weil Delphi aus der
property intern 2 funktionen macht
Delphi-Quelltext
1: 2:
| function readGeburt : TGeburt; procedure writeGeburt(geburt : TGeburt); |
Es geht halt nur über diesen Umweg:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm1.Button1Click(Sender: TObject); var geburt : tGeburt; begin geburt := Tier.Geburt; geburt.Datum := StrToDate('12.06.08'); Tier.Geburt := geburt; end; |
aber vieleicht kennt jemand eine Bessere Lösung.
jaenicke - Di 09.12.08 13:33
Abgesehen davon, dass die Struktur so etwas komisch aussieht (da gäbe es sicher eine schönere Lösung):
Das Problem lässt sich sehr einfach umgehen: Wenn man für TGeburt keinen Record verwendet, dann geht das. Wenn das stattdessen eine Klasse ist, dann ist fTier.Geburt intern ein Zeiger auf das Objekt und dann kann man dieses auch verändern.
Dafür muss aber diese Klasse immer erst erzeugt werden.
Bei Verwendung eines Records bekommst du praktisch eine Kopie des Records, und wenn du darin etwas ändern könntest, dann würde sich das nicht auf den echten Record auswirken.
MH - Mi 10.12.08 08:00
@ jaenicke Das mit der Klasse funktioniert. Dafür schon mal sehr vielen Dank.
Aber wie meinst du das mit der Struktur? Könntest du evtl. einen Vorschlag machen wie ich das besser machen könnte? Denn ich merke jetzt am Anfang schon das ich den Überblick verliere :?
jaenicke - Mi 10.12.08 14:04
Nun ja, anstatt sich an mehreren typisierten Dateien festzuklammern würde ich die einzelnen Bestandteile selbst speichern. Dann musst du die Daten nicht auf mehrere Dateien verteilen und kannst den Inhalt von TFile z.B. direkt in TTier legen.
Ich mache das, wenn ich keine echte Datenbank verwende, meistens so, dass ich jeder Klasse die Methoden SaveToStream und LoadToStream verpasse. In der Datei speichere ich dann zuerst einen Header mit Informationen über die Programmversion etc. und speichere danach den Inhalt.
Wenn ich dann in einer späteren Version das Dateiformat verändere, dann erkenne ich das am Header und kann ggf. eine Konvertierung in das neue Format durchführen.
Bei einem meiner Programme habe ich das Dateiformat zudem so aufgebaut, dass eine ältere Version die Daten ohne Probleme noch lesen konnte und die neue zusätzliche Informationen so darin gespeichert hat, dass die alte Version das nicht gestört hat. Dafür hatte ich bereits für ggf. neue Versionen entsprechende Kompatibilitätsinformationen vorgesehen. Das nur als Beispiel was bei einem eigenen Format alles möglich ist.
Ich finde diese Lösung jedenfalls sehr viel einfacher und trotzdem flexibler, zudem müssen z.B. Strings so keine feste Länge haben. Außerdem wird die Datenstruktur im Programm so kompakter und übersichtlicher, da man nicht auf die Speicherung achten muss sondern auf logische Zusammenhänge achten kann beim Entwurf der Strukturen.
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!