Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Mein Kontaktmanager und ich brauchen Hilfe!!! (https://www.delphipraxis.net/67028-mein-kontaktmanager-und-ich-brauchen-hilfe.html)

Neutron 8. Apr 2006 09:45


Mein Kontaktmanager und ich brauchen Hilfe!!!
 
Dank euren Tipps hab ich das Grundgerüst des Kontakmanagers fertig gekriegt! :-D Danke!

Problem: Ich hab sehr viele Variationen ausprobiert (vielleicht zu viele)
und jetzt tauchen überall Fehler auf. Wahrscheinlich hab ich irgendwo mal
vergessen eine alte procedure zu löschen. Ich selbst scheine meine Fehler
nicht zu erkennen oder ich überlese sie einfach! :wall:

Ihr könnt euch den Kontaktmanager ja mal Downloaden und den Quellcode überfliegen (Ich hab sehr viel mit Kommentaren gearbeitet).

Wenn euch irgendwas seltsam erscheint oder ihr meint das gehört da nicht hin oder ihr sonst irgend ein Fehler seht
dann Meldet euch bitte noch mal!

Danke im voraus!

(Der Download wurde entfernt)

dahead 8. Apr 2006 10:09

Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
 
Morgen,

Was für Fehler meinst du denn? An welcher Stelle?

Delphi-Quellcode:
if Form2.ListBox1.Items.Strings[11] = 'J' then
begin                                              
CheckBox1.Checked := True;
end
else
if Form2.ListBox1.Items.Strings[11] = 'N' then
begin
CheckBox1.Checked := False;
end;
sowas kann man auch abkürzen:

Delphi-Quellcode:
Checkbox1.Checked := Form2.ListBox1.Items.Strings[11] = 'J';
Was machst du wenn strings keine 11 Elemente hat?
Warum haben sämtliche Controls keine vernünftige Namen?
Wie stellst du sicher, dass der Ordner "Speicher" existiert, bzw. dass du darin schreiben kannst?

Warum deklarierst du deine Variablen nicht alle an einer Stelle?

Delphi-Quellcode:
  public
    ID : Integer;
    M : Integer; // hier
    procedure LoadDaten;
    ...
  end;

var
  Form1: TForm1;
  Count : Integer= 0; // hier
Warum hast du dir keine Klasse dafür geschrieben? Das wäre wesentlich übersichtlicher und leichter zu pflegen.

Nicodius 8. Apr 2006 10:19

Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
 
das mit den kalssen sit wohl das größte manko - in deinem code hat man 0 üebrsicht sry :|

gib mal vernünftige namen, prüf die zulässigen bereiche, step dein programm mal durch(haltepunkt, f7)

grüße Nico

Neutron 8. Apr 2006 10:34

Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
 
Also das sind jetzt sehr viele Sachen auf einmal aber ich versuche alle zu beantworten! :roll:

Ich glaube die Var 'Count' benutze ich gar nicht mehr!
Danke schon mal fürs aufmerksam machen.

Zu den vernümpftigen Namen also ich dachte erst das ich das Project gar nicht allein hinbekomme
tja hat doch funktioniert...
Aber jetzt steck ich schon zu tief drin als das ich noch
alles umbenennen kann!

Ich hatte schon eine Klasse (TDatein) Angelegt aber das hat alles nicht
hingehauen (schlimmer als jetzt) und daher hab ich sie dann wieder gelöscht!

Wie gesagt ich hab viel herum probiert!

Bei dem Ortner Speicher gehe ich einfach davon aus das er Existiert bzw. das man darin schreiben kann.

Danke! :-D Ist dir sonst noch etwas ins Auge gestochen z.B. :
Warum er wenn er beendet immer die Procedure (LoadfromStream) als Fehler markiert,
aber da die Procedure am ende ja eigentlich nicht aufgerufen
wird ist das doch völlig unmöglich oder?

Neutron 8. Apr 2006 10:44

Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
 
Gut also ich schau alles noch mal durch! :(
(Ich nehme jetzt den Download raus weil, ne)...

dahead 8. Apr 2006 12:41

Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz