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
user profile iconD. 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

user profile iconD. Annies hat folgendes geschrieben:
concat [concetenate] verbindet Strings zu einem Gesamtstring - ist erprobt!


[OT]Warum verwendest du nicht einfach den +-Operator :gruebel: ?[/OT]

AXMD


Delete - Sa 10.05.08 16:18

Guck dir mal meinen Beitrag zu den Pascal-Datei Routinen in der Delphipraxis an: http://www.delphipraxis.net/post883744.html#883744

Warum nimmst du keine TStringList?


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;  // Fehler!!
  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;
{Für CLX-Anwendungen: uses SysUtils, Variants, Classes, QGraphics, WControls, QForms, QDialogs;
type  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
  private
    { private-Deklarationen }

  public
    { public-Deklarationen }
    ClickList: TStrings; { Feld deklarieren }
  end;
var  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
    ClickList := TStringList.Create;{ Liste erzeugen }
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.log'));{ die Liste speichern }
 ClickList.Free;{ Listenobjekt freigeben }
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
begin
  ClickList.Add(Format('Click at (%d, %d)', [X, Y]));{ Der Liste einen String hinzufügen }
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
user profile iconD. 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); //Fehler
 {$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');  //diesen wert prüfen
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.