Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 16 ] 
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 : 23.05.2009 19:21

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


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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


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 : 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...


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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ť :)


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 : 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.


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 24.05.2009 20:22

Pokúsim sa ti vysvetliť teóriu poiterov na obrázku:

Tlist, pridavanie

(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.


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 : 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?


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


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 : 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


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


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 : 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.


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


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 : 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


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 : 25.05.2009 18:49

som tam kde som bol na ziaciatku musim nieco skusit


Offline

Skúsený užívateľ
Skúsený užívateľ
Tlist, pridavanie

Registrovaný: 11.01.09
Prihlásený: 24.04.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 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.


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 : 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


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


Podobné témy

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

v Databázy

7

1255

08.08.2006 10:26

tRizzO Zobrazenie posledných príspevkov

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

v PHP, ASP

9

1080

26.12.2007 13:41

Flety Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. PrestaShop - Pridavanie fontov

v Redakčné systémy

1

1497

01.11.2009 13:53

KViki Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. pridavanie medzi oznaceny text

v JavaScript, VBScript, Ajax

9

509

25.04.2010 18:28

kurtulik1 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pridávanie obrázkov do príspevkov

v Krčma

4

477

08.04.2014 21:47

Megi Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. pridavanie medzier do stringu

v PHP, ASP

7

421

31.01.2009 21:38

stenley Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pridavanie objektov do videa

v Video programy

0

534

27.04.2008 10:36

raider93hudc Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. eshop - pridavanie produktov do kosika

v PHP, ASP

1

525

31.01.2009 11:40

emer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pridávanie nových hodnôt do url

v PHP, ASP

7

716

16.09.2008 16:25

masko32 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pridávanie textu/znakov do formulára kliknutím

v JavaScript, VBScript, Ajax

3

392

29.07.2010 21:45

Gresthorn Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Script na pridavanie fotiek do fotoalbumu

v Redakčné systémy

0

652

18.01.2009 23:16

feips Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. postupne pridavanie opakujuceho sa kodu do formulara

v JavaScript, VBScript, Ajax

2

646

01.02.2009 18:25

trco Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. pridavanie clankov do db a na index

v PHP, ASP

9

583

06.11.2007 13:03

Tominator Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. pridavanie spatneho lomitka pred niektore znaky po odoslani

v PHP, ASP

3

422

04.09.2010 18:45

shaggy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Ako vytvoriť pridavanie priatelov pomocou PHP a MySQL

v PHP, ASP

24

1162

12.04.2011 14:35

stenley Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pridávanie príspevkov do chatu od najstaršieho po najnovšie

v PHP, ASP

4

361

07.12.2012 18:57

ondrejko0102 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