Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Delphi - pomale zobrazovanie...

Mam taky maly problem. V databaze mam vyse 250 roznych produktov a k nim kratky popis. Kazdy produkt sa vytvara na dynamickom panely, ktory si vytvorim pred zobrazenim daneho produktu. Na tom panely sa mi vytvara asi 7 LABELOV, 1 IMAGE a 1 RICHTEXT. Ked si dam zobrazit vsetky produkty, vsetkych cca 250 panelov sa mi okamzite vytvori ale kym sa zobrazia tak to trva aspon 50 sekund. Co som sa uz pytal viacerych programatorov, tak je to sposobene tym ze vlastne ja vytvaram naraz v jednom cykle 250 * 8 komponentov co je strasne vela a druha vec je, ze Windows sa pomale prekreslovanie. Osetril som to tak, ze si robim strankovanie, ale nie je to idealne, ale je to postacujuce. Mozno mi bude vediet niekto poradit, ako to urobit bez toho aby som nemusel pouzivat to strankovanie. DoubleBuffering mam zapnute, ale aj tak to ide pomaly... Nech robim, co robim ide to pomaly. Vytvara sa naraz vela komponentov. Dalsia vec je ze by som mohol pouzit fremy. Pomocou fremov by to islo rychlejsie? To znamena nie na panel, ale vytvorit si jeden frem a ten vytvarat dynamicky... Vdaka...

Předmět Autor Datum
Slo by to rychleji - pouzit TTabControl Je to vlastne pouze jedna stranka, kde bude pouze tech 7 lab…
Jan Fiala 07.02.2006 14:20
Jan Fiala
No, prave ze ide o to, ze to nechcem mat v zalozkach. Chcem aby sa mi vsetko vyhodilo do ScrollBoxu…
Intex 07.02.2006 14:24
Intex
Rozmyslal som este aj o komponente "DBCtrlGrid" ale potrebujem formatovany vypic cez RichText a ten…
Intex 07.02.2006 14:26
Intex
A co to primo malovat na Canvas ? Pokud to ma slouzit pouze pro prohlizeni, staci to vykreslit na TI…
Jan Fiala 07.02.2006 14:35
Jan Fiala
No... to mi uz hovorili viacery... ale nepojde to... Je tam nakupnu kosik, na ktory ked sa klikne ta…
Intex 07.02.2006 14:37
Intex
A potrbujem tam okrem ineho aj formatovany vypis o danom produkte, dalej je tam zmensenina obrazku,…
Intex 07.02.2006 14:39
Intex
Kliknuti se da vyresit seznamem aktivnich mist - kliknu na Canvas, zkontroluji podle seznamu, jestli…
Jan Fiala 07.02.2006 15:03
Jan Fiala
To kliknutie na Canvas... ano da so tak urobit ze si ohranicim miesto x[1,1]; y[10,10] a v tomto stv…
Intex 07.02.2006 15:13
Intex
Rozliseni by se dalo vyresit nejak takto: [pas]TypOblasti = (toObrazek, toKosik, ...); TOblast = r…
Jan Fiala 07.02.2006 15:19
Jan Fiala
To ano... to by nebol problem ale co s formatovanym vypisom. Najprv musi byt tucne pismo ako "o co s…
Intex 07.02.2006 16:15
Intex
A aky je v tom problem? Na velkost textu su WinAPI fcie. Myslis ze Win to preratavat nemusi ked mu v…
MM.. 07.02.2006 21:08
MM..
Urob si nejake OWNER_DRAW okno a vykresluj si to sam (chce to ale trochu znalost WinAPI a aj trochu…
MM.. 07.02.2006 15:30
MM..
Chápu to správně, že vytvořené jsou ihned, ale jejich zobrazení trvá dlouho? Mohl by jsi nám ukázat…
Rulda 07.02.2006 20:01
Rulda
Tewn kod pravdepodobne neukazem, lebo taky kod nie je. Proste vytvorim si jednotlive komponenty na p…
Intex 07.02.2006 21:31
Intex
nevyznam sa sice v delphi, ale taketo veci by si mal robit cez thready na pozadi aby si to nenacitav…
IgorK 07.02.2006 20:06
IgorK
Samozrejme, ze podporuje. Krome psani ovladacu a pretypovavani operatoru (oblibeny argument ceckaru)…
Jan Fiala 07.02.2006 20:21
Jan Fiala
Ale spustim... testoval som to aj na Win9x... a islo to celkom pekne...
Intex 07.02.2006 21:32
Intex
Kontroloval jsi take sustemove prostredky ? Pokud totiz klesnou nekam na 10%, zacnou se Windows chov…
Jan Fiala 07.02.2006 21:35
Jan Fiala
Systemove prostriedky som nekontroloval, ale podla mna to bude v poriadku. Strankovanie mam urobene…
Intex 07.02.2006 21:38
Intex
Pokud to mas pres strankovani, pak je to OK. Ale psal, jsi, ze jsi proti strankovani a ze vytvaris 2…
Jan Fiala 07.02.2006 21:43
Jan Fiala
Ono s tym ma mozno problem samotny windows, ked ma preratavat ca. 500*10=5000 okien (kazdy komponent…
MM.. 07.02.2006 21:00
MM..
Ano, Widle tolik objektů nezvládnou v přijatelném čase. Narazil jsem na podobný problém. Dělal jsem…
Rce 07.02.2006 21:23
Rce
Raz som videl program robeny vo VisualBasicu v ktorom sa rvalo nejakych niekolko tisic poloziek do l…
MM.. 07.02.2006 21:29
MM..
To je jednoduche, ne ? Odeberu olozku, seradim, odeberu polozku, seradim... :-P Podobny problem se r…
Jan Fiala 07.02.2006 21:33
Jan Fiala
Len tak na ukazku pridavam obrazok ako vyzera jeden panel. [ukazka.jpg] Toto je panel, presne z pr…
Intex 07.02.2006 21:42
Intex
Typ oceli: nerez :-? nemel by tam byt typ materialu ?
Jan Fiala 07.02.2006 21:45
Jan Fiala
Ako je na stranke tak to musi byt aj v programe... Ja som si to nevymyslel...
Intex 07.02.2006 21:46
Intex
To by sa krasne dalo urobit vlastnym vykreslovanim, alebo cez nejaky grid (ako pisal Rce vyssie), pt…
MM.. 07.02.2006 21:55
MM..
Presne tak. Zaroven sa robi vytvaranie objektov a zaroven to aj Win vykresluje. Nepomoze tu ani oset… poslední
Intex 07.02.2006 22:02
Intex

No, prave ze ide o to, ze to nechcem mat v zalozkach. Chcem aby sa mi vsetko vyhodilo do ScrollBoxu ale aby to islo rychlo... Nechcem tam mat ziadne zalozky... Takze fremy nepomozu... aj som si myslel... Panely su ze vraj velmi pomale na vykreslenie. Co moze byt potom rychlesie nez panel a mozu sa na to ukladat komponenty?

Kliknuti se da vyresit seznamem aktivnich mist - kliknu na Canvas, zkontroluji podle seznamu, jestli jsem kliknul na aktivni misto a pak ukazu bud detail obrazku nebo pridam produkt do kosiku nebo...

Pokud to chces delat takto, proc vykreslujes vsech 250 produktu najednou ?
Proc neudelat zalozky a vykreslovat treba po 25 na zalozku - podobne jako na webu ?

To kliknutie na Canvas... ano da so tak urobit ze si ohranicim miesto x[1,1]; y[10,10] a v tomto stvorci mozem klimnut. Ale problem nastane ak chcem zistit ID cislo produktu, resp. presne ktory obrazok sa ma zobrazit na celu plochu... Takto mi staci iba pretypovat Sender na Image a zobrazim obrazok. V pripade pridania do kosika si do Image kosika do premennej TAG ukladam ID cislo vyrobku, ktory chcem do kosika vlozit. Ako potom zistim o aky produkt ide? Da sa to samozrejme cez suradnice v Canvase obycajnym prepocitavanim... Ale potom nastane problem s formatovanym vypisom:

Nazov: Televizor
Znacka: Orava 215
Popis: Jedna sa o mozno znackovy
televizor z Oravy...
Hmotnost: 30 kg

Preco vypisujem naraz? To bol len pokus, ci to pocitac zvladne... Mam urobene uz strankovanie... ale neviem preco, v normalnom programe (EXE subor) mi strankovanie nijako nesedi... Na webe je to ine...

To ano... to by nebol problem ale co s formatovanym vypisom. Najprv musi byt tucne pismo ako "o co sa jedna" a potom text. Lenze text moze byt na 1, 2, 3 alebo aj viac riadkov... potom by som musel zistovat aj pocet riadkov v jednotlivom segmente informacie. A ak sa nemylim, tak aj delenie vety na slova (zistit kolko slov vojde do jedneho riadku...) a ten potom vypisat... to sa mi zda neefektivne...

Tewn kod pravdepodobne neukazem, lebo taky kod nie je. Proste vytvorim si jednotlive komponenty na panely a parent nastavim na ScrollBox. Prebehne to hned, ani si to nevsimnem. Hned ako sa nastavi parent prebehne vykreslenie na ScrollBox. Toto nevidi. Vidim to az vtedy, ked si uz uplne vsetky komponenty vytvorene a vidim ako jedno po druhom pomaly naskakuju. Dokonca aj ScrollBox sa hned nastavi aj s posuvnikmi tak ako maju a az nasledne potom nabehne vykreslovanie...

Samozrejme, ze podporuje. Krome psani ovladacu a pretypovavani operatoru (oblibeny argument ceckaru) v nem napises to same co v C - muzes vyuzivat bud primo WinAPI nebo jejich zapouzdreni ve VCL, coz je mnohem jednodussi a rychlejsi.

Problem je v tom, ze vytvari nejakych 2000 WinControls a to proste neni optimalni pristup. Druha vec je, ze na Win9x takovy program zrejme vubec nespusti...

Systemove prostriedky som nekontroloval, ale podla mna to bude v poriadku. Strankovanie mam urobene na 5 - 10 produktov na jednu stranku, co zaberie v pamati asi 6 MB. Po kazdom prepnuti stranky sa vsetky objekty zrusia a vytvoria sa nove s aktualnymi udajmi z danej stranky... Mozem este na Win9x pozrier systemove prostriedky...

Ono s tym ma mozno problem samotny windows, ked ma preratavat ca. 500*10=5000 okien (kazdy komponent, richbox, atd. je okno)
Alebo napr. ak si vytvoris len obycajny Windowsacky listbox a narves donho napr. 30000 poloziek bude to chvilu trvat (opozdenie vznika v samotnych Win, pri InsertItem(), resp. pri posielani insert item messages tomu listboxu).

Take veci sa daju robit efektivnejsie tak, ze si to clovek sam kresli - odpadava duplicita ukladania dat (t.j. udaje mam niekde v pamati programu, ale pre napr. ten listbox ich este musim vsetky nacpat aj do listboxu, co trva dlho), ak si to kreslim sam tak pouzivam stale len tie udaje v pamati, nemusim ich uz nikde cpat. Ale je to hodne narocne na naprogramovanie/vyvoj (musis urobit algoritmus ktory vie zobrazit akykolvek vysek z toho "okna" (zoznamu apod.), pri kazdom prijatom WM_PAINT message).

Ano, Widle tolik objektů nezvládnou v přijatelném čase. Narazil jsem na podobný problém. Dělal jsem program na album fotografiií (RceAlbum - 12.htm až dole). Původně byl každý náhled samostatné TImage. Mělo to sice výhodu, že nebylo nutno nikde více si obrázek pamatovat, ale už při 50 až 100 fotkách to bylo neúnosně pomalé. Pak jsem udělal TDrawGrid a vykresluju si fotky na vlastní triko a už je to svižné. Dokonce stíhám i načítat náhledy z TEMPů. Kolegovi Intexovi doporučuju též TDrawGrid a vykreslovat si to tam vše sám programově.

Raz som videl program robeny vo VisualBasicu v ktorom sa rvalo nejakych niekolko tisic poloziek do listboxu (nejaky zoznam suborov na viacerych CDckach), ale ked som tam klikol na novy zoznam (mali sa povodne udaje listboxu zrusit), tak to trvalo snad viac ako minutu :-) Neviem co s tym ten visualbasic minutu robil ked mal ten listbox len zrusit :-)

Len tak na ukazku pridavam obrazok ako vyzera jeden panel.

[ukazka.jpg]

Toto je panel, presne z programu. Takto si ich vytvaram na ScrollBoxe 5 - 10. Este neviem, ake bude vysledne cislo. Asi 10 panelov na jednu stranku... Takto to ide uplne bez problemov a necakam viac ako pol sekundy, kym sa zobrazia vsetky panely. Ked to bolo zobrazenie uplne vsetkeho, tak panely sa vytvorili hned. Akurat to zobrazenie trvalo velmi dlho... Windows ma pomale vykreslovanie. Mozno som zvolil nespravny postup, ale teraz ku koncu, ked je uz vsetko hotove, je zbytocne to vsetko prerabat...

To by sa krasne dalo urobit vlastnym vykreslovanim, alebo cez nejaky grid (ako pisal Rce vyssie), ptz. tam je vpodstate pevna vyska takze by sa dala pekne ratat momentalna pozicia.
No ale ked je to uz urobene tak to asi prerabat uz nebudes, to by bolo dost roboty.

Podla toho ako to spravanie popisujes mam pocit ze zaroven robi nieco tvoj program a zaroven aj vykresluje Win, a Win nema na vykreslovanie dost vykonu CPU, mozno nieco robis neefektivne ale to bez zdrojaku a debugovania tazko urcit takto na dialku. Tych 250*8 okien je dost, s tym Win maju co robit.

Zpět do poradny Odpovědět na původní otázku Nahoru