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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2012, 21:24   #1
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию Sleep Delphi

Доброго времени суток уважаемые программисты, есть код который выводит текст на канву
Код:
begin
  with Form1.Canvas do
  begin
    for q := 1 to N do
    begin
      TextOut(PenPos.X, PenPos.Y, a[q]);
      if PenPos.X + TextWidth(a[i]) > 250 then
      begin
        Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X - (240 +TextWidth(a[i])), Form1.Canvas.PenPos.Y + 20);
      end;
     sleep(100);
    end;
  end;
end;
А каким образом вместо sleep можно здесь использовать таймер? А то при использовании sleep программа не реагирует ни на какие действия..
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 16.12.2012, 21:36   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Есть компонент, который называется таймер.
Задаёте интервал, потом пишете обработчик этого таймера, который будет вызываться каждый раз по истечении заданного интервала. В обработчике делаете нужные действия.
Вадим Мошев вне форума Ответить с цитированием
Старый 16.12.2012, 21:39   #3
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Вадим Мошев, знаю, обработчик делаю, и кнопочку, не могу связь понять, когда на кнопку нажимаю то пусть Timer.Enabled:=true; должен же таймер выполниться?....а в обработчик таймера вставляю свой код который выше, но все выводится как бы за один раз а не посимвольно
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 16.12.2012, 21:44   #4
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

В приведенном коде обрабатывай сообщения Application.ProcessMessages; и таймер не будет нужен. Обычно для такого дела таймер не используется.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 16.12.2012, 21:47   #5
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
не могу связь понять, когда на кнопку нажимаю то пусть Timer.Enabled:=true; должен же таймер выполниться?.
Здесь просто включается таймер, после чего начинает периодически вызываться обработчик.
Цитата:
а в обработчик таймера вставляю свой код который выше, но все выводится как бы за один раз а не посимвольно
Интервал какой?
Кстати, цикл в обработчике вам не нужен будет.

Вообще, что у вас делает программа? Печатает текст посимвольно?
Вадим Мошев вне форума Ответить с цитированием
Старый 16.12.2012, 21:47   #6
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Код:
begin
  with Form1.Canvas do
  begin
    for q := 1 to N do
    begin
      TextOut(PenPos.X, PenPos.Y, a[q]);
      if PenPos.X + TextWidth(a[i]) > 250 then
      begin
        Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X - (240 +TextWidth(a[i])), Form1.Canvas.PenPos.Y + 20);
      end;
     sleep(100);
   application.ProcessMessages
    end;
  end;
end;
apromix, Вот так? Тогда косячит просто программа выполняется не могу закрыть её
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 16.12.2012, 21:53   #7
McFrey
Форумчанин
 
Аватар для McFrey
 
Регистрация: 15.10.2011
Сообщений: 306
По умолчанию

Вадим Мошев, да просто посимвольно выводит текст на канву, а почему цикл в обработчике не будет нужен? ....я же из массива просто в этом цикле вывожу каждый символ с задержкой....
интервал и 100 и 10000 результат такойже т.е. спустя какое то время (100 мсек или 10000 мсек) на экране появляется текст сразу целиком
Если твоя программа выполняет мистические действия, значит, ты сделал что-то невероятно тупое...
McFrey вне форума Ответить с цитированием
Старый 16.12.2012, 21:59   #8
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Цитата:
Сообщение от McFrey Посмотреть сообщение
Код:
begin
  with Form1.Canvas do
  begin
    for q := 1 to N do
    begin
      TextOut(PenPos.X, PenPos.Y, a[q]);
      if PenPos.X + TextWidth(a[i]) > 250 then
      begin
        Form1.Canvas.MoveTo(Form1.Canvas.PenPos.X - (240 +TextWidth(a[i])), Form1.Canvas.PenPos.Y + 20);
      end;
     sleep(100);
   application.ProcessMessages
    end;
  end;
end;
apromix, Вот так? Тогда косячит просто программа выполняется не могу закрыть её
Покидай Application.ProcessMessages; в разных местах цикла Хотя мне кажется нужно перед отрисовкой. А лучше бы прикрепил код.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 16.12.2012, 22:04   #9
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
да просто посимвольно выводит текст на канву, а почему цикл в обработчике не будет нужен?
Потому что сам обработчик таймера можно сказать является циклом, он периодически выполняет одно и то же, что написано у него в теле.
Более глубже помочь не смогу, так как я не работал с канвой, но могу посоветовать вот такой алгоритм
Код:
объявляем глобальную переменную k и задаём ей значение 1

Обработчик таймера с интервалом, например 200 мс
	начало
		вывести символ с номером k на канву;
		увеличить k на 1 (inc(k))
		
		Если k = длинна строки (это последний символ)
			выключить таймер
	
	конец
Вадим Мошев вне форума Ответить с цитированием
Старый 16.12.2012, 22:07   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Алгоритм Вадима Мошева.
Код:
const
  s = 'Hello';

var
  q: integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
  q := 0;
  Timer1.Enabled := true;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
  canvas.TextOut(10, 10, copy(s, 1, q));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  inc(q);
  if q >= length(s) then
    Timer1.Enabled := false;
  repaint;
end;
Только текст сам не сотрется при повторном нажатии кнопки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Sleep в потоке Florento Общие вопросы Delphi 13 21.06.2011 21:54
функция Sleep() ^Angel^ Общие вопросы C/C++ 9 07.05.2011 13:27
Sleep(50); за 63 мс... или за 47... Teksa Общие вопросы C/C++ 8 20.07.2010 08:34
Цикл for. Реализация sleep (Delphi) на C# Casper-SC Общие вопросы .NET 2 31.12.2009 15:06
Функция Sleep(); VadEr Общие вопросы Delphi 6 10.09.2009 17:45