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