![]() |
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:
und dann habe ich noch einen Button erstellt und wollte die Speicherprozedur aufrufen:
//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;
Delphi-Quellcode:
und dann kommt immer die Meldung: [Error] Unit1.pas(80): Incompatible types: 'TStringGrid' and 'String'
procedure TForm1.Button1Click(Sender: TObject);
begin saveGrdToFile('D:\Test.dat', [StringGrid1]); end; 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 |
AW: Stringgrid speichern und laden über einen Stream
Hallo,
herzlich willkommen in der DP.
Delphi-Quellcode:
Hier sind die Variablen vertauscht.
saveGrdToFile('D:\Test.dat',
[StringGrid1]); |
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) |
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 |
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:
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.
// 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; Nun habe ich versucht beiden zusammenzufügen, dass sieht wie folgt aus:
Delphi-Quellcode:
- Wenn ich das so lasse, lautet die Fehlermeldung: Not enough actual parameters.
//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 [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 |
AW: Stringgrid speichern und laden über einen Stream
Delphi-Quellcode:
StringGrid1 ist vom Typ TStringGrid und diese Klasse ist kein Nachfahr von TCustomEdit
procedure SaveEditcontrols(const FileName: string; const Controls: array of 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
|
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 |
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. |
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.
|
AW: Stringgrid speichern und laden über einen Stream
Zitat:
![]() Diese Information gibt es zu jeder Klasse |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 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