Отговори на тема  [ 22 мнения ]  Отиди на страница Предишна  1, 2
Проблем с затваряне на модален диалог. 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
така, внимателно прочетох описанието на проблема ти.
прави ми впечатление че се опитваш да затвориш прозорец(в случая диалог), когато същия е създал модален диалог. по замисъл на самите модални диалози, това е строго забранено. ако си забелязал, имаш ли активиран модален диалог, прозореца който го е създал не отговаря на съобщения. това е съвсем логично, понеже DoModal не се завръща докато не се затвори, а като не се завръща, значи седиш във функция която е блокирала разноса на съобщенията ти.
внимавай с таймерите и модалните диалози! по някаква странна логика при модален режим всички съобщения се спират, без таймерното. ако отвориш модален диалог във функцията на таймера, това автоматично означава забивка на програмата - екрана почва да се пълни с модални диалози, тъй като както казах таймера е някакво шибано изключение.
в случая смятам че първия ти диалог не се затваря защото има пуснат от него модален диалог. доколкото разбирам искаш при настъпване на стопиращото събитие и двата да изчезнат. предполагам че трябва да дадеш OnOK на двата диалога последователно - първо на втория, после на първия.
а за онова там с проверката на видимост - функцията връща BOOL, не е уместно да сравняваш BOOL със NULL. впрочем и двете са дефинирани като 0, затова така бачка. аз лично не ползвам нито BOOL, нито NULL, ползвам инт, 0, а също и не ползвам сравнение, а директно израза. виждал съм че микрософт ползват 0 вместо NULL в кода си и щом те го правят, значи може :)


Пет Яну 11, 2008 8:02 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Не е шибано изключението. Много често това че таймера работи спестява пускането на нов thread и си работиш в функцията на таймера вместо това.
Сблъсквал съм се преди време с такова забиване на програмата наистина е криво. Но като го знаеш че е така няма проблеми. Е нямаше да се изгърбят мокрософтските драскачи ако бяха предвидили при затваряне на parrent диалога да се терминира по някакъв начин и модалния диалог който е отворил.

Всъщност как стои въпроса с немодалните диалози. Там има ли някакво щатно съобщение от parrent dialog-a към тях когато се затваря? Винаги съм си пращал аз съобщение като съм правил такива приложения.


Пет Яну 11, 2008 9:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
Цитат:
Е нямаше да се изгърбят мокрософтските драскачи ако бяха предвидили при затваряне на parrent диалога да се терминира по някакъв начин и модалния диалог който е отворил.
там е работата че модалния диалог не е дъщерен прозорец на "родителя" си. ако беше дъщерен, щеше да се затваря автоматично, но не е. но представи си все пак че това което искаш стане - затваряме модалния диалог СЛЕД затваряне на създалия го. така, функцията DoModal която до сега е висяла излиза и се озоваваме във тялото на функция принадлежаща към мъртва инстанция на прозорец. това е ситуация която аз лично намирам за рискована. във твоята ситуация аз бих затворил първо модалния диалог, а след това стартиралия го прозорец, но най-вероятно въобще не бих ползвал модални диалози.


Съб Яну 12, 2008 12:31 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Това което казваш ме наведе на мисълта че това което става,да мога да викам функция от уж невалиден диалог е в резултат на това че диалога не се изтрива и чака да се затвори 2 рия модален диалог за да се изтрие. Ако това е така са го направили хитро.
А в една dialog based програма няма как да избягаш от модалните диалози.


Съб Яну 12, 2008 1:21 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
защо да бягаш от модалните диалози - на тях работата е такава да бъдат модални
незнам какво точно правиш, но имаш доста възможности за да избягаш от проблема в случая...

_________________
main[-1u]={1};


Съб Яну 12, 2008 2:12 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Ами всъщност ако е така както предполагам съм решил проблема много добре :)
Но не съм толкова на ти с PC програмирането и не се сещам как да проверя предположението. Иначе работи много добре на няколко компютъра и под XP и WIN98 така както съм го направил. Може би ще го оставя така. Тази ситуация която отработвам е разпадане на USB връзката с устройството ми докато имам диалог който пита потребителя да запише ли направените промени в настройките и е по скоро изключение което не се случва почти на практика :).


Съб Яну 12, 2008 2:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2658
Мнение 
Nikola Kirov написа:
Това което казваш ме наведе на мисълта че това което става,да мога да викам функция от уж невалиден диалог е в резултат на това че диалога не се изтрива и чака да се затвори 2 рия модален диалог за да се изтрие. Ако това е така са го направили хитро.
и мене ми мина нещо такова през ума, но ме домързя да пробвам. вероятно затова имаш валиден хендъл към диалога, а от друга страна е невидим. предполагам обаче че не е правено специално, а просто така си става. мисълта ми е че колкото и прозореца да имаш създадени по тоя начин, нишката на програмата ти е една винаги. това трябва да ти е пътеводна светлина когато се чудиш върху подобни проблеми.
колкото до това защо аз лично избягвам модалните диалози, ще дам примера с модалния диалог на ICQ който се появява когато свърши трансфер на файл например. този диалог може да изкара от кожата потребителя, питал съм и други, всички го мразят. не че модалните диалози са лошо нещо, ползвам ги на доста места. твоя случай принципно си изглежда точно за модален диалог, наистина ситуацията ти за затваряне е някакво отклонение от нормалната работа. така както го описваш, аз по-скоро бих индицирал промяната на ситуацията с деактивиране на бутона ОК, или със светването на някоя лампичка, или със появата на мигащ надпис или нещо подобно, но не бих подходил така "хакерски" затваряйки диалога. съображенията ми са както технически, така и психологически - потребителя ще бъде изненадан когато диалога му изчезне точно като цъка върху него, а и може да цъкне върху нещо под него, поради внезапното изчезване.


Съб Яну 12, 2008 10:42 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 22 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 0 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни