| | |
| Stránka: 1 z 1
| [ Príspevkov: 16 ] | |
Autor | Správa |
---|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce |
Zdravicko, mam taky problem. Som v tomto smere dost neskuseny. Mam tabulku do ktorej sa pridavaju postupne riadky. Pri kazdom pridani riadka som to chcem niekde ulozit. Ta tabulka je patri do suboru viacerych zaznamov.
Tak som si spravil najprv maticu. Zistil som ze je to blbost. Potom som to riesil cez dinamicke pole zaznamov a pri kazdom pridani riadka som zvacsil pole o 1 riadok. Aj to bola riadna blbost pretoze pri kazdom zvacseni sa obsah vymazal. Niekolko ludi na forach zistilo to iste co ja a bolo im odporucene pouzit Tlist. Tak som to spravil aj ja.
Kód: Triadok = record stlpec1:string; stlpec2:string; stlpec3:string; ... end; type Tsubor = record List:Tlist; { Toto neje dolezite} nieco1:string; nieco2 string; end; var subor:Tsubor; procedure TOkno.ButtonAddClick(Sender: TObject); var riadok:Triadok; cisloRiadka: Integer; begin riadok.stlpec1:='hodnota z tabulky'; riadok.stlpec2:='hodnota z tabulky'; riadok.stlpec3:='hodnota z tabulky'; { tu je chyba} subor.list.add(riadok); { dajme tomu ze cisloriadku ma hodnotu uz niekde medzitym priradenu} showmessage(subor.list[cisloriadka].stlpec1); atďatď; end;
No pekne... ono to nefunguje. Neje mozne trepem si hlavu do stola. Neviem co je to pointer. Chyba: Incompatible types riadok and Pointer
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 23.05.2009 23:36 | |
|
Úprava:
Kód: procedure TForm1.Button1Click(Sender: TObject); var riadok:Triadok; x: ^TRiadok; cisloRiadka: Integer; begin
riadok.stlpec1:='hodnota z tabulky1'; riadok.stlpec2:='hodnota z tabulky2'; riadok.stlpec3:='hodnota z tabulky3';
Subor.List:= TList.Create; subor.list.Add(@riadok); cisloRiadka:= 0;
x:= subor.List.Items[cisloRiadka]; ShowMessage(x^.stlpec2);
Subor.List.Free;
end;
Takže najprv k chybám: Skôr, ako začneš pracovať s triedou TList, musíš najprv vytvoriť jej inštanciu, tak ako aj v každej inej triede -> List:= TList.Create.
Citácia: TList definuje zoznam ukazateľov, ktorý možno použiť pre ukladanie objektov ľubovoľnej triedy
Z tejto definíce vyplýva, že TList sa používa na uloženie pointerov (adries premenných). Preto má byť správne ako parameter v Add @riadok (operátor @ pred premennou znamená, že sa má použiť adresa premennej, nie jej hodnota). Jednotlivé položky - itemy - TListu sa začínajú číslovať od 0 vyššie, teda prvý záznam má hodnotu 0 (Items[0]). Potom ak potrebuješ načítať premenné z TListu, je nutné z neho priradiť adresu (pretože TList obsahuje iba adresy premenných) do premennej deklarovanej ako pointer. A až s touto premennou môžeš pracovať, teda vypisovať, meniť, atď.
No a teraz, čo je to ten pointer. Niečo už bolo riešene v tejto téme a v tejto téme. A ešte pár definícií na programujte.com
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 24.05.2009 15:03 | |
|
Diki za vysvetlenie, uz viem zhruba co su pointery. Moj problem to teda nevyriesilo, ked su v Tliste iba odkazy. Ja robim nieco take.
Kód: Tskupina = record nieco:string; nieco:string list: Tlist; end; ... ... ... var Skupina: Tskupina; Subor: File of Tskupina;
No a potom nejaka taka funkcia ze po kazdom pridani riadka do tabulky Kód: Procedure TForm1.InputAdded(Sender: TObject); var riadok: Triadok; begin riadok.stlpec1:='hodnota'; skupina.list:=Tlist.Create; skupina.list.add(@riadok); skupina.list.free; end;
No a to prida len odkaz na premennu riadok. Samotnu hodnotu nemam. Ale ja ju potrebujem, potrebujem potom ulozit kazdu jednu hodnotu z tabulky do suboru File of Tskupina, potom ju podla potreby nacitat a zasa s hodnotami pracovat. Tych riadkov je tam plno. Mohol by som to spravit takto: Kód: var tabulka:array[1..1000] of Triadok;
Procedure TForm1.InputAdded(Sender: TObject); var riadok: Triadok; begin { Potom by to slo takto hezky} riadok.stlpec1:='hodnota'; subor.tabulka[I] :=riadok; end;
Vedel by som potom jednoducho ulozit tabulku nacitat jednoducho celu tabulku a vsetko mozne. Ale to je hlupe ze mam vymedzene v pamati urcity pocet riadkov, co ak budem potrebovat viac? alebo ked budem chciet mazat riadky. Viem ze Tlist to ma spravene jednoducho, mazanie riadkov aj vymienanie riadkov. Ale zasa nechapem ako s Tlistom mozem ukladat hodnoty ked su tam len tie pointery, po uzavreti formulara sa hodnoty z tabulky vymazu a tie pointery co...
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 24.05.2009 15:43 | |
|
Moment, toto máš zle:
Kód: Procedure TForm1.InputAdded(Sender: TObject); var riadok: Triadok; begin riadok.stlpec1:='hodnota'; skupina.list:=Tlist.Create; skupina.list.add(@riadok); skupina.list.free; end;
konkrétne to TList.Create a skupina.list.free. Pretože vždy, keď do TListu niečo uložíš, potom ho cez free uvoľníš z pamäte a tým sa všetko zmaže. Do OnCreate Formulára si daj skupina.list:=Tlist.Create a do OnDestroy formulára skupina.list.free. Týmto zamedzíš vymazávaniu TListu (vymaže sa až po zrušení hlavného formulára).
K tvojmu problému: Prečo by to neriešilo tvoj problém? Veď áno, do Tlistu ukladáš iba adresy, lenže tieto adresy priradíš nejakej premennej (deklarovanej ako pointer na daný typ) a cez túto premennú pristupuješ k hodnotám, ktoré boli do tohto listu vložené.
Siriuse píše: No a to prida len odkaz na premennu riadok. Samotnu hodnotu nemam. O tomto vravím. Tým, že máš adresu premennej, nemáš jej hodnotu, ale poznáš miesto, kde máš túto hodnotu hľadať - poznaš adresu premennej, ktorá obsauje tieto dáta, ktoré potrebuješ. To znamená, že pointer (na daný typ premennej, ktorý vložíš do TListu) nasmeruješ na túto hodnotu (ktorú načítaš z TListu) a potom pomocou operátora ^ pracuješ akokeby priamo s touto premennou. V tom spočíva význam používania pointerov. Neviem ti to už viac vysvetliť, skús si pozhánať nejaké materiály na pointery (ukazatele, smerníky - sú to synonymá) a snáď ti to trocha pomôže. Ale v každom prípade si myslím, že pomocou TListu sa dá tvoj problém riešiť
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 24.05.2009 19:50 | |
|
Ked pridam nieco do Tlistu, nejaky objekt, napr. ten Triadok. Tak ze list.add(@riadok); a potom zmenim riadok:='nieco ine'; zmeni sa aj prislusne list.items[I]? a ked mam zo 1000 tych zaznamov, staci mi 1000 list.items(ov) alebo potrebujem aj 1000 premennych riadok.
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 24.05.2009 20:22 | |
|
Pokúsim sa ti vysvetliť teóriu poiterov na obrázku:
(ten obrázok je len ilustračný, značne zjednodušený, adresy sú v skutočnosti 32 bitové - v 32. bitovom operačnom systéme - teda zaberajú v pamäti stále 4 bajty. Adresa nasledujúcej premennej začína na adrese tejto premennej + veľkosť tejto premennej. Na tomto obrázku som dal iba čislice 1, 2, ... aby si to ľahšie pochopil. Ale v skutočnosti to v pamäti VIZERÁ INAK !)
Takže pozri sa na tento obrázok. Máme dve premenné: uk: ^integer a x: integer. Uk ukazuje na premennú x, teda nesie jej adresu. Priradenie adresy uskutočníš takto:
Kód: uk:= @x; // ak pracujeme s pointerom ako takým (nie s premennou, na ktoru ukazuje), nepoužívame žiaden operátor
Teraz ak vykonáš toto: Kód: ShowMessage(IntToStr(uk^)); // ak chceme pracovať s premennou, na ktorú ukazuje pointer, používa sa operátor ^ ShowMessage(IntToStr(x));
v oboch správach sa ti zobrazí 100. A potom, ak vykonáš toto: Kód: x:= 60; ShowMessage(IntToStr(uk^)); ShowMessage(IntToStr(x));
opäť dostaneš rovnaké číslo, ale tentoraz 60.
Teraz už máš lepšiu predstavu, ako pointer funguje?
//EDIT
Sirius píše: a potom zmenim riadok:='nieco ine'; zmeni sa aj prislusne list.items[I]?
Ak zmeníš premennú, ktorej adresu si uložil do TListu, zmena bude aj keď s touto adresou budeš neskôr chcieť pracovať. Teda nemal by si meniť premennú, ktorú vkladáš do TListu.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 24.05.2009 20:38 | |
|
Noo ja pointery uz celkom chapem. Aj tak nemam to co chcem, mam to spravene takto.
Kód: var list:Tlist; riadok: Triadok;
From1.InputAdded(Sender: TObject); begin riadok.stlpcek:='hodnota'; ... {medzitim bol list uz vytvoreny } list.add(@riadok); end;
Form1.UkazHodnotuButtonClick(Sender: TObject); var linkedriadok: ^Triadok; I:integer; begin I:=inputbox(daco,daco,daco); linkedmeteor:=list[I] showmessage(linkedmeteor^.stlpcek); end;
no tak akekolvek bude I, vypyse mi furt rovnaku hodnotu pretoze mam tam plno odkazov na ten isty meteor. Ale to ja nechcem samozrejme. Ja chcem normalne si zvolim I a vypise mi prislusny riadok ako je v tabulke zadane. Viem ze to robim zle... preto sa pytam ako sa to robi spravne?
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 24.05.2009 20:49 | |
|
No, v kóde si neuviedol, ako máš deklarovanú premennú linkedmeteor, ale ak je ^TRiadok, tak je to správne. Ďalej nerobí sa to list[i], ale:
Kód: list.Items[i];
Zbytok vyzerá OK, tak to skús upraviť a napíš, či to teraz funguje správne.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 24.05.2009 21:00 | |
|
som sa pomilil s tym linkedmeteor, je to vlastne linkedriadok. A akekolvek I v list.items[I] mam linkedriadok ma furt rovnaku hodnotu. Asi som uz strateny
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 24.05.2009 21:11 | |
|
No ona je rovnaká, pretože sa kukni do procedúry InputAdded:
Kód: riadok.stlpcek:='hodnota'; Máš tu stále rovnakú hodnotu Do TListu musíš dávať viac premenných (pre každý údaj jedna premenná, keďže sa pracuje s adresami a teda s premennými samotnými, nie s ich hodnotami). Najideálnejšie je asi použiť pole a potom: Kód: riadok[poradie].stlpcek:= 'nejaky_premenlivy_udaj';
Skús to ešte takto.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 25.05.2009 14:52 | |
|
no dobre ak chcem pridat 1000 udajov do TList potrebujem aj 1000 premennych? tak to vizera ako riadna blbost. Spravim si pole tych premennych, a kolko pamate mam tomu polu vymedzit ([1..1000]Co ak tabulka bude mat 300 zaznamov potom mam 700 zbytocnych, a co ak bude mat viac nez 1000? co potom)? zasa som na zaciatku. To mozem pole pouzit rovno a nemusim mat ziaden Tlist. Dynamicke pole by to riesilo. Ale zasa ono to je dost blbe ked ti po kazdom zvacseni pola vymaze zaznamy. Jednoducho je TList idealny pripoji ti premennu na koniec zoznamu okamzite ti zvacsi pole, a su tam procedury exchange a delete ktore jednoducho vymienaju a mazu riadky (inak by clovek musel posuvat cely obsah) lenze... su tam len pointre. A predstav si ze Tlist ulozim na disk premenne v pamati sa vymazu ked ukoncim program a subor znova nacitam nemam z toho nic.
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 25.05.2009 18:22 | |
|
Tak neviem teda. Skús použiť dynamické polia (premenná riadok bude toto dynamické pole) spolu s TListom, v ktorom budú ukazatele na prvky tohoto poľa. A čo sa týka ukladania do súboru, tak ulož hodnoty poľa, nie TListu. A po opätovnom spustení programu pri jeho inicializácii zistíš, koľko hodnot je v súbore, podľa toho alokuješ dynamické pole a po jeho vyplnení hodnotami zo súbrou ešte tieto hodnoty (respektíve adresy prvkov poľa) vložíš do TListu.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 25.05.2009 18:47 | |
|
no tak to nemusim pouzivat Tlist vobec... ked aj tak mam jedno dinamicke pole ktore ukladam a mozem do neho veselo ukladat aj nacitavat, naco mi je tam este tlist?Akoze ukladat tabulka->dinamicke pole->tlist potom pracovat s Tlistom a ukladat dynamicke pole a pri nacitani zasa dinamicke pole-> Tlist -> tabulka, zbytocne to potom hlti pamat a robi kod zlozitejsim, ked mozem v pohode tabulka-> Dpole a rovno pracovat s polom ukladat a zasa nacitat Dpole ->tabulka
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 25.05.2009 18:49 | |
|
som tam kde som bol na ziaciatku musim nieco skusit
|
|
Registrovaný: 11.01.09 Prihlásený: 24.04.24 Príspevky: 1385 Témy: 9 Bydlisko: Hrinova | Napísal Fico: 26.05.2009 14:30 | |
|
Ešte je jedno riešienie Ak potrebuješ ukladať iba hodnoty typu string, môžeš vymeniť TList (ktorý pracuje s pointrami, teda premennými) za TStringList (ktorý pracuje s hodnotami - tzn, starý údaj premennej sa môže prepísať). Pracuje sa s ním veľmi podobne, ako s TList.
|
|
Registrovaný: 23.05.09 Prihlásený: 16.01.18 Príspevky: 95 Témy: 39 Bydlisko: Michalovce | Napísal autor témy Siriuse: 26.05.2009 20:28 | |
|
myslim ze uz som to vyriesil... mam 10 stlpcov tabulky ich pocet sa nemeni, co tak spravit zaznam pozostavajuci z 10tich TStringListov skusoim to spravit takto
|
|
| Stránka: 1 z 1
| [ Príspevkov: 16 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Rozhádzané pridávanie v Databázy | 7 | 1255 | 08.08.2006 10:26 tRizzO | | automaticke pridavanie inzeratov v PHP, ASP | 9 | 1080 | 26.12.2007 13:41 Flety | | PrestaShop - Pridavanie fontov v Redakčné systémy | 1 | 1497 | 01.11.2009 13:53 KViki | | pridavanie medzi oznaceny text v JavaScript, VBScript, Ajax | 9 | 509 | 25.04.2010 18:28 kurtulik1 | | Pridávanie obrázkov do príspevkov v Krčma | 4 | 477 | 08.04.2014 21:47 Megi | | pridavanie medzier do stringu v PHP, ASP | 7 | 421 | 31.01.2009 21:38 stenley | | Pridavanie objektov do videa v Video programy | 0 | 534 | 27.04.2008 10:36 raider93hudc | | eshop - pridavanie produktov do kosika v PHP, ASP | 1 | 525 | 31.01.2009 11:40 emer | | Pridávanie nových hodnôt do url v PHP, ASP | 7 | 716 | 16.09.2008 16:25 masko32 | | Pridávanie textu/znakov do formulára kliknutím v JavaScript, VBScript, Ajax | 3 | 392 | 29.07.2010 21:45 Gresthorn | | Script na pridavanie fotiek do fotoalbumu v Redakčné systémy | 0 | 652 | 18.01.2009 23:16 feips | | postupne pridavanie opakujuceho sa kodu do formulara v JavaScript, VBScript, Ajax | 2 | 646 | 01.02.2009 18:25 trco | | pridavanie clankov do db a na index v PHP, ASP | 9 | 583 | 06.11.2007 13:03 Tominator | | pridavanie spatneho lomitka pred niektore znaky po odoslani v PHP, ASP | 3 | 422 | 04.09.2010 18:45 shaggy | | Ako vytvoriť pridavanie priatelov pomocou PHP a MySQL v PHP, ASP | 24 | 1162 | 12.04.2011 14:35 stenley | | Pridávanie príspevkov do chatu od najstaršieho po najnovšie v PHP, ASP | 4 | 361 | 07.12.2012 18:57 ondrejko0102 |
| 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
|
|