Zapis i odczyt StringGrid z całym formatowaniem tabeli.

0

Witajcie. Ma ktoś może jakiś pomysł albo jakiś gotowy patent jak zrobić zapis i odczyt tabeli StringGgrid wraz z całym jej formatowaniem? zakładając, że tabela jest duża a każda cela ma inną czcionkę kolor wielkość, wyrównanie itp... ? Co prawda mam zrobiony obecnie standardowy zapis/odczyt StringGrida do pliku (jako tekst) i działa prawidłowo ale nie zapisuje i nie odczytuje on niestety nic poza tekstem.


procedure TForm1.Zapisz1Click(Sender: TObject);

var
  f : Textfile;
  x, y : Integer;

begin
  if SaveDialog1.Execute then
     begin
       assignfile (f,savedialog1.filename);
       rewrite (f);
       writeln (f,KGrid1.colcount);
       writeln (f,KGrid1.rowcount);
         For X:=0 to KGrid1.colcount-1 do
         For y:=0 to KGrid1.rowcount-1 do
       writeln (F, KGrid1.cells[x,y]);
       closefile (f);
     end;

end;



procedure TForm1.Wczytaj1Click(Sender: TObject);

var
  f  : Textfile;
  temp, x, y : Integer;
  tempstr : String;

begin
  if openDialog1.Execute then
     begin
       if FileExists(openDialog1.FileName) then
          assignfile (f,opendialog1.filename);
          reset (f);
          readln (f,temp);
          KGrid1.colcount:=temp;
          readln (f,temp);
          KGrid1.rowcount:=temp;
            For X:=0 to KGrid1.colcount-1 do
            For y:=0 to KGrid1.rowcount-1 do begin
          readln (F, tempstr);
          KGrid1.cells[x,y]:=tempstr;
       end;
       closefile (f);
     
     end;
   
end;
0

StringGrid jako taki nie posiada informacji o jakimkolwiek formatowaniu w wierszach/kolumnach/komórkach. Jak chcesz mieć w danej komórce np. tekst na czerwono to musisz to namalować sam. W związku z tym nie widzę sensownego sposobu aby to wykonać. Być może nie do końca opisałeś problem jaki masz. Daj np. screena tego SG i napisz po co chcesz zapisywać formatowanie komórek skoro i tak nie da się go odtworzyć w prosty sposób.

0

Dzięki Woolfik - jesteś wielki :) .
Właśnie o to mi chodziło. No z tą różnicą że plik ustawień jest zapisywany oddzielnie, ale w sumie to nie przeszkadza. Zrobiłem tak, by nazwa była taka sama jak nazwa zapisywanej / odczytywanej bazy danych.

podaję kodzik jakby miał się komuś przydać:


procedure TForm1.Zapisz1Click(Sender: TObject);

var
  f :textfile;
  x, y :integer;
  MyStream1: TFileStream;

begin
   if SaveDialog1.Execute then
     begin
       assignfile (f,savedialog1.filename);
       rewrite (f);
       writeln (f,KGrid1.colcount);
       writeln (f,KGrid1.rowcount);
         For X:=0 to KGrid1.colcount-1 do
         For y:=0 to KGrid1.rowcount-1 do
       writeln (F, KGrid1.cells[x,y]);
       closefile (f);
      
         try
           MyStream1 := TFileStream.create(((SaveDialog1.FileName)+'.sav'), FmCreate);
           MyStream1.WriteComponent(KGrid1);
           MyStream1.Free;
         except
           Application.MessageBox('Nie można zapisać ustawień.', 'Uwaga.', MB_OK + MB_DEFBUTTON1 or  MB_ICONSTOP);
         end;
     end;
end;

procedure TForm1.Wczytaj1Click(Sender: TObject);

var
  f :textfile;
  temp, x, y :integer;
  tempstr :string;
  mystream1: tfilestream;

begin
  if openDialog1.Execute then
     begin
       if FileExists(openDialog1.FileName) then
          assignfile (f,opendialog1.filename);
          reset (f);
          readln (f,temp);
          KGrid1.colcount:=temp;
          readln (f,temp);
          KGrid1.rowcount:=temp;
            For X:=0 to KGrid1.colcount-1 do
            For y:=0 to KGrid1.rowcount-1 do begin
          readln (F, tempstr);
          KGrid1.cells[x,y]:=tempstr;
       end;
       closefile (f);

          try
            MyStream1 := TFileStream.Create(((OpenDialog1.FileName)+'.sav'), FmOpenRead);
            KGrid1 := MyStream1.ReadComponent(KGrid1) as TKgrid;
            MyStream1.Free;
          except
            Application.MessageBox('Nie można wczytać ustawień.', 'Uwaga.', MB_OK + MB_DEFBUTTON1 or  MB_ICONSTOP);
          end;
end;

1

@zebmcs: a własny format?

Załóżmy, że masz w komórkach tekst i możliwość kolorowania ich tła. Do tego nie posiadasz żadnych dodatkowych informacji, które były by wyświetlane w komórkach (np. styl fontu, obrazki itd.). W takim przypadku, wystarczy w pliku zapisać liczbę komórek (kolumn i wierszy), a następnie sukcesywnie wpisywać do strumienia dane komórek w odpowiedniej kolejności - najpierw długość tekstu, następnie tekst, a na końcu kolor, i tak dla każdej komórki. Kolejność nie jest z góry określona (można zapisywać kolumnami lub wierszami), byle zastosować ten sam schemat podczas zapisu danych do pliku oraz podczas ich odczytu z pliku.

Możesz też skorzystać z jakiegokolwiek istniejącego formatu, np. CSV/XML - w nim też możesz zapisywać dodatkowe informacje, poza samym tekstem. Tyle że w odróżnieniu od binarki, tekstowy konfig będzie ważył dużo więcej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1