Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 9 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39
Bydlisko: Michalovce
Príspevok NapísalOffline : 30.05.2009 17:08

Viem ze existuju klasice procedury na ukladanie na disk ako StringList.SaveToFile a LoadFromFile ale ja mam StringList ako sucast vacsej struktury uvadzam priklad
Kód:
ttabulka = record
Stlpec1:TStringlist;
Stlpec2:TStringLIst;
Stlpec3:TStringList;
end;

Tstruktura = record
nieco:String;
nieco:string;
tabulka:Ttabulka;
end;

var
  subor:File of Tstruktura;


Aj ked je nieco zadane v stringlistoch, a je to som si overil neulozi na disk nic. Preco? Mam na to pouzit streamy? ak hej tak ako?


Offline

Skúsený užívateľ
Skúsený užívateľ
TStringList, Ukladanie na disk

Registrovaný: 11.01.09
Prihlásený: 25.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 30.05.2009 19:01

Nezapíše sa ti nič, pretože:
1.) do súboru ukladáš celú štruktúru TStruktura a do súboru sa nedá zapísať dátový typ TStringList.
2.) do súboru môžeš ukladať premenné, ktorých veľkosť v pamäti je daná už v dobe vívoja (takže taký string nepôjde, alebo ak, tak maximálne iba 255 znakov).

Teda ak nehodláš využívať zapuzdrené funkcie SaveToFile a LoadFromFile, tak na tvojom mieste by som použil stream-y:

Kód:
TTabulka = record
  Stlpec1: TStringList;
  Stlpec2: TStringLIst;
  Stlpec3: TStringList;
end;

TStruktura = record
  nieco: string;
  nieco2: string;
  tabulka: Ttabulka;
end;

var
    s: TStream;
    struktura: TStruktura;

...

procedure Zapis();
begin

s:= TFileStream.Create('subor.txt', fmCreate);

s.WriteBuffer(struktura.nieco[1], Length(struktura.nieco));
s.WriteBuffer(struktura.nieco2[1], Length(struktura.nieco2));

struktura.tabulka.Stlpec1.SaveToStream(s);
struktura.tabulka.Stlpec2.SaveToStream(s);
struktura.tabulka.Stlpec3.SaveToStream(s);

s.Free;

end;


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39
Bydlisko: Michalovce
Príspevok Napísal autor témyOffline : 30.05.2009 20:26

a neda sa kombinovat typovy subor s Streamom tak ze
Kód:
Tstruktura = record
nieco:string;
nieco:string;
tabulka: TStream;
end;
var
  struktura:Tstruktura;

procedure ulozclick(sender:Tobject);
var
  subor: File of Tstruktura;
begin
assignfile(Filepath, subor);
rewrite(subor);
struktura.nieco:='nieco';
struktura.tabulka:=TFileStream.create(a tu co?);
struktura.tabulka.savetostream(stlpec1);
write(subor,struktura);
struktura.tabulka.free;
closefile(subor);
end;

Ci musim pouzit iba hole streami, pretoze takto cez binarne typove subory je pohodlne nacitavat ostatne premenne, teda okrem tabulky. A ak nie tak potom citaju zo streamov tie stlpce?


Offline

Skúsený užívateľ
Skúsený užívateľ
TStringList, Ukladanie na disk

Registrovaný: 11.01.09
Prihlásený: 25.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 31.05.2009 10:37

Nemôžeš to takto kombinovať, lebo opäť zapisuješ do súboru dátový typ, ktorý nie je možné zapísať (zapísať sa dá, ale nebude to nič "čítatelné").
Keď budeš spätne čítať zo súboru pomocou stream-ov, budeš potrebovať vedieť, koľko znakov máš načítať, pretože inak by ti načítalo najväčší možný počet znakov. Takže preto keď budeš zapisovať do súboru pomocou stream-u reťazce, predtým ešte daj do súboru zapísať číselnú hodnotu, ktorá bude predstavovať počet znakov, ktoré hodláš zapísať.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39
Bydlisko: Michalovce
Príspevok Napísal autor témyOffline : 31.05.2009 11:25

a dlzku StringListov netreba zadavat?


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39
Bydlisko: Michalovce
Príspevok Napísal autor témyOffline : 31.05.2009 15:16

napises mi ako sa to nacitava?? lebo systemom subor.loadfromstream(stream); nejde


Offline

Skúsený užívateľ
Skúsený užívateľ
TStringList, Ukladanie na disk

Registrovaný: 11.01.09
Prihlásený: 25.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 01.06.2009 8:47

Treba aj dĺžku StringListov, aby si vedel, koľko znakov patrí do tohto listu. Reťazce potom načítavaš takto (ak si ich predtým uložil štýlom dlžka-reťazec):

Kód:
s:= TFileStream.Create('E:\subor.txt', fmOpenRead);
s.ReadBuffer(dlzka, sizeOf(integer));
s.ReadBuffer(struktura.nieco[1], dlzka);

s.ReadBuffer(dlzka, sizeOf(integer));
struktura.tabulka.Stlpec1.LoadFromStream(s);


Problém ale nastane pri načítavaní StringListov. Keď ich máš v stream-e viac, tak to robí problémy a načíta okrem textu aj uloženú veľkosť nasledujúceho stream-u a teda pri čítaní ďalšieho integera nastane chyba. S týmto ti fakt neviem pomôcť, nikdy som nerobil takéto zložité načítavania zo stream-u. Nech sa skúsi ozvať niekto iný.

// keby bolo na mne, tak ja by som asi načítaval text do StringListov po jednotlivých znakoch, pričom počet znakov by som vedel podľa načítanej veľkosti StringListu


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 23.05.09
Prihlásený: 16.01.18
Príspevky: 95
Témy: 39
Bydlisko: Michalovce
Príspevok Napísal autor témyOffline : 01.06.2009 13:19

No tak... ako by si to riesil. Zadanie.

Tabulka do ktorej sa zadavaju udaje. Ma 9 stlpcov, pocet stlpcov sa nemeni. Pocet riadkov je vysoky, moze byt rozny (aj 300 alebo aj 1200). Po kazdom pridani riadku, je tam udalost rovno v komponente, onInputAdded, to neje problem. Pri stlaceni F2 sa ti na ulozit do suboru spolu s inymi datami (nejakym zaznamom) na disk. AKO TO SPRAVIT?


Offline

Skúsený užívateľ
Skúsený užívateľ
TStringList, Ukladanie na disk

Registrovaný: 11.01.09
Prihlásený: 25.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 01.06.2009 13:43

Tak ja by som uložil celú tabuľku do jedného StringListu a to tak, že by som pomocou cyklu for i:= 1 to pocetriadkov do začal v prvom riadku a zapísal z neho všetky stĺpce, potom do druhého, atď. Takto by bola celá tabuľka v jednom StringListe, ktorého obsah by som uložil do stream-u spolu s inými dátami a to takto:

Kód:
procedure Zapis();
begin

    s:= TFileStream.Create('subor.txt', fmCreate);

    dlzka:= Length(struktura.nieco);
    s.WriteBuffer(dlzka, sizeOf(integer));
    s.WriteBuffer(struktura.nieco[1], Length(struktura.nieco));

    dlzka:= Length(struktura.nieco2);
    s.WriteBuffer(dlzka, sizeOf(integer));
    s.WriteBuffer(struktura.nieco2[1], Length(struktura.nieco2));
    struktura.CelaTabulka.SaveToStream(s);
    s.Free;

end;


A potom spätne načítal takto:

Kód:
procedure Citaj();
begin

    s:= TFileStream.Create('E:\subor.txt', fmOpenRead);

    s.ReadBuffer(dlzka, sizeOf(integer));
    s.ReadBuffer(struktura.nieco[1], dlzka);

    s.ReadBuffer(dlzka, sizeOf(integer));
    s.ReadBuffer(struktura.nieco2[1], dlzka);

    struktura.CelaTabulka.LoadFromStream(s);
    s.Free;

end;


Odpovedať na tému [ Príspevkov: 9 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. ukladanie

v Operačné systémy Microsoft

1

455

29.12.2009 11:22

raf Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie nastavení

v Ostatné programy

0

341

18.12.2010 13:27

mhdsim Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie textu

v JavaScript, VBScript, Ajax

4

553

27.11.2009 20:35

DjLefo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie volitelnych poli

v Databázy

0

402

26.04.2012 23:04

Jojko001 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie hesiel HELP!!!

v Ostatné programy

3

759

29.03.2009 11:35

void Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. gmail - ukladanie obrázkov

v Služby a webstránky

3

458

31.05.2009 13:38

walther Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. zlé ukladanie titulkov

v Ostatné programy

8

480

23.11.2019 15:10

mimush Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. LG KC550 ukladanie

v Mobilné zariadenia

0

664

11.03.2009 16:52

uniqat Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ukladanie do knižníc

v Operačné systémy Microsoft

1

341

29.11.2009 1:46

mmichalll Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Rýchle ukladanie obrázkov

v Grafické programy

1

1398

06.12.2009 21:22

erikoo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie pod seba

v PHP, ASP

5

388

16.08.2016 18:08

chrono Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie nastavenia v cookies...

v PHP, ASP

16

631

19.02.2014 15:25

don jebot Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Mozilla Firefox ukladanie hesiel

v Sieťové a internetové programy

0

1358

18.01.2009 13:46

Triplespace Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Photoshop - ukladanie v GIF

v Grafické programy

0

580

21.03.2009 15:03

TECon Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Sony Vegas - ukladanie videa

v Video programy

4

758

30.06.2011 19:57

F3RY Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ukladanie mimo stromu dokumentov

v PHP, ASP

9

532

01.04.2010 17:36

camo Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra