![]() |
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) |
Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
Morgen,
Was für Fehler meinst du denn? An welcher Stelle?
Delphi-Quellcode:
sowas kann man auch abkürzen:
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;
Delphi-Quellcode:
Was machst du wenn strings keine 11 Elemente hat?
Checkbox1.Checked := Form2.ListBox1.Items.Strings[11] = 'J';
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:
Warum hast du dir keine Klasse dafür geschrieben? Das wäre wesentlich übersichtlicher und leichter zu pflegen.
public
ID : Integer; M : Integer; // hier procedure LoadDaten; ... end; var Form1: TForm1; Count : Integer= 0; // hier |
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 |
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? |
Re: Mein Kontaktmanager und ich brauchen Hilfe!!!
Gut also ich schau alles noch mal durch! :(
(Ich nehme jetzt den Download raus weil, ne)... |
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:
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.
var
AktDatensatz: TDatensatz; 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:
Desweiteren könntest du einfach via "Array of TDatensatz" ein dynamisches Array erstellen. Somit kannst du in einer Datei mehrere Kontakte abspeichern.
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;
Delphi-Quellcode:
Mal ein kurzes Beispiel (habs hier reingetippt, kann also Fehler enthalten, aber ich denke du weißt was ich meine):
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;
Delphi-Quellcode:
Außerdem ist es manchmal sehr übersichtlich mit dem Befehl with ... do zu arbeiten:
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; statt:
Delphi-Quellcode:
so:
//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
Delphi-Quellcode:
Du solltest dir auch angewöhnen, deinen Code korrekt einzurücken. Dadurch ist er wesentlich besser lesbar.
//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; 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 12:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz