Einzelnen Beitrag anzeigen

Benutzerbild von dahead
dahead

Registriert seit: 16. Mai 2005
620 Beiträge
 
#6

Re: Mein Kontaktmanager und ich brauchen Hilfe!!!

  Alt 8. Apr 2006, 12:41
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.
  Mit Zitat antworten Zitat