Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Stringgrid speichern und laden über einen Stream (https://www.delphipraxis.net/155291-stringgrid-speichern-und-laden-ueber-einen-stream.html)

Delphineuling10 16. Okt 2010 18:23

Stringgrid speichern und laden über einen Stream
 
Hallo Leute ich habe ein Problem und finde seit Stunden den Fehler nicht :/
Ich habe ein Stringgrid und möchte das gerne über einen Stream in eine Datei speichern und habe folgenden Code gefunden und versucht anzuwenden:


Delphi-Quellcode:
//StringGrid speichern (mit einem Stream)
procedure saveGrdToFile(grd: TStringGrid; Pfad : String);
var
  i,j,row,col,len : Word;
  buff: string;
begin
  fStream := TFileStream.Create(pfad, fmCreate);
  fStream.Free;
    fStream := TFileStream.Create(pfad, fmOpenWrite);
      col := grd.ColCount -1;
      row := grd.RowCount -1;
      fStream.WriteBuffer(row, SizeOf(Word));
      fStream.writeBuffer(col, SizeOf(Word));
    for i := 0 to row do
      for j := 0 to col do
      begin
        buff := grd.Cells[j,i];
        len := Length(buff);
        fStream.WriteBuffer(len, SizeOf(Word));
        fStream.WriteBuffer(buff[1], len)
      end;
    fStream.Free;
end;

//StringGrid laden (mit einem Stream)
procedure loadGrdFromFile(grd: TStringGrid; Pfad : String);
var i,j,row,col,len : Word;
buff: string;
begin
  fStream := TFileStream.Create(pfad, fmOpenRead);
  fStream.ReadBuffer(row, SizeOf(Word));
  fStream.ReadBuffer(col, SizeOf(Word));
  grd.ColCount := col + 1;
  grd.RowCount := row + 1;
  for i := 0 to row do
    for j := 0 to col do
    begin
      fStream.ReadBuffer(len, SizeOf(Word));
      SetLength(buff, len);
      fStream.ReadBuffer(buff[1], len);
      grd.Cells[j,i] := buff
    end;
    fStream.Free
end;
und dann habe ich noch einen Button erstellt und wollte die Speicherprozedur aufrufen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
saveGrdToFile('D:\Test.dat',
    [StringGrid1]);
end;
und dann kommt immer die Meldung: [Error] Unit1.pas(80): Incompatible types: 'TStringGrid' and 'String'

Es wäre schön wenn jemand eine Idee hat, was ich noch ändern oder probieren kann, damit das ganze funktioniert. Mir wäre aber wichtig, dass ich das über einen Stream schaffe..

Grüße

Chemiker 16. Okt 2010 18:35

AW: Stringgrid speichern und laden über einen Stream
 
Hallo,
herzlich willkommen in der DP.

Delphi-Quellcode:
saveGrdToFile('D:\Test.dat',
[StringGrid1]);
Hier sind die Variablen vertauscht.

toms 16. Okt 2010 18:43

AW: Stringgrid speichern und laden über einen Stream
 
Die Klammern [] sind zudem falsch.

Delphi-Quellcode:
saveGrdToFile('D:\Test.dat', StringGrid1);


PS: Bitte formatiere noch deinen Sourcecode mit Hilfe der [ delphi][ /delphi]-Tags. (ohne Leerzeichen)
(Klicke dazu auf Bearbeiten)

Delphineuling10 17. Okt 2010 00:28

AW: Stringgrid speichern und laden über einen Stream
 
Hallo Chemiker und Toms,

vielen Dank für eure schnelle Antwort und für den Tip mit (-Tags). Hat funktioniert!
Ich habe noch einen zweiten Stream mit deren Hilfe ich mehrere Richeditfelder speicher und auch in eine Datei speicher. Nun möchte ich das gerne beide Streams (Stringgrid und Richedit) zu einem zusammenfügen. Aber das versuche ich erstmal alleine und falls ich nicht weiter komme würde ich gerne nochmal um euren Rat bitten.

Grüße

Delphineuling10 17. Okt 2010 11:44

AW: Stringgrid speichern und laden über einen Stream
 
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

Sir Rufo 17. Okt 2010 11:56

AW: Stringgrid speichern und laden über einen Stream
 
Delphi-Quellcode:
procedure SaveEditcontrols(const FileName: string; const Controls: array of TCustomEdit);
StringGrid1 ist vom Typ TStringGrid und diese Klasse ist kein Nachfahr von TCustomEdit
Genau das sagt die Fehlermeldung auch.
Die Routine von den Schweizern kann ausschließlich Klassen von TCustomEdit und die Nachfahren davon speichern.

Warum glaubst du, steht in der Deklaration
Delphi-Quellcode:
const Controls : array of TCustomEdit
? ;)

Delphineuling10 17. Okt 2010 12:03

AW: Stringgrid speichern und laden über einen Stream
 
Aha ok..wofür das ganze genau steht das weiß ich immer nicht. Ich habe erst in diesem Sommer damit angefangen mir Delphi etwas beizubringen ;)

Also vermute ich, dass es keine Möglichkeit das zusammen zufügen :/? Wenn Nein, gibt es andere Möglichkeiten wie ich das anstellen könnte.

Grüße

Sir Rufo 17. Okt 2010 12:23

AW: Stringgrid speichern und laden über einen Stream
 
Mich wundert jetzt aber folgendes:

Einen Parameter vom Typ String erkennst du nicht, bzw. du weißt nicht wie man den benutzt.
Dieses zählt zu den "LowLevel"-Grundlagen

Ein Stream gehört eher zu den "Advanced"-Grundlagen.

Kann es sein, dass du versuchst vor dem ersten Schritt den 10. Schritt zu machen?

Was du aus den beiden Code-Fragmenten gemacht hast, ist ohne Verständnis einfach zusammenkopiert.
Das hat leider mit Programmieren nichts zu tun. Und so kann Dir hier keiner helfen, da jede Antwort zu diesem Thema nicht verstehen würdest.

Wenn du dir einen Gefallen tun möchtest, dann arbeite ein paar Grundlagen-Tutorials durch.

Delphineuling10 17. Okt 2010 12:38

AW: Stringgrid speichern und laden über einen Stream
 
Also ein String erkenne ich schon, aber das ein StringGrid und diese Klasse ist kein Nachfahr von TCustomEdit ist war mir nun nicht so klar. Dann werde ich mal noch bissel nach einer Lösung suchen. Danke trotzdem.

Sir Rufo 17. Okt 2010 12:46

AW: Stringgrid speichern und laden über einen Stream
 
Zitat:

Zitat von Delphineuling10 (Beitrag 1056187)
Also ein String erkenne ich schon, aber das ein StringGrid und diese Klasse ist kein Nachfahr von TCustomEdit ist war mir nun nicht so klar.

Und dabei liegt die Erkenntnis nur einen Klick entfernt
TStringGrid
Diese Information gibt es zu jeder Klasse


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