Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 12:19 Uhr.
Seite 2 von 2     12   

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