Delphi-PRAXiS

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)

Portfreak 20. Nov 2010 16:49

Delphi-Version: 5

Mehrere Memos in einer Datei Speichern
 
Hallöchen!

Ich bräuchte dringend fachkundige Hilfe! Zurzeit arbeite ich an einem Projekt, das auf Memofelder basiert. Ich würde gerne eine Speichern und Laden Option hinzufügen weis nur nicht wie ich es anstellen soll.

Die erste Möglichkeit bot sich durch

Delphi-Quellcode:
 
...
  if OpenDialog1.Execute then
     begin
       Memo1.Lines.SaveToFile(OpenDialog1.Filename);
     end;
...

und
...
if OpenDialog1.Execute then
     begin
       Memo1.Lines.LoadFromFile(OpenDialog1.Filename);
     end;
...
Ich verwende bis zu 5 Memofelder und würde deren inhalt gerne in eine Datei speichern.
Ich hab es schon mit Assignfile etc. probiert. Leider ohne erfolg :(


Danke für angebotene Hilfe!

toms 20. Nov 2010 16:50

AW: Mehrere Memos in einer Datei Speichern
 
Hallo

Ein Stichwort: Streams

mkinzler 20. Nov 2010 16:55

AW: Mehrere Memos in einer Datei Speichern
 
.SaveToFile() erzeugt eine neue Datei bzw. überschreibt eine vorhandene.

Delphi-Quellcode:
var
   sl: TStrings;
begin
   sl := TStringList.Create;
   ...
   sl.Append( Memo1.Lines);
   sl.Append( Memo2.Lines);
   ...
   sl.SaveToFile(OpenDialog1.Filename);
   ...
   sl.Free;

s.h.a.r.k 20. Nov 2010 17:00

AW: Mehrere Memos in einer Datei Speichern
 
Das Problem ist, wie mkinzler schon gesagt hat, dass
Delphi-Quellcode:
SaveToFile()
leider den schon vorhandenen Inhalt überschreibt, d.h. du solltest das nach Möglichkeit selbst machen. Das kannst du entweder über Streams handeln, oder auch via Hier im Forum suchenAssignFile(), Hier im Forum suchenReset() bzw. Hier im Forum suchenRewrite(), Hier im Forum suchenWriteln() bzw. Hier im Forum suchenReadln() erledigen.

Zuvor müsstest du dir allerdings das Format überlegen, in welchem du die Daten speichern willst. Du musst beim Auslesen später ja wieder den Text trennen können!

himitsu 20. Nov 2010 17:02

AW: Mehrere Memos in einer Datei Speichern
 
oder eine spezielle Zeile einfügen, woran man die Texte wieder trennen kann.

Also jeweils ein Memo.Lines mit .AddStrings zu einer StringListe hinzufügen, dann über .Add eine Kennzeile (eine Zeile/Wörter, welche es sonst nicht gibt) anhängen und nun weitere Memos dran.
Beim Auslesen nun Anhand dieser Zeile(n) die Stringliste wieder auf die Memos aufteilen.

Portfreak 20. Nov 2010 21:09

AW: Mehrere Memos in einer Datei Speichern
 
Vielen Dank für die Antworten!

Mittlerweile hab ich's geschafft die Inhalte der Memofelder 1-3 in eine *.txt zu speichern.

Delphi-Quellcode:
procedure TRechner.BtSaveClick(Sender: TObject);
 var
   myFile : TextFile;
   text  : string;
begin
   AssignFile(myFile, EdFileName.Text);
   ReWrite(myFile);

//Memo1
   Write(myFile,'Memo1Anfang', '');
   WriteLn(myFile);

   Write(myFile, Memo1.Text, ' ');
   Write(myFile,'Memo1Ende', '');
   WriteLn(myFile);
   WriteLn(myFile);

//Memo2
   Write(myFile, 'Memo2Anfang', '');
   WriteLn(myFile);
 
   Write(myFile, Memo2.Text,' ');
   Write(myFile,'Memo2Ende', '');
   WriteLn(myFile);
   WriteLn(myFile);

//Memo3
   Write(myFile, 'Memo3Anfang', '');
   WriteLn(myFile);
   Write(myFile, Memo3.Text,' ');
   Write(myFile,'Memo3Ende', '');
   WriteLn(myFile);
 
    CloseFile(myFile);
 
   Reset(myFile);

   while not Eof(myFile) do
   begin
     ReadLn(myFile, text);
   end;

   CloseFile(myFile);
 end;
Dadurch konnte ich eine geordnete struktur beim speichern herstellen die so ausssah

Zitat:

Memo1Anfang
Feld1
Feld2
Memo1Ende

Memo2Anfang
Feld3
Feld4
Memo2Ende

Memo3Anfang
Feld5
Feld6
Memo3Ende
Jetzt bin ich am grübbeln wie man nun diese Werte wieder in die Memofelder LADEN kann. Ich hab da echt Null plan :S...
Irgendwie soll das programm die Werte zuordnen können.

Brauche nochmals eure hilfe :)!
Danke!!

Bummi 20. Nov 2010 21:26

AW: Mehrere Memos in einer Datei Speichern
 
wenn Du schon so angefangen hast,
in einem Loop readln und Ziel.add wenn Ziel<>nil
wenn Du eine Anfangmarke findenst, Ziel=Zielmemo
wenn Du eine EndeMarke findest Ziel=nil

Portfreak 20. Nov 2010 21:34

AW: Mehrere Memos in einer Datei Speichern
 
Danke!!

Nurnoch eine unverschämte bitte ^^": Ich bräuchte eine kleine starthilfe in sachen eines loops in verbindung mit dem einlesen.

Hihi... ^^"

Bummi 20. Nov 2010 21:38

AW: Mehrere Memos in einer Datei Speichern
 
am Ende von Posting #6 machst Du es doch schon...

Sir Rufo 20. Nov 2010 21:50

AW: Mehrere Memos in einer Datei Speichern
 
Zitat:

Zitat von Bummi (Beitrag 1062917)
am Ende von Posting #6 machst Du es doch schon...

"...denn sie wissen nicht was sie tun..." :mrgreen:

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!!

himitsu 30. Nov 2010 18:56

AW: Mehrere Memos in einer Datei Speichern
 
Zitat:

Delphi-Quellcode:
EdDir.Text+'.ini'

Nein, besser ist es DefaultExt des Save-Dialogs auf .ini zu setzen und natürlich die Dateierweiterungsauswahlliste (mir fällt grade der Property-Name nicht ein) mit .ini ausgefüllt zu haben (und eventuell dieses
Delphi-Quellcode:
+'.ini'
wegzulassen, egals in welcher Weise es eingefügt wird).

DeddyH 1. Dez 2010 10:41

AW: Mehrere Memos in einer Datei Speichern
 
Zitat:

Zitat von himitsu (Beitrag 1065191)
... die Dateierweiterungsauswahlliste (mir fällt grade der Property-Name nicht ein) ...

Filter?

himitsu 1. Dez 2010 12:00

AW: Mehrere Memos in einer Datei Speichern
 
Zitat:

Zitat von DeddyH (Beitrag 1065347)
Filter?

ähhhh ... joar :oops:

Portfreak 1. Dez 2010 12:16

AW: Mehrere Memos in einer Datei Speichern
 
Danke, aber im Filter des Savedialogs hatte ich schon die ini als filter angeben, bzw. ist es immer noch, allerdings fehlt dann beim speichern wenn
Delphi-Quellcode:
EdDit.Text+'.ini'
nicht mehr vorhanden ist. So wie es Bummi gelöst hat klappt es 1a, und ohne komplikationen :)

DeddyH 1. Dez 2010 12:18

AW: Mehrere Memos in einer Datei Speichern
 
Dafür gibt es die angesprochene DefaultExt.


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