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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
А ты зачем, братан, кастишь напрямую String в Integer? ;-) 27.09.04 13:03  Число просмотров: 1533
Автор: 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, поактивней исследуй свой код и переменные во время работы твоей программы.
<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