Autor Téma: Rozdiel medzi Invalidate, Refresh a Repaint u vizualnych VCL komponent  (Přečteno 1071 krát)

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Excellent
Rated 1 time
Zdravim.

Mohol by mi prosim vas niekto polopatisticky vysvetlit aky je rozdiel medzi nasledujucimi metodami u vizualnych VCL komponent:

1. Invalidate
2. Refresh
3. Repaint

Konkretne ma to zaujima hlavne u trosku komplikovanejsej komponentny TChart (TeeChart). Vykreslujem asi 5 fastline serii a celkom do toho grafu palim. Pridavam cca 5 bodov za sekundu pre kazdu seriu. Neviem ale pri tejto kadencii sa mi z nejakeho dovodu prestal graf sam prekreslovat. Musim cez neho prebiehat aspon myskou aby sa prekreslil. Volanie metody Refresh to vyriesilo, ale neviem ci som zvolil zrovna tu najoptimalnejsiu cestu.

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
TeeChart v D10.2 je tusim 2016ka. Mozem skusit cisty projekt ze preco sa mi prestali same prekreslovat grafy, ale momentalne nestiham, zajtra potrebujem zakaznikovy nieco predviest. Ucesavat to budem neskor, zatial nech to ide, hodim tam to invalidate, i s nim mi to fungovalo.

Mozno som zvolil zly postup pri pridavani hodnot do serii. Vzdy pristupujem k jednotlivym seriam priamo pomocou ich premennej a nie pomocou kolekcie cez TChart kontajner. Najprv vsetkym seriam zavolam metody BeginUpdate. Potom do nich nasukam hodnoty a potom vsetkym zavolam EndUpdate. Toto by som mozno mohol zmenit a volat BeginUpdate a EndUpdate len raz pre samotny TChart. Neviem jak je to vo vnutry poprepajane a zmenezovane.

V kazdom pripade diky za vycerpavajuce vysvetlenie o sposobe fungovania metod Invalidate, Refresh a Repaint. Nie som zrovna moc "vizualne komponentovy". Riesim u nich len nevyhnutne zlo... A tak nejak sa mi mari ze zvycajne sa odporucalo pouzivat Invalidate...

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 177
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
A nestačí náhodou přidat hodnotu do série před AddXY?
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Ano, hodnoty pridavam cez AddXY.

BeginUpdate a EndUpdate pouzivam preto, lebo hned po tom co pridam hodnotu, tak minimalne jednu alebo viac hodnot zo zaciatku serie este umazavam a az tak volam EndUpdate. Cize tych bodov je preca len upravenych viac, ale uznavam ze koli dvom trom bodom sa to mozno fakt neoplati, vyskusam to aj bez toho. Ale bral som to tak ze umazanie paru pociatocnych bodov moze ale aj nemusi vyvolat "masivnejsie" prekreslenia. Ale kedze zdrojak nepoznam, povedal som si ze Begin a EndUpdate by nemalo nicomu ublizit tak to tam radsej dam.  Begin a EndUpdate mam pekne cisto spravene v ramci bloku try, finally, Takze sa nema ako stat aby som tie serie neodomkol. A teraz ma prave asi napadlo preco mi to prestava vykreslovat. Hned ako pridam nejake hodnoty a umazem aj nejake tie pociatocne hodnoty tak nastavim este zobrazovanu oblast pomocou volania metody BottomAxis.SetMinMax... ci tak nejako, ale toto volam v case ked su este vsetky serie zamknute. Je dost mozne ze sa to tam niekde zamota a uz sa to po zavolani EndUpdate neprekresli.

Problem je ze to teraz neviem uplne jednoducho vyskusat, pretoze aplikacia je zavisla na externom hardveri ktory teraz nemam a moc sa mi to simulovat nechce. Ale urcite to najneskor po novom roku vyskusam, pripadne medzi sviatkami a dam vediet.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 496
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
ja vykreslujem bod kazdu milisekundu (teda 100 bodov raz za 100 ms v timery) + dalsie prepocitane hodnoty (spolu 4 serie), a splape ako vino (XE5)

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
fiha pekne. a aky dlhy takyto zaznam zobrazujes?

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4417
  • Karma: 39
    • Verze Delphi: XE7 professional
Veď nech tu hodí obrázok.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline František

  • Hrdina
  • ****
  • Příspěvků: 496
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
30000 ms