Autor Téma: TDialog.Execute versus TForm.OnActivate  (Přečteno 8606 krát)

Offline vladyk

  • Příspěvků: 32
  • Karma: 0
TDialog.Execute versus TForm.OnActivate
« kdy: 21-03-2013, 04:33:05 »
Vidím, že to tady moc nežije, tak přihodím jednu drobnost :-)

Mám dvě prakticky shodné aplikace. V jedné z nich se po každém spuštění TDialog.Execute (na typu dialogu nezáleží) volá OnActivate formuláře a ve druhé ne (aby to nebylo tak easy, tak nejprve to odnese MainForm a když je ošetřen, opakuje se totéž na právě aktivním formuláři). Patrně je někde nějaká totální blbost typu nenastaveného parametru, ale ať koukám jak koukám a debugguju jak debugguju do libovolné hloubky, tak na ni nemůžu přijít... takže v té první aplikaci blokuju opakovanou aktivaci postižených formulářů, zatímco  ta druhá funguje bez problémů.

S formuláři se přitom nedělají žádné kotrmelce, hlavní je přítomen od spuštění do ukončení aplikace a ostatní se volají via ShowModal, obsazení paměti nijak dramatické.

Co mám u té první aplikace blbě (nebo u obou nenastavené)? Lezl jsem step-by-step až do assembleru, ale pořád nikde nevidím rozdíl... až když se otevře příslušné dialogové okno a odklepne soubor...  >:(

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:TDialog.Execute versus TForm.OnActivate
« Odpověď #1 kdy: 21-03-2013, 08:59:35 »
Co mám u té první aplikace blbě (nebo u obou nenastavené)? Lezl jsem step-by-step až do assembleru, ale pořád nikde nevidím rozdíl... až když se otevře příslušné dialogové okno a odklepne soubor...  >:(
A v aplikaci, kde se OnActivate nevyskytuje sis nehral s GWL_STYLE?

Protoze normalni je, ze pri ziskani focusu se ta udalost vyskytuje.
A kdyz se divam do zdrojovek, tak pokud to neni nejake MDI okno ev. okno se stylem WS_CHILD, tak uz zadne dalsi moznosti, jak udalost potlacit, nevidim.

A pokud to potrebujes resit, tak to IMHO znamena, ze jsi do OnActive umistil cinnost, ktera tam nepatri  :)

Offline vladyk

  • Příspěvků: 32
  • Karma: 0
Re:TDialog.Execute versus TForm.OnActivate
« Odpověď #2 kdy: 21-03-2013, 14:22:54 »
GWL_STYLE? To ani nevím, co je :-)

Nojo, nepatří, nepatří... možná je to pravda, i když jsou tam normální inicializační úkony, žádná vražda... ale proč se po ní sápe ausgerechnet akorát Execute od TDialogů? Žádný jiný okno neškodí.

Jinak se to pochopitelně dá docela snadno obejít (příznak prvního otevření), ale je to stejný, jak ondyno s tím přeukládáním data do SQL - nejde o to, že se to dá vyřešit, ale kua proč to vůbec nastává... asi už jsem na to moc starej, zlatý CP/M nebo ještě líp ASPO1 :D

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:TDialog.Execute versus TForm.OnActivate
« Odpověď #3 kdy: 21-03-2013, 15:01:35 »
ale kua proč to vůbec nastává... asi už jsem na to moc starej, zlatý CP/M nebo ještě líp ASPO1 :D
Kontrolni otazka: na tom main formu v aplikaci, kde k tomu dochazi: mas tam alespon jeden focusable widget tj. potomka TWinControls? Kdyz tak tam zkus cvicne polozit treba TButton, co se stane.

zlatý CP/M nebo ještě líp ASPO1 :D
Jenomze treba CP/M bylo v podstate jen souborove I/O a vsechno ostatni sis musel oprgat a jak sis to zprasil, taks to mel.

Offline vladyk

  • Příspěvků: 32
  • Karma: 0
Re:TDialog.Execute versus TForm.OnActivate
« Odpověď #4 kdy: 22-03-2013, 01:41:25 »
Kontrolni otazka: na tom main formu v aplikaci, kde k tomu dochazi: mas tam alespon jeden focusable widget tj. potomka TWinControls? Kdyz tak tam zkus cvicne polozit treba TButton, co se stane.
Na main ne, na těch vnořených, co přišly na řadu pak, jo... no, beru to na sebe, musím se k OnActivate postavit trochu jinak a důsledně odlišovat inicializaci a reaktivaci. Chleba to nežere :-)

[Jenomze treba CP/M bylo v podstate jen souborove I/O a vsechno ostatni sis musel oprgat a jak sis to zprasil, taks to mel.

To mi nevadilo, jednu úlohu jsem si dokázal ohlídat vždycky a víc jich nebylo potřeba - koneckonců když zatloukáš hřebíky, tak přitom taky obvykle nepíšeš dopis :-) A interrupty fungovaly taky ve vlastní režii... Dnešní programování a hlavně "programování", kdy si lidi stahujou jednotlivý kostky, aniž by tušili, co se vevnitř děje, mi přijde takový nedopečený, prostě lego a nedejpánbu, když se daj k sobě dvě špatný kostičky...

Co nadělám, nějak to musím doklepat, byť jsem srdcem zůstal v DOSový éře... :-) Pomalu přecházím na další problém, s jedním serverem se moje aplikace dohaduje několik desítek vteřin, že se dohodnou... taky zajímavý, něco jako registr vozidel :-D

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:TDialog.Execute versus TForm.OnActivate
« Odpověď #5 kdy: 22-03-2013, 06:42:09 »
Kontrolni otazka: na tom main formu v aplikaci, kde k tomu dochazi: mas tam alespon jeden focusable widget tj. potomka TWinControls? Kdyz tak tam zkus cvicne polozit treba TButton, co se stane.
Na main ne, na těch vnořených, co přišly na řadu pak, jo... no, beru to na sebe, musím se k OnActivate postavit trochu jinak a důsledně odlišovat inicializaci a reaktivaci. Chleba to nežere :-)
e několik desítek vteřin, že se dohodnou... taky zajímavý, něco jako registr vozidel :-D
No tim to odlisne chovani bude nejspis zpusobeno (coz bys overil tim, ze si na main pro overeni nejaky pridas).

Ovsem co s tim me nenapada. Kdyz jsem se dival do zdrojovek, jak zauzlovane je rizeni focusu ve VCL, tak jsem si vzpomel, ze jsme nekdy pred 10 lety postavili aplikaci na framech a meli jsme nejake obtizne lokaliozvatelne problemy, zpusobene prave tim, ze na main formu nebyl zadny focusable widget. Ale HOSIP o co presne slo a co jsme s tim udelali.

Jinak pokud nemuzes udelat inicializaci v OnCreate, tak nejlepsi je si z OnCreate postnout user message a v jejim handleru inicializaci udelat. Tim mas zajisteno, ze se provede prave jednou. Nejlepe je si udelat nejakeho predka pro vsechny formulare a jemu udelat nejakou virtualni metodu napr. DoAsynchAfterShow a tu prekryt.

Offline vladyk

  • Příspěvků: 32
  • Karma: 0
Re:TDialog.Execute versus TForm.OnActivate
« Odpověď #6 kdy: 22-03-2013, 10:11:24 »
Já jsem teď (v čase od poslední reakce) tu postiženou aplikaci rozebral do šroubku a překopal - a zjistil jsem, že jsem vlastně měl kliku s tou druhou, nepostiženou... nicméně funguje už sedm let na různých strojích a nic... vot technika  :)

OnCreate má imho nevýhodu v tom, že je na některý operace ještě moc brzo. Nicméně jsem to teď celý přepsal a rozdělil a v OnActivate mám všude důsledně flag na FirstActivate a vypadá to dostatečně odolně. Až udělám papíry pro berňák, tak možná hrábnu i do tý sedm let starý (která tím přestane fungovat  :) )

Mmch jak jsem tak rejdil v hlubinách windows, tak mám pocit, že to zpracování msg je docela pěkná alchymie, jestli se v tom někdo fakt vyzná tak, že ho nic nezaskočí, tak před ním smekám.

*

MMCH2 nemáš nějaký zkušenosti s kreslením na canvas? Potřebuju hejbat s pár objektama a pořád mi to občas problikne, tak to asi budu muset vykreslovat na canvas hlavního objektu a mít jakoby dva a prohazovat je, ale počítám, že na to někdo vymyslel něco chytřejšího.