Einzelnen Beitrag anzeigen

Delphineuling10
(Gast)

n/a Beiträge
 
#5

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 12:44
Hallo Leute,

nun benötige ich bitte doch noch einmal eure Hilfe. Ich hatte oben schon angedeutet, ich möchte gerne einen Stringgrid und mehrere Richedit-Felder in einer Datei speichern. Jeder Stream für sich funktioniert auch super. Ich habe nun versucht das in einem zusammen zufügen. Ich würde euch das gerne zeigen:

Ich habe vom SwissDelphiCenter den Code:

Delphi-Quellcode:
// Speichern Routine
procedure SaveEditcontrols(const FileName: string; const Controls: array of TCustomEdit);
var
  fs: TFilestream;
  writer: TWriter;
  i: Integer;
  ss: TStringstream;
begin
  fs := TFilestream.Create(FileName, fmCreate);
  try
    writer := TWriter.Create(fs, 4096);
    try
      for i := Low(Controls) to High(Controls) do
        if Controls[i] is TCustomRichedit then
        begin
          ss := TStringstream.Create(EmptyStr);
          try
            with TRichedit(Controls[i]) do
            begin
              Plaintext := False;
              Lines.SaveToStream(ss);
            end;
            writer.WriteString(ss.Datastring);
          finally
            ss.Free;
          end;
        end
      else
        writer.WriteString(Controls[i].Text);
    finally
      writer.Free;
    end;
  finally
    fs.Free;
  end;
end;

// Lade Routine
procedure LoadEditcontrols(const FileName: string; const Controls: array of TCustomEdit);
var
  fs: TFilestream;
  reader: Treader;
  i: Integer;
  ss: TStringstream;
begin
  fs := TFilestream.Create(FileName, fmOpenread or fmShareDenyWrite);
  try
    reader := Treader.Create(fs, 4096);
    try
      for i := Low(Controls) to High(Controls) do
        if Controls[i] is TCustomRichedit then
        begin
          ss := TStringstream.Create(reader.ReadString);
          try
            with TRichedit(Controls[i]) do
            begin
              Plaintext := False;
              Lines.LoadfromStream(ss);
            end;
          finally
            ss.Free;
          end;
        end
      else
        Controls[i].Text := reader.ReadString;
    finally
      reader.Free;
    end;
  finally
    fs.Free;
  end;
end;

// Beispiel, um 3 TRichEdits und 3 TEdit Controls in einer Datei zu speichern

procedure TForm1.Button1Click(Sender: TObject);
begin
  SaveEditControls('C:\temp\temp.dat',
    [richedit1, richedit2, edit1, edit2, edit3]);
end;
Ich habe das ausprobiert und es funktioniert! Mit eurer Hilfe habe ich es dann auch geschafft, ein StringGrid zu speichern. Den Code füge ich nun nicht nochmal ein, der steht oben in meinem ersten Beitrag.

Nun habe ich versucht beiden zusammenzufügen, dass sieht wie folgt aus:

Delphi-Quellcode:
//Speicher prozedur
procedure SaveEditcontrols(const FileName: string; const Controls: array of TCustomEdit; grd: TStringGrid; Pfad : String);
var
  fs: TFilestream;
  writer: TWriter;
  i: Integer;
  ss: TStringstream;
  q,j,row,col,len : Word;
  buff:string;
begin
//StringGrid in Stream speichern
fs := TFileStream.Create(pfad, fmCreate);
  fs.Free;
    fs := TFileStream.Create(pfad, fmOpenWrite);
      col := grd.ColCount -1;
      row := grd.RowCount -1;
      fs.WriteBuffer(row, SizeOf(Word));
      fs.writeBuffer(col, SizeOf(Word));
    for q := 0 to row do
      for j := 0 to col do
      begin
        buff := grd.Cells[j,q];
        len := Length(buff);
        fs.WriteBuffer(len, SizeOf(Word));
        fs.WriteBuffer(buff[1], len)
      end;
    fs.Free;
//Richedit und Edit Felder in String speichern
  fs := TFilestream.Create(FileName, fmCreate);
  try
    writer := TWriter.Create(fs, 4096);
    try
      for i := Low(Controls) to High(Controls) do
        if Controls[i] is TCustomRichedit then
        begin
          ss := TStringstream.Create(EmptyStr);
          try
            with TRichedit(Controls[i]) do
            begin
              Plaintext := False;
              Lines.SaveToStream(ss);
            end;
            writer.WriteString(ss.Datastring);
          finally
            ss.Free;
          end;
        end
      else
        writer.WriteString(Controls[i].Text);
    finally
      writer.Free;
    end;
  finally
    fs.Free;
  end;

//Lade Prozedur
procedure LoadEditcontrols(const FileName: string; const Controls: array of TCustomEdit; grd: TStringGrid; Pfad : String);
var
  fs: TFilestream;
  reader: Treader;
  i: Integer;
  ss: TStringstream;
  var q,j,row,col,len : Word;
  buff:string;
begin
fs := TFileStream.Create(pfad, fmOpenRead);
  fs.ReadBuffer(row, SizeOf(Word));
  fs.ReadBuffer(col, SizeOf(Word));
  grd.ColCount := col + 1;
  grd.RowCount := row + 1;
  for q := 0 to row do
    for j := 0 to col do
    begin
      fs.ReadBuffer(len, SizeOf(Word));
      SetLength(buff, len);
      fs.ReadBuffer(buff[1], len);
      grd.Cells[j,q] := buff
    end;
    fs.Free;

  fs := TFilestream.Create(FileName, fmOpenread or fmShareDenyWrite);
  try
    reader := Treader.Create(fs, 4096);
    try
      for i := Low(Controls) to High(Controls) do
        if Controls[i] is TCustomRichedit then
        begin
          ss := TStringstream.Create(reader.ReadString);
          try
            with TRichedit(Controls[i]) do
            begin
              Plaintext := False;
              Lines.LoadfromStream(ss);
            end;
          finally
            ss.Free;
          end;
        end
      else
        Controls[i].Text := reader.ReadString;
    finally
      reader.Free;
    end;
  finally
    fs.Free;
  end;
end;

//Und um die Proredur aufzurufen
procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveDialog1.Execute then
  begin
    if SaveDialog1.Filename<>'then // ist Dateiname angegeben?
    begin
       SaveEditControls(SaveDialog1.Filename,
     [richedit1, richedit2, edit1, edit2, edit3, edit4]);
      
      end;
  end;

end;
- Wenn ich das so lasse, lautet die Fehlermeldung: Not enough actual parameters.

- Wenn ich [richedit1, richedit2, edit1, edit2, edit3, edit4, Stringgrid1]) schreibe, lautet die Fehlermeldung: Incompatible types: 'TCustomEdit' and 'TStringGrid'

- Ich bin etwas verwirrt, weil ihr mir ja in der anderen Prozedur den Tipp gegeben habt, ich soll die [] weglassen und die Variabeln tauschen. Aber nun kann ich das auf das neue Problem nicht anwenden. Die Proceduren laufen auch ohne Fehlermeldung durch. Er stoppt nur am Ende wenn bei:procedure TForm1.Button1Click.

Ich würde mich sehr über eure Hilfe freuen, weil es der letzte Baustein für mein Projekt ist.

Grüße

Geändert von Delphineuling10 (17. Okt 2010 um 12:47 Uhr)
  Mit Zitat antworten Zitat