Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi SaveDialog - Add statt Overwrite (https://www.delphipraxis.net/113777-savedialog-add-statt-overwrite.html)

Z4ppy 14. Mai 2008 15:02


SaveDialog - Add statt Overwrite
 
Ich weiss, der Threadtitel is nicht ganz optimal, aber das, was ich ursprünglich eingeben wollte, ist zu lang..

Mein Prob:
Per SaveDialog soll eine Datei ausgewählt/ein Dateiname eingegeben werden. Dann will ich in mehreren Schritten Sachen in die Datei speichern. Die Daten sollen jeweils hinten angefügt werden... So wie bei PHP fopen mit Parameter a(+)
Hier mal ein Beispiel:
In der Datei abc.txt steht das:
Zitat:

Hallo
paperlapapp
Nun soll "bla" hinzugefügt werden, sodass da dann nachher steht:
Zitat:

Hallo
paperlapapp
bla
Wie geht das?

MfG Z4ppy

PS.: NEIN, ich will das nicht mit einem Memo lösen, wo ich die Daten reinlade und dann wieder abspeicher...
PS2.: Benutze Delphi 7...

Klaus01 14. Mai 2008 15:04

Re: SaveDialog - Add statt Overwrite
 
Hallo,

Du könntest eine StringList nehmen und da die Datei hineinladen
und Zeilen hinzufügen.
Oder Du schaust Dir append an.

Grüße
Klaus

mkinzler 14. Mai 2008 15:07

Re: SaveDialog - Add statt Overwrite
 
Wie schreibst du die Datei?
Du könntest mit Text Append() verwenden

Luckie 14. Mai 2008 15:08

Re: SaveDialog - Add statt Overwrite
 
Zitat:

Zitat von Z4ppy
Ich weiss, der Threadtitel is nicht ganz optimal, aber das, was ich ursprünglich eingeben wollte, ist zu lang..

Zum einem hat der Dialog überhaupt nichts mit dem Speichern zu tun, er gibt dir nur einen Dateinamen und zweitens warum ist der Titel zu lang: "Zeilen an Textdatei anhängen"?

Und wenn man den Threadtitel in der suche eingibt, findet man eventuell schon was brauchbares.

Namenloser 14. Mai 2008 15:10

Re: SaveDialog - Add statt Overwrite
 
Das geht auch mit Streams:
Delphi-Quellcode:
function AddStringToFile(const s: string; const filename: string; newline: boolean=true)
var
  filestream: tfilestream;
  nl: string;
begin
  filestream := tfilestream.create(filename,fmCreate);
  try
    filestream.position := filestream.size;
    if newline then
    begin
      nl := #13#10;
      filestream.write(pchar(nl),2);
    end;
    filestream.write(pchar(s),length(s));
  finally
    filestream.free;
  end;
end;
Aus dem Kopf in den Beitragseditor getippt, also ohne Gewähr.

Z4ppy 14. Mai 2008 15:15

Re: SaveDialog - Add statt Overwrite
 
Danke :)
Aber: Compiler meckert ziemlich...
1. "Function needs result type" << is klar...
2. "Variable required" << das 2mal, bei folgenden Zeilen:
Delphi-Quellcode:
filestream.write(pchar(nl),2);
Delphi-Quellcode:
filestream.write(pchar(s),length(s));
1. kann ich natürlich selber reparieren, 2. leider net... Kann mir da noch jemand helfen?

MfG Z4ppy

Fussball-Robby 14. Mai 2008 15:17

Re: SaveDialog - Add statt Overwrite
 
Ich denke, es ist einfacher mit TStrings.
Delphi-Quellcode:
function AddStringToFile(const Text: String; const FileName: String): Boolean;
var
  List: TStrings;
begin
  Result := False;
  if not FileExists(FileName) then
    Exit;
  List := TStringList.Create;
  try
    List.LoadFromFile(FileName);
    List.Add(Text);
    List.SaveToFile(FileName);
    Result := True;
  finally
    List.Free;
  end;
end;
Beim nächsten mal aber bite vorher suchen, das gab es hier schon dutzende male.

Namenloser 14. Mai 2008 15:17

Re: SaveDialog - Add statt Overwrite
 
1. Sry, ich meinet natürlich procedure, nicht function
2. Das wundert mich. Probier es mal ohne pchar(). Wenn das immer noch nicht klappt, probier s[1] bzw nl[1].

[add] TStrings lädt aber die gesamteDatei in den Arbeitsspeicher. Ein Filestream nicht.

Fussball-Robby 14. Mai 2008 15:19

Re: SaveDialog - Add statt Overwrite
 
Solltest du die FileStreams verwenden, müsste der 2. Parameter beim Create aber fmOpenWrite sein, oder? :gruebel:

Z4ppy 14. Mai 2008 15:20

Re: SaveDialog - Add statt Overwrite
 
Danke, NamenLozer... Ohne PChar gehts wunderbar :)

MfG Z4ppy

[ADD] oO geht doch nicht :( Also der Compiler gibt zwar keine Warnung aus, aber in der Datei steht dann nur Datenmüll...

Namenloser 14. Mai 2008 19:27

Re: SaveDialog - Add statt Overwrite
 
Mal mit s[1] probiert? Ggf. auch mal pchar(s)^ probieren. Sry für das rumgerate, ich steh immer etwas auf dem Schlauch, was genau in Delphi als Pointer behandelt wird und was nicht, und was per Compilermagic umgewandelt wird.

Edit: Btw: fmCreate entspricht praktisch fmOpenReadWrite, mit dem Unterschied, dass die Datei erstellt wird, wenn sie nicht existiert.

SirThornberry 14. Mai 2008 19:35

Re: SaveDialog - Add statt Overwrite
 
Zitat:

Edit: Btw: fmCreate entspricht praktisch fmOpenReadWrite, mit dem Unterschied, dass die Datei erstellt wird, wenn sie nicht existiert.
:shock: Falsch!! fmCreate legt die Datei an wenn sie noch nicht existiert und wenn sie existiert wird der Dateiinhalt gelöscht!

Streams sind aus meiner Sicht schon der richtige Weg. Denn wenn man Objectpascal verwendet, warum sollte man dann nicht die vorhandenen Klassen nutzen sondern globale Funktionen?!

Delphi-Quellcode:
var lStream: TFileStream;
    lText: String;
begin
  lStream := TFileStream.Create(YourFileName, fmOpenReadWrite);
  try
    lStream.Position := lStream.Size;
    lText := 'Dein Text'#13#10;
    lStream.write(lText[1], Length(lText));
  finally
    lStream.Free;
  end;

Muetze1 14. Mai 2008 20:53

Re: SaveDialog - Add statt Overwrite
 
Zitat:

Zitat von NamenLozer
Mal mit s[1] probiert? Ggf. auch mal pchar(s)^ probieren. Sry für das rumgerate, ich steh immer etwas auf dem Schlauch, was genau in Delphi als Pointer behandelt wird und was nicht, und was per Compilermagic umgewandelt wird.

Bei allem rumgerate ist nicht ein einziges Mal compilermagic mit dabei.

Write() will die Daten direkt haben, also direkt das erste Zeichen - oder - beim PChar auch das erste Zeichen und nicht den Pointer, somit dereferenzieren.

Z4ppy 15. Mai 2008 20:14

Re: SaveDialog - Add statt Overwrite
 
@SirThornberry: Danke für deinen Vorschlag... Leider erhalte ich immer "Der Prozess konnte nicht auf die Datei 'bla.txt' zugreifen, weil sie von einem anderen Prozess verwendet wird." Wenn ich nun mit Unlocker schaue, welcher Prozess das ist, dann ist es die Project1.exe... Ein Prozess kann also nicht auf die Datei zugreifen, weil er sie selber verwendet :wall: :wall: :wall:

Vorschläge?

MfG Z4ppy

littleDave 15. Mai 2008 20:36

Re: SaveDialog - Add statt Overwrite
 
Versuche es so:
Delphi-Quellcode:
lStream := TFileStream.Create(YourFileName, fmOpenWrite or fmShareDenyNone);
Mit dem fmShareDenyNone erlaubst du anderen Prozessen (auch dein eigenen) diese Datei erneut zu öffnen. Außerdem würde ich bei "nur"-Schreibvorgang fmOpenWrite und nicht fmOpenReadWrite nehmen.

Z4ppy 15. Mai 2008 21:18

Re: SaveDialog - Add statt Overwrite
 
Danke, geht aber leider auch net... Selber Fehler :wall:

MfG Z4ppy

littleDave 15. Mai 2008 21:26

Re: SaveDialog - Add statt Overwrite
 
Wenn du die Datei noch wo anders in deinem Programm öffnest, musst du dort natürlich auch den Flag fmShareDenyNone angeben. Wenn du an der anderen Stelle fmShareExclusive verwendest, bringt dich auch kein ShareDenyNone was. Außerdem, wenn du die Datei bereits offen hast, warum benutzt du dann nicht das selbe Handle um hineinzuschreiben?

Z4ppy 15. Mai 2008 21:34

Re: SaveDialog - Add statt Overwrite
 
Also... Ich hab das jetz so gemacht:
Delphi-Quellcode:
procedure AddStringToFile(const s: string; const filename: string);
var lStream: TFileStream;
    lText: String;
begin
  lStream := TFileStream.Create(filename, fmOpenWrite or fmShareDenyNone);
  try
    lStream.Position := lStream.Size;
    lText := #13#10+s;
    lStream.write(lText[1], Length(lText));
  finally
    lStream.Free;
  end;
end;
Diese Prozedur ruf ich dann bei nem Button-Klick auf mit dem entsprechenden string und dem Dateinamen...
Vor dem Aufruf der Prozedur überprüf ich noch, ob die Datei besteht - wenn nicht, wird sie erstellt. Ist das evtl. der Knackpunkt?

MfG Z4ppy

[ADD] Wenn ich das nun mit einer Datei aufrufe, die bereits existiert, geht alles tadellos... Aber wenn ich einen Dateinamen angebe beim SaveDialog, der nicht existiert, wird die Datei zunächst erstellt und dann kommt die Fehlermeldung...

littleDave 15. Mai 2008 21:58

Re: SaveDialog - Add statt Overwrite
 
Hm, dann rate ich mal: der fehler liegt beim Erstellen der Datei. Ohne ein wenig Quelltext kann man dir da aber nicht helfen. Ich könnte jetzt raten und sagen: du erstellst ein TFileStream-Objekt, dass du nicht mehr freigibst.

Z4ppy 15. Mai 2008 22:09

Re: SaveDialog - Add statt Overwrite
 
:wall::wall::wall::wall::wall::wall:
Danke dir, das war die Lösung :)

MfG Z4ppy


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz