AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Stringgrid speichern und laden über einen Stream
Thema durchsuchen
Ansicht
Themen-Optionen

Stringgrid speichern und laden über einen Stream

Ein Thema von Delphineuling10 · begonnen am 16. Okt 2010 · letzter Beitrag vom 17. Okt 2010
Antwort Antwort
Delphineuling10
(Gast)

n/a Beiträge
 
#1

Stringgrid speichern und laden über einen Stream

  Alt 16. Okt 2010, 18:23
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

Geändert von Delphineuling10 (17. Okt 2010 um 00:21 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Stringgrid speichern und laden über einen Stream

  Alt 16. Okt 2010, 18:35
Hallo,
herzlich willkommen in der DP.

Delphi-Quellcode:
saveGrdToFile('D:\Test.dat',
[StringGrid1]);
Hier sind die Variablen vertauscht.
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#3

AW: Stringgrid speichern und laden über einen Stream

  Alt 16. Okt 2010, 18:43
Die Klammern [] sind zudem falsch.

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

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

n/a Beiträge
 
#4

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 00:28
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
  Mit Zitat antworten Zitat
Delphineuling10
(Gast)

n/a Beiträge
 
#5

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 11: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 11:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 11:56
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 const Controls : array of TCustomEdit ?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Delphineuling10
(Gast)

n/a Beiträge
 
#7

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 12:03
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 12:23
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Delphineuling10
(Gast)

n/a Beiträge
 
#9

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 12:38
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Stringgrid speichern und laden über einen Stream

  Alt 17. Okt 2010, 12:46
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:19 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