Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Schreiben in Textdatei
D. Annies - Sa 10.05.08 11:37
Titel: Schreiben in Textdatei
Hi, Delpher,
manchmal kann man ja an sich selbst zweifeln.
Ich verwende den folgenden Code, um in eine Textdatei zu schreiben:
Delphi-Quelltext
1: 2: 3: 4: 5:
| var t1: textfile; assignfile(t1, concat(label30.caption,'OUTTXT\leihprotokoll.txt')); append(t1); writeln(t1, 'hi'); closefile(t1); |
Aber leider erscheinen in der Textdatei (die vorhanden und nicht leer ist) am Ende nur Steuerzeichen.
Was ist da los?? (Fühle mich wie ein Baby)
Danke für Hilfe, Detlef :oops:
Xion - Sa 10.05.08 12:31
Titel: Re: Schreiben in Textdatei
D. Annies hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5:
| var t1: textfile; assignfile(t1, concat(label30.caption,'OUTTXT\leihprotokoll.txt')); append(t1); writeln(t1, 'hi'); closefile(t1); | |
sollte es nicht ReWrite heißen?
D. Annies - Sa 10.05.08 13:02
Hi, Xion,
nein, - ich will Text anhängen.
Gruß, Detlef
Xion - Sa 10.05.08 13:47
ah, das geht mit append. wieder was dazugelernt :D
D. Annies - Sa 10.05.08 14:23
Hi, Xion - kleiner Nebeneffekt - :P
aber was ist denn bloß an dem Code falsch - er funktioniert an anderen Stellen des Codes ja - mit anderen Dateien.
Xion - Sa 10.05.08 14:25
wenn ich wüsste was "concat" sein soll. Also grundsätzlich solltest du den VOLLEN Pfad für die Datei angeben, da sonst Windoof die Datei sonst wo hinspeichern könnte.
D. Annies - Sa 10.05.08 14:54
Hi, Xion,
concat [concetenate] verbindet Strings zu einem Gesamtstring - ist erprobt!
Daran liegt es nicht,
Detlef
AXMD - Sa 10.05.08 14:58
D. Annies hat folgendes geschrieben: |
concat [concetenate] verbindet Strings zu einem Gesamtstring - ist erprobt! |
[OT]Warum verwendest du nicht einfach den
+-Operator :gruebel: ?[/OT]
AXMD
D. Annies - Sa 10.05.08 19:24
Hi, Andreas und Luckie,
hab jetzt mal den +-Operator genommen und werde die Textdatei lokal deklarieren.
Melde mich wieder, (danke für euer Interesse)
Detlef
D. Annies - Sa 10.05.08 20:37
Bin jetzt bei folgendem Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure tform1.leihprot; var n, k, anzb : integer; inhalt, anzs : string[35]; tx : textfile; strliste : Tstringlist; zeile : string[80]; begin assignfile(tx, label30.caption+ 'OUTTXT\leihprotokoll.txt'); reset(tx); while not eof(tx) do begin readln(tx, zeile); strliste.Add(zeile); end; closefile(tx);
strliste.Append('hi'); strliste.Append(datetostr(date)+ ' '+ timetostr(time)+ ' '+ ort+ ' *** '+ aktuser); strliste.SaveToFile(label30.caption+ 'OUTTXT\leihprotokoll.txt');
showmessage('hi'); |
Da ist aber noch wieder was falsch. Luckie?
SmileySN - Sa 10.05.08 20:48
Die Stringliste muss erst erzeugt werden, bevor man sie benutzen kann.
TStrliste.Create;
Ansonsten mal prüfen was in Label30.Caption drin steht, ob da auch der Backslash am ende drin ist.
D. Annies - Sa 10.05.08 20:52
hi, smiley,
danke für create, der \ steht drin
Detlef
SmileySN - Sa 10.05.08 21:20
Übrigens muss die Stringliste auch wieder freigegeben werden, wenn man sie nicht mehr braucht.
Falls die Liste im Programm immer benötigt wird, dann würde ich sie im Formcreate erstellen und im Formdestroy wieder freigeben.
Hier ein Beispiel aus der Delphihilfe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
public ClickList: TStrings; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin ClickList := TStringList.Create; end;
procedure TForm1.FormDestroy(Sender: TObject); begin ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.log')); ClickList.Free; end;
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ClickList.Add(Format('Click at (%d, %d)', [X, Y])); end;
end. |
Außerdem habe ich Stringlist.Append nicht gefunden nur Stringlist.Add
D. Annies - Sa 10.05.08 21:33
hi, smiley,
danke für deine Mühe, verfolge ich gleich - aber jetzt haltet euch fest:
ich habe deb folgenden Code mal "vorgeschaltet":
Delphi-Quelltext
1: 2: 3: 4:
| assignfile(tx,label30.caption+ 'OUTTXT\leihprotokoll2.txt'); rewrite(tx); writeln(tx, 'hi'); writeln(tx, datetostr(date), ' ', timetostr(time), ' ', ort, ' *** ', aktuser); closefile(tx); |
Also vor das assignfile ... append(t1);
Es geht wunderbar! ????? Alles bestens zu sehen.
ÄÄÄÄH??
Detlef, ratlos.
SmileySN - Sa 10.05.08 21:47
Dazu sollte man etwas mehr code sehen könne, aber möglicherweise hat sich auch was im delphi verheddert.
Starte das Delphi mal neu und lade das Projekt neu, mal sehen ob es dann immer noch so läuft.
Möglicherweise hast Du auch noch ein anderes tx irgendwo oder global definiert und greift darauf zu.
wenn append vor assign kommt, müsste ein Fehlermeldung beim append erscheinen, da es tx ja noch gar nicht richtig gibt.
D. Annies - Sa 10.05.08 22:07
hi, smiley,
habe alles geprüft, es muss an append liegen - mit vorgeschaltet meinte ich, dass ich diese 3 Zeilen vor den oben angegebenenen Code gesetzt habe, alles ganz harmlos.
Habe ausgeschaltet, eingeschaltet - gleiches bild, gleicher ton - zum Mäusemelken!
Delete - So 11.05.08 10:40
Titel: Re: Schreiben in Textdatei
D. Annies hat folgendes geschrieben: |
Hi, Delpher,
manchmal kann man ja an sich selbst zweifeln.
Ich verwende den folgenden Code, um in eine Textdatei zu schreiben:
Delphi-Quelltext 1: 2: 3: 4: 5:
| var t1: textfile; assignfile(t1, concat(label30.caption,'OUTTXT\leihprotokoll.txt')); append(t1); writeln(t1, 'hi'); closefile(t1); |
Aber leider erscheinen in der Textdatei (die vorhanden und nicht leer ist) am Ende nur Steuerzeichen.
Was ist da los?? (Fühle mich wie ein Baby)
Danke für Hilfe, Detlef :oops: |
bei mir funktioniert der code wunderbar
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| program Project1; {$APPTYPE CONSOLE}
uses SysUtils;
var tf: textfile; begin assign(tf, copy(paramstr(0), 1, length(paramstr(0))-3)+'.txt'); {$i-} append(tf); if IOResult <> 0 then rewrite(tf); if IOResult <> 0 then halt(1); {$I+} writeln(tf, 'test text für append'); close(tf);
end. |
an deiner stelle würd ich den code " concat(label30.caption,'OUTTXT\leihprotokoll.txt'" gegen zuweisung in eine stringvariable, welche du überprüfen solltest auf den korrekten string diese dann wieder neu einsetzen.
dann sähe dein code in etwa wie folgt aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var t1: textfile; s: string; s := concat(label30.caption,'OUTTXT\leihprotokoll.txt'); assignfile(t1, s); append(t1); writeln(t1, 'hi'); closefile(t1); |
ich vermute mal, dass dein vezeichnis falsch zusammengestellt wird, z.b. wegen fehlenden oder doppelten oder was auch immer \
darüber hinaus solltest du schaun, dass du absolute pfade verwendest, da du sonst nie weisst, wohin du wirklich schreibst...
<HTH> GG
D. Annies - So 11.05.08 17:38
Hi, GG
danke auch für dein Interesse!
Ich bin immer noch am "Kämpfen" - ich überprüfe jetzt auch deine Idee nochmal - melde mich wieder,
Gruß, Detlef :eyecrazy:
D. Annies - So 11.05.08 19:08
So, überprüft ist, Pfad stimmt, kein \ zuviel oder zuwenig.
Hammer:
ich habe dann einmal die Daten in eine Datei leihprotokoll2.txt kopiert (mit Notepad), die Datei umbenannt (leihprotokoll.txt) - dann wurde einmal angehängt (!!) - danach nicht mehr, wieder die Steuerzeichen.
Es wird also immer besser: Wir erweitern Ihre Frustrationstolerenz oder was??
Gruß, Det?\ö (*gg*)
Delete - So 11.05.08 19:46
wie gesagt. der code den ich oben gepostet habe, funktioniert.
machst an anderer stelle noch so 'ne textdatei auf und schliesst sie nicht mehr? hast sie vielleicht im binärmus geöffnet...?
poste doch etwas mehr code.. denn von diesen stücken kann man praktisch nix sehen.
noch 'n schönen sonntag.
SmileySN - So 11.05.08 21:15
Wenn das Problem reproduzierbar ist, dann ist es ja fast schon kein Problem mehr.
Beim 2ten abspeichern hälst du das Programm an (Breakpoint setzen) und gehst Schritt für Schritt durch was er macht.
Dabei sollte es Dir auffallen, was da falsch läuft. (Variablen beobachten).
Wenn das nicht hilft, dann ein eigenes Projekt machen, in das Du nur diesen Code reinschreibst und ihn dann 2 mal ausführen lässt.
Vielleicht fällt Dir dann etwas auf.
Ansonsten zur Benutzung von Pfaden mache ich meißt folgendes, bei Desktopprogrammen, die ihre Daten im Programm-Pfad halten.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| procedure TForm1.FormActivate(Sender: TObject); begin ProgPath := ExtractFilePath(paramstr(0)); ImportPath := ProgPath + 'Import\'; ExportPath := ProgPath + 'Export\';
if fileexists(ProgPath + 'Kategorie.ini') then Form1.CBKategorie.Items.LoadFromFile(ProgPath + 'Kategorie.ini');
if not DirectoryExists(ImportPath) then Mkdir(ImportPath);
if not DirectoryExists(ExportPath) then Mkdir(ExportPath);
DBInit; end; |
Beim Start den Programmpfad in eine Globale Variable speichern und sich dann immer auf diesen beziehen.
Das Programm darf dann bei Vista natürlich nicht in den Programme-Ordner installiert werden.
Wenn die Daten woanders liegen sollen, dann den Pfad über einen Fileopen dialog hölen lassen und auch auf existenz prüfen.
Dann immer mit diesem Pfad arbeiten und nicht mit einem Pfad, der in einer editbox steht.
D. Annies - So 11.05.08 21:26
Hi, Delpher,
so, jetzt dürfen sich alle mal hinsetzen und festhalten:
Ich habe, nur auf blauen Dunst, die Datei gelöscht. Dann wurde brav hineingeschrieben und zwar nicht in GENAU HINSEHEN: leihprotokoll.txt sondern in Leihprotokoll.txt
Gesehen?
Jetzt geht alles, auch mehrfach hintereinander, halt binär: nie oder immer.
Immer ist uns ja wohl lieber. :lol:
Der etwas schwindlige Detlef. Hat noch jemand einen Kommentar? Dann bitte.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!