Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата(Poseidon @  3.7.2006,  19:14 Найти цитируемый пост)
Application.ProcessMessages

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

Код

procedure TForm1.Timer2Timer(Sender: TObject);

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

Автор: Dr3d 3.7.2006, 19:32
Вот и программа целиком..

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

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

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

Код

procedure TForm1.Timer2Timer(Sender: TObject);

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

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
Цитата(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 4.7.2006, 12:00
Интервал для второго таймера я поставил маленький, чтобы долго не ждать.
Но даже если поставить как надо, на 60 сек, то результат тотже самый. 

Автор: drkot 4.7.2006, 16:57
разберем ситуацию. касаюсь только алгоритмичномти. Реализации кода не касаюсь.
интервал вызова процедуры 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;

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

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

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

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

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

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

З.Ы. Как юзать Format? 

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

F1

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

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

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

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

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

Автор: Dr3d 4.7.2006, 19:10
Цитата

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



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

Я так думаю туда нужно целый цикл с перерисовкой дабавить.
Будет выглядеть как в Асталависте. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)