В XP не обновляется вторая форма проекта
Для показа всяческих сообщений завед несколько дополнительных форм. Когда надо форма показывается по Form2->Show(); Когда на форме обновляю данные то после отдаю команду Form2->Refresh(); Когда сообщение не нужно , форму закрываю : Form2->Close(); Под ОС ME все нормально работает, а вот под XP периодически содержимое формы 2 не обновляется. Куда рыть?
Попробуй вместо (а для начала лучше совместно с...) Refresh использовать Update или Repaint. Это три метода, которые делают схожие вещи. Иногда бывает трудно понять логику - почему один срабатывает, а другие игнорируются.
в Label, просто Canvas->TextOut???? или как?
Похоже помогло, эффект вроде исчез (правда не очень долго смотрел, но не увидел больше). Я попробовал вместо Refresh использовать Update. Про Repaint вычитал что его вызывает Refresh. Возможно помимо Update можно использовать и Invalidate, но пока не пробовал. Заметил, что при использовании Update обновление стало более четким: перестали границы окна дергаться как при работе с Refresh и пореже содержимое внутри окна (хотя все равно подергивается). Но! Заметил такую штуку: похоже , если содержимое окна (формы) не изменилось программой с момента последнего применения оператора Update, то если отдать команду Update, с некоторой вероятностью (очень большой, можно сказать так: это обязательно случится в течении десятка раз) возможно, что появится рамка окна с белым содержимым и будет весело маячить игнорируя даже Close(). Это в XP. В ME таких эффектов нет. Все работает и с Refresh и с Update.
Во второй форме я банально пишу в Label-и.
Без описания, что и как выводится трудно что-то говорить. А ещё помог бы код ;)
Я тоже подвоха не ожидал, пока под XP не попробовал прогу.
Form5->Label2->Caption="До окончания осталось "+IntToStr(cnt)+" сек";
Form5->Show();
nxt:
Form5->Update();
Form5->Label2->Caption="До окончания осталось "+IntToStr(cnt)+" сек";
sleep(1);
Form1->Update();
cnt--;
if(cnt>0){goto nxt;}
Form5->Close();
Посмотрел , и действительно если форма фокус теряет, то она уже его и не получает.
Если вспомню - обязательно напишу
Я, конечно, не уверен, но сдается мне, что у Вас приложение однопотоковое, стало быть, вызвав FormX->Update(), Вы поставите в очередь сообщение на перерисовку формы, но обработать это сообщение форма не сможет, пока не прервется Ваш процесс. Для насильной обработки всех сообщений, попробуйте вызывать время от времени Application->HandleMessage(), а еще лучше Application->ProcessMessages();
Да приложение однопотоковое. В принципе мне не обязательно именно на форме писать сообщение и я вчера прикинул, что дешевле чем разбираться досконально переписать все места с выводом и выводить все на Panel. Кстати, гораздо меньше помех при смене содержимого , чем при работе на форму. А с формой разбирательство видно придется отложить, но опыт показывает, что всплывет обязательно.Не открутишься!
Огромное спасибо за подсказки- как буду рыть - выложу результаты!
По-моему, я именно за счёт установки фокуса насильно и разрулил потерю фокуса формой. У меня обработчик вызывался с другой формы и использовал при этом ту форму (где сидит), что приводило к потере фокуса вызывающей формой. В общем, она пряталась и "вытащить" её не было возможности, т.к. она у меня модальная.
В двух словах (резюме вышесказанного):
при работе со второй формой при изменении ее содержимого в однопотоковом приложении надо:
1) отдать команду FormX->Update();
2) Application->ProcessMessages();
3) FormX->SetFocus();
Раньше (до XP) я просто делал так FormX->Refresh;FormX->SetFocus();
последняя команда нужна была если на второй форме есть кнопочки. Но вот сейчас не проходит (хотя и кнопочек нет).
Я еще посмотрю и тады напишу.
Ну функционирование под ME и XP различается! Вот Vista придет, она нам покажет!
интересно, может и столкнулся бы с этим, но использую для этих целй свойство Visible формы, ну это конечно смотря что за приложение.