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 (https://www.delphipraxis.net/78232-stringgrid-speichern.html)

Noobinator 1. Okt 2006 10:11


Re: Im Stringgrid bestimmte Zellen Markieren (Rahmen/farbe)
 
und noch ne Frage von mir.
Bisher habe ich verschiedene stringgrids immer in mehrern Dateien speichern müssen, da ich anderst nicht zurecht kahm.
Nun kann das ja nicht ewig so weitergehen und ich habe mich mal ein bissl mit Onkel google auseinandergesetzt.

Heraus kam das:
Delphi-Quellcode:
procedure TForm1.WriteStringGridsToFile(const fname:string);
var
  fs:TFileStream;
begin
  fs:=TFileStream.Create(fname,fmCreate);
  if writestringgridtofilestream(StringGrid1,fs) and// das kennt er nicht
    writestringgridtofilestream(StringGrid2,fs) then showmessage('ok') // das auch nicht
    else showmessage('Schreibfehler!');
  fs.Free;
end;
 
procedure TForm1.ReadStringGridsFromFile(const fname:string);
var
  fs:TFileStream;
begin
  fs:=TFileStream.Create(fname,fmOpenRead);
  fs.Position:=0;
  if readstringgridfromfilestream(StringGrid1,fs) and // das genausowenig
    readstringgridfromfilestream(StringGrid2,fs) then showmessage('ok') //wie das.
    else showmessage('Lesefehler!');
  fs.Free;
end;
Was ist dieser Filestream?
und was muss ich machen, damit er diesen kennt? gibt es da eine eigene unit, die ich erst unter uses eintragen muss?

marabu 1. Okt 2006 11:33

Re: Fragen rund ums Stringgrid
 
Hallo,

TFileStream ist in der Unit Classes deklariert.

Kannst du bei Gelegenheit (jetzt wäre so eine Gelegenheit) die von dir verwendete Delphi-Version in deinem DP-Profil nachtragen?

Grüße vom marabu

Noobinator 1. Okt 2006 12:24

Re: Fragen rund ums Stringgrid
 
Habe delphi 7 Personal

und warum kennt der den Bezeichner writetofilestream und readfromfilestream dann nicht, denn die unit classes ist ja standardimplementiert.

oder kennst du noch eine andere möglichkeit 2 grids in einer datei zu speichern?

DGL-luke 1. Okt 2006 12:37

Re: Fragen rund ums Stringgrid
 
Delphi-Quellcode:
procedure WriteStringToStream(s: string; fs: TStream);
begin
fs.Write(s[0],length(s));
end;

function ReadStringFromStream(count: Integer; fs: TStream): string;
begin
result := '';
fs.Read(result[0],count);
end;
Das brauchst du... und ich glaube nicht, dass diese Funktionen irgendwo in der VCL definiert sind.

marabu 1. Okt 2006 16:00

Re: StringGrid speichern
 
Lukas hat Recht, Onkel Google hat dir nicht alles gegeben. In seinem Code hat er allerdings ein paar Fehler eingebaut.

Beim Speichern eines StringGrid musst man überlegen, ob die Daten spalten- oder zeilenorientiert gespeichert werden sollen. Das Speichern mehrerer StringGrids in derselben Datei ist technisch kein Problem, aber ob es auch sinnvoll ist? Falls es Überschriften (FixedCols, FixedRows) gibt, sollen die immer bei jedem Speichervorgang mitgespeichert werden?

Eine Speicherroutine, die diese Fragestellungen berücksichtigt, könnte ansatzweise so aussehen:

Delphi-Quellcode:
type
  TSaveOption = (soSaveCols, soExcludeFixed);
  TSaveOptions = set of TSaveOption;

procedure SaveGrid(sg: TStringGrid; s: TStream; so: TSaveOptions = []);
var
  iLow, iHigh, i: Integer;
  ss: TStringStream;
  bSaveCols, bExcludeFixed: Boolean;
begin
  ss := TStringStream.Create('');
  with sg do
  begin
    bSaveCols := soSaveCols in so;
    bExcludeFixed := soExcludeFixed in so;
    if bSaveCols then
    begin
      iLow := IfThen(bExcludeFixed, FixedCols);
      iHigh := Pred(ColCount);
    end else
    begin
      iLow := IfThen(bExcludeFixed, FixedRows);
      iHigh := Pred(RowCount);
    end;
    for i := iLow to iHigh do
    begin
      ss.Size := 0;
      if bSaveCols
        then ss.WriteString(Cols[i].CommaText + sLineBreak)
        else ss.WriteString(Rows[i].CommaText + sLineBreak);
      ss.Position := 0;
      s.CopyFrom(ss, ss.Size);
    end;
  end;
  ss.Free;
end;
Testen kannst du so:

Delphi-Quellcode:
var
  s: TStream;
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.txt');
  s := TFileStream.Create(fn, fmCreate);
  //  Zeilenweise, FixedRows mitspeichern
  SaveGrid(StringGrid, s);
  //  Zeilenweise, FixedRows nicht mitspeichern
  SaveGrid(StringGrid, s, [soExcludeFixed]);
  //  Spaltenweise, FixedRows mitspeichern
  SaveGrid(StringGrid, s, [soSaveCols]);
  //  Spalteweise, FixedRows nicht mitspeichern
  SaveGrid(StringGrid, s, [soSaveCols, soExcludeFixed]);
  s.Free;
end;
Mit diesem Test-Code würde dasselbe StringGrid auf vier verschiedene Arten hintereinander in dieselbe Datei geschrieben.

Grüße vom marabu

r2c2 1. Okt 2006 17:51

Re: StringGrid speichern
 
Wenns nicht auf Performance und Speicherplatz ankommt, wär folgendes wahrscheinlich noch möglich:

Delphi-Quellcode:
  // Pseudocode, ungetestet
  stream := TFileStream.Create(...);
  try
    stream.WriteComponent(StringGrid1);
    stream.WriteComponent(StringGrid2);
  finally
    stream.Free;
  end;
mfg

Christian

Noobinator 2. Okt 2006 09:52

Re: StringGrid speichern
 
danke Leute, ich habe mir aber sebst geholfen indem ich ein bissl getrickst habe xD
Ist nicht die optimale lösung,aber geht auch.

habe das erste stringgrid einfach normal gespeichert mit

Delphi-Quellcode:
procedure TForm1.Speichern1Click(Sender: TObject);
var
  F,g: TStringList;
  i,s: Integer;
begin
savedialog1.execute;
  F := TStringList.Create;
  try
    F.Add(IntToStr(StringGrid1.RowCount));
    F.Add(IntToStr(StringGrid1.ColCount));
    for i := 0 to (StringGrid1.RowCount - 1) do
      F.Add(StringGrid1.Rows[i].CommaText);
    F.SaveToFile(savedialog1.FileName);
  finally
    F.Free;
end;
und das zweite einfach mit

Delphi-Quellcode:
speichern:=savedialog1.FileName ;
      delete(speichern,length(savedialog1.FileName)-3,4);
      laden:=speichern+'.xxx';
    g.SaveToFile(laden);
damit speichere ich einfach mit einem Klick in 2 dateien xD

ps: so wer hat jetzt was an meinem Code zu meckern :wink:

EDIT: sch**** Tipfehler

shmia 2. Okt 2006 10:13

Re: StringGrid speichern
 
Zitat:

Zitat von Noobinator
ps: so wer hat jetzt was an meinem Code zu meckern :wink:

ICH! :zwinker:
Schreib dir eine Procedure mit Übergabeparametern:
Delphi-Quellcode:
procedure SaveStringGridToFile(AGrid:TStringGrid; const filename:string);
Wenn du dann noch das Gegenstück zum Laden hast, dann hast du ein nützliches Paar, dass in der Code Library ganz gut aufgehoben wäre.


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