Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | |
Вроде все правильно сделал - все равно проблема... 27.09.04 08:39 Число просмотров: 1629
Автор: 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;
---
Подсажите, пожалуйста, в чем проблема?
|
<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 изначально выкл
|
|
|