Na, dann lass uns dass dochmal durchgehen, hast dich da glaube ich ziemlich verrannt..
Quelltext
1:
| Label3.Caption := 'Die Listbox hat' + Inttostr(Listbox1.Items.Count) + 'Zeilen'; |
Richtig
Quelltext
1:
| Zeile := Listbox1.Items[2]; |
Hier lädst du den 3. Eintrag der Liste (ListBox1) in die Variable Zeile
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| posi := 2;
if (Zeile[posi]<>'"') then begin repeat nr := nr + Zeile[posi]; posi := posi+1; until (Zeile[posi] = '"'); end; |
Die Integervariable posi setzt du auf zwei, du willst also alle Zeichen in "nr" schreiben bis zum ersten mal das Zeichen " auftaucht. Das erste Zeichen lässt du dabei weg. Der Code sieht aus als würde er funktionieren, doch schön ist er nicht. Ungetestet würde ich ihn hierdurch ersetzen:
Quelltext
1: 2: 3: 4: 5:
| while Zeile[posi]<>'"' do begin nr := nr+Zeile[posi]; inc(posi); end; |
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| nr_e.Text := nr;
if vorhanden(Listbox2,nr_e.text) then begin Showmessage('Diese nummer ist schon vorhanden'); Einlesen.enabled := false; Listbox1.Items.Delete(2); end else begin Listbox2.Items.Add (nr_e.text); Listbox2.Items.Savetofile('[Laufwerksbuchstabe]:\[Pfad]\[Verzeichnis]\*.txt'); Einlesen.enabled := true; end; end; |
Ich nehme jetzt mal an, dass "nr_e" ein EditFeld ist. (Oder ein Record?)
Doch was soll vorhanden() für eine Prozedur sein? Ich nehme an, du hast eine Funktion geschrieben, welche überprüft ob es den Eintrag in Listbox2 schon gibt? In dem Fall wäre das ja nur eine Zahl also sollte deine Funktion vorhanden(); so aussehen: (Den Komponentennamen brauchst du nicht zu übergeben, der ändert sich ja nicht!)
Quelltext
1: 2: 3: 4: 5: 6: 7:
| function vorhanden(s:string):Boolean; var i : integer; begin Result:=false; for i:= 0 to ListBox2.Items.Count-1 do if ListBox2.Items[i] = s then Result:=true; end; |
Wie du siehst bräuchtest du eigentlich keine extra Funktion dafür, doch ich hab mal deinen Ansatz übernommen.
Und jetzt machst du etwas, was ich gar nicht verstehe:
Quelltext
1: 2:
| Listbox2.Items.Add (nr_e.text); Listbox2.Items.Savetofile('[Laufwerksbuchstabe]:\[Pfad]\[Verzeichnis]\*.txt'); |
Als erstes fügst du ListBox2 eine Zahl hinzu, welche du aus Listbox1 extrahiert hast! Denn in nr_e.Text ist nur eine Zahl als String gespeichert.
Dann willst du ListBox2 in eine Datei speichern, gibst jedoch keine datei an. Wenn du die Datei im Verzeichnis der .exe haben willst mach es so:
Quelltext
1:
| ListBox2.Items.SaveToFile(ExtractFilePath(Application.ExeName)+'test.txt'); |
Doch den Sinn des ganzen verstehe ich nicht. Du hast eine Listbox in der Nummern, Namen etc gespeichert sind, von dort holst du dir aus genau einem Eintrag diese Nummer. Dann prüfst du ob es die Nummer in der 2. Listbox auch gibt und wenn es sie nicht gibt speicherst du die gesamte ListBox2 in einer datei. wenn sie in ListBox2 schon vorhanden ist löscht du den Eintrag. Wenn du das in einer Schleife machen würdest so würdest du alle Einträge aus ListBox 1 (ab Position 3) nacheinander überprüfen und ggf. eine Nummer an Listbox2 übergeben und diese Speichern, die dazugehörigen Daten, Name etc sind jedoch verloren weil du sie ja dann löscht. Was dir bleibt ist eine Textdatei voll mit nichtssagenden Nummern!
Deinen Quelltext habe ich kurz verbessert doch es fehlt ihm den Sinn. Wenn du eine Art Adressenverzeichnis machen willst, sind Textdateien eh ungeeignet. Du solltest typisierte-Dateien verwenden oder eben mit Datenbanken arbeiten.
Tutorials zu typisierten Dateien, mit eben dem Beispiel einer Adressenverwaltung findest du unter
www.delphi-source.de
Man sieht, dass du dir Mühe gegeben hast doch hast du leider ein paar gravierende Denkfehler im Quelltext und es scheint, als sei der Ansatz falsch!
MfG, Raphael
Nicht aufgeben!!