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;
> А как сделать, например, если указанное кол-во раз код > повторен, сделать то, то и то? > Использую компонент 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
Так я его и использую, но вот возник такой вопрос. Не могли бы вы привести пример кода для описанного мной случая, - в дельфи я новичок и мне очень трудно сориентироваться...
Могли бы. Пример внутри.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 изначально выкл