Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2009, 20:23   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию Проблема с Sleep!

У меня такая проблема: каждую секунду значение Label1.Caption должно уменьшаться на 1. Я написал цикл:
Код:
for i := 1 to 20 do
  begin
  TextNum.Caption := IntToStr(StrToInt(TextNum.Caption) - 1);
  Sleep(1000);
  end;
Но при его выполнении происходит задержка в 20 сек, в течение которых прога зависает, а потом значением Label'а сразу становится 0.
Вопрос: как сделать, чтобы задержка выполнялась не сразу и не зависала программу?
k1r1ch вне форума Ответить с цитированием
Старый 19.06.2009, 20:27   #2
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

ну, возможно стоит использовать таймер
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 19.06.2009, 20:30   #3
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию Таймер

А можно чуть поподробней? Про таймер? Я только-только начал изучать программирование...
k1r1ch вне форума Ответить с цитированием
Старый 19.06.2009, 20:31   #4
__STDC__
Участник клуба
 
Аватар для __STDC__
 
Регистрация: 16.03.2009
Сообщений: 1,013
По умолчанию

ну кинуть на форму таймер с вкладки System (у меня делфи 7), поставите enabled у него в false и написать как-нибудь так
Код:
procedure TForm1.Button1Click(Sender: TObject);

begin
  Timer1.Enabled := true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  TextNum.Caption := IntToStr(StrToInt(TextNum.Caption) - 1);
  if (TextNum.Caption = '0') then Timer1.Enabled := false;
end;
Uguu~
__STDC__ вне форума Ответить с цитированием
Старый 19.06.2009, 20:51   #5
crystalbit
ГОСТ 2.403-75
Пользователь
 
Аватар для crystalbit
 
Регистрация: 04.05.2009
Сообщений: 92
По умолчанию

после
Код:
 Sleep(1000);
поставь
Код:
Application.ProcessMessages
и будет тебе счастье

только да, программа будет подвисать

upd.
как вариант в отдельном потоке или таймер, или еще так:
Код:
for i := 1 to 20 do
begin
  TextNum.Caption := IntToStr(StrToInt(TextNum.Caption) - 1);
  for k:=1 to 100 do begin
    Sleep(10);
    Application.ProcessMessages;
  end;
end;
мой скромный delphi блог
crystalbit вне форума Ответить с цитированием
Старый 19.06.2009, 22:22   #6
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Цикл можно "обойти" :
Код:
procedure TForm1.FormPaint(Sender: TObject);
begin
  if (StrToInt(Label1.Caption)) <= 0 then Label1.Caption:= '0'
  else
  begin
    Label1.Caption:= IntToStr(StrToInt(Label1.Caption) -1);
    Sleep(1000);
  end;
end;
После then вместо Label1.Caption:= '0' можно вставить переходк к какой либо другой процедуре программы.
ЗЫ: начальное значение Label1.Caption (обязательно числовой тип - integer, byte )устанавливаем в Инспекторе объектов при проектировании.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 19.06.2009 в 22:25.
DeKot вне форума Ответить с цитированием
Старый 20.06.2009, 09:53   #7
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

С таймером вот такая ошибка:
[Error] Unit2.pas(40): Undeclared identifier: 'Timer1Timer'
Да и вообще, тут же цикла нет, по идее действие будет один раз выполняться? Или сама процедура как цикл?
2crystalbit: В обоих вариантах все то же самое (то есть зависание).
2DeKot: А тут действие всего один раз выполняется и все.
k1r1ch вне форума Ответить с цитированием
Старый 20.06.2009, 10:52   #8
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,759
По умолчанию

Вот так всё прекрасно работает:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  for i := 20 downto 0 do
    begin
      Label1.Caption := IntToStr (i);
      sleep (1000);
      Application.ProcessMessages;
    end;
end;
FaTaL вне форума Ответить с цитированием
Старый 20.06.2009, 15:40   #9
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

To k1r1ch
Цитата:
2DeKot: А тут действие всего один раз выполняется и все.
.
А ты программу с этим кодом запускал? На форме значение в Label1 каждую сек. уменьшается на 1 от заданного в Инспекторе, а при достижении 0 просто постоянно висит 0.Код то выполняется в процедуре FormPaint.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 20.06.2009, 18:47   #10
hoza_syl
Форумчанин
 
Аватар для hoza_syl
 
Регистрация: 23.05.2008
Сообщений: 219
По умолчанию

А так чтоли нельзя?:

Код:
 var  h: THandle;
begin

 h:=CreateEvent(nil,true,false,''); //создаем пустое событие
for i := 1 to 20 do
  begin
  TextNum.Caption := IntToStr(StrToInt(TextNum.Caption) - 1);
   WaitForSingleObject(h,1000); //задержка в 30 сек
  end;
 closeHandle(h); //уничтожаем его
The Revolution is Now!
hoza_syl вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запросы типа "sleep" bilep SQL, базы данных 0 23.01.2009 21:37
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37
Аналог Sleep() Ants Общие вопросы Delphi 2 18.11.2008 13:11
Функция для Sleep russian-stalker Общие вопросы Delphi 5 12.09.2008 16:40
Альтернатива sleep Zuzlan Общие вопросы Delphi 2 01.11.2007 01:44