Autor Beitrag
MH
Hält's aus hier
Beiträge: 11

Win XP
D3, D2005
BeitragVerfasst: Di 09.12.08 00:21 
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:

ausblenden 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:
ausblenden Delphi-Quelltext
1:
2:
Tier := TTier.Create;
Tier.Geburt.Datum := 01.01.2000//Hier bekomm ich denn die fehlermeldung das die linke Seite nicht zugewisen werden kann

Sicherlich wieder blöß ein dummer fehler :oops:
Ich hoffe das mir hierbei geholfen werden kann :D

Dann erstma
Marco
Logikmensch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 390

Win XP
Delphi 2007 Prof., XE2, XE5
BeitragVerfasst: Di 09.12.08 06:48 
Hallo,

ich glaube, der Compiler ist einfach verwirrt, denn eine Zuweisung wie

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

_________________
Es gibt keine Probleme - nur Lösungen!
Zyklame
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41
Erhaltene Danke: 1

Win 7 Professional
Delphi XE, Visual Studio 2010
BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
2:
function  readGeburt : TGeburt;
procedure writeGeburt(geburt : TGeburt);


Es geht halt nur über diesen Umweg:

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

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 11

Win XP
D3, D2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.