| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Мистика или закон? |
| Автор: Dr3d 3.7.2006, 19:07 |
| Есть две формы: Form1 и Form2. На второй форме есть Label. (Label.Caption := 'бла-бла-бла';) <-- Это важно! После запуска приложения обе формы скрываются: // ShowWindow(Form1.Handle, SW_HIDE); // ShowWindow(Form2.Handle, SW_HIDE); // ShowWindow(Application.Handle, SW_HIDE); затем показываем вторую форму, делаем задержку в 5 сек и скрываем её: // ShowWindow(Form2.Handle, SW_SHOW); // Sleep(5000); // ShowWindow(Form2.Handle, SW_HIDE); выводится форма с надписью ''бла-бла-бла', всё как надо, НО Но проделывая тоже самое второй раз - НИКАКОЙ НАДПИСИ НЕТ!!! Форма выводится, но она пустая! Т.е. написав вот так: // ShowWindow(Form2.Handle, SW_SHOW); // Sleep(5000); // ShowWindow(Form2.Handle, SW_HIDE); // Sleep(5000); // ShowWindow(Form2.Handle, SW_SHOW); // Sleep(5000); // ShowWindow(Form2.Handle, SW_HIDE); Первый раз вылезет форма с надписью 'бла-бла-бла', а второй раз без надписи! Вопрос: почему это происходит? И как сделать так, чтобы и второй раз была видна надпись? |
| Автор: drkot 3.7.2006, 19:13 |
| в виде кода давай. выкладывай проект народ посмотрит, а гадать что ты написал .... |
| Автор: Poseidon 3.7.2006, 19:14 |
| Вставь Application.ProcessMessages перед каждым Sleep(5000); |
| Автор: Dr3d 3.7.2006, 19:22 |
| Нужная процедура в конце прикрепленного файла. |
| Автор: drkot 3.7.2006, 19:28 | ||
должно помочь.
после входа в процедуру останавливай таймер, а то если процесс длительный глюки могут полезть. а при выходе снова запускай. |
| Автор: Dr3d 3.7.2006, 19:32 |
| Вот и программа целиком.. Только не стоит запускать её из-под Delphi, после запуска она блокирует клавиатуру. Чтобы её закрыть нужно завершить через Диспетчер задач процесс: service.exe |
| Автор: Dr3d 3.7.2006, 19:49 | ||||
Application.ProcessMessages стоит при активации Form1, но не помогает, а останавливая таймер, форма вообще не закрывается... да и в случае ошибки в процедуре таймер не запустится. |
| Автор: Max111 3.7.2006, 21:11 |
| Доброе утро, В справке написано The Sleep function suspends the execution of the current thread for a specified interval. Если у Вас интервал для Timer2 меньше чем 5000 то непонятно вообще как это у вас работает. Я бы сделал несколько проще вызов Form1.show внутри метода Show включить таймер с интервалом в 5000 при истечении таймера Form1.close |
| Автор: Dr3d 3.7.2006, 21:20 | ||
Один хрен второй раз надписи не видно. |
| Автор: Dr3d 4.7.2006, 12:00 |
| Интервал для второго таймера я поставил маленький, чтобы долго не ждать. Но даже если поставить как надо, на 60 сек, то результат тотже самый. |
| Автор: drkot 4.7.2006, 16:57 | ||||||||||||
| разберем ситуацию. касаюсь только алгоритмичномти. Реализации кода не касаюсь. интервал вызова процедуры 1000мс.
начали
вот и первый бок.
ждем 5000мс за это время процедура будет вызвана еще 4 раза и в каждой вновь вызваной процедуре произойдет showwindow неудивитьльно что виснет.
тоже самое
может format проще будет использовать?
таймер обнозначно останавливать при входе и заново запускать при выходе. Сейчас это напоминает попытку пролезть по тунелю через работающий вентилятор. |
| Автор: Dr3d 4.7.2006, 17:26 |
| Не, я не мучаюсь, я запускаю эту програмку на удаленном ПК. И как ты наверное заметил, это клиентская часть, сервер стоит на моем компе, и чтоб закрыть клиента я всего лишь посылаю 'exit'. Клаву блокирую потому, что это программа для нашего комп клуба. И программа в целом работает нормально, проблемы возникают только со второй формой. Я уже там конечно намудрил, она раньше не зависала (Timer2.Interval := 60000). Вся проблема и заключается в том, что я отображаю эту форму чтобы показать первый раз пользователю, что у него осталось 5 минут, а второй раз 1 минута, но появляясь второй раз на ней нет надписи. Вот. З.Ы. Как юзать Format? |
| Автор: drkot 4.7.2006, 17:49 |
F1 Ситуация: бегаеш к примеру монстеров стреляеш, и тут хрясь игра сворачивается А уверен что твоя форма прорверся наружу при активированом DirectX и сколько по времени она это делает? как писал ранее . если коснутся то показ и скрытие формы реализовано неверно нестоит вобще зомораживать слипами основной поток (да еще и на 5 с). Лучше уж так: показал форму запустил таймер отсчет закончился, форму скрыл форму, выключил таймер зачем долго висеть в одной процедуре (еслиб это отдельные потоки были то еще понятно) а так поток один (оболочка) вот он бедняга и не прорисовывает. (кста можно пытаться принудительно обновлять) И немного по стилистике: видны попытки использования API функций напрямую, но непонятно зачем? Все что использовал в делфе уже прописано в системных юнитах, место не экономится, читаемость падает. Я не против API только если это надо. |
| Автор: Dr3d 4.7.2006, 18:54 |
| Согласен, что красиво писать я еще не умею, но мне главное чтоб работало! Сейчас все работает, делаю обновление формы (Form2.Refresh;) и Label показывается. Тут слабал небольшой примерчик по этому поводу, кому интересно, глянте. |
| Автор: Dr3d 4.7.2006, 19:10 | ||
А вот и нет Только что проверил на Варике и на Контре проверил, никто не свернулся, только вот это окошко слишком быстро мигнуло, даже не видно что там написано Я так думаю туда нужно целый цикл с перерисовкой дабавить. Будет выглядеть как в Асталависте. |