AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid speichern

Ein Thema von Noobinator · begonnen am 1. Okt 2006 · letzter Beitrag vom 2. Okt 2006
Antwort Antwort
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#1

Re: Im Stringgrid bestimmte Zellen Markieren (Rahmen/farbe)

  Alt 1. Okt 2006, 11:11
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?
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Fragen rund ums Stringgrid

  Alt 1. Okt 2006, 12:33
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
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#3

Re: Fragen rund ums Stringgrid

  Alt 1. Okt 2006, 13:24
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?
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Fragen rund ums Stringgrid

  Alt 1. Okt 2006, 13:37
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: StringGrid speichern

  Alt 1. Okt 2006, 17:00
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
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#6

Re: StringGrid speichern

  Alt 1. Okt 2006, 18:51
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#7

Re: StringGrid speichern

  Alt 2. Okt 2006, 10:52
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

EDIT: sch**** Tipfehler
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: StringGrid speichern

  Alt 2. Okt 2006, 11:13
Zitat von Noobinator:
ps: so wer hat jetzt was an meinem Code zu meckern
ICH!
Schreib dir eine Procedure mit Übergabeparametern:
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.
Andreas
  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:26 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