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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 19:38   #1
Deis
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 37
Восклицание Вопрос про MaskEdit и воиспроизведение *.wav

Делаю программу таймер обратного отсчёта. Пользователь вводит в MaskEdit1(2,3) часы, минуты и секунды. По истечении времени воспроизводится звуковой сигнал *.wav. Практически всё понятно и совсем чуть чуть надо помочь.

1) В MaskEdit я сделал, чтобы вводились только цифры. Но всё равно проскакивает какой-нибудь символ, если его нажать раньше цифры. Как это исправить?

2) В MaskEdit если нет ни одного числа и нажать на пуск, то появляется ошибка на Инглише, как сделать так, чтобы вылазила "своя" ошибка, т.е. допустим надпись "Вы не ввели ни одного числа"

3) Как сделать так, когда таймер отсчитал всё время сколько задал пользователь, воспроизводился звуковой сигнал (например Alarm.wav).

Заранее благодарен!

вот код моего недоделаного таймера:
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
short h, m, s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
// настройка таймера
   Timer1->Enabled = false;
   Timer1->Interval = 1000; // период сигналов от таймера
    // 1 сек
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ( ! Timer1->Enabled )
   {
     // запустить таймер
      Timer1->Enabled = true;
      Button1->Caption = "Стоп";
      Button2->Enabled = false;
    }
    else
     {
       // остановить таймер
       Timer1->Enabled = false;
       Button1->Caption = "Пуск";
       Button2->Enabled = true;
     }
h = StrToInt( MaskEdit1 -> Text );
m = StrToInt( MaskEdit2 -> Text );
s = StrToInt( MaskEdit3 -> Text );

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if ( s >= 1 ) {
s--;
} else if ( s <= 0 ) {
s = 59;
s--;
if ( m >= 1 ) {
m--;
} else if ( m <= 0 ) {
m = 59;
if ( h >= 1 ) {
h--;
} else if ( h <= 0 ) {
h = 23;
m = 59;
s = 59;
}
}
}
Label1 -> Caption = IntToStr( h );
Label2 -> Caption = IntToStr( m );
Label3 -> Caption = IntToStr( s );        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
h = 0;
m = 0;
s = 0;
Label1->Caption = "00";
Label2->Caption = "00";
Label3->Caption = "00";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
MaskEdit1 -> EditMask = "!99;1; "; //Ввод только цифр. Максимальное значение 99
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit2Change(TObject *Sender)
{
MaskEdit2 -> EditMask = "!99;1; "; //Ввод только цифр. Максимальное значение 99
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit3Change(TObject *Sender)
{
MaskEdit3 -> EditMask = "!99;1; "; //Ввод только цифр. Максимальное значение 99
}
//---------------------------------------------------------------------------
Deis вне форума Ответить с цитированием
Старый 11.03.2011, 23:48   #2
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

1)
Цитата:
В MaskEdit я сделал, чтобы вводились только цифры. Но всё равно проскакивает какой-нибудь символ, если его нажать раньше цифры. Как это исправить?
Код:
MaskEdit1 -> EditMask = "!99;1; " ;
if(isdigit(MaskEdit1->Text.c_str()[0])==0) MaskEdit1->Text = "";
2) Например так
Код:
if(MaskEdit1 -> Text == "  ")
MessageBox(NULL,"Вы не ввели ни одного числа","Сообщение об ошибке",MB_OK);
3) Кидай на форму компонент TMediaPlayer, а потом в нужном месте вызови
Код:
MediaPlayer1->FileName = "C:\\myfile.wav";

MediaPlayer1->Open();

MediaPlayer1->Play();
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 12.03.2011, 03:11   #3
Deis
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 37
По умолчанию

cпасибо! реально помог!
Deis вне форума Ответить с цитированием
Старый 15.03.2011, 12:39   #4
Deis
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 37
По умолчанию

Блин, я тупой как сделать в моём коде так, чтобы когда таймер закончил отсчитывать время воспроизводился звук в формате .wav

выкладываю весь код, мало ли кому понадобится!
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
short h, m, s;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   Timer1->Enabled = false; // настройка таймера
   Timer1->Interval = 1000; // период сигналов от таймера 1 сек
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 {
   if(MaskEdit1 -> Text == "  ")
   MessageBox(NULL,"Вы ввели часы не правильно. Часы вводяться в формате, пример: 00, 01, 22. Если этого не сделать, возможно неправильная работа программы.","Ошибка в поле часы",MB_OK);
   if(MaskEdit2 -> Text == "  ")
   MessageBox(NULL,"Вы ввели минуты не правильно. Минуты вводяться в формате, пример: 00, 01, 22. Если этого не сделать, возможно неправильная работа программы.","Ошибка в поле минуты",MB_OK);
   if(MaskEdit3 -> Text == "  ")
   MessageBox(NULL,"Вы ввели секунды не правильно. Секунды вводяться в формате, пример: 00, 01, 22. Если этого не сделать, возможно неправильная работа программы.","Ошибка в поле секунды",MB_OK);

 }
if ( ! Timer1->Enabled )
   {
      Timer1->Enabled = true; // запустить таймер
      Button1->Caption = "Стоп";
      Button2->Enabled = false;
    }
    else
     {
       Timer1->Enabled = false; // остановить таймер
       Button1->Caption = "Пуск";
       Button2->Enabled = true;
     }
h = StrToInt( MaskEdit1 -> Text );
m = StrToInt( MaskEdit2 -> Text );
s = StrToInt( MaskEdit3 -> Text );

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if ( s >= 1 )
 {
 s--;
 }
 else if ( s <= 0 )
  {
  s = 59;
  s--;
  if ( m >= 1 )
    {
    m--;
     }
     else if ( m <= 0 )
      {
      m = 59;
      if ( h >= 1 )
        {
        h--;
      }
      else if ( h <= 0 )
       {
        h = 23;
        m = 59;
        s = 59;
  }
}
}
Label1 -> Caption = IntToStr( h );
Label2 -> Caption = IntToStr( m );
Label3 -> Caption = IntToStr( s );        
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
h = 0;
m = 0;
s = 0;
Label1->Caption = "00";
Label2->Caption = "00";
Label3->Caption = "00";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit1Change(TObject *Sender)
{
 MaskEdit1 -> EditMask = "!99;1; " ;
 if(isdigit(MaskEdit1->Text.c_str()[0])==0) MaskEdit1->Text = "";
 //Ввод только цифр. Максимальное значение 99
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit2Change(TObject *Sender)
{
 MaskEdit2 -> EditMask = "!99;1; " ;
 if(isdigit(MaskEdit2->Text.c_str()[0])==0) MaskEdit2->Text = "";
 //Ввод только цифр. Максимальное значение 99
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MaskEdit3Change(TObject *Sender)
{
 MaskEdit3 -> EditMask = "!99;1; " ;
 if(isdigit(MaskEdit3->Text.c_str()[0])==0) MaskEdit3->Text = "";
 //Ввод только цифр. Максимальное значение 99
}
//---------------------------------------------------------------------------
Deis вне форума Ответить с цитированием
Старый 20.04.2011, 20:07   #5
RusGim
 
Регистрация: 20.04.2011
Сообщений: 5
По умолчанию Надо так

В общем, твой таймер должен выглядеть примерно так...
Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
long secs;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
long StrToSec (AnsiString Str)
{
// Функция конвертирования указанного времени в MaskEdit1 в секунды
AnsiString H,M,S;
int Buf;
H = String(Str[1])+String(Str[2]); // часы
M = String(Str[4])+String(Str[5]); // минуты
S = String(Str[7])+String(Str[8]);  // секунды
if((H=="  ")||(M=="  ")||(S=="  ")) // если где-то закрался косяк
{
// ругаемся
MessageBox(0,"Время должно быть в формате ЧЧ:ММ:СС!", "Ошибка ввода", MB_OK+MB_ICONERROR);
Buf = 0; // считаем, что 0
}
else Buf = H.ToInt()*3600+M.ToInt()*60+S.ToInt(); // общее кол-во секунд
return Buf; // возвращаем результат
}
//---------------------------------------------------------------------------
AnsiString SecToStr (long Sec)
{
// Функция конвертирования, обратная StrToSec
int H,M,S; // целочисленные переменные
AnsiString SH,SM,SS, All;
S = Sec;
H = S/3600; S = S - H*3600; // последнее - выделение остатка от деления
M = S/60; S = S-M*60;
if(S<10)SS+="0"; // в соответствии с нашей маской, числа часов, минут
if(M<10)SM+="0"; // и секунд должны быть двухциферными, поэтому, если
if(H<10)SH+="0"; // полученное число меньше 10, то добавляем 0
SS=SS+String(S);
SM=SM+String(M);
SH=SH+String(H);
All = SH+":"+SM+":"+SS;
return All;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// инициализация программы
MaskEdit1->EditMask = "00:00:00;1; "; // наша маска в формате ЧЧ:ММ:СС
MaskEdit1->Text = "00:00:00"; // начальное значение MaskEdit1
secs = 0; // обнуляем секунды
MediaPlayer1->Visible = false; // скрываем плеер
MediaPlayer1->FileName = "alarm.mp3"; // указываем плееру файл
MediaPlayer1->Open(); // и открываем его для проигрывания
Timer1->Interval = 1000; // интервал таймера - 1 секунда
Timer1->Enabled = false; // изначально, таймер выключен
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
// Кнопка старта/остановки
if(Timer1->Enabled)        // если таймер был включен,
{
Timer1->Enabled = false;   // останавливаем отсчёт,
Button2->Enabled = true;   // открываем доступ к кнопке сброса,
Button1->Caption = "Пуск"; // меняем название кнопки,
MaskEdit1->Enabled = true; // доступ к вводу времени
}
else                       // иначе,
{
secs = StrToSec(MaskEdit1->Text); // считаем кол-во секунд
if(secs > 0)              // если время отлично от нуля
{
Timer1->Enabled = true;    // включаем таймер
Button1->Caption = "Стоп"; // переименовываем кнопку
Button2->Enabled = false;  // закрываем доступ к кнопке сброса
MaskEdit1->Enabled = false; // и к вводу времени
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
// Кнопка сбрасывания значения
secs = 0; // обнуляем секунды
MaskEdit1->Text = "00:00:00"; // начальное значение MaskEdit1
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
// исполнение таймера
secs--;         // отнимаем секунду от общего времени
MaskEdit1->Text = SecToStr(secs); // отображаем остаток времени
if((secs < 5)&&(secs>0)) Beep(1000,100); // пятисекундное оповещение

if(secs <= 0) // если времени не осталось, то
{
Beep(1000,800);
Button1Click(0); // останавливаем таймер
Button2Click(0); // сбрасываем значения
MediaPlayer1->Play(); // проигрываем мелодию
}
}
//---------------------------------------------------------------------------
RusGim вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
играть сначала 1.wav потом 2.wav mma Мультимедиа в Delphi 9 23.12.2010 20:04
Вопрос про Свойство Visible и про иконки в imagelist Kappi4 Компоненты Delphi 2 21.05.2010 13:10
Конвертация аудиофайлов WAV -> WAV namestnik Помощь студентам 2 27.05.2009 23:05
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
У меня вопрос про базы данных,а точнее про таблицы!!! Alexij Общие вопросы Delphi 1 13.04.2008 23:24