Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мистика или закон? Загадка с ShowWindow(Form2.Handle,... 
:(
    Опции темы
Dr3d
  Дата 3.7.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Есть две формы: 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);

Первый раз вылезет форма с надписью 'бла-бла-бла', а второй раз без надписи!

Вопрос: почему это происходит? И как сделать так, чтобы и второй раз была видна надпись?
PM MAIL   Вверх
drkot
Дата 3.7.2006, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



в виде кода давай.
выкладывай проект народ посмотрит, а гадать что ты написал .... 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Poseidon
Дата 3.7.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Вставь Application.ProcessMessages перед каждым Sleep(5000); 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Dr3d
Дата 3.7.2006, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Нужная процедура в конце прикрепленного файла. 

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  client.pas 4,28 Kb
PM MAIL   Вверх
drkot
Дата 3.7.2006, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(Poseidon @  3.7.2006,  19:14 Найти цитируемый пост)
Application.ProcessMessages

должно помочь.

Код

procedure TForm1.Timer2Timer(Sender: TObject);

после входа в процедуру останавливай таймер, а то если процесс длительный глюки могут полезть.
а при выходе снова запускай.  

Это сообщение отредактировал(а) drkot - 3.7.2006, 19:28


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dr3d
Дата 3.7.2006, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Вот и программа целиком..

Только не стоит запускать её из-под Delphi, после запуска она блокирует клавиатуру.
Чтобы её закрыть нужно завершить через Диспетчер задач процесс: service.exe
 

Это сообщение отредактировал(а) Dr3d - 3.7.2006, 19:44

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  client.rar 9,78 Kb
PM MAIL   Вверх
Dr3d
Дата 3.7.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Цитата(drkot @ 3.7.2006,  19:28)
Цитата(Poseidon @  3.7.2006,  19:14 Найти цитируемый пост)
Application.ProcessMessages

должно помочь.

Код

procedure TForm1.Timer2Timer(Sender: TObject);

после входа в процедуру останавливай таймер, а то если процесс длительный глюки могут полезть.
а при выходе снова запускай.

Application.ProcessMessages стоит при активации Form1, но не помогает,
а останавливая таймер, форма вообще не закрывается...
да и в случае ошибки в процедуре таймер не запустится. 
PM MAIL   Вверх
Max111
Дата 3.7.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 18.1.2006

Репутация: нет
Всего: нет



Доброе утро,

В справке написано
The Sleep function suspends the execution of the current thread for a specified interval. 

Если у Вас интервал для Timer2 меньше чем 5000
то непонятно вообще как это у вас работает.

Я бы сделал несколько проще 
вызов Form1.show
внутри метода Show включить таймер с интервалом в 5000 
при истечении таймера Form1.close
 
PM MAIL   Вверх
Dr3d
Дата 3.7.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Цитата(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

Один хрен второй раз надписи не видно.
PM MAIL   Вверх
Dr3d
Дата 4.7.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Интервал для второго таймера я поставил маленький, чтобы долго не ждать.
Но даже если поставить как надо, на 60 сек, то результат тотже самый. 
PM MAIL   Вверх
drkot
Дата 4.7.2006, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



разберем ситуацию. касаюсь только алгоритмичномти. Реализации кода не касаюсь.
интервал вызова процедуры 1000мс.
Код

procedure TForm1.Timer2Timer(Sender: TObject);
var
sh, sm: string;
begin

начали
Код

sh:=labe;
sm:=labe;

if labe = '00:01' then
begin
showwindow(form2.Handle, SW_SHOW);

вот и первый бок.
Код

sleep(5000);

ждем 5000мс за это время процедура будет вызвана еще 4 раза
и в каждой вновь вызваной процедуре произойдет showwindow
неудивитьльно что виснет.
Код

showwindow(form2.Handle, SW_HIDE);
end;

if labe = '00:05' then
begin
form2.Caption := 'Осталось 5 минут.';
showwindow(form2.Handle, SW_SHOW);
sleep(5000);

тоже самое
Код

showwindow(form2.Handle, SW_HIDE);
end;

if labe = '00:00' then
begin
ShowWindow(Handle, SW_SHOW);
ShowWindow(Application.Handle, SW_HIDE);
showcursor(false);
sleep(100);
BlockInput(True);
timer2.Enabled := false;
end;



может format проще будет использовать?
Код

if length(labe) = 5 then
  begin
    delete(sh,3,3);
    delete(sm,1,3);
   if (sm = '00') and (sh <> '00') then
    begin
     sh:=inttostr(strtoint(sh)-1);
     sm:='59';
     if length(sm)=1 then sm := '0' + sm;
     if length(sh)=1 then sh := '0' + sh;
     labe := sh + ':' + sm;
    end
    else if (sm <> '00') then
    begin
    sm:=inttostr(strtoint(sm)-1);
    if length(sm)=1 then sm := '0' + sm;
    if length(sh)=1 then sh := '0' + sh;
    labe := sh + ':' + sm;
    end;

end;
end;

таймер обнозначно останавливать при входе и заново запускать при выходе. Сейчас это напоминает попытку пролезть по тунелю через работающий вентилятор. 


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
drkot
Дата 4.7.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



немного вдогонку:
"рабочий алгоритм можно сделать быстрым, а быстрый рабочим нет"
(да простят меня коллеги если процетировал неправильно)
так вот: сначало надо получить рабочий алгоритм, а уж потом на него фенички навешивать, а у тебя сплошные фенички и работать не хочет.
Так и не понял зачем управление блокировать?
Цитата(Dr3d @  3.7.2006,  19:32 Найти цитируемый пост)
Только не стоит запускать её из-под Delphi, после запуска она блокирует клавиатуру.Чтобы её закрыть нужно завершить через Диспетчер задач процесс: service.exe

этож как ты мучишся  smile  


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dr3d
Дата 4.7.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Не, я не мучаюсь, я запускаю эту програмку на удаленном ПК. И как ты наверное заметил, это клиентская часть, сервер стоит на моем компе, и чтоб закрыть клиента я всего лишь посылаю 'exit'.

Клаву блокирую потому, что это программа для нашего комп клуба.

И программа в целом работает нормально, проблемы возникают только со второй формой.
Я уже там конечно намудрил, она раньше не зависала (Timer2.Interval := 60000).
Вся проблема и заключается в том, что я отображаю эту форму чтобы показать первый раз пользователю, что у него осталось 5 минут, а второй раз 1 минута, но появляясь второй раз на ней нет надписи. Вот.

З.Ы. Как юзать Format? 
PM MAIL   Вверх
drkot
Дата 4.7.2006, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: 5
Всего: 8



Цитата(Dr3d @  4.7.2006,  17:26 Найти цитируемый пост)
З.Ы. Как юзать Format? 

F1

Ситуация: бегаеш к примеру монстеров стреляеш, и тут хрясь игра сворачивается  smile , форма появляется  smile  smile  пока весь процесс угомонится тя уже убили  smile . Но это так лирика.
А уверен что твоя форма прорверся наружу при активированом DirectX и сколько по времени она это делает?
как писал ранее
Цитата(drkot @  4.7.2006,  16:57 Найти цитируемый пост)
Реализации кода не касаюсь.
.
если коснутся то показ и скрытие формы реализовано неверно нестоит вобще зомораживать слипами основной поток (да еще и на 5 с). Лучше уж так:
  показал форму
  запустил таймер
      отсчет закончился, форму скрыл форму, выключил таймер

зачем долго висеть в одной процедуре (еслиб это отдельные потоки были то еще понятно)
а так поток один (оболочка) вот он бедняга и не прорисовывает. (кста можно пытаться принудительно обновлять)

И немного по стилистике: видны попытки использования API функций напрямую, но непонятно зачем?
Все что использовал в делфе уже прописано в системных юнитах, место не экономится, читаемость падает. Я не против API только если это надо. 
   


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Dr3d
Дата 4.7.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Согласен, что красиво писать я еще не умею, но мне главное чтоб работало!
Сейчас все работает, делаю обновление формы (Form2.Refresh;) и Label показывается.

Тут слабал небольшой примерчик по этому поводу, кому интересно, глянте.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  Temp.rar 9,78 Kb
PM MAIL   Вверх
Dr3d
Дата 4.7.2006, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 3.7.2006

Репутация: нет
Всего: нет



Цитата

Ситуация: бегаеш к примеру монстеров стреляеш, и тут хрясь игра сворачивается   , форма появляется      пока весь процесс угомонится тя уже убили   . Но это так лирика.



А вот и нет smile 
Только что проверил на Варике и на Контре проверил, никто не свернулся, только вот это окошко слишком быстро мигнуло, даже не видно что там написано smile .

Я так думаю туда нужно целый цикл с перерисовкой дабавить.
Будет выглядеть как в Асталависте. 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.