Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi SaveToStream in OnChange Ereignis... (https://www.delphipraxis.net/75847-savetostream-onchange-ereignis.html)

litsa 25. Aug 2006 22:16


SaveToStream in OnChange Ereignis...
 
Hallo

ich weiss es gibt sehr viele Beiträge zu savetostream trotzdem komme ich im moment nicht weiter..
Habe hier im Forum schon was gefunden um ein TRichEdit zu speichern:

Delphi-Quellcode:
procedure TcFrame.Button2Click(Sender: TObject);
var
  fs: TFileStream;
  fm: word;
  log: string;
begin
  if Panel4.Caption <> '' then
  begin
    log := Panel4.Caption;
    try
      if FileExists(ExtractFilePath(ParamStr(0)) + '.\logs\' + log + '.log') then
        fm := fmOpenReadWrite
      else
        fm := fmCreate;
      fs := TFileStream.Create(ExtractFilePath(ParamStr(0)) + '.\logs\' +
        log + '.log', fm, fmShareDenyWrite);
      fs.Seek(0, soFromEnd);
      cText.Lines.SaveToStream(fs);
    finally
      fs.Free;
    end;
  end;
end;
Nun möchte ich aber das ganze in einem OnChange Ereignis einbinden..im Grunde möchte ich dass wenn eine neue Zeile im RichEdit eingefügt wird dann diese Zeile in die Datei am Ende hinzufügen.

Wäre dankbar für jede Hilfe..

Christian Seehase 25. Aug 2006 22:25

Re: SaveToStream in OnChange Ereignis...
 
Moin Litsa,

muss es unbedingt ein Richedit sein, bzw. brauchst Du die Formatierung, oder ist das RichEdit auf PlainText eingestellt?

litsa 25. Aug 2006 22:30

Re: SaveToStream in OnChange Ereignis...
 
hi
also es muss ein richedit sein (habe schon ne menge code fertig) und ja is auf plan text eingestellt..

Christian Seehase 25. Aug 2006 23:27

Re: SaveToStream in OnChange Ereignis...
 
Moin litsa,

mit PlainText := true dürfte das so funktionieren:

Delphi-Quellcode:
var
  sLine : string;

begin
  if cText.Lines.Count = 0 then exit;
  fs := TFileStream.Create(....);
  try
    sLine      := cText.Lines[cText.Lines.Count-1]+#13#10;
    fs.Position := fs.Size;
    fs.Write(sLine[1],length(sLine));
  finally
    FreeAndNil(fs);
  end;
end;
Vielleicht könntest Du den Filestream auch als Feld im Formular anlegen, und im OnCreate erzeugen (OnDestroy freigeben), so dass Du ihn nicht immer neu erzeugen musst.

litsa 26. Aug 2006 12:50

Re: SaveToStream in OnChange Ereignis...
 
Hallo Christian
also OnChange will einfach nicht :( Nur mit ButtonClick krieg ich's hin..

Delphi-Quellcode:
fs.Write(sLine[1],length(sLine));
schreibt die zeile in ner art delimited text oder so ähnlich (wenn mehrere strings vorkommen)in die datei...ansonsten fügt er die zeile 3 mal in die datei ein..

DGL-luke 26. Aug 2006 13:41

Re: SaveToStream in OnChange Ereignis...
 
Du solltest es mit fmOpenWrite versuchen. Dann wird der Inhalt komplett gelöscht, bevor neu beschrieben wird.

allerdings ist das im OnChange pro Tastendruck ein Speichervorgang... das ist schlecht für die Festplatte! Ich würde das nur in Zeitintervallen, z.B. über einen Timer, speichern, oder durch den benutzer gesteuert, mit einem button.

das mit dem zeile anhängen finde ich zu kompliziert.

Jürgen Thomas 26. Aug 2006 14:19

Re: SaveToStream in OnChange Ereignis...
 
Zitat:

Zitat von DGL-luke
Du solltest es mit fmOpenWrite versuchen. Dann wird der Inhalt komplett gelöscht, bevor neu beschrieben wird.

allerdings ist das im OnChange pro Tastendruck ein Speichervorgang... das ist schlecht für die Festplatte! Ich würde das nur in Zeitintervallen, z.B. über einen Timer, speichern, oder durch den benutzer gesteuert, mit einem button.

das mit dem zeile anhängen finde ich zu kompliziert.

So würde ich es auch machen, aber genau dann wird ständig alles gespeichert, und das will litsa ja wohl vermeiden...

Zum Speichern der gesamten Datei bietet sich doch etwas viel Einfacheres an:
Delphi-Quellcode:
sDateiname := ...
cText.Lines.SaveToFile(sDateiname);
Gruß Jürgen

inherited 26. Aug 2006 15:31

Re: SaveToStream in OnChange Ereignis...
 
Zitat:

Zitat von DGL-luke
Du solltest es mit fmOpenWrite versuchen.

Déjà-lu :mrgreen:
Du kannst ja im OnChange-ereignis mit cText.Lines.Count ob Zeilen hinzugekommen sind oder nicht

litsa 26. Aug 2006 16:10

Re: SaveToStream in OnChange Ereignis...
 
SaveToFile löscht ja den Inhalt und das will ich net...

Ich glaube das Problem liegt bei der Write-Methode bzw. write soll erst aufgerufen werden wenn die zeile durch ist

Jürgen Thomas 26. Aug 2006 16:18

Re: SaveToStream in OnChange Ereignis...
 
Zitat:

Zitat von litsa
SaveToFile löscht ja den Inhalt und das will ich net...

Stimmt, es löscht den bisherigen Inhalt der Datei - aber es speichert den vollständigen aktuellen Inhalt des RTF-Edit. Jürgen

Christian Seehase 26. Aug 2006 16:32

Re: SaveToStream in OnChange Ereignis...
 
Moin litsa,

dann mach' es doch wie Nicolai vorgeschlagen hat:


Delphi-Quellcode:
type
  TcFrame = ....
  // ...
  private
    FiLogCount : integer;
  end;

procedure TcFrame.cFrameCreate(Sender: TObject);
begin
  FiLogCount := 0;
end;

var
  sLine : string;

begin
  if cText.Lines.Count = 0 then exit;
  if FiLogCount = cText.Lines.Count then exit;
  FiLogCount := cText.Lines.Count;
  fs := TFileStream.Create(....);
  try
    sLine      := cText.Lines[cText.Lines.Count-1]+#13#10;
    fs.Position := fs.Size;
    fs.Write(sLine[1],length(sLine));
  finally
    FreeAndNil(fs);
  end;
end;
Falls die Logdatei bei jedem Programmstart nicht von vorne beginnt, sondern geladen wird, müsstest Du FiLogCount natürlich auf die Anzahl der geladenen Zeilen initalisieren, und nicht auf 0.

litsa 26. Aug 2006 16:49

Re: SaveToStream in OnChange Ereignis...
 
Hallo
hatte es schon damit versucht und auch gefunden woran es liegt..wenn der text formattiert ist dann fügt er den text nicht hinzu.
Obwohl PlainText auf True! Nun habe ich in der Hilfe folgendes gefunden "If the rich text attributes of a file are encoded in some format other than rich text format (RTF), it is necessary to use a converter on the text, even when PlainText is true." ..was auch wahr is :?

Also danke an alle
Gruß
Evangelia

Christian Seehase 26. Aug 2006 17:22

Re: SaveToStream in OnChange Ereignis...
 
Moin litsa,

komisch, bei mir funktioniert's :gruebel:

Hier mal mein Test vollständig (ein leeres TRichEdit, zwei Button)

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure RichEdit1Change(Sender: TObject);
  private
    { Private declarations }
    FiLogCount : integer;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  RichEdit1.Lines.SaveToFile('c:\temp\rtf.txt');
end;

procedure TForm1.FormCreate(Sender: TObject);

var
  tneSave : TNotifyEvent;

begin
  if FileExists('c:\temp\rtf.txt') then begin
    tneSave := RichEdit1.OnChange;
    try
      RichEdit1.OnChange := nil;
      RichEdit1.Lines.LoadFromFile('c:\temp\rtf.txt');
    finally
      RichEdit1.OnChange := tneSave;
    end;
  end;
  FiLogCount := RichEdit1.Lines.Count;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  RichEdit1.SelStart := 0;
  RichEdit1.SelLength := length(RichEdit1.Lines.Text);
  RichEdit1.SelAttributes.Style := [fsBold];
  RichEdit1.Lines.Add('Zeile '+IntToStr(RichEdit1.Lines.Count+1));
end;

procedure TForm1.RichEdit1Change(Sender: TObject);
var
  sLine : string;
  fs   : TFileStream;

begin
  if RichEdit1.Lines.Count = 0 then exit;
  if FiLogCount = RichEdit1.Lines.Count then exit;
  FiLogCount := RichEdit1.Lines.Count;
  fs := TFileStream.Create('c:\temp\rtf.txt',fmOpenReadWrite,fmShareDenyWrite);
  try
    sLine      := RichEdit1.Lines[RichEdit1.Lines.Count-1]+#13#10;
    fs.Position := fs.Size;
    fs.Write(sLine[1],length(sLine));
  finally
    FreeAndNil(fs);
  end;
end;
Da nicht direkt RichEdit1.Lines.SaveToFile benutzt wird, spielt es auch keine Rolle, ob PlainText := true ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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