Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Eine Datei in 3 Memos laden (https://www.delphipraxis.net/37054-eine-datei-3-memos-laden.html)

TheMiller 30. Dez 2004 12:09


Eine Datei in 3 Memos laden
 
Hey Leute,

bräuchte mal wieder eure Unterstützung..

Ich lade mittels Stringliste die Inhalte von 3 Memos in eine Datei. Jetzt möchte ich den Inhalt, der zu Memo1 gehörte, wieder in Memo1 laden, den Inhalt von Memo2 in Memo2 usw. laden.

Wie mache ich das am Besten? Ich habe das noch nie gemacht. Es könnte evtl was mit pos() oder so zu tun haben, oder?

Wäre für einen Codeschnipsel mit Erklärung sehr sehr dankbar!

Wie immer, Danke im Vorraus

Bye!

PS: Auch mein Glückwunsch! :sharkylinchen:

Airblader 30. Dez 2004 12:14

Re: Eine Datei in 3 Memos laden
 
Also wenn du in der Datei nicht irgendwie deutlich machst (Seperator) was zu was gehört geht das schlecht :wink:

TheMiller 30. Dez 2004 12:16

Re: Eine Datei in 3 Memos laden
 
Naja, einen Seperator eintragen ist ja auch nicht gerade die Welt. Dann nehmen wir doch einfach ein ";"...ok?

glkgereon 30. Dez 2004 12:23

Re: Eine Datei in 3 Memos laden
 
naja, wenns ein text is besser net, da würde ich eher sowas wie [/\Memo1/\] nehmen

und dann das:

Delphi-Quellcode:
Sep[1]:='[/\Memo1/\]';
Sep[2]:='[/\Memo2/\]';
Sep[3]:='[/\Memo3/\]';
Temp.LoadFromFile('x.y');
Memo1.Text:=copy(Temp.Text,0,Pos(Sep[1],Temp.Text));
Memo2.Text:=copy(Temp.Text,Pos(Sep[1],Temp.Text)+length(Sep[1],Temp.Text),Pos(Sep[2],Temp.Text));
Memo3.Text:=copy(Temp.Text,Pos(Sep[2],Temp.Text)+length(Sep[2],Temp.Text),Pos(Sep[3],Temp.Text));
event. bei den pos und so nochn +1 oder -1 hin, aber der ansatz müsste es sein....

achso:
so markiert [/\Memo1/\] das ende des "Memo1-Textes"

TheMiller 30. Dez 2004 12:25

Re: Eine Datei in 3 Memos laden
 
Cool, ich danke dir. Werde es mal testen und mich bei Fragen nochmal melden ;-)

TheMiller 30. Dez 2004 12:38

Re: Eine Datei in 3 Memos laden
 
Naja,

so ganz will es noch net. Ich habe jetzt daraus ein Array of String gemacht und dann bekomme ich in den letzten 3 Zeilen die Meldung vom Compiler: Inkompatible Typen..

Habe es auch mit array of Char probiert, doch dann sagt der Compiler bei den Sep[x]-Zeilen: Inkompatible Typen Char und String

Was nun?

glkgereon 30. Dez 2004 12:46

Re: Eine Datei in 3 Memos laden
 
dann setz jeweils die sachen ein...

sollte ein array of string sein...

TheMiller 30. Dez 2004 12:47

Re: Eine Datei in 3 Memos laden
 
Hm... das klappt bei mir aber nicht. Habe das auch noch nie gemacht :oops:

TheMiller 30. Dez 2004 21:08

Re: Eine Datei in 3 Memos laden
 
Hat niemand mehr eine Idee? *GanzVorsichtigNachfrag*

Nikolas 30. Dez 2004 21:29

Re: Eine Datei in 3 Memos laden
 
Pushen ist doch erst nach 24h erlaubt... :evil:

Du kannst auch einfach den gesamten Text von Memo1 in die erste Zeile der Datei schreiben und dann den Zeilenumsprung als Trennzeichen missbrauchen.

hibbert 30. Dez 2004 21:31

Re: Eine Datei in 3 Memos laden
 
wie wäre es denn, wenn du den Text in eine Variable lädst.
und dann sollte folgendes gehen:
Delphi-Quellcode:
var text,textM1,textM2,textM2:string;
i:integer;
begin
i:=pos('[/\Memo1/\]',text);
textM1 := copy(text,1,i);
delete(text,1,i + 10);
i:=pos('[/\Memo2/\]',text);
textM2 := copy(text,1,i);
delete(text,1,i + 10);
textM3 := text;
(ungetestet !!)
den 3. seperator kannst du ja weglassen, denn dann kann ja nurnoch was für das letzte memo kommen...

ist nur ein lösungs ansatz, hoffe das ich helfen konnte.

hibbert

glkgereon 30. Dez 2004 21:31

Re: Eine Datei in 3 Memos laden
 
aber wenn da auch zeilentrennzeichen sind?

ich würde meine methode oben zum laufen bringen :mrgreen:

TheMiller 30. Dez 2004 23:19

Re: Eine Datei in 3 Memos laden
 
Danke, ich werde auch dies mal ausprobieren...

@glkgereon: Ja, aber wie...

Wuaegner 30. Dez 2004 23:43

Re: Eine Datei in 3 Memos laden
 
hm wieso machsts nich mit ner ini-Datei?

Aenogym 31. Dez 2004 00:00

Re: Eine Datei in 3 Memos laden
 
Zitat:

Zitat von Wuaegner
hm wieso machsts nich mit ner ini-Datei?

genau:

Delphi-Quellcode:
//speichern
var ini: TIniFile;
begin
  ini := TIniFile.create;
  try
    ini.loadfromfile('...');
    ini.writestring('Memos', 'Memo1', memo1.lines.DelimitedText);
    ini.writestring('Memos', 'Memo2', memo2.lines.DelimitedText);
    ini.writestring('Memos', 'Memo3', memo3.lines.DelimitedText);
  finally
    ini.free;
  end;
end;

//laden
var ini: TIniFile;
begin
  ini := TIniFile.create;
  try
    ini.loadfromfile('...');
    memo1.lines.delimitedtext := ini.readstring('Memos', 'Memo1', '');
    memo2.lines.delimitedtext := ini.readstring('Memos', 'Memo2', '');
    memo3.lines.delimitedtext := ini.readstring('Memos', 'Memo3', '');
  finally
    ini.free;
  end;
end;
so in etwa (ungetestet).

Aenogym

Pr0g 31. Dez 2004 00:05

Re: Eine Datei in 3 Memos laden
 
Unter Win9x ist die größe von Ini-Dateien auf 32Kb begrenzt, dann müsstest du, falls es größere Datenmengen sind, eine passende Komponente, wie TBigIniFile nehmem.

Aber es geht auch als Textdatei:
Delphi-Quellcode:
procedure WriteMemos(AMemo1, AMemo2, AMemo3: TMemo; const AFilename: String);
var
  SL: TStrings;
begin
  SL := TStringList.Create;
  try
    SL.AddStrings(AMemo1.Lines);
    SL.Add('[/\Memo/\]');
    SL.AddStrings(AMemo2.Lines);
    SL.Add('[/\Memo/\]');
    SL.AddStrings(AMemo3.Lines);
    SL.SaveToFile(AFilename);
  finally
    SL.Free;
  end;
end;

procedure ReadMemos(AMemo1, AMemo2, AMemo3: TMemo; const AFilename: String);
var
  SL: TStrings;
  i,
  Memo: Integer;
begin
  AMemo1.Clear;
  AMemo2.Clear;
  AMemo3.Clear;
  SL := TStringList.Create;
  try
    SL.LoadFromFile(AFilename);
    Memo := 1;
    for i := 0 to SL.Count - 1 do
    begin
      if SL[i] = '[/\Memo/\]' then
      begin
        Inc(Memo);
        Continue;
      end;
      case Memo of
        1: AMemo1.Lines.Add(SL[i]);
        2: AMemo2.Lines.Add(SL[i]);
        3: AMemo3.Lines.Add(SL[i]);
      end;
    end;
  finally
    SL.Free;
  end;
end;
Aufruf:
Delphi-Quellcode:
  WriteMemos(Memo1, Memo2, Memo3, 'c:\test.txt');
// und
  ReadMemos(Memo1, Memo2, Memo3, 'c:\test.txt');
Ich sage nicht, dass es die beste Lösung ist, aber sie funktioniert ;)

MfG Pr0g

TheMiller 31. Dez 2004 10:45

Re: Eine Datei in 3 Memos laden
 
Hey,

ihr seid klasse. Ich werde alles mal probieren. Aber auf die Idee mit der Ini-Datei hätte ich auch kommen können. Außerdem ist das Ziel-OS WinXP, so dass ich mit der größe keine Probs bekomme.

Danke an alle.

Falls wir uns nicht mehr lesen sollten, wünsche ich euch einen guten Rutsch in 2005!

Bye

Christian Seehase 31. Dez 2004 13:27

Re: Eine Datei in 3 Memos laden
 
Moin DJ-SPM,

vor kurzem hatte ich hier mal eine Methode gepostet, wie man mehrere TRichEdit in eine Datei schreiben, und sie getrennt wieder auslesen kann.
Das funktioniert natürlich auch mit TMemo.

10 Richedit in eine Datei speichern und wieder auslesen

TheMiller 31. Dez 2004 13:46

Re: Eine Datei in 3 Memos laden
 
Hi chris,

meinst du diesen Code:

Delphi-Quellcode:
// schreiben
var
  iLen : integer;
  fs  : TFileStream;
  ms  : TMemoryStream;

begin
  ms := TMemoryStream.Create;
  fs := TFileStream.Create(....,fmCreate);
  try
    ms.Clear;
    RichEdit1.Lines.SaveToStream(ms);
    iLen := ms.Position;
    fs.Write(iLen,4);
    fs.CopyFrom(ms,0);
  finally
    FreeAndNil(fs);
    FreeAndNil(ms);
  end;
end;

// lesen
var
  iLen : integer;
  fs  : TFileStream;
  ms  : TMemoryStream;

begin
  ms := TMemoryStream.Create;
  fs := TFileStream.Create('c:\temp\riform.txt',fmOpenRead);
  try
    fs.Read(iLen,4);
    ms.Clear;
    ms.CopyFrom(fs,iLen);
    ms.Position := 0;
    RichEdit1.Lines.LoadFromStream(ms);
  finally
    FreeAndNil(fs);
    FreeAndNil(ms);
  end;
end;
Wenn ja, kannst du mir kurz sagen, wo die Seperatoren sind, also, wie der Code funzt?
Danke

Christian Seehase 31. Dez 2004 13:53

Re: Eine Datei in 3 Memos laden
 
Moin DJ-SPM,

nein, ich meinte den Code davor.
Das was Du da gepostet hast ist nur erforderlich, wenn man die, in einem Memo ja nicht vorhandenen, Formatierungen mit speichern will.
Das Prinzip bleibt aber gleich.
Wie ich in dem genannten Thread weiter oben beschrieben hatte:
Es wird erst die Länge gespeichert, dann der Inhalt.

Bei Auslesen liest man dann also die Länge ein, reserviert sich in einem Buffer entsprechend Platz, und liest ein.

Das Beispiel bezieht sich nur auf eine Datei, aber in einer Schleife gehen dann auch mehrere.

TheMiller 31. Dez 2004 14:05

Re: Eine Datei in 3 Memos laden
 
stimmt, danke.

Jetzt habe ich so viele Lösungsvorschläge, da weiß ich garnet, welchen ich nehmen soll...


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