Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2009, 15:04   #1
DeFREEnd
 
Регистрация: 13.01.2009
Сообщений: 7
По умолчанию DateTimePicker в будильнике

Вобщем недавно начал работать в Делфи, вот возник вопрос в написании будильника...
Для ввода юзером времени срабатывания сигнала, был выбран компонент DateTimePicker... Все таки через Edit делать было как то несерьезно)
Вот код расчета срабатывания звонка:
Код:
var st:sustemtime;
procedure TMainForm.Timer2Timer(Sender: TObject);
begin
if st=DateTimePicker1.Time then MeinMPlayer.Play;
end;
При компиляции выбивает следущую ошибку:
Код:
 [Error] MainUnit.pas(103): Incompatible types
Как я понимаю несоответствие типов...
Вопрос, их привести к одному виду данных или же есть еще более удобный и эффективный способ?
DeFREEnd вне форума Ответить с цитированием
Старый 13.01.2009, 15:49   #2
Google[Bot]
Пользователь
 
Аватар для Google[Bot]
 
Регистрация: 09.01.2009
Сообщений: 65
По умолчанию

DateTimePicker1.Time тут тип TTime, а у st - sustemtime, потому ошибка и выскакивает, вместо st можно использовать Now() и все будет работать
Google[Bot] вне форума Ответить с цитированием
Старый 13.01.2009, 17:26   #3
DeFREEnd
 
Регистрация: 13.01.2009
Сообщений: 7
По умолчанию

Вобщем заюзал я вместо sustemtime функцию now(), все отлично - компилятор не ругается, стал использовать эту функцию для вывода на экран проги текущего времени, тоже все работает...
Вот только будильник перестал реагировать на совпадения установленного времени и текущего..(
До этого при помощи susutemtime и полей ввода Edit все работало отлично...
Код:
//Расчет когда давать сигнал
procedure TMainForm.Timer2Timer(Sender: TObject);
begin
if DateTimePicker1.Time=now then MeinMPlayer.Play;
end;

//Вывод на экран текущего времени
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
TimePanel.Caption:=TimeToStr(now);
end;

//Включение таймера
procedure TMainForm.StartButtonClick(Sender: TObject);
begin
Timer2.Enabled:=true;
end;
DeFREEnd вне форума Ответить с цитированием
Старый 13.01.2009, 18:34   #4
Google[Bot]
Пользователь
 
Аватар для Google[Bot]
 
Регистрация: 09.01.2009
Сообщений: 65
По умолчанию

@Вот только будильник перестал реагировать на совпадения установленного времени и текущего..(@

А частота таймера какая? При таком сравнении должна быть посекундная или меньше... Возможно просто пропускает момент, когда сравнить надо... Попробуйте +-лапоть...
Google[Bot] вне форума Ответить с цитированием
Старый 13.01.2009, 19:27   #5
DeFREEnd
 
Регистрация: 13.01.2009
Сообщений: 7
По умолчанию

Интервал всмысле? стоял 1000 (1 секунда как я понимаю)
менял на 100, 10.. все равно...
ради интереса вместо DateTimePicker, поставил обратно edit1 и edit2
и запуситил прогу. все работает норм... только добавил строку
Код:
 Timer2.Enabled:=false;
в конце процедуры, дабы избежать повторного вызова звукового сигнала.
После проверил, может из-за этого и неработает включения сигнала.. однако непомогло...
Вот слегка изменненый код (в коментарии неработающий вариант) и Edit1 и Edit2 в качастве полей для ввода часов\минут и st:sustemtime вместо now()

Код:
procedure TMainForm.Timer2Timer(Sender: TObject);
begin
{if DateTimePicker1.Time=now then
begin
  MeinMPlayer.Play;
  Timer2.Enabled:=false;
  end;}
getlocaltime(ST);
if (ST.Whour=StrToInt(Edit1.Text))and (ST.WMinute=StrToInt(Edit2.Text)) then
begin
 MeinMPlayer.Play;
 Timer2.Enabled:=false;
end;
end;
DeFREEnd вне форума Ответить с цитированием
Старый 13.01.2009, 19:54   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
procedure TMainForm.Timer2Timer(Sender: TObject);
var tektime: TDateTime;
begin
tektime:=Now;
if (tektime>=DateTimePicker1.Time) and (tektime<DateTimePicker1.Time+StrToTime('00:00:02')) then
//это для наглядности - 2 интервала таймера 
MeinMPlayer.Play;
end;
Останавливать таймер не нужно - а если вам нужно 10, 20 будильников? На каждый - свой таймер?
Интервал таймера - 1 секунда.
mihali4 вне форума Ответить с цитированием
Старый 13.01.2009, 20:51   #7
Google[Bot]
Пользователь
 
Аватар для Google[Bot]
 
Регистрация: 09.01.2009
Сообщений: 65
По умолчанию

if (ST.Whour=StrToInt(Edit1.Text))and (ST.WMinute=StrToInt(Edit2.Text)) then

Вот про это я и говорил, проверка до секунди осуществяется при сравнении с Now, а вы это заменили проверкой до минуты...
Google[Bot] вне форума Ответить с цитированием
Старый 13.01.2009, 21:12   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Чем это не нравится?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 If Now >= DateTimePicker1.DateTime then
  Beep{или что там хотите};
end;
Время сами приваивайте DateTimePicker1, т.к он использует то время, которое у него было при помещении на форму.
Alter вне форума Ответить с цитированием
Старый 13.01.2009, 21:18   #9
Google[Bot]
Пользователь
 
Аватар для Google[Bot]
 
Регистрация: 09.01.2009
Сообщений: 65
По умолчанию

Цитата:
Сообщение от Alter Посмотреть сообщение
Чем это не нравится?
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 If Now >= DateTimePicker1.DateTime then
  Beep{или что там хотите};
end;
Время сами приваивайте DateTimePicker1, т.к он использует то время, которое у него было при помещении на форму.
так он будет пищать каждую секунду, или че там было...

Можно вместо if >= и <= испозовать secondsBeetwen(время1,время2)<2

Последний раз редактировалось Google[Bot]; 13.01.2009 в 21:26.
Google[Bot] вне форума Ответить с цитированием
Старый 13.01.2009, 22:44   #10
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Цитата:
Сообщение от Google[Bot] Посмотреть сообщение
так он будет пищать каждую секунду, или че там было...

Можно вместо if >= и <= испозовать secondsBeetwen(время1,время2)<2
Не будет если будете запускать второй таймер(в нём запуск музыки), с ограниченным временем работы, который будет отключаться как закончится его время.
Я же как пример привёл проверку.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
DateTimePicker в DBGrid Alex_76 Помощь студентам 4 20.06.2008 15:21
DateTimePicker и API Андрей= Win Api 5 22.04.2008 15:21
DateTimePicker Delphi GAGARIN-NEW Помощь студентам 7 06.12.2007 15:23
Вопросы DateTimePicker Askat БД в Delphi 14 29.06.2007 18:53
DateTimePicker + Label krem Компоненты Delphi 2 10.05.2007 16:36