⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitmain.pas

📁 自动语音应答系统
💻 PAS
📖 第 1 页 / 共 2 页
字号:
                  Show;
               end;
               MMWaveFile1.Wave.OnProgress := CvtProgressCB;
               MMWaveFile1.Wave.ConvertFile(MMWaveOpenDialog1.FileName+'.wav', FmtDialog.PWaveFormat);

            finally
               FormCvtProgress.Close;
            end;
            MMWaveFile1.Wave.FreeWave;
            MMWaveFile1.Wave.FileName:=MMWaveOpenDialog1.FileName;            
            if fileexists(MMWaveOpenDialog1.FileName+'.wav') then
            begin
               renamefile(MMWaveOpenDialog1.FileName,MMWaveOpenDialog1.FileName+'.bak');
               renamefile(MMWaveOpenDialog1.FileName+'.wav',MMWaveOpenDialog1.FileName);
               MessageDlg('转换成功!原文件改名为.bak',mtInformation, [mbOk], 0);
            end
            else MessageDlg('转换错误!',mtInformation, [mbOk], 0);
         except
            MessageDlg('转换错误!',mtError, [mbOk], 0);
         end;
      end;
      Refresh;
end;

{-- TMainForm ------------------------------------------------------------}
procedure TFormMain.ConvertACM;
begin  
      MMACM1.EnumFormats := efConvert;
      if MMACM1.ChooseFormat(MMWaveFile1.Wave.PWaveFormat,'选择目标格式') then
      begin
         try
            with FormCvtProgress do
            begin
               Gauge1.Progress := 0;
               BringToFront;
               Show;
            end;
            MMWaveFile1.Wave.OnProgress := CvtProgressCB;
            MMACM1.ConvertFile(MMWaveOpenDialog1.FileName+'.wav');
         finally
            FormCvtProgress.Close;
         end;
         MMWaveFile1.Wave.FreeWave;
         if fileexists(MMWaveOpenDialog1.FileName+'.wav') then
         begin
            renamefile(MMWaveOpenDialog1.FileName,MMWaveOpenDialog1.FileName+'.bak');
            renamefile(MMWaveOpenDialog1.FileName+'.wav',MMWaveOpenDialog1.FileName);
            MessageDlg('转换成功!原文件改名为.bak',mtInformation, [mbOk], 0);
         end
         else MessageDlg('转换错误!',mtInformation, [mbOk], 0);
      end;
      Refresh;
end;

procedure TFormMain.ApdTapiDevice1TapiDTMF(CP: TObject; Digit: Char;
  ErrorCode: Integer);
var
   i:integer;
   s:string;
begin
  if (Digit = '') or (Digit = ' ') then Exit;
  case Digit of
  '1'..'9': i:=ord(Digit)-$30;
  '0': i:=ord(Digit)-$20;
  '*': i:=11;
  '#': i:=12;
  else exit;
  end;
  s:=trim(lowercase(FormKeyboard.edit[i].text));
  if s='' then exit;
  if (pos('.com ',s)<>0)or(pos('.com"',s)<>0)or
     (pos('.exe ',s)<>0)or(pos('.exe"',s)<>0)then
     WinExec(pchar(s),SW_SHOWNORMAL)
  else
     ShellExecute(handle,nil,pchar(s),nil,nil,sw_shownormal);
end;

procedure TFormMain.CheckBox2Click(Sender: TObject);
begin
  Button7.Enabled:=CheckBox2.checked;
  if CheckBox2.Checked then
  begin
     if not ApdTapiDevice1.EnableVoice then
     begin
        MessageDlg('没有选择正确的猫.', mtInformation, [mbOk], 0);
     end
     else begin
       try
          ApdTapiDevice1.OnTapiFail:=nil;
          screen.Cursor:=crHourGlass;
          Caller:=false;
          CurrentState := StateAnswer;
          ApdTapiDevice1.AutoAnswer;
          Label4.Caption := '正在侦听';
       finally
          screen.Cursor:=crDefault;
          wait(1000); //等1秒
          ApdTapiDevice1.OnTapiFail:=ApdTapiDevice1TapiFail;
       end;
     end;
  end
  else begin
     try
        ApdTapiDevice1.OnTapiFail:=nil;
        ApdTapiDevice1.CancelCall;
        Label4.Caption := '已经断开';
     finally
        while ApdTapiDevice1.TapiState <> tsIdle do  Application.ProcessMessages;
        wait(1000); //等1秒
        ApdTapiDevice1.OnTapiFail:=ApdTapiDevice1TapiFail;
     end;
  end;
  if CheckBox2.Checked then reg.writeinteger('AutoAnswer',1)
  else reg.writeinteger('AutoAnswer',0);
end;

procedure TFormMain.FormShow(Sender: TObject);
begin
   Timer1Busy:=false;
   files:=0;
   WaveFileDir := ExtractFilePath(ParamStr(0));
   SelectDevice_My(ApdTapiDevice1,false,regpath);
   ApdTapiDevice1.EnableVoice := True;

   if (reg.valueexists('Speeker'))and(reg.readinteger('Speeker')=1)then Monitor.Checked:=true
   else Monitor.Checked:=false;
   if (reg.valueexists('AnswerRecord'))and(reg.readinteger('AnswerRecord')=1)then CheckBox1.Checked:=true
   else CheckBox1.Checked:=false;
   if (reg.valueexists('AnswerOnRing')) then edit2.text:=reg.readstring('AnswerOnRing');
   if (reg.valueexists('AutoAnswer'))and(reg.readinteger('AutoAnswer')=1)then CheckBox2.Checked:=true
   else CheckBox2.Checked:=false;
   if (reg.valueexists('InGreet')) then combobox1.text:=reg.readstring('InGreet');
   if (reg.valueexists('OutGreet')) then combobox2.text:=reg.readstring('OutGreet');
   if (reg.valueexists('AnswerRecordTime')) then MaxLengthEdit.text:=reg.readstring('AnswerRecordTime');
   if (reg.valueexists('CallerID')) then CallerID.text:=reg.readstring('CallerID');

   ApdTapiDevice1.MonitorRecording := Monitor.Checked;
   CheckBox2Click(Sender);
end;

procedure TFormMain.Button8Click(Sender: TObject);
begin
   callerid.text:=',';
   Button6Click(Sender);   
end;

procedure TFormMain.MonitorClick(Sender: TObject);
begin
   ApdTapiDevice1.MonitorRecording := Monitor.Checked;
   if Monitor.Checked then reg.writeinteger('Speeker',1)
   else reg.writeinteger('Speeker',0);
end;

procedure TFormMain.Label3Click(Sender: TObject);
begin
   ShellExecute(handle,nil,pchar(label3.caption),nil,nil,sw_shownormal);
end;

procedure TFormMain.Label10Click(Sender: TObject);
begin
   ShellExecute(handle,nil,pchar('mailto:'+label10.caption),nil,nil,sw_shownormal);
end;

procedure TFormMain.Timer1Timer(Sender: TObject);
begin
   timer1.enabled:=false;
   if Timer1Busy then exit; //如果“正忙”,则退出
   Timer1Busy:=true;   //设置“正忙”
   while ApdTapiDevice1.TapiState <> tsIdle do Application.ProcessMessages;
   CurrentState := StateIdle;
   CheckBox2Click(Sender);
   Timer1Busy:=false;  //取消“正忙”
end;

procedure TFormMain.ApdTapiDevice1TapiStatus(CP: TObject; First,
  Last: Boolean; Device, Message, Param1, Param2, Param3: Cardinal);
{注意:APRO4.x中最好把此两行改成以下
procedure TFormMain.ApdTapiDevice1TapiStatus(CP: TObject; First,
  Last: Boolean; Device, Message, Param1, Param2, Param3: longint); }
var
   s:string;
begin
  if (Message=LINE_CALLSTATE)and(Param1=LINECALLSTATE_OFFERING)and(trim(FormRingDetect.ComboBox1.text)<>'') then
  begin 
     label14.Caption:='铃音';
     s:=trim(lowercase(FormRingDetect.combobox1.text));
     if s='' then exit;
     if (pos('.com ',s)<>0)or(pos('.com"',s)<>0)or
        (pos('.exe ',s)<>0)or(pos('.exe"',s)<>0)then
        WinExec(pchar(s),SW_SHOWNORMAL)
     else 
        ShellExecute(handle,nil,pchar(s),nil,nil,sw_shownormal);
  end;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin 
   FormPhoneBook.ShowModal;
   if FormPhoneBook.Edit2.text<>'' then
   begin
      CallerID.text:=FormPhoneBook.Edit2.text;
   end;
end;

procedure TFormMain.CallerIDChange(Sender: TObject);
var
   slist:TStringList;
   i:integer;
begin
   CallerID.text:=trim(CallerID.text);
   reg.writestring('CallerID',CallerID.text);
   slist:=Tstringlist.create;
   try
      slist.LoadFromFile(WaveFileDir+'PhoneBook2.Dat');
      i:=slist.IndexOf(CallerID.text);
      if i<>-1 then
      begin
         slist.LoadFromFile(WaveFileDir+'PhoneBook1.Dat');
         CallerIDName.text:=slist.strings[i];
      end;
   except
      MessageDlg('电话号码薄错误.', mtInformation, [mbOk], 0);
   end;
   slist.free;
end;

procedure TFormMain.Button10Click(Sender: TObject);
begin
   files:=0;
   Button10.caption:=inttostr(files)+'个录音';
   FormPlay.ShowModal;
end;

procedure TFormMain.Button7Click(Sender: TObject);
var
   i:integer;
   time:dword;
begin
   Label14.caption:='';
   Button6.Enabled:=false;
   Button8.Enabled:=false;
   Button7.Enabled:=false;
   i:=ApdTapiDevice1.AnswerOnRing;
   ApdTapiDevice1.AnswerOnRing:=1; 
   time:=gettickcount;
   while gettickcount-time<3000 do application.ProcessMessages;
   ApdTapiDevice1.AnswerOnRing:=i;
   Button6.Enabled:=true;
   Button8.Enabled:=true;
   Button7.Enabled:=CheckBox2.checked;
end;

procedure TFormMain.Edit2Change(Sender: TObject);
var
   i:integer;
begin
   i:=strtointdef(edit2.text,0);
   if edit2.text<>inttostr(i) then edit2.text:=inttostr(i);
   ApdTapiDevice1.AnswerOnRing:=i;

   reg.writestring('AnswerOnRing',Edit2.text);
end;

procedure TFormMain.CvtProgressCB(Sender: TObject; CurByte, NumBytes: Longint;
                                  Var Cancel: Boolean);
begin 
     with FormCvtProgress do
     begin
        Gauge1.Progress := Round((CurByte * 100.0) / NumBytes+0.5);
     end;
     Cancel := FormCvtProgress.Cancel;
end;

procedure TFormMain.ApdTapiDevice1TapiWaveSilence(CP: TObject;
  var StopRecording, Hangup: Boolean);
begin
   Label14.caption:='无音';
end;

procedure TFormMain.ApdTapiDevice1TapiWaveBusy(CP: TObject;
  var StopRecording, Hangup: Boolean);
begin
   Label14.caption:='忙音或对方已挂机';
end;

procedure TFormMain.ApdTapiDevice1TapiWaveRingback(CP: TObject;
  var RingbackTimes: Integer; var StopRecording, Hangup: Boolean);
var
   i:integer;
begin
   Label14.caption:='回铃音';
   for i:=1 to RingBackTimes do Label14.caption:=Label14.caption+'.';
   if (RingbackTimes>=5) then
   begin
      StopRecording:=true;
      Hangup:=true;
   end
   else if (RingbackTimes<=0) then
   begin
      Label14.caption:='';
      if fileexists(combobox2.text) then
      begin
         RecordNextFile:=true;
         ApdTapiDevice1.StopWaveRecord;
      end
      else Label4.Caption := '正在录音';
   end;
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
   reg:=Tregistry.create;
   reg.rootkey:=HKEY_LOCAL_MACHINE;
   reg.openkey(regpath,true);
end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   Button9Click(Sender);
   ApdTapiDevice1.OnTapiFail:=Nil;
   timer1.Enabled:=false;
   reg.closekey;
   reg.free;
end;

procedure TFormMain.Button3Click(Sender: TObject);
begin
   FormKeyboard.ShowModal;
end;

procedure TFormMain.Button5Click(Sender: TObject);
begin
   FormAbout.ShowModal;
end;

procedure TFormMain.Button41Click(Sender: TObject);
begin
   if MMWaveOpenDialog1.Execute then
   begin
      combobox1.text:=MMWaveOpenDialog1.FileName;
      ComboBox1Change(Sender);
      if MessageDlg('选择的wav文件必须是您的声卡所支持的格式,一般是16位8000赫单声PCM,需要转换吗?', mtInformation, [mbyes,mbno], 0)=mrno then exit;
      MMWaveFile1.Wave.FileName:='';
      MMWaveFile1.Wave.FileName:=MMWaveOpenDialog1.FileName;
      if MMACM1.ACMPresent and (MMACM1.NumConverters > 0) then ConvertACM
      else ConvertPCM;
   end;
end;

procedure TFormMain.Button11Click(Sender: TObject);
begin
   if MMWaveOpenDialog1.Execute then
   begin
      combobox2.text:=MMWaveOpenDialog1.FileName;
      ComboBox2Change(Sender);
      if MessageDlg('选择的wav文件必须是您的声卡所支持的格式,一般是16位8000赫单声PCM,需要转换吗?', mtInformation, [mbyes,mbno], 0)=mrno then exit;
      MMWaveFile1.Wave.FileName:='';
      MMWaveFile1.Wave.FileName:=MMWaveOpenDialog1.FileName;
      if MMACM1.ACMPresent and (MMACM1.NumConverters > 0) then ConvertACM
      else ConvertPCM;
   end;
end;

procedure TFormMain.ComboBox1Change(Sender: TObject);
begin
   reg.writestring('InGreet',combobox1.text);
end;

procedure TFormMain.ComboBox2Change(Sender: TObject);
begin
   reg.writestring('OutGreet',combobox2.text);
end;

procedure TFormMain.ComboBox1Exit(Sender: TObject);
begin
   ComboBox1Change(Sender);
end;

procedure TFormMain.ComboBox2Exit(Sender: TObject);
begin
   ComboBox2Change(Sender);
end;

procedure TFormMain.Button4Click(Sender: TObject);
begin
   FormRingDetect.ShowModal;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -