Noch ein paar Tipps:
Statt alle Daten in Edit's oder einer Listbox temporär zu speichern, kannst du dir doch einfach eine Variable deines Typs TDatensatz erstellen.
Delphi-Quellcode:
var
AktDatensatz: TDatensatz;
In diese Variable lädst du nun die Daten aus der Datei und in einer getrennten Prozedur (bspw. ShowValues oder ZeigeWerte) zeigst du die Kontakt-Daten in den Edits usw. an.
Außerdem wäre es sinnvoll Gebrauch vom Typ Boolean bei "Interesse Audio" usw. zu machen, statt einen String in der Form von "J" und "N" zu speichern. Zum einen braucht das mehr Speicher, ist nicht zweckmäßig und außerdem kann es zu Fehlern kommen, wenn du bspw. irgendwo im Code ein kleines "n" verwendest.
Delphi-Quellcode:
type
TDatensatz = record //TDatensatz der immer als Stream gespeichert wird
Vorname: AnsiString;
Name: AnsiString;
Alter: String;
Geburtsdatum: String;
Telefon: String;
Handy: String;
EMail: AnsiString;
PLZ: String;
Ort: AnsiString;
Strasse: AnsiString;
Hausnummer: String;
IntersVI,
InteresFO,
InteresAU: Boolean; // hier
end;
Desweiteren könntest du einfach via "Array of TDatensatz" ein dynamisches Array erstellen. Somit kannst du in einer Datei mehrere Kontakte abspeichern.
Delphi-Quellcode:
var
fAktDatenbank: Array of TDatensatz; // Durch das hier musst du natürlich deine Laden/Speichern Funktionen abändern.
fAktDatenbankSatz: Integer; // zum feststellen, welchen Datensatz der Benutzer gerade ansieht/bearbeitet
fAktDatensatzDatei: String;
Mal ein kurzes Beispiel (habs hier reingetippt, kann also Fehler enthalten, aber ich denke du weißt was ich meine):
Delphi-Quellcode:
function LoadDatensatzDatei(const Value: String): Boolean;
var
Stream: TStream;
I: Integer;
Len: LongInt;
begin
Result := FileExists(Value); // Prüfen ob Dateiname existiert
if not Result then // Falls nicht raus hier
Exit;
SetLength(fAktDatenbank, 0); // Nicht unbedingt notwendig: Array Länge auf 0 setzen
Stream := TFileStream.Create(Value, fmOpenRead); // Datei/Stream öffnen
try
Stream.Read(Len, SizeOf(Len)); // Menge der Datensätze lesen
SetLength(fAktDatenbank, Len); // Array Länge festlegen
for I := 0 to Len - 1 do // Jeden Eintrag lesen
with fAktDatenbank[I] do
begin
// ID
Stream.Read(ID, SizeOf(Integer));
// IntersVI
Stream.Read(IntersVI, SizeOf(Boolean));
// Name
Stream.Read(Len, SizeOf(Len));
SetLength(Name, Len);
Stream.Read(PChar(Name)^, Len);
// ImageIndex
Stream.Read(ImageIndex, SizeOf(Integer));
end;
finally
Stream.Free;
end;
fAktDatensatzDatei := Value; // Dateiname aktualisieren und merken
end;
procedure SaveDatensatzDatei(Value: String);
var
Stream: TStream;
I: Integer;
Len: LongInt;
begin
Stream := TFileStream.Create(Value, fmCreate); // Datei erstellen (ggf. vorher prüfen ob schon da usw.)
try
Len := Length(fAktDatenbank); // Menge der Datenbank-Datensätze ermitteln
Stream.Write(Len, SizeOf(Len)); // Menge schreiben
for I := 0 to Length(fAktDatenbank) - 1 do
with fAktDatenbank[I] do
begin
// ID
Stream.Write(ID, SizeOf(Integer));
// IntersVI
Stream.Write(IntersVI, SizeOf(Boolean)); // Wert von IntersVI schreiben
// Name
Len := Length(Name); // Länge des Strings ermitteln
Stream.Write(Len, SizeOf(Len)); // Länge schreiben
Stream.Write(PChar(Name)^, Len); // String schreiben
// ImageIndex
Stream.Write(ImageIndex, SizeOf(Integer));
end;
fAktDatensatzDatei := Value; // Name der Datei merken
finally
Stream.Free;
end;
end;
Außerdem ist es manchmal sehr übersichtlich mit dem Befehl with ... do zu arbeiten:
statt:
Delphi-Quellcode:
//Jetzt wird alles in einer Listbox gespeichert
Form2.ListBox1.Clear; //Listbox leeren um Platz zu schaffen
Form2.ListBox1.Items.Add(Daten.Vorname); //Hier beginnt die Addung der Daten in die Listbox
Form2.ListBox1.Items.Add(Daten.Name);
Form2.ListBox1.Items.Add(Daten.Alter);
Form2.ListBox1.Items.Add(Daten.Geburtsdatum);
Form2.ListBox1.Items.Add(Daten.Telefon);
Form2.ListBox1.Items.Add(Daten.Handy);
Form2.ListBox1.Items.Add(Daten.EMail);
Form2.ListBox1.Items.Add(Daten.PLZ);
Form2.ListBox1.Items.Add(Daten.Ort);
Form2.ListBox1.Items.Add(Daten.Strasse);
Form2.ListBox1.Items.Add(Daten.Hausnummer);
Form2.ListBox1.Items.Add(Daten.IntersVI);
Form2.ListBox1.Items.Add(Daten.InteresFO);
Form2.ListBox1.Items.Add(Daten.InteresAU);//Hier endet sie
so:
Delphi-Quellcode:
//Jetzt wird alles in einer Listbox gespeichert
with Form2.ListBox1 do
begin
Clear; //Listbox leeren um Platz zu schaffen
Items.BeginUpdate; // beschleunigt das hinzufügen
Items.Add(Daten.Vorname); // Hier beginnt die Addung der Daten in die Listbox
Items.Add(Daten.Name);
Items.Add(Daten.Alter);
Items.Add(Daten.Geburtsdatum);
Items.Add(Daten.Telefon);
Items.Add(Daten.Handy);
Items.Add(Daten.EMail);
Items.Add(Daten.PLZ);
Items.Add(Daten.Ort);
Items.Add(Daten.Strasse);
Items.Add(Daten.Hausnummer);
Items.Add(Daten.IntersVI);
Items.Add(Daten.InteresFO);
Items.Add(Daten.InteresAU); // Hier endet sie
Items.EndUpdate; // mitteilen, dass wir fertig sind
end;
Du solltest dir auch angewöhnen, deinen Code korrekt einzurücken. Dadurch ist er wesentlich besser lesbar.
Und zu guter letzt: du solltest deine Prozeduren/Funktionen nicht unbedingt LoadFromStream/SaveToStream nennen, da es bereits Standardnamen sind. Dabei könnte es bei einem nicht exakten Aufruf (LoadFromStream statt Listbox1.LoadFromStream) zu Fehlern kommen.