информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Все любят медСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Могли бы. Пример внутри. 25.09.04 13:21  Число просмотров: 1626
Автор: 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-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach