Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

В XP не обновляется вторая форма проекта

479
19 января 2007 года
Ухух
142 / / 05.05.2006
Для показа всяческих сообщений завед несколько дополнительных форм. Когда надо форма показывается по Form2->Show(); Когда на форме обновляю данные то после отдаю команду Form2->Refresh(); Когда сообщение не нужно , форму закрываю : Form2->Close(); Под ОС ME все нормально работает, а вот под XP периодически содержимое формы 2 не обновляется. Куда рыть?
11K
19 января 2007 года
.nornad
125 / / 04.01.2007
Попробуй вместо (а для начала лучше совместно с...) Refresh использовать Update или Repaint. Это три метода, которые делают схожие вещи. Иногда бывает трудно понять логику - почему один срабатывает, а другие игнорируются.
92
19 января 2007 года
Тень Пса
2.2K / / 19.10.2006
а как выводишь данные на форму???

в Label, просто Canvas->TextOut???? или как?
479
19 января 2007 года
Ухух
142 / / 05.05.2006
Спасибо!

Похоже помогло, эффект вроде исчез (правда не очень долго смотрел, но не увидел больше). Я попробовал вместо Refresh использовать Update. Про Repaint вычитал что его вызывает Refresh. Возможно помимо Update можно использовать и Invalidate, но пока не пробовал. Заметил, что при использовании Update обновление стало более четким: перестали границы окна дергаться как при работе с Refresh и пореже содержимое внутри окна (хотя все равно подергивается). Но! Заметил такую штуку: похоже , если содержимое окна (формы) не изменилось программой с момента последнего применения оператора Update, то если отдать команду Update, с некоторой вероятностью (очень большой, можно сказать так: это обязательно случится в течении десятка раз) возможно, что появится рамка окна с белым содержимым и будет весело маячить игнорируя даже Close(). Это в XP. В ME таких эффектов нет. Все работает и с Refresh и с Update.

Во второй форме я банально пишу в Label-и.
11K
19 января 2007 года
.nornad
125 / / 04.01.2007
Странные у тебя вещи творятся... У меня такого пока не было.
Без описания, что и как выводится трудно что-то говорить. А ещё помог бы код ;)
479
19 января 2007 года
Ухух
142 / / 05.05.2006
Рано обрадовался. Вот что видно: под XP как только вторая форма сдвигается с места мышкой (а я предполагаю и теряет, а потом получает фокус) , то она перестает обновляться. В ME вторая форма с места не сдвигается и все нормально работает. В инспекторе объектов я у второй формы поставил так: BorderIcon у всех иконок false поставил, BorderStyle=bsToolWindow, а FormStile=fsNormal.

Я тоже подвоха не ожидал, пока под 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();

Посмотрел , и действительно если форма фокус теряет, то она уже его и не получает.
11K
19 января 2007 года
.nornad
125 / / 04.01.2007
Была такая штука. Как решил - не помню :)
Если вспомню - обязательно напишу
391
19 января 2007 года
Archie
562 / / 03.02.2005
Я, конечно, не уверен, но сдается мне, что у Вас приложение однопотоковое, стало быть, вызвав FormX->Update(), Вы поставите в очередь сообщение на перерисовку формы, но обработать это сообщение форма не сможет, пока не прервется Ваш процесс. Для насильной обработки всех сообщений, попробуйте вызывать время от времени Application->HandleMessage(), а еще лучше Application->ProcessMessages();
479
20 января 2007 года
Ухух
142 / / 05.05.2006
Да, попробовал- результат тот же. Вообще я бы это не заметил если бы вторая форма не висела бы долго. До этого в других программах я так делать и все сходило- не на долго выводились собщения и просто не было видно этого эффекта. Но вот вылез.

Да приложение однопотоковое. В принципе мне не обязательно именно на форме писать сообщение и я вчера прикинул, что дешевле чем разбираться досконально переписать все места с выводом и выводить все на Panel. Кстати, гораздо меньше помех при смене содержимого , чем при работе на форму. А с формой разбирательство видно придется отложить, но опыт показывает, что всплывет обязательно.Не открутишься!

Огромное спасибо за подсказки- как буду рыть - выложу результаты!
11K
20 января 2007 года
.nornad
125 / / 04.01.2007
А ты не пробовал насильно фокус возвращать на нужную тебе форму?

По-моему, я именно за счёт установки фокуса насильно и разрулил потерю фокуса формой. У меня обработчик вызывался с другой формы и использовал при этом ту форму (где сидит), что приводило к потере фокуса вызывающей формой. В общем, она пряталась и "вытащить" её не было возможности, т.к. она у меня модальная.
479
21 января 2007 года
Ухух
142 / / 05.05.2006
В том то и дело что пробовал!

В двух словах (резюме вышесказанного):
при работе со второй формой при изменении ее содержимого в однопотоковом приложении надо:
1) отдать команду FormX->Update();
2) Application->ProcessMessages();
3) FormX->SetFocus();

Раньше (до XP) я просто делал так FormX->Refresh;FormX->SetFocus();
последняя команда нужна была если на второй форме есть кнопочки. Но вот сейчас не проходит (хотя и кнопочек нет).

Я еще посмотрю и тады напишу.

Ну функционирование под ME и XP различается! Вот Vista придет, она нам покажет!
23K
22 января 2007 года
Log1c
4 / / 04.11.2006
интересно, может и столкнулся бы с этим, но использую для этих целй свойство Visible формы, ну это конечно смотря что за приложение.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог