Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Mehrere Memos in einer Datei Speichern (https://www.delphipraxis.net/156118-mehrere-memos-einer-datei-speichern.html)

wolfgang_SV 20. Nov 2010 21:54

AW: Mehrere Memos in einer Datei Speichern
 
Zitat:

"...denn sie wissen nicht was sie tun..."
irgendwie hast du hier mal recht..

toms 21. Nov 2010 10:03

AW: Mehrere Memos in einer Datei Speichern
 
...und das ganze ein wenig schöner und allgemeiner gehalten:

Speichern:
Delphi-Quellcode:
SaveStrings(fs, [Memo1.Lines, Memo2.Lines, ListBox1.Items]);


Laden:
Delphi-Quellcode:
LoadStrings(fs, [Memo1.Lines, Memo2.Lines, ListBox1.Items]);


Delphi-Quellcode:
const
  FILE_SIG = 'MyFileSignature';
  BUF_SIZE = 4096;

function SaveStrings(AStream: TStream; const Strings: array of TStrings; FileSig: string = ''): Boolean;
var
  Writer: TWriter;
  i: Integer;
begin
  Result := False;
  Writer := TWriter.Create(aStream, BUF_SIZE);
  try
    if FileSig <> '' then
    begin
      Writer.WriteSignature;
      Writer.WriteIdent(FileSig);
    end;

    Writer.WriteListBegin;
    for i := Low(Strings) to High(Strings) do
    begin
      Writer.WriteString(Strings[i].Text);
    end;
    Writer.WriteListEnd;
    Result := True;
  finally
    Writer.Free;
  end;
end;

function LoadStrings(AStream: TStream; const Strings: array of TStrings; FileSig: string = ''): Boolean;
var
  Reader: TReader;
  i: Integer;
begin
  Result := False;
  Reader := TReader.Create(aStream, BUF_SIZE);
  try
    if FileSig <> '' then
    begin
      Reader.ReadSignature;
      if Reader.ReadIdent <> FileSig then
        raise Exception.Create('ungültige Datei...');
    end;

    i := Low(Strings);
    Reader.ReadListBegin;
    while not Reader.EndOfList do
    begin
      if i <= High(Strings) then
        Strings[i].Text := Reader.ReadString;
      Inc(i);
    end;
    Reader.ReadListEnd;
    Result := True;
  finally
    Reader.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create('C:\MyStrings.txt', fmCreate);
  try
    SaveStrings(fs, [Memo1.Lines, Memo2.Lines, ListBox1.Items], FILE_SIG);
  finally
    fs.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  fs: TFileStream;
begin
  fs := TFileStream.Create('C:\MyStrings.txt', fmOpenRead);
  try
    LoadStrings(fs, [Memo1.Lines, Memo2.Lines, ListBox1.Items], FILE_SIG);
  finally
    fs.Free;
  end;
end;

Portfreak 21. Nov 2010 14:50

AW: Mehrere Memos in einer Datei Speichern
 
Soweit fuktioniert alles danke. Allerdings Meldet mir das programm einen Fehler sobald ich die datei laden möchte.

Zitat:

Im Project Project1.exe ist eine Exception der Klasse EReadError aufgetreten. Meldung: 'Ungültiges Stream-Format'...
HAb versucht zu schauen wo es liegt aber ich finde leider nichts :(


EDIT:
Hab den Eintrag ", FILE_SIG" in der Button2 Prozedur entfernt und schon funktioniert ist. Wofür ist die FILE_SIG notwendig??

toms 21. Nov 2010 15:47

AW: Mehrere Memos in einer Datei Speichern
 
Zitat:

Zitat von Portfreak (Beitrag 1063066)
EDIT:
Hab den Eintrag ", FILE_SIG" in der Button2 Prozedur entfernt und schon funktioniert ist. Wofür ist die FILE_SIG notwendig??

Es gab im SaveStrings ein kleiner Fehler, ist jedoch schon behoben.

Die Signatur ist ein Schutz:
Zitat:

Durch Überprüfen der Signatur vor dem Laden von Objekten schützen Reader-Objekte sich davor, unbeabsichtigt ungültige oder beschädigte Daten zu lesen.

Portfreak 21. Nov 2010 16:14

AW: Mehrere Memos in einer Datei Speichern
 
Vielen dank für die kompetente hilfe!!!
Thread kann geschlossen werden!

Portfreak 30. Nov 2010 18:05

AW: Mehrere Memos in einer Datei Speichern
 
Ich danke euch nochmal sehr für die geleistete Hilfe!

Folgenden Code nutze ich zum speichern.

Delphi-Quellcode:
procedure TRechner.BtSaveClick(Sender: TObject);
var
  fs: TFileStream;
begin
PfadSave;
if EdDir.Text = '' then
  begin
  end else begin
  fs := TFileStream.Create(EdDir.Text+'.ini', fmCreate); //EdDir ist der Speicherpfad + Dateiname
  try
    SaveStrings(fs, [Memo1.Lines, Memo2.Lines], FILE_SIG);
  finally
    fs.Free;
  end;
Ich habe auch ein SaveDialog eingebaut, dass ohne probleme funkltioniert ALLERDINGS:

Fall 1. Die Datei ist noch nicht vorhanden -> Dateiname wird eingeben -> Speichern ->> klappt.
Fall 1. Die Datei ist vorhanden und soll überschrieben werden -> Datei wird markiert -> Speichern ->> DATEI bist zweimal die gleiche Endung (XX.ini.ini).


Im Savedialog habe ich zudem einen filter auf ini gesetzt (Filtername: .ini" und Filter: *.ini)

Lösungsversuche
1.)Habe mal im dialog den filter oder ein teil des filter rausgehauen, das ergebniss war, dass nun alle dateien angezeigt wurden und das .ini problem beim überschreiben bestand immernoch.
2.) Savedialogfilter nicht verändert (filter auf .ini usw.). In der prozedur den +'.ini' eintrag entfernt. Ergebnis ->> Datei besitz keine endnung
3.) Per if abfrage FileExists(EdDit.Text+'.ini') then DeleteFile(EdDit.Text+'.ini') else... ->> brachte nichts...

Woran kann es liegen?

Bummi 30. Nov 2010 18:08

AW: Mehrere Memos in einer Datei Speichern
 
Delphi-Quellcode:
    ChangeFileExt(EdDir.Text,'.ini')

Portfreak 30. Nov 2010 18:21

AW: Mehrere Memos in einer Datei Speichern
 
Danke!

Aber entweder setze ich es an die falsche stelle oder es klappt nicht :(.

Also beim Auswählen der Datei, nimmt EdDir nicht nur den Dateipfad auf sondern auch Dateiname.Dateiendun (C:\test.ini).
D.h. Die procedure erkennt nicht dass dort ein .ini bereits vorhanden ist und hängt noch ein dran (C:\test.ini.ini).
Folglich bringt ein Delete nichts da beim markieren der pfad + endung ebenfalls an EdDir gegeben wird.

Kusios...:(

Bummi 30. Nov 2010 18:26

AW: Mehrere Memos in einer Datei Speichern
 
Delphi-Quellcode:
   Showmessage( ChangeFileExt('C:\test\test.ini','.ini') +#13#10 + ChangeFileExt('C:\test\test.txt','.ini') +#13#10 + ChangeFileExt('C:\test\test','.ini'));
:shock:

EDIT
Delphi-Quellcode:
fs := TFileStream.Create(ChangeFileExt(EdDir.Text,'.ini'), fmCreate)

Portfreak 30. Nov 2010 18:39

AW: Mehrere Memos in einer Datei Speichern
 
Fertig DANKESCHÖN!!


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:13 Uhr.
Seite 2 von 3     12 3      

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