Autor Beitrag
theSonGoku
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 29



BeitragVerfasst: Mi 22.07.09 20:10 
Hallo,

ich möchte mir in Delphi ein Programm schreiben, in dem ich dann Name, Vorname, Adresse etc. von meinen bekannten etc. eintragen, abspeichern und wieder abrufen kann.

Nun meine Frage. Wie kann ich die Datensätze in einer Datei speichern? Ich kann sie ja schlecht im Programm speichern.


mfG
Thomas
Andreas L.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1703
Erhaltene Danke: 25

Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
BeitragVerfasst: Mi 22.07.09 20:15 
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 23.07.09 09:36 
Falls Du es mit typisierten Dateien machen möchtest: Ein Beispiel
Ist aber ein ziemliches altes Beispiel von mir und soll eigentlich nur den Umgang mit typisierten Dateien zeigen.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 23.07.09 10:38 
Wobei Strukturen in typisierte Dateien schlecht änderbar sind.

_________________
Markus Kinzler.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 23.07.09 13:57 
Eine andere Möglichkeit: Suche in der Entwickler-Ecke STREAMS.

Beispiele für das Arbeiten mit Streams findest du hier genug. Ich möchte nur auf den interessanten Teil eingehen. Für eine Datei brauchst du immer ein Format. Hier eine Definition für ein Level-Dateiformat von [url=www.yogularm.de/game]Yogularm[/url]:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
#FileType
4u  File Version

#META
4u  Meta Size
STRING  Meta (Name=Value;Name=Value...)

#STONES
4u  Stone Count
{
4u  Stone Type
4  X
4  Y
1u  Status-Byte
    Bit0  Visible
4u  Extra Count
{
4u  Extra ID
4u  Extra Data Length
Data  Extra Data
}
}

Die Rauten leiten Kommentare ein. Sonst steht vor dem Tab immer der Datentyp (4u = 4 Bytes unsigned = Cardinal; 4 = 4 Byte signed = Integer ...). Dahinter steht eine kurze Beschreibung. Geschweifte Klammern ({ und }) zeigen, dass dieser Bereich beliebig oft wiederholt werden kann.

Für dein Adressbuch könnte das in etwa so aussehen:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#Einträge
4u  Anzahl der Einträge
{
4u  Anzahl der Felder
{
4u  Länge des Feldnamens
STRING  Feldname
4u  Länge des Feldinhaltes
STRING  Feldinhalt
}
}

Dabei hast du die Möglichkeit, weitere Felder hinzuzufügen. Felder sind z.B. Name, Adresse, Telefonnummer etc. Die Inhalte werden immer als String gespeichert.

Jetzt geht's an die Speichermethode:

ausblenden Pseudocode
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Write(Adressbuch.Count);
for i := 0 to Adressbuch.Count-1 do
begin
  Write(3);
  for j := 0 to 2 do
  begin
    Write(4);       // Länge von "NAME"
    Write('NAME');
    Write(Length(Adressbuch[i].Name);
    Write(Adressbuch[i].Name);

    Write(7);       // Länge von "PRENAME"
    Write('PRENAME');
    Write(Length(Adressbuch[i].PreName);
    Write(Adressbuch[i].PreName);

    Write(7);       // Länge von "ADDRESS"
    Write('ADDRESS');
    Write(Length(Adressbuch[i].Address);
    Write(Adressbuch[i].Address);
  end;
end;

Write solltest du durch Stream.Write ersetzen. Wie genau du mit Streams arbeitest, liest du wie schon gesagt am besten im Forum nach. Die Lesemethode ist etwas komplizierter, sollte aber auch kein Problem darstellen.

Ihabe drei Dateiformate in der Art entwickelt, die auch sehr zuverlässig funktionieren. Ich schreibe an den Anfang immer noch eine Dateitypversion. Wenn's dann beim Lesen knallt und die Dateitypversionen nicht übereinstimmen, dann kommt eine Meldung in der steht, dass vielleicht ein Programmupdate erforderlich ist. Abwärtskompatibilität ist kein Problem (neue Programmversionen können alle älteren Dateitypversionen lesen).

Der Vorteil zu XML-Dateien ist der, dass solche Streamdateien weniger Platz benötigen. Und INI-Dateien sind in ihren Möglichkeiten sehr beschränkt. Und typisierte Dateien sind eigentlich veraltet, da keine Streams verwendet werden können. Streams haben eben den Vorteil, dass man auch mal schnell in die Zwischenablage oder in den RAM anstatt in eine Datei schreiben kann.

Wenn du Fragen zu den einzelnen Punkten hast (hast du bestimmt - das war sehr oberflächlich), dann stelle sie hier.