Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi 10 Richedit in eine Datei speichern und wieder auslesen (https://www.delphipraxis.net/36709-10-richedit-eine-datei-speichern-und-wieder-auslesen.html)

ferby 23. Dez 2004 21:42


10 Richedit in eine Datei speichern und wieder auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Ich möchte ein Programm das 10 Richeditfelder (in einen Menü kann man wählen in welchen man schreiben will) hat. Den inhalt soll man dann in eine Datei Speichern können. In der Datei soll pro Zeile der Inhalt eines Richeditfeldes stehen. Das Programm habe ich schon geschrieben (nur schnell) aber es ist ein Fehler drinn den ich nicht finde....
Wenn ich einmal Speicher dann gehts, aber wenn ich nochmal speicher dann nicht mehr und ich weiß nicht warum....

könnt ihr euch das Programm mal anschauen, bitte die Programmierung nicht ändern sondern nur den Fehler suchen es ist nämlich ein Teil aus einen größeren Programm... DANKE!


Ferby

Luckie 23. Dez 2004 21:52

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Zitat:

Zitat von ferby
könnt ihr euch das Programm mal anschauen, bitte die Programmierung nicht ändern sondern nur den Fehler suchen

Wir sind hier nicht bei 9live!

Poste die relevanten Codeteile und sag uns was nicht klappt bzw. was für ein Fehler kommt.

ferby 23. Dez 2004 21:56

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hi,

Das Programm ist sehr kurz und ich weiß nicht in welchen codeteil der Fehler ist.
Wenn ich Abspeicher das Programm lade dann geht noch alles aber wenn ich jetzt nochmal auf speichern gehe und das programm neu öffne dann verschwinden zeilen und in der text datei verrutschen zeilen, ich weiß nicht warum...

gmarts 23. Dez 2004 22:40

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Wenn's so kurz ist, dann poste es doch hier. :) (P.S. die exe nächstes mal nicht mitpacken, dein armer modemuser)

Wenn du mal in deine Textdatei schaust, dann siehst du, das es richtig gespeichert wird.
Also genügt es die Procedure fürs Öffnen hier zu posten.

So z.B.:
Delphi-Quellcode:
var
  Form1: TForm1;
  waserwillrichedits: array [1..10] of TRichedit;
    textdatei:textfile;
...

procedure TForm1.Button1Click(Sender: TObject);
var
i,i2:integer;
waserwillvar:ansistring;
begin
   assignfile(textdatei, 'test.txt');  // Richeditfelder werden geladen
   reset(textdatei);
   for i:=1 to 10 do
   begin
      readln(textdatei,waserwillvar);
      for i2:=1 to length(waserwillvar) do if waserwillvar[i2]=#1 then waserwillvar[i2]:=#10;
      waserwillrichedits[i].text:=waserwillvar;
   end;
   closefile(textdatei);
end;
Dann vielleicht etwas übersichtlichere Namen. (waserwillhier waserwilldort waserwilldennüberhaupt....)
So und jetzt schauen wa mal drüber...

ferby 23. Dez 2004 22:43

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hallo,

Ich finde keinen Fehler......

gmarts 23. Dez 2004 22:53

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Wieso so kompliziert? :D

Laden:
Delphi-Quellcode:
for i:=1 to 10 do readln(textdatei,waserwillrichedits[i].text);
Speichern:
Delphi-Quellcode:
 for i:=1 to 10 do writeln(textdatei,waserwillrichedits[i].text);

ferby 24. Dez 2004 09:23

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hallo,


ALso wirklich wie soll das gehen? Wenn im 1 Richedit jetzt zwei Zeilen stehen dann stehen zwei Zeilen in der txt Datei, wenn ich jetzt wieder Lade dann steht die erste Zeile der Textdatei im Richedit1 und die zweite im Richedit2....

Christian Seehase 24. Dez 2004 10:43

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Moin ferby,

Zitat:

Zitat von ferby
In der Datei soll pro Zeile der Inhalt eines Richeditfeldes stehen.

Das halte ich für zu aufwendig.
Warum speicherst Du nicht in einen FileStream.
Erst die Länge des Feldes, dann den Inhalt.

ferby 24. Dez 2004 14:06

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hallo,


Kannst du mir da ein Besipiel geben, ich wüßt wie ich das mit einen richedit mach aber nicht mit 10 in einer Datei????


Frohe Weinachten an alle,
Ferby

StanY 24. Dez 2004 14:10

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Du bastelst dir nen Dateiheader, bestehend aus 10 Integer.

Dann speicherst du die Längen der RichtEdit Felder im Header.

Danach kommt nacheinander einfach der Inhalt der RichEdits.

Beim auslesen: Header auslesen. Auf Grund der Größen die RichEdits auslesen.

edit: Alternativ statt Header eine eigene Datei, wo die Längen drin stehen.

ferby 24. Dez 2004 14:29

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hi,

Also ich weiß nicht ob das so einfacher ist als meine Variante... ich schau mal ob ich auf den Fehler bei Variante finde und wenn nicht probier ich deine aus.

Christian Seehase 24. Dez 2004 14:33

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Moin Ferby,

das könnte so aussehen, wenn Du nur den Text haben willst:

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

begin
  fs := TFileStream.Create(....);
  try
    iLen := length(RichEdit1.Lines.Text);
    fsWrite(iLen,4);
    fs.Write(RichEdit1.Lines.Text[1],iLen);
  finally
    FreeAndNil(fs);
  end;
end;

// lesen
var
  iLen : integer;
  fs  : TFileStream;
  sBuf : string;

begin
  fs := TFileStream.Create(...,fmOpenRead);
  try
    fs.Read(iLen,4);
    SetLength(sBuf,iLen);
    fs.Read(sBuf[1],iLen);
    RichEdit1.Lines.Text := sBuf;
  finally
    FreeAndNil(fs);
  end;
end;
Nachdem Du den Wert ausgelesen/geschrieben hast, steht der FileStream auf der Länge des nächsten Eintrages.
Du kannst also das, was zwischen try/finally steht der Reihe nach für alle RichEdits ausführen.
Sollen auch die Formatierungen gespeichert werden wird's etwas komplizierter:

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;

ferby 24. Dez 2004 15:55

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,


Das ist mir viel zu kompliziert, ich möchte nur Befehle verwenden die ich auch verstehe....

Ich habe jetzt alles nochmal geschrieben und zwar nach einen anderen prinizp.

Kann sich das wer mal anschauen, es funktioniert auch, nur Zeilenumbrüche werden gelöscht... warum????


Das Programm ist ganz kelein, es nimmt euch nur ganz wenig von eurer kostbaren Zeit weg :-)

Luckie 24. Dez 2004 16:03

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Ein Zeilenumbruch ist #13#10 unter Windows. #01 ist das Steuerzeichen für "Start of Header".

Btw. sieht mir dein Quellcode reichlich kompliziert aus.

ferby 24. Dez 2004 16:07

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hallo,

Das weiß ich, wo muss ich das #10 einfügen damit es geht, ich habe es auf verschiedenen stellen ausproiert nur dan funktionieren auf einmal andere dinge nicht mehr.........

Luckie 24. Dez 2004 16:22

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Warte ich schreibe es dir gerade.

Luckie 24. Dez 2004 17:43

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
So in etwa:
Delphi-Quellcode:
var
  Form1        : TForm1;
  RichEditArray: array[0..2] of TRichedit;

implementation

{$R *.dfm}

procedure SaveRichtEdit(RichEdit: TRichEdit; const Filename: string);
var
  sl          : TStringList;
begin
  sl := TStringList.Create;
  try
    if FileExists(Filename) then
      sl.LoadFromFile(Filename);
    sl.Add(RichEdit.Text);
    sl.SaveToFile(Filename);
  finally
    FreeAndNil(sl);
  end;
end;

procedure LoadRichEdits;
var
  Filename    : string;
  sl          : TStringList;
  i           : Integer;
begin
  Filename := ExtractFilePath(ParamStr(0)) + 'test.txt';
  if FileExists(Filename) then
  begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile(Filename);
      for i := 0 to Min(length(RichEditArray), sl.Count) - 1 do
      begin
        RichEditArray[i].Text := sl.Strings[i];
      end;
    finally
      FreeAndNil(sl);
    end
  end;
  for i := 0 to length(RichEditArray) - 1 do
    RichEditArray[i].Visible := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i           : integer;
begin
  for i := 0 to length(RichEditArray) - 1 do
  begin
    RichEditArray[i] := TRichedit.Create(Self);
    RichEditArray[i].Parent := Self;
    RichEditArray[i].SetBounds(100, 10, 550, 250);
    RichEditArray[i].Visible := False;
  end;
end;

procedure TForm1.speichernClick(Sender: TObject);
var
  Filename    : string;
  i           : Integer;
begin
  Filename := ExtractFilePath(ParamStr(0)) + 'test.txt';
  if FileExists(Filename) then
  begin
    if not DeleteFile(Filename) then
      ShowMessage(SysErrorMessage(GetLastError))
    else
      for i := 0 to length(RichEditArray) - 1 do
        SaveRichtEdit(RichEditArray[i], Filename);
  end;
end;

procedure TForm1.waserwillmenueClick(Sender: TObject);
var
  i           : Integer;
begin
  for i := 0 to length(RichEditArray) - 1 do
    RichEditArray[i].Visible := False;
  RichEditArray[waserwillmenue.ItemIndex].Visible := True;
end;

procedure TForm1.ladenClick(Sender: TObject);
var
  i           : Integer;
begin
  speichern.Visible := True;
  LoadRichEdits;
  for i := 0 to length(RichEditArray) - 1 do
    RichEditArray[i].Visible := True;
end;

ferby 24. Dez 2004 18:01

Re: 10 Richedit in eine Datei speichern und wieder auslesen
 
Hallo,

Danke werde ich später ausprobieren habe jetzt leider keine Zeit mehr.... das Christkind kommt muss gucken gehen :shock:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz