C# problem z odchytenim ukoncenia vykreslenia formy a objekt
C# problem z odchytenim ukoncenia vykreslenia formy a objekt
Neviem prist na to ako odchytit ukoncenie vykreslenia formy a objektov.
Podrobnejsie:
Pri spusteni programu sa spusti "inicializacia objektov" a metoda "Load" a vsetky objekty sa vykreslia na obrazovku.
Ja potrebujem spustit akciu až ked su vsetky objekty vykreslene. Nie paralelne zo spustenim ,ani v priebehu.
Viete mi poradit?
Podrobnejsie:
Pri spusteni programu sa spusti "inicializacia objektov" a metoda "Load" a vsetky objekty sa vykreslia na obrazovku.
Ja potrebujem spustit akciu až ked su vsetky objekty vykreslene. Nie paralelne zo spustenim ,ani v priebehu.
Viete mi poradit?
-
axxis
Addict
- Príspevky: 3690
- Registrovaný: 29 máj 2007, 21:53
- Bydlisko: Spálené mlyny
- Kontaktovať používateľa:
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Ked pracujes s microsoftimi vecami vzdy hladaj LifeCycle. Je to poradie Eventov (na pozadi sa deje teda trochu nieco ine, ale cela akcia je reprezentovana aj eventami), ktore sa volaju pri vytvarani a destrukcii Formu (ASPX stranky alebo niecoho ineho...)
LifeCycle pre windows forms je:
[/b]
Ale ak chces aby sa nieco vykonalo na konci Loadu tak to proste napis na jeho koniec a malo by to byt v poriadku. (A ak by si to z nejakeho dovodu nechcel mat na konci Loadu tak to daj to akehokolvek eventu, ktory nasleduje v zivotnom cykle) Ak sa to rozhodnes umiestnit do nejakeho neskorsieho eventu pocitaj ale s tym, ze sa moze odpalovat niekolkokrat. Napr. Form.Activated sa spusta ak opustis svoj form a potom sa donho vratis (prepnes sa na iny program a vratis sa spat)
LifeCycle pre windows forms je:
Kód: Vybrať všetko
Control.HandleCreated
Control.BindingContextChanged
Form.Load
Control.VisibleChanged
Form.Activated
Form.ShownAle ak chces aby sa nieco vykonalo na konci Loadu tak to proste napis na jeho koniec a malo by to byt v poriadku. (A ak by si to z nejakeho dovodu nechcel mat na konci Loadu tak to daj to akehokolvek eventu, ktory nasleduje v zivotnom cykle) Ak sa to rozhodnes umiestnit do nejakeho neskorsieho eventu pocitaj ale s tym, ze sa moze odpalovat niekolkokrat. Napr. Form.Activated sa spusta ak opustis svoj form a potom sa donho vratis (prepnes sa na iny program a vratis sa spat)
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Je určite lepšie nedávať jednotlivé akcie do eventov na základe poradia, ale významu, takže nie akýkoľvek event.
V tvojom prípade by som vybral "Shown", ale záleží na okolnosti, teda či chceš aby sa akcia vykonala keď sa okno "zobrazí". Ak chceš aby sa niečo vykonalo po načítaní ("Load"), potom
V tvojom prípade by som vybral "Shown", ale záleží na okolnosti, teda či chceš aby sa akcia vykonala keď sa okno "zobrazí". Ak chceš aby sa niečo vykonalo po načítaní ("Load"), potom
tedaMicrosoft Developer Network napísal: The OnLoad method also allows derived classes to handle the event without attaching a delegate. This is the preferred technique for handling the event in a derived class.
Kód: Vybrať všetko
protected override OnLoad(EventArgs a) {
base.OnLoad(a);
//kód
....
}
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Form.load a Form.Activated a podobne, som skusal a prebehnu skor ako sa dokonci vykreslenie.
To sa da zistit jednoducho: Na konci metody zadat MessageBox a formular sa zobrazi az ked odkliknes hlasku.
Ja potrebujem aby sa zobrazila automaticky hlaska(to len pre priklad) az ked je formular do-kresleny.
alebo
napr. nieco ako....dokresli sa tlacitko az potom mozes nan kliknut a nieco vykonat... ale ja chcem nieco vykonat automaticky ale az ked vsetky objekty su komplentne...
spustena funkcia je natolko narocna, ze spomali vykreslenie formularu az je vidno ako vykresluje bod po bode......nevyzera to dobre...
ja potrebujem len pri prvom spusteni: vykreslit objekty , form.enabled = false , cursor = wait do ukoncenia funkcie a vypisanie vysledku do formularu, form.enabled = true....atd.
Shown som neskusal, zajtra vyskusam....
Este skusam hladat...
... zatial dik za snahu..
A ani Shown ... nevyhovel...
To sa da zistit jednoducho: Na konci metody zadat MessageBox a formular sa zobrazi az ked odkliknes hlasku.
Ja potrebujem aby sa zobrazila automaticky hlaska(to len pre priklad) az ked je formular do-kresleny.
alebo
napr. nieco ako....dokresli sa tlacitko az potom mozes nan kliknut a nieco vykonat... ale ja chcem nieco vykonat automaticky ale az ked vsetky objekty su komplentne...
spustena funkcia je natolko narocna, ze spomali vykreslenie formularu az je vidno ako vykresluje bod po bode......nevyzera to dobre...
ja potrebujem len pri prvom spusteni: vykreslit objekty , form.enabled = false , cursor = wait do ukoncenia funkcie a vypisanie vysledku do formularu, form.enabled = true....atd.
Shown som neskusal, zajtra vyskusam....
Este skusam hladat...
A ani Shown ... nevyhovel...
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Neviem či si neuvedomuješ že vykresľovanie okna nie je kreslenie.
To že niečo nevidíš na obrazovke ešte neznamená že to tam naozaj nie je.
Jednak že vykresľovanie kontroliek je vec najprv .NET(vystavanie, vykreslenie nejakých špecialít) a potom operačného systému, a potom znova os a ktorý to smeruje do hw (prípad viacerých grafických kariet, viacerých okien). Pri "vykresľovaní" nedochádza ku kresleniu na obrazovku, ale ku zapisovaniu do rôznych bufferov pre rôzne okná, ktoré sa potom ešte znova zaobaľujú a vypočítava sa napr. ich pozícia, alpha a pod.
Prepíš OnLoad a budeš mať istotu, že k vykonaniu tvojho kódu dôjde až po zavolaní Load.
To že niečo nevidíš na obrazovke ešte neznamená že to tam naozaj nie je.
Jednak že vykresľovanie kontroliek je vec najprv .NET(vystavanie, vykreslenie nejakých špecialít) a potom operačného systému, a potom znova os a ktorý to smeruje do hw (prípad viacerých grafických kariet, viacerých okien). Pri "vykresľovaní" nedochádza ku kresleniu na obrazovku, ale ku zapisovaniu do rôznych bufferov pre rôzne okná, ktoré sa potom ešte znova zaobaľujú a vypočítava sa napr. ich pozícia, alpha a pod.
Prepíš OnLoad a budeš mať istotu, že k vykonaniu tvojho kódu dôjde až po zavolaní Load.
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Nechcem riesit co je vykreslenie a ci uz objekt existuje v pamäti atd.
Mne ide o vizualny efekt. Zo strany uzivatela vyzera pomale vykreslovanie ako ze ma ten program nejaky problem.
Uzivatelovy je jedno co sa robi na pozadi, on povie "je to skarede a nejake pomale ci co".
Aby sme sa rozumeli ... pre mna je rozdiel "po zavolani Load" a "po ukonceni vsetkych operacii, ktore nastartovali v Load".
Vyskusam OnLoad a uvidime.
Mne ide o vizualny efekt. Zo strany uzivatela vyzera pomale vykreslovanie ako ze ma ten program nejaky problem.
Uzivatelovy je jedno co sa robi na pozadi, on povie "je to skarede a nejake pomale ci co".
Aby sme sa rozumeli ... pre mna je rozdiel "po zavolani Load" a "po ukonceni vsetkych operacii, ktore nastartovali v Load".
Vyskusam OnLoad a uvidime.
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Ty tam štartuješ nejaké pararelné thready? Inak jednotlivé prvky odosielajú operačnému systému správy ktoré spracováva a rovnako to robia aj konkrétne okná, ktoré jednotlivé správy zachytávajú a využívajú/vykonávajú pomocou eventov.
Shown ti bude fungovať.
Napísané narýchlo, ale podstatu vystihuje. Ak okno zachytí event a spracováva v ňom nejakú funkciu, k ďalšej správe sa už nedostane pokým sa vykonávanie funkcie neukončí a my sa nedostaneme k ďalšiemu zavolaniu wndproc.
Shown ti bude fungovať.
Nie, toto je maximálne mylný test. MsgBox:LugoG napísal:To sa da zistit jednoducho: Na konci metody zadat MessageBox a formular sa zobrazi az ked odkliknes hlasku.
Kód: Vybrať všetko
LRESULT CALLBACK WndProc(...) {
switch(msg) {
case WM_SHOWWINDOW:
//príkaz na zobrazenie okna je prijatý
//zavolá sa load
bla->bla->bla->event_Load(...);
//tu pokračujeme až po zobrazení a odkliknutí MessageBoxu
DefWindowProc(); //až teraz vykresľujeme okno, hoci Load už prebehol
break;
....
}
}
void bla::bla::bla::event_Load(...) {
//všetky správy sú zastavené, kým sa vykonáva Load
int result = MessageBox(.....);
//tu sa dostaneme až po odkliknutí tlačidla
return;
}
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Po nejakom case som sa vratil k tomuto problemu.
Poziadavka je odoslana do SQL, takze pravdepodobne spusti pararelný thread.
Uz som spominal ,ze Shown nefunguje, objavi sa formular ,nieco ako negativ foto a caka a pohne sa dalej az po 3-5 sekundach.
(za ten cas sa da urobit aj Screnn, keby som mohol vlozit obrazok tak vam ho tu ukazem
)
Poziadavka je odoslana do SQL, takze pravdepodobne spusti pararelný thread.
Uz som spominal ,ze Shown nefunguje, objavi sa formular ,nieco ako negativ foto a caka a pohne sa dalej az po 3-5 sekundach.
(za ten cas sa da urobit aj Screnn, keby som mohol vlozit obrazok tak vam ho tu ukazem
Re: C# problem z odchytenim ukoncenia vykreslenia formy a ob
Thread so ziskanim odpovede si spusti ty.
Shown nefunguje, tento specialny event vytvoreny konkretne .NET developermi ako nadstavbu na WinAPI prave na tento ucel je tam drzany microsoftom naschval. Oni si totiz pred svetom odmietaju pripustit ze vytvorili bezvyznamny nefunkcny kod, a taki programatori ako ty na tom potom prave trpia.
pre tych co nepochopili: </irony>
Shown nefunguje, tento specialny event vytvoreny konkretne .NET developermi ako nadstavbu na WinAPI prave na tento ucel je tam drzany microsoftom naschval. Oni si totiz pred svetom odmietaju pripustit ze vytvorili bezvyznamny nefunkcny kod, a taki programatori ako ty na tom potom prave trpia.
pre tych co nepochopili: </irony>