информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле ЛевинаПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Могли бы. Пример внутри. 25.09.04 13:21  Число просмотров: 1793
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
procedure TForm1.Timer1Timer(Sender: TObject);
Var ThisTimer: TTimer;
begin
  ThisTimer := TTimer(Sender);
  ThisTimer.Tag := ThisTimer.Tag - 1;
  If ThisTimer.Tag < 0 Then
  Begin
    ThisTimer.Enabled := False;
    Exit;
  End;

  // А здесь пишешь тот код, который должен у тебя выполниться через
  // равные промежутки времени.
  // Внимание! Установи на форме для таймера параметр Enabled в False,
  // если не хочешь, чтобы он выполнялся сразу после создания формы.
  // Для запуска кода делаешь Timer1.Enabled := True
  // В свойство таймера Tag устанавливаешь нужное количество итераций.
  // В свойство таймера Interval ставишь нужное кол-во миллисекунд.

end;

---
<programming>
[Delphi] Повтор действия 25.09.04 11:49  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
Отредактировано 25.09.04 11:56  Количество правок: 1
<"чистая" ссылка>
Как одно и то же действие повторить указанное кол-во раз через указанное кол-во времени (время указано в минутах)?
[Delphi] А как теперь остановить? =)) 01.10.04 07:51  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
А как сделать, например, если указанное кол-во раз код повторен, сделать то, то и то?
Использую компонент Timer.
[Delphi] Подумать ;-) 01.10.04 08:57  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 01.10.04 08:59  Количество правок: 1
<"чистая" ссылка>
> А как сделать, например, если указанное кол-во раз код
> повторен, сделать то, то и то?
> Использую компонент Timer.

Ты мог видеть, что в моём примере поле таймера Tag уменьшается на каждом срабатывании на 1. Как только стало меньше 0, поле таймера Enabled выставляется в False. Т.е. таймер перестаёт срабатывать.

Ты с моим примером разбирался?
Там видно, что играясь с условием "If ThisTimer.Tag < 0 Then ThisTimer.Enabled := False..." можно достигнуть всяких результатов.
То есть, каждый раз при выполнении действия из Timer.Tag... 01.10.04 13:31  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
То есть, каждый раз при выполнении действия из Timer.Tag вычитается еденица?
Да. При каждом срабатывании таймера. Это же в примере видно — «ThisTimer.Tag := ThisTimer.Tag - 1» 01.10.04 14:47  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
[Delphi] Окромя таймера можешь делать цикл For и усыплять поток функцией Sleep(). Правда поток "замёрзнет" на это время, он это кое-где надо, к примеру, в консольных прогах. 25.09.04 12:42  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
Use TTimer 25.09.04 12:02  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
Так я его и использую, но вот возник такой вопрос. Не могли... 25.09.04 13:01  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
Так я его и использую, но вот возник такой вопрос. Не могли бы вы привести пример кода для описанного мной случая, - в дельфи я новичок и мне очень трудно сориентироваться...
Могли бы. Пример внутри. 25.09.04 13:21  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
procedure TForm1.Timer1Timer(Sender: TObject);
Var ThisTimer: TTimer;
begin
  ThisTimer := TTimer(Sender);
  ThisTimer.Tag := ThisTimer.Tag - 1;
  If ThisTimer.Tag < 0 Then
  Begin
    ThisTimer.Enabled := False;
    Exit;
  End;

  // А здесь пишешь тот код, который должен у тебя выполниться через
  // равные промежутки времени.
  // Внимание! Установи на форме для таймера параметр Enabled в False,
  // если не хочешь, чтобы он выполнялся сразу после создания формы.
  // Для запуска кода делаешь Timer1.Enabled := True
  // В свойство таймера Tag устанавливаешь нужное количество итераций.
  // В свойство таймера Interval ставишь нужное кол-во миллисекунд.

end;

---
Вроде все правильно сделал - все равно проблема... 27.09.04 08:39  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
<"чистая" ссылка>
Вроде все правильно сделал - все равно проблема, не работает повтор кода...
Вот код:
procedure TVmsg.FormActivate(Sender: TObject);
var
Psound: string;
begin
   Psound:= Alarm.W2wav.Text;
     if Alarm.NumCh.Checked then  //если просят повторить
     begin
     TimeA.Enabled := True; // включаем таймер
     TimeA.Tag := Integer(Alarm.NumA.Text); //узнаем, сколько раз просят повторить
     TimeA.Interval := Integer(Alarm.NumT.Text) * 60 * 1000;
{^^^ узнаем, через какой промежуток времени нас просят это сделать в минутах и переведем их в милисекунды}
     Smsg.Caption := Alarm.Msg.Text; // текст сообщения
     PlaySound(Pchar(Psound),0,SND_FILENAME);  // звук
     end
     else begin  // а если нас не просят напоминать несколько раз, сделаем это единожды
     Smsg.Caption := Alarm.Msg.Text; // текст сообщения
     PlaySound(Pchar(Psound),0,SND_FILENAME);  // звук
     end;
end;

---
Подсажите, пожалуйста, в чем проблема?
А ты зачем, братан, кастишь напрямую String в Integer? ;-) 27.09.04 13:03  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 27.09.04 13:12  Количество правок: 5
<"чистая" ссылка>
> Вроде все правильно сделал - все равно проблема, не
> работает повтор кода...
> Вот код:
>

> procedure TVmsg.FormActivate(Sender: TObject);
> var
> Psound: string;
> begin
> Psound:= Alarm.W2wav.Text;
> if Alarm.NumCh.Checked then //если просят повторить
> begin
> TimeA.Enabled := True; // включаем таймер
> TimeA.Tag := Integer(Alarm.NumA.Text); //узнаем,
> сколько раз просят повторить
> TimeA.Interval := Integer(Alarm.NumT.Text) * 60 *
Вот у тебя строка (выше) - так нельзя! Для того чтобы превратить строковое представление числа в тип Integer, используй функцию StrToInt() !!!!!!!
Там я смотрю ещё есть подобные места - отследи их все. Будь поаккуратней с приведением типов при работе со строками.

И ещё. Отладчик и точки останова не просто так имеются в среде Delphi, поактивней, pls, поактивней исследуй свой код и переменные во время работы твоей программы.
Уточнение 28.09.04 07:44  
Автор: n0xi0uzz <Черкасов Виктор> Статус: Member
Отредактировано 28.09.04 08:16  Количество правок: 1
<"чистая" ссылка>
Тогда вместо Integer(Alarm.NumA.Text); писать StrToInt(Alarm.NumA.Text); - так?
А проблема вроде бы как не только в этом - меня только сегодня утром осенило - я не в ту процедуру впихнул этот код ;)
Да, и вдогонку вопрос: а как преобразовать string в pchar, или лучше просто Pchar(string)?
Ответ. 28.09.04 12:27  
Автор: HandleX <Александр М.> Статус: The Elderman
<"чистая" ссылка>
> Тогда вместо Integer(Alarm.NumA.Text); писать
> StrToInt(Alarm.NumA.Text); - так?
Да, так.

> А проблема вроде бы как не только в этом - меня только
> сегодня утром осенило - я не в ту процедуру впихнул этот
> код ;)
Плохо, когда не то, да ещё и не туда ;-)

> Да, и вдогонку вопрос: а как преобразовать string в pchar,
> или лучше просто Pchar(string)?
Да, это пожалуй, один из немногих случаев, когда компилер корректно понимает твой кастинг — в случае PChar(MyStringVar) компилер нормально возвратит тебе указатель на первый байт твоей строки.
ну например (если не надо большой универсальности) 25.09.04 13:10  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 25.09.04 13:12  Количество правок: 1
<"чистая" ссылка>
ну например (если не надо большой универсальности)
function TForm1::StartCounter(CyclesCount:integer;PeriodSecond:integer;);
begin
RemainCount:=CyclesCount;
Timer1.Interval:=Period*1000;
Timer1.Enabled:=(CyclesCount>0);
end;
Function TForm1::Timer1OnTimer(...)
begin
///тырыпырытраливали
dec(RemainCount);
if(RemainCount=0)Timer1.Enabled:=0;
end;

Где RemainCount - глобальная/классовая integer переменная, Timer1 изначально выкл
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach