![]() |
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:
Was ist dieser Filestream?
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; und was muss ich machen, damit er diesen kennt? gibt es da eine eigene unit, die ich erst unter uses eintragen muss? |
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 |
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? |
Re: Fragen rund ums Stringgrid
Delphi-Quellcode:
Das brauchst du... und ich glaube nicht, dass diese Funktionen irgendwo in der VCL definiert sind.
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; |
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:
Testen kannst du so:
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;
Delphi-Quellcode:
Mit diesem Test-Code würde dasselbe StringGrid auf vier verschiedene Arten hintereinander in dieselbe Datei geschrieben.
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; Grüße vom marabu |
Re: StringGrid speichern
Wenns nicht auf Performance und Speicherplatz ankommt, wär folgendes wahrscheinlich noch möglich:
Delphi-Quellcode:
mfg
// Pseudocode, ungetestet
stream := TFileStream.Create(...); try stream.WriteComponent(StringGrid1); stream.WriteComponent(StringGrid2); finally stream.Free; end; Christian |
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:
und das zweite einfach mit
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;
Delphi-Quellcode:
damit speichere ich einfach mit einem Klick in 2 dateien xD
speichern:=savedialog1.FileName ;
delete(speichern,length(savedialog1.FileName)-3,4); laden:=speichern+'.xxx'; g.SaveToFile(laden); ps: so wer hat jetzt was an meinem Code zu meckern :wink: EDIT: sch**** Tipfehler |
Re: StringGrid speichern
Zitat:
Schreib dir eine Procedure mit Übergabeparametern:
Delphi-Quellcode:
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.
procedure SaveStringGridToFile(AGrid:TStringGrid; const filename:string);
|
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