Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Mehrere Memo's Speicher (https://www.delphipraxis.net/85017-mehrere-memos-speicher.html)

SaFu 24. Jan 2007 18:36


Mehrere Memo's Speicher
 
Hi, habe mal ne Frage.

Kann man z.B. 5 Memo inhalte zusammen in einer *.txt Speichern und die Gepeicherten inhalte, wieder in die einzelnen Memos Laden.

:gruebel:

z.B. so

Delphi-Quellcode:
procedure TForm7.Button2Click(Sender: TObject);
Var memos :TFileName;
 begin
  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ Edit3.Text +'.txt';
  Memo1-5.SaveToFile(memos);// sowas ähnliches
 end;

marabu 24. Jan 2007 18:54

Re: Mehrere Memo's Speicher
 
Hallo Sascha,

keine Frage - du kannst den Inhalt mehrerer Memos hintereinander in dieselbe Text-Datei schreiben. Damit du beim Einlesen merkst, welche Zeilen zusammen gehören, musst du entweder die Zeilenanzahl voran stellen oder eine Trennzeile mit ausgeben.

Delphi-Quellcode:
procedure SaveMemos(memos: array of TMemo; fn: TFileName);
var
  i: Integer;
  s: TStream;
  line: String;
begin
  s := TFileStream.Create(fn, fmCreate);
  for i := 0 to High(memos) do
  begin
    line := IntToStr(memos[i].Lines.Count) + sLineBreak; // memos statt memo
    s.Write(line[1], Length(line));
    memos[i].Lines.SaveToStream(s); // memos statt memo
  end;
  s.Free;
end;
Getippt und nicht getestet.

Grüße vom marabu

cruiser 24. Jan 2007 19:06

Re: Mehrere Memo's Speicher
 
Speichern:

Delphi-Quellcode:
var
  FileStream: TMemoryStream;
begin
  FileStream := TMemoryStream.Create;

  FileStream.Write(Length(Memo1.Text), SizeOf(Integer));
  FileStream.Write(Memo1.Text, Length(Memo1.Text));

  FileStream.Write(Length(Memo2.Text), SizeOf(Integer));
  FileStream.Write(Memo2.Text, Length(Memo1.Text));

  {...}
 
  FileStream.SaveToFile('FileName');
  FileStream.Free;
end;
Laden:

Delphi-Quellcode:
var
  FileStream: TMemoryStream;
  pos,l,i: Integer;
begin
  FileStream := TMemoryStream.Create;
  FileStream.LoadFromFile('FileName');

  pos := 0;
  l := 0;

  for i := 1 to 5 do
  begin
    FileStream.Position := pos;
    FileStream.Read(l, SizeOf(Integer));
    FileStream.Position := pos + SizeOf(Integer);

    case i of
      1: FileStream.Read(Memo1.Text ,l);
      {...}
      5: FileStream.Read(Memo5.Text ,l);
    end;

    pos := pos + l + SizeOf(Integer);
  end;
  FileStream.Free;
end;
Ist ungetestet, aber müsste so klappen.

Zur Struktur: Du speicherst immer zuerst die Anzahl der Zeichen und dann den Text selber. Beim Auslesen ebenso.

xZise 24. Jan 2007 19:55

Re: Mehrere Memo's Speicher
 
Etwas, womit man leichter zurecht kommt:

---------------------
Aso... Bevor der Code kommt ^^ Falsche Sparte! Definition von "Freeware" (siehe Hauptseite): "Freeware-Programme (mit oder ohne Sourcecode) zum Testen und Diskutieren"
---------------------

Speichern:
Delphi-Quellcode:
memoFile := TStringList.Create;
try
  memoFile.Add(IntToStr(High(memos)));
  for i := 0 to High(memos) do
  begin
    memoFile.Insert(i + 1, memos[i].Count);
    memoFile.Add(memos[i].Text);
  end;
  memoFile.SaveToFile(FILENAME);
finally
  memoFile.Free;
end;
Lesen:
Delphi-Quellcode:
memoFile := TStringList.Create;
try
  memoFile.OpenFromFile(FILENAME);
  for i := 0 to StrToIntDef(memoFile[0], 0) do
  begin
    bufferText := '';
    if i < StrToIntDef(memoFile[0], 0) then
      for j := StrToInt(memoFile[i + 1]) to StrToInt(memoFile[i + 2]) - 1 do
      begin
        bufferText := bufferText + memoFile[j];
      end
    else
      for j := StrToInt(memoFile[i + 1]) to memoFile.Count - 1 do
      begin
        bufferText := bufferText + memoFile[j];
      end
    memos[i].Text := bufferText;
  end;
finally
  memoFile.Free;
end;

DP-Maintenance 24. Jan 2007 20:13

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Freeware" nach "VCL / WinForms / Controls" verschoben.
Es handelt sich nicht um Freeware. Daher *schieb* ;)

SaFu 24. Jan 2007 21:08

Re: Mehrere Memo's Speicher
 
Hi danke erstmal für die Zahlreichen Antworten :lol:

Womit ich etwas leichter zurecht komme ist das vom Cruiser aber da fehlen anscheinen noch Variablen

Kann mir da mal einer bitte weiter helfe finde es leider nicht.

Welche Variablen :gruebel:

Delphi-Quellcode:
procedure TForm7.Panel1Click(Sender: TObject);
var
  FileStream: TMemoryStream;
  memos :TFileName;
begin
  FileStream := TMemoryStream.Create;

  FileStream.Write(Length(Memo1.Text), SizeOf(Integer));
  FileStream.Write(Memo1.Text, Length(Memo1.Text));

  FileStream.Write(Length(Memo2.Text), SizeOf(Integer));
  FileStream.Write(Memo2.Text, Length(Memo1.Text));

  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ Edit3.Text +'.txt';
  FileStream.SaveToFile(memos);
  FileStream.Free;
end;

MrKnogge 24. Jan 2007 21:11

Re: Mehrere Memo's Speicher
 
Was für Variablen sollen denn da fehlen, was für eine Fehlermeldung kommt ?

Gruß

SaFu 24. Jan 2007 21:13

Re: Mehrere Memo's Speicher
 
Dieser Fehler

Delphi-Quellcode:
[Fehler] Unit7.pas(417): Variable erforderlich
an jeder stelle an der Text steht

MrKnogge 24. Jan 2007 21:18

Re: Mehrere Memo's Speicher
 
Sind die Memos auf derselben Form ?

SaFu 24. Jan 2007 21:20

Re: Mehrere Memo's Speicher
 
Ja

inherited 24. Jan 2007 21:21

Re: Mehrere Memo's Speicher
 
Daran liegt es nicht, es liegt daran, das die Funktion "Write" eine Variable braucht, Text ist eine Property. Du musst also vorher Memo1.Text in einen String kopieren und den dann in den Stream schreiben.

SaFu 24. Jan 2007 21:24

Re: Mehrere Memo's Speicher
 
Sorry wenn ich so dumm Frage aber.
Mit Streams habe ich noch nie gearbeitet wie macht man sowas
:oops:

inherited 24. Jan 2007 21:26

Re: Mehrere Memo's Speicher
 
Delphi-Quellcode:
var s: String
[...]
  s:=Memo1.text;
  FileStream.Write(Length(s), SizeOf(Integer));
  FileStream.Write(s, Length(Memo1.Text));
usw.

SaFu 24. Jan 2007 21:47

Re: Mehrere Memo's Speicher
 
Sorry aber irgendwie habe ich immernoch den gleichen Fehler

Delphi-Quellcode:

procedure TForm7.Panel1Click(Sender: TObject);
var FileStream: TMemoryStream;
    memos :TFileName;
    a,b: String;
begin
 a:=Memo1.Text;
 b:=Memo1.Text;

  FileStream := TMemoryStream.Create;

  FileStream.Write(Length(a), // und zwar hier SizeOf(Integer));
  FileStream.Write(a, Length(Memo1.Text));

  FileStream.Write(Length(b), // und hier SizeOf(Integer));
  FileStream.Write(b, Length(Memo1.Text));

  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt';
  FileStream.SaveToFile(memos);
  FileStream.Free;
end;
Delphi-Quellcode:
[Fehler] Unit7.pas(426): Variable erforderlich

MrKnogge 24. Jan 2007 21:52

Re: Mehrere Memo's Speicher
 
Dann speicherst du SizeOf(Integer) vorher eben genauso in eine Variable wie du es bei Memo2.Text gemacht hast.

Gruß

inherited 24. Jan 2007 22:03

Re: Mehrere Memo's Speicher
 
Auch daran liegt es nicht ;)
Er muss Length(a) bzw length(b) vorher in eine eigene Variable packen.

SaFu 24. Jan 2007 22:08

Re: Mehrere Memo's Speicher
 
so etwa

Delphi-Quellcode:
procedure TForm7.Panel1Click(Sender: TObject);
var FileStream: TMemoryStream;
    memos :TFileName;
    a,b :String;
    c,d :integer;
begin
 a:=Memo1.Text;
 b:=Memo2.Text;
 c:= SizeOf(Integer);
 d:= SizeOf(Integer);

  FileStream := TMemoryStream.Create;

  FileStream.Write(Length(a), c));
  FileStream.Write(a, Length(Memo1.Text));

  FileStream.Write(Length(b), d));
  FileStream.Write(b, Length(Memo2.Text));

  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt';
  FileStream.SaveToFile(memos);
  FileStream.Free;
end;
:cry:

3_of_8 24. Jan 2007 22:33

Re: Mehrere Memo's Speicher
 
Das ist nicht das Problem. Das Problem ist das length(a), das macht Ärger. Speicher das in eine Variable.

Delphi-Quellcode:
procedure TForm7.Panel1Click(Sender: TObject);
var FileStream: TMemoryStream;
    memos: TFileName;
    a,b: String;
    la, lb: Integer;
begin
a:=Memo1.Text;
b:=Memo2.Text;
c:= SizeOf(Integer);
d:= SizeOf(Integer);

  FileStream := TMemoryStream.Create;

  la:=length(a);
  FileStream.Write(la, sizeof(Integer));
  FileStream.Write(a, la);

  lb:=length(b);
  FileStream.Write(lb, sizeof(Integer));
  FileStream.Write(b, lb);

  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt';
  FileStream.SaveToFile(memos);
  FileStream.Free;
end;

SaFu 24. Jan 2007 22:37

Re: Mehrere Memo's Speicher
 
Habs jetzt so aber die *.txt ist jetzt unleserlich

Delphi-Quellcode:

procedure TForm7.Button7Click(Sender: TObject);
var FileStream: TMemoryStream;
    memos :TFileName;
    a,b :String;
    c,d :integer;
begin
 a:=Memo1.Text;
 b:=Memo2.Text;
 c:=Length(a) ;
 d:=Length(b) ;

  FileStream := TMemoryStream.Create;

  FileStream.Write(c, SizeOf(Integer));
  FileStream.Write(a, Length(Memo1.Text));

  FileStream.Write(d, SizeOf(Integer));
  FileStream.Write(b, Length(Memo2.Text));

  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt';
  FileStream.SaveToFile(memos);
  FileStream.Free;
end;

3_of_8 24. Jan 2007 22:39

Re: Mehrere Memo's Speicher
 
Wie, "unleserlich"?

Die ersten 4 Zeichen sind "unleserlich" und später mal 4 Zeichen ebenfalls, das ist normal. Ansonsten müsste es eigentlich so stimmen. Wie sieht sie denn aus, die TXT?

SaFu 24. Jan 2007 22:42

Re: Mehrere Memo's Speicher
 
Das bei meiner "Lösung"
Delphi-Quellcode:

   èݤ     ÷ êãE 𤠽EE D   P¯¤ èݤ     ÷ êãE ð¤

Das bei deiner:
Delphi-Quellcode:
       Øn£

3_of_8 24. Jan 2007 22:52

Re: Mehrere Memo's Speicher
 
Delphi-Quellcode:
procedure TForm7.Button7Click(Sender: TObject);
var FileStream: TMemoryStream;
    memos :TFileName;
    a,b :String;
    c,d :integer;
begin
  a:=Memo1.Text;
  b:=Memo2.Text;
  c:=Length(a) ;
  d:=Length(b) ;

  FileStream := TMemoryStream.Create;
  FileStream.Write(c, SizeOf(Integer));
  FileStream.Write(a[1], c);

  FileStream.Write(d, SizeOf(Integer));
  FileStream.Write(b[1], d);

  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt';
  FileStream.SaveToFile(memos);
  FileStream.Free;
end;
So gehts.

SaFu 24. Jan 2007 22:59

Re: Mehrere Memo's Speicher
 
Super das Klappt so

Will nicht unhöfflich sein aber könntest du mir noch bei wiederherstellen helfen

Delphi-Quellcode:
procedure TForm7.Button9Click(Sender: TObject);
var
  memos :TFileName;
  FileStream: TMemoryStream;
  pos,l,i: Integer;
begin
  FileStream := TMemoryStream.Create;
  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt'
  FileStream.LoadFromFile(memos);

  pos := 0;
  l := 0;

  for i := 1 to 5 do
  begin
    FileStream.Position := pos;
    FileStream.Read(l, SizeOf(Integer));
    FileStream.Position := pos + SizeOf(Integer);

    case i of
      1: FileStream.Read(Memo1.Text ,l);
      {...}
      5: FileStream.Read(Memo5.Text ,l);
    end;

    pos := pos + l + SizeOf(Integer);
  end;
  FileStream.Free;
end;

end;
das ist schwerer als ich gedacht habe :pale:

Danke

3_of_8 25. Jan 2007 12:25

Re: Mehrere Memo's Speicher
 
Lass die ganzen TStream.Position-Zuweisungen weg. Setze nur am Anfang die Position auf 0, alles weitere erledigt TStream.Read automatisch.

Delphi-Quellcode:
procedure TForm7.Button9Click(Sender: TObject);
var
  memos :TFileName;
  FileStream: TMemoryStream;
  l,i: Integer;
begin
  FileStream := TMemoryStream.Create;
  memos:= ExtractFilePath(ParamStr(0))+'Bemerkungen\'+ ComboBox4.Text+'.txt'
  FileStream.LoadFromFile(memos);

  l := 0;

  for i := 1 to 5 do
  begin
    FileStream.Position := 0;
    FileStream.Read(l, SizeOf(Integer));

    case i of
      1: FileStream.Read(Memo1.Text ,l);
      {...}
      5: FileStream.Read(Memo5.Text ,l);
    end;

  end;
  FileStream.Free;
end;

end;

Hawkeye219 25. Jan 2007 12:46

Re: Mehrere Memo's Speicher
 
Hallo,

Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
procedure TForm7.Button9Click(Sender: TObject);
for i := 1 to 5 do
begin
  FileStream.Position := 0; // für _jedes_ Memo bei 0 starten?
  FileStream.Read(l, SizeOf(Integer));

  case i of
    1: FileStream.Read(Memo1.Text ,l); // ???
    {...}
    5: FileStream.Read(Memo5.Text ,l); // ????
  end;

end;

bezogen auf die Fehler sind wir jetzt wieder bei Beitrag #6 angelangt.

Was ich nicht verstehe: marabu hat in Beitrag #2 eine elegante Routine zum Schreiben der Memos gepostet. Es sollte doch möglich sein, diese Routine zu verstehen und eine analoge Routine zum Lesen der Memos zu entwickeln, oder?

Gruß Hawkeye

cruiser 25. Jan 2007 14:44

Re: Mehrere Memo's Speicher
 
Ich hab nie behauptet, meines sei das non-plus-ultra... Im Nachhinein seh ich das speichern der Lines-Anzahl im Klartext auch als... mh... hübscher an.. vor allem bleibt es so immer Klartext

SaFu 25. Jan 2007 15:08

Re: Mehrere Memo's Speicher
 
Ja marabu gibt sehr gute Tips, nur Leider bin ich noch nicht so gut in Programmieren, das ich diesen Code interpretieren und einbinden kann, geschweige denn eine procedure entwickeln zum laden
(Schande über mich)

Also hier gibt es echt leute die es richtig drauf haben.


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