![]() |
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:
Zitat:
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... |
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 |
Re: SaveDialog - Add statt Overwrite
Wie schreibst du die Datei?
Du könntest mit Text Append() verwenden |
Re: SaveDialog - Add statt Overwrite
Zitat:
Und wenn man den Threadtitel in der suche eingibt, findet man eventuell schon was brauchbares. |
Re: SaveDialog - Add statt Overwrite
Das geht auch mit Streams:
Delphi-Quellcode:
Aus dem Kopf in den Beitragseditor getippt, also ohne Gewähr.
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; |
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:
1. kann ich natürlich selber reparieren, 2. leider net... Kann mir da noch jemand helfen?
filestream.write(pchar(s),length(s));
MfG Z4ppy |
Re: SaveDialog - Add statt Overwrite
Ich denke, es ist einfacher mit TStrings.
Delphi-Quellcode:
Beim nächsten mal aber bite vorher suchen, das gab es hier schon dutzende male.
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; |
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. |
Re: SaveDialog - Add statt Overwrite
Solltest du die FileStreams verwenden, müsste der 2. Parameter beim Create aber fmOpenWrite sein, oder? :gruebel:
|
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... |
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. |
Re: SaveDialog - Add statt Overwrite
Zitat:
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; |
Re: SaveDialog - Add statt Overwrite
Zitat:
Write() will die Daten direkt haben, also direkt das erste Zeichen - oder - beim PChar auch das erste Zeichen und nicht den Pointer, somit dereferenzieren. |
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 |
Re: SaveDialog - Add statt Overwrite
Versuche es so:
Delphi-Quellcode:
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.
lStream := TFileStream.Create(YourFileName, fmOpenWrite or fmShareDenyNone);
|
Re: SaveDialog - Add statt Overwrite
Danke, geht aber leider auch net... Selber Fehler :wall:
MfG Z4ppy |
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?
|
Re: SaveDialog - Add statt Overwrite
Also... Ich hab das jetz so gemacht:
Delphi-Quellcode:
Diese Prozedur ruf ich dann bei nem Button-Klick auf mit dem entsprechenden string und dem Dateinamen...
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; 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... |
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.
|
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 20:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz