tabela

0

Jak zapisać tabele .

// Temat zamknięty

0

dlaczego Ty wywołujesz konstruktor w petli for? przeciez raz sie wywoluje konstruktor w celu stworzenia zmiennej wiec:
Ini := TiniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
// a nastepnie
for i := 1 to Form1.StringGrid1.RowCount do
begin
//rózne rzeczy ze zmenna ini

           end;

ini.free;

No a poza tym to w czym masz problem? to powinno dzialac.

Jesli natomiast chcesz uzywac plikow binarnych (jak rozumiem to masz na mysli mowiac o konwersji z ini naTfilestream)a nie textowych to tez nie ma problemu, tyle ze plik ini ma swoja strukture umozliwiajacą latwy dostep w programie do sekcji i wpisow w sekcjach . Niestety jest wolny. Plik binarny w ktorym musisz sam okreslic format zapisu to jest to jak zapisujesz dane i jak zapisujsz informacje o danych moze byc duzo wydajniejszy.
Jesli w jednym takim pliku chcesz zapisywac jedna tablice dwuwymiarowa stringow to najprosciej mozesz zrobic to tak:
2x po 2 bajty K,L (albo po 4 jesli tablice beda duze) okreslajace wymiar kolumn i wierszy , potem K*L pol po 1 bajcie (lub 2 czy 4 w zależnosci od dlugosci planowanych wpisow w poszsczegolnych komorkach stringrida) a potem juz wierszami albo kolumnami zawartosc pol stringrida.
Mysle ze nic ciekawego nie napsialem, no ale co tu duzo myslec, to po prostu trzeba zrobic jak chce sie miec :)))

P.S.Nie wiem czy Cie dobrze zrozumalem i czy o to Ci chodzilo.

0

Hmm no tak ,a le skad bedziesz wiedzial ile czego jest i jak ro czytac? Ptponuje podejscie bardziej ogolne:

procedure strgridtostream(s:Tstream;sg:Tstringgrid);
var i,j,k,w:integer;
dlugosciwpisow:array of byte;// zakladam ze w jednej komorce w stringgridzie nie bedzie wiecej niz 255 znakow
str:string;
begin
k:=sg.ColCount;w:=sg.RowCount;
setlength(dlugosciwpisow,kw);
for i:=0 to k-1 do
for j:=0 to w-1 do dlugosciwpisow[k
i+j]:=length(sg.Cells[j,i]);
s.Write(k,4);s.Write(w,4);s.Write(dlugosciwpisow[0],k*w);
for i:=0 to k-1 do
for j:=0 to w-1 do begin
str:=sg.Cells[j,i];
if length(str)>0 then s.Write(str[1],length(str)); end;

end;
procedure strgridfromstream(s:Tstream;sg:Tstringgrid);
var i,j,k,w:integer;
dlugosciwpisow:array of byte;
str:string;
begin s.read(k,4);s.read(w,4);
sg.ColCount:=k;sg.RowCount:=w;
setlength(dlugosciwpisow,kw);
s.read(dlugosciwpisow[0],k
w);

for i:=0 to k-1 do
for j:=0 to w-1 do begin str:='';
if dlugosciwpisow[ki+j]>0 then begin
setlength(str,dlugosciwpisow[k
i+j]);s.Read(str[1],dlugosciwpisow[k*i+j]);
end;
sg.Cells[j,i]:=str;
end;

end;

i teraz
var f:Tfilestream;
if fileexists('dane') then
f:=Tfilestream.create('dane',fmopenreadwrite) else f:=Tfilestream.create('dane',fmcreate);
strgridtostream(f,sg1); f.position:=0;
stringgridfromstream(f,sg2);

i juz.

Oczywiscie w ten sposob mozesz do pliku zapisywac wiecej takich stringgridow sprawdzajac czy po odczycie jednej jest koniec pliku czy nie ( if f.position=f.size then //znaczy ze dalej nic nie ma...

else stringgridfromstream(f,sg3);)

albo zapis f.position:=f.size; strgridtostream(f,sg4);

P.S. Nie gwarantuje ze nie ma gdzies bledu robilem to teraz dosc szybko.

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