Entwickler-Ecke
Dateizugriff - problem beim speichern von einer ListBox in eine txt-datei
nanashi - Mi 17.03.10 20:33
Titel: problem beim speichern von einer ListBox in eine txt-datei
Hallo.^^
Mein Problem müsste eigentlich ganz simpel sein und vllt zu simpel für mich um den Fehler zu finden. >.<
Ich habe zwei ListBoxen und in ListBox1 stehen Wörter. Mit einer Procedure kopiere ich nun ein markiertes Wort von ListBox1 in ListBox2.
Eine weitere Procedure (über einen anderen button) soll nun diese Wörter aus ListBox2 in eine txt-datei speichern.
Klingt sehr einfach... so dachte ich mir das zumindest..
Die leere txt-datei wurde zu Beginn durch oncreate eingelesen:
Delphi-Quelltext
1:
| ListBox2.Items.LoadFromFile('Auswahl.txt'); |
das hat auch funktiniert. ich hab das getestet indem ich einfach mal vorher was in die txt reingeschrieben hab. keine probleme.
Die Procedure zum kopieren in die andere ListBox:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.BitBtn7Click(Sender: TObject); var Position2:Integer; begin Position2:=ListBox2.Items.Add(ListBox1.Items.Strings[ListBox1.ItemIndex]); ShowMessage('Eingefügt an Position'+IntToStr(Position2+1)); ListBox2.Sorted:=True; end; |
Die Procedure zum speichern in die txt-datei:
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.BitBtn11Click(Sender: TObject); begin ListBox2.Items.SaveToFile('Auswahl.txt'); end; |
Das Ergebnis des drückens dieses Buttons ist allerdings nun: 1. er speichert die Wörter nicht in die txt-data
2. er schließt das Programm einfach und gibt
keine Fehlermeldung aus
Kann mir jemand bitte sagen woran das liegt? Das ist zum verzweifeln find ich.. ohne Fehlermeldung weiß ich nicht mal was er zu meckern hat.
Achja.. ich nutze Delphi 7.
Lg nanashi
Moderiert von
Christian S.: Delphi-Tags hinzugefügtModeriert von
Christian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Mi 17.03.2010 um 21:48
Georg08 - Mi 17.03.10 20:39
Hallo
eristens:
zweitens:
Ich habe es jetzt mal versucht mit 3 Buttons eienr Listbox und einem Editfeld:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.LadenClick(Sender: TObject); begin Listbox1.Items.LoadFromFile('liste.txt'); end;
procedure TForm1.SpeichernClick(Sender: TObject); begin Listbox1.Items.SaveToFile('liste.txt'); end;
procedure TForm1.HinzufuegenClick(Sender: TObject); begin Listbox1.Items.Add(Edit1.Text) end; |
funktioniert...
huuuuuh - Mi 17.03.10 20:39
hab schon länger nicht mehr mit delphi gearbeitet, aber SaveToFile benötigt mehr vom dateipfad. glaube ich.
also so:
Delphi-Quelltext
1:
| ListBox2.Items.SaveToFile(ExeFilePath+'\Auswahl.txt'); |
probiers mal aus, wüsste selber gern ob so geht :mrgreen:
nanashi - Mi 17.03.10 20:46
@huuuuh: bei deiner Variante kommt: Undefinierter Bezeichner: 'ExeFilePath'
es muss eigentlich gehen deshalb war ich auch so überrascht ich lade und speichere öffter mal in dem Programm etwas aus und ein, genauso wie Georg es beschrieben hat... nur hier macht er irgendwie fachsen.
Könnte es daran liegen, dass die txt vorher leer ist?
Georg08 - Mi 17.03.10 20:53
bei meinem Beispiel habe ich die "liste.txt" vom Programm erzeugen lassen, Ohne Pfad...
@ nanashi:
Kannst du bitte Mal mehr von dem Code zeigen...
Im Anhang mal das kleine Programm...
nanashi - Mi 17.03.10 20:59
hmm jetzt macht er es
ich habe jetzt geschrieben:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm1.BitBtn11Click(Sender: TObject); begin ListBox2.Sorted:=true; ListBox2.Items.SaveToFile('Auswahl.txt'); end; |
ich finde es wirklich sehr seltsam, dass er es erst macht, wenn ich vorher schonma drauf zugegriffen habe o.o
da is doch was faul
& was willst du beim code den sehen..
also mein oncreate sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.FormCreate(Sender: TObject); var Liste1: TStringList; i:integer; begin Edit5.text := 'englische Vokabel:'; Edit6.text := 'deutsche Vokabel:'; Deutsch := 'Deutsch'; Englisch := 'Englisch'; Japanisch := 'Japanisch'; Koreanisch := 'Koreanisch'; Liste1:=TStringList.create; Liste1.LoadFromFile('Vokabeleng.txt'); ListBox2.Items.LoadFromFile('Auswahl.txt'); i:=0; while i < Liste1.count do begin; ListBox1.Items.Add(Liste1[i]); i:=i+1; end; ListBox1.Sorted:=True; end; |
nanashi - Mi 17.03.10 21:08
@Georg: da bei deinem anhang kommt "Der ausgewählte Dateianhang existiert leider nicht.".. könntest du bitte den code schreiben wie du im programm die txt erzeugen hast? danke^^
dann würde ich es nämlich mal auf deine variante probieren
Georg08 - Mi 17.03.10 21:17
tut mir leid, der dateianhang war falsch hier der neue
Delete - Mi 17.03.10 21:32
Delphi-Quelltext
1: 2:
| Liste1.LoadFromFile('Vokabeleng.txt'); ListBox2.Items.LoadFromFile('Auswahl.txt'); |
Und wo denkst du speichert dir dein Programm die Dateien ab bzw. sucht sie zum Laden?
nanashi - Mi 17.03.10 21:32
danke. hmm also ich hab mir das jetzt bestimmt 6 ma durchgelsen & das ist wirklich wies im buche steht.^^
nur sobald ich das vorher ma nicht sortiere an der stelle macht er es wieder nicht. hab es gerade probiert. >.<
naja ich würd sagen ich lass dann einma diese unnötige zeile mit sorted drin und dafür gehts dann... komisch ist es trotzdem.. wer weiß vllt hats einfach nurn schlechten tag ;)
ich hätte vllt noch erwähnen sollen, dass ich delphi 7 auf vista nutze.. fällt mir grad so auf.. vllt kommts deshalb zu ungereimtheiten.. ich hab zwar vorher das system manuel schon drauf eingestellt gehabt aber vllt arbeitet es doch noch nich optimal
bevor die frage vllt kommt.. ich habs so gemacht wie in dem forum beschrieben:
http://forum.delphi-treff.de/showthread.php?t=20038
aber danke für deine mühen ^___^
---
Moderiert von
Narses: Beiträge zusammengefasst---
o.o worauf willst du hinaus lukie?
ich hab die txt´s alle in dem ordner wo auch das projekt drin is o.o
Delete - Mi 17.03.10 21:43
Und Windows kann hell sehen und weiß welcher Ordner gemeint ist? Dass die Dateien gefunden werden ist purer Zufall. Lege mal eine Verknüpfung zu deiner Exe an, gib ein anderes Arbeistverzeichnis an und guck, was passiert.
nanashi - Fr 19.03.10 06:37
Naja aber ich brauch doch eigentlich nur eine Verknüpfung, wenn ich die txt´s woanders speichere als das Projekt, also in einem anderen Ordner, Laufwerk etc. und es nicht im selben Ordner liegt wie auch das Projekt und alle anderen Dateien für das Programm. Lieg ich damit falsch, oder hab ich dich nur falsch verstanden?
Delete - Fr 19.03.10 18:58
Und was, wenn der Benutzer sich eine Verknüpfung anlegt und was ändert? Des weiteren passiert das Gleiche, wenn du einen Öffnen-Dialog hast und beim Auswählen einer Datei das Verzeichnis wechselst. Und wenn du Pech hast, ändert ein fremdes Programm das Arbeitsverzeichnis. Und dann such mal beim Kunden nach dem Fehler -- viel Spass.
Warum sich mögliche Problem künstlich aufhalsen, wenn man sie ganz einfach vermeiden kann? Das werde ich nie verstehen. :roll:
nanashi - Fr 19.03.10 21:41
ok wenn man das so weit sieht, hast du wahrscheinlich recht.
Also ich kenne bis jetzt 2 Varianten:
1. die, die ich genutzt habe.. sprich einfach durch 'Auswahl.txt' aufrufen, da es im selben Ordner gespeichert ist
2. das ganze über
Delphi-Quelltext
1:
| ListBox2.Items.SaveToFile('C:/Delphi/Arbeit mit Aurora/ed/Auswahl.txt'); |
Welches von denen würdest du nun nehmen, also erstens hab ich gemerkt nicht.
Oder würdest du sogar noch eine 3te oder 4te Variante nutzen??
Gib mir mal bitte ein Scriptbeispiel wie man das deiner Meinung nach am besten programmieren sollte.^^
Delete - Fr 19.03.10 21:56
Also deine zweite Lösung ist fast noch schlechter als deine erste. Deine erste hat zumindest noch eine Chance, dass sie auf anderen Rechnern funktioniert. Bei der zweiten dürfte sie fast gegen null gehen, weil zum einem das Verzeichnis bei mir mit Sicherheit nicht existiert und man als normaler Benutzer unter C keine Schreibrechte hat.
Wenn es das Anwendungsverzeichnis sein muss, dann bitte mit ParamStr(0) ermitteln oder besser einen Öffnen-Dialog verwenden und dem Benutzer selber den Speicherort wählen lassen.
elundril - Fr 19.03.10 22:05
Warum verwendet man nicht das Anwendungsverzeichnis (also das verzeichnis in das man kommt wenn man im Explorer %APPDATA% eingibt)?
lg elundril
nanashi - Fr 26.03.10 17:14
Problem gelöst.^^ Hat ne Weile gedauert, aber jetz kenn ich den Fehler.
Ich habe das ganze jetzt mit 2 Button über OpenDialog und SaveDialog geregelt.
Das Problem war, dass dies nicht bei BitButton ausgeführt wird und er dann erst gar nicht zum Algorithmus kam, sondern gleich das ganze Programm abgebrochen hat. Ich musste also normale Button nehmen.
Scheint doch nicht immer das beste zu sein mit BitButton. >.< Schade die hab ich eigentlich gemocht.. kann man besser gestallten...
Delete - Fr 26.03.10 21:56
Dein Problem hat bestimmt nichts mit dem BitButton zu tun. Da bin ich mir ziemlich sicher. Denn was soll er anders machen als ein normaler Button, wenn auf ihn geklickt wird? Er löst genauso das OnClick Ereignis aus.
jaenicke - Fr 26.03.10 23:02
Vermutlich war bei dem TBitBtn schlicht Kind bzw. damit ModalResult gesetzt, so dass das Formular eben geschlossen wird...
delphi10 - Sa 27.03.10 14:39
nanashi hat folgendes geschrieben : |
Problem gelöst.^^ Hat ne Weile gedauert, aber jetz kenn ich den Fehler.
Ich habe das ganze jetzt mit 2 Button über OpenDialog und SaveDialog geregelt.
Das Problem war, dass dies nicht bei BitButton ausgeführt wird und er dann erst gar nicht zum Algorithmus kam, sondern gleich das ganze Programm abgebrochen hat. Ich musste also normale Button nehmen.
Scheint doch nicht immer das beste zu sein mit BitButton. >.< Schade die hab ich eigentlich gemocht.. kann man besser gestallten... |
Diese Antwort läßt darauf schließen, dass Du das Problem mit den Dateipfaden nicht wirklich verstanden hast. Was bitte sollen den Buttons oder BitBtn mit Problemen im Filesystem zu tun haben?
ffgorcky - Sa 27.03.10 19:51
Also wenn Du die Datei in dem Anwendungs-Verzeichnis speichern möchtest, dann brauchst Du das doch nur so zu machen:
Delphi-Quelltext
1:
| ListBox2.Items.SaveToFile(ExtractFilePath(ParamStr(0)) + '\Auswahl.txt'); |
So sollte es gehen.
Das laden sollte genauso klappen:
Delphi-Quelltext
1:
| ListBox2.Items.LoadFromFile(ExtractFilePath(ParamStr(0)) + '\Auswahl.txt'); |
elundril - Sa 27.03.10 22:58
Sollte man aber nicht so machen, afaik. Dafür gibts doch gerade das %APPDATA%-Verzeichnis, oder irre ich?
lg elundril
Delete - Sa 27.03.10 23:17
Das kann man so pauschal nicht sagen. Bei portablen Anwendungen nimmt man schon das Anwendungsverzeichnis.
nanashi - So 28.03.10 15:20
@Delphi 10:
Das ich bessere Lösungen für das mit den Dateipfaden brauch ist mir schon klar.
Aber mein Ausgangsproblem war ja, dass er den speichervorgang bei meinem bitbutton nicht ausführen wollte. & das wäre mit normalen button gelöst.
Was die Dateipfade betrifft, find ich aber das OpenDialog und SaveDialog keine schlechte Idee ist, oder möchte mir jemand wiedersprechen? Zumindest seh ich da im Moment noch kein Nachteil. Der User kann selbst entscheiden wo er hin speichert und was er öffnet.
Die Dialogkomponenten wurden mir hier ja auch vorgeschlagen..
---
Moderiert von
Narses: Beiträge zusammengefasst---
jaenicke hat folgendes geschrieben : |
| Vermutlich war bei dem TBitBtn schlicht Kind bzw. damit ModalResult gesetzt, so dass das Formular eben geschlossen wird... |
Ich hab die Eigenschaften des TBitBtn eigentlich wie bereits vorprogrammiert gelassen und nichts geändert gehabt. D.h. theoretisch hätte es funktionieren müssen...
Ich werd mir jetz ma nochmal ein BitBtn aufs Formular ziehen.. ma sehen ob wirklich etwas an den eigenschaften falsch eingestellt ist.^^
jaenicke - Di 30.03.10 23:30
delphi10 hat folgendes geschrieben : |
| An den Eigenschaften wirds wohl kaum scheitern |
Doch, denn wenn Kind bzw. ModalResult entsprechend gesetzt sind, tritt genau das beschriebene Problem auf, dass der Button auch sofort das Fenster schließt...
delphi10 - Mi 31.03.10 15:48
jaenicke hat folgendes geschrieben : |
delphi10 hat folgendes geschrieben : | | An den Eigenschaften wirds wohl kaum scheitern | Doch, denn wenn Kind bzw. ModalResult entsprechend gesetzt sind, tritt genau das beschriebene Problem auf, dass der Button auch sofort das Fenster schließt... |
@nanashi sonderte u.a. dieses ab:
Ich hab die Eigenschaften des TBitBtn eigentlich wie bereits vorprogrammiert gelassen und nichts geändert gehabt.
Deshalb schloss ich diese Fehlerquelle aus.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!