Entwickler-Ecke

Dateizugriff - Ausgewählte Datei im SaveDialog anlegen und Text abspeichern


Bomania - Mo 10.02.03 21:02
Titel: Ausgewählte Datei im SaveDialog anlegen und Text abspeichern
Hallo,

ich möchte mittels dem SaveDialog eine neue Datei anlegen lassen und zugleich auch Text darin abspeichern. Bis jetzt sieht das bei mir so aus:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
...
 with SaveDialog1 do
  begin
    Filter:='HTML-Datei|*.html';
    InitialDir:=ExtractFilePath(ParamStr(0));
    if Execute then
    begin
      Dateiname:=FileName;
     end; // if
  end; // with
end;


Wie zu erkennen ist, fehlt mir der Teil zum anlegen der Datei/abspeichern von Text in der Datei. Kann mir da jemand helfen?

Danke


smiegel - Mo 10.02.03 21:22

Hallo,

im Forum dürften dazu genügend Einträge existieren. Suche einmal danach.

Tipp: TFileStream, AssignFile in der Delphi-Hilfe nachschauen.


Anonymous - Mo 10.02.03 22:19

Wenn ich mal wieder vergessen habe wie das geht, dann gebe ich EOF in Delphi ein und drücke die F1 Taste. Es erscheint die Hilfe zu der Eof-Funktion. Dann klicke ich oben auf Beispiel. Da hast du ein wunderbares Beispiel wie man Texte abspeichert. Das EOF ist auf jeden Fall eine Eselsbrücke.

Ansonsten bin ich faul und schreibe meine Texte in ein TSringList. Dann gebe ich StringList.SaveToFile('c:\blabla.txt') und schon ist mein Text gespeichert.


Bomania - Di 11.02.03 18:55

Ich speichere den Text nun mit folgender Funktion ab:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure SaveStrToStream(const Stream: TStream; const Value: String); 
//Schreibt einen dynamischen String in einen Stream
var Len: Word;
begin
  Len := Length(Value);
  Stream.WriteBuffer(Len, SizeOf(Len));
  if Len > 0 then
    Stream.WriteBuffer(Pointer(Value)^, Len);
end;


Leider entsteht ein sehr unschöner Effekt: Wenn ich den Text aus einem TRichEdit abspeichere, dann befinden sich immer an erster Stelle ein oder zwei merkwürdige Zeichen. Muss man bei einem RichEdit etwas bestimmtes beachten?


Delete - Mi 12.02.03 04:16

Hm, also wenn du schon mit einem RichEdit arbeitest. Warum denn dann so kompliziert?


Quelltext
1:
2:
If SaveDialog1.Execute then
  RichEdit1.Lines.SaveToFile(SaveDialog1.Filename);


Bomania - Mi 12.02.03 07:27

Danke für den Tipp. Ich hab das Problem nämlich etwas umständlich gelöst (aber es funktioniert):


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:
35:
procedure SaveStrToStream(const Stream: TStream; const Value: String); 
//Schreibt einen dynamischen String in einen Stream
var Len: Word;
begin
  Len := Length(Value);
  Stream.WriteBuffer(Len, SizeOf(Len));
  if Len > 0 then
    Stream.WriteBuffer(Pointer(Value)^, Len);
end;

...

var Dateiname:String;
var f:TextFile;
var FS:TFileStream;
     X:string;
begin
  with SaveDialog1 do
  begin
    Filter:='HTML-Dateien|*.html';
    InitialDir:=ExtractFilePath(ParamStr(0));
    if Execute then
    begin
      Dateiname:=FileName;
      FS:=TFileStream.Create(Dateiname,fmCreate);
      FS.Destroy;
      rtb_Ausgabe.SelectAll;
      X:=rtb_Ausgabe.SelText;
      AssignFile(f,Dateiname);
      ReWrite(f);
      Writeln(f,X);
      CloseFile(f);
    end; // if
  end; // with
end;