Entwickler-Ecke

Sonstiges (Delphi) - Kontaktliste mit Delphi


theSonGoku - Mi 22.07.09 20:10
Titel: Kontaktliste mit Delphi
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. - Mi 22.07.09 20:15

Suche in: Delphi-Forum, Delphi-Library INI, Suche in: Delphi-Forum, Delphi-Library XML, Suche in: Delphi-Forum, Delphi-Library TYPISIERTE DATEI, Datenbank...


jasocul - Do 23.07.09 09:36

Falls Du es mit typisierten Dateien machen möchtest: Ein Beispiel [http://jasocul.de/html/typisierte_dateien.html]
Ist aber ein ziemliches altes Beispiel von mir und soll eigentlich nur den Umgang mit typisierten Dateien zeigen.


mkinzler - Do 23.07.09 10:38

Wobei Strukturen in typisierte Dateien schlecht änderbar sind.


Yogu - 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=http://www.yogularm.de/game]Yogularm[/url]:


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:


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:


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.