www.pudn.com > telephonefordelphi.rar > UnitMain.pas


unit UnitMain; 
 
interface 
 
uses 
  WinTypes,shellapi, 
  WinProcs, 
  Messages, 
  SysUtils, 
  Classes, 
  Graphics, 
  Controls, 
  Forms, 
  Dialogs, 
  StdCtrls, 
  ExtCtrls,registry, 
  Menus,AdTapi, 
  AdTutil, 
  AdPort, OoMisc,AdTSel_My, AdTStat, MMHook, MMDesign, 
  MMObj, MMACMDlg, MMDSPObj, MMWave, MMCstDlg; 
 
const 
  RegPath='SOFTWARE\www\Telephone'; 
  CurrentState : Integer = 0; 
  StateGreeting          = 0; 
  StateRecording         = 1;   
  StateIdle              = 2; 
  StateBeeping           = 3; 
  StatePlayback          = 4; 
  StateDial              = 5; 
  StateDialing           = 6; 
  StateAnswer            = 7; 
type 
  TFormMain = class(TForm) 
    Label1: TLabel; 
    Label2: TLabel; 
    CallerID: TEdit; 
    CallerIDName: TEdit; 
    Button2: TButton; 
    Button9: TButton; 
    GroupBox1: TGroupBox; 
    Label4: TLabel; 
    Label5: TLabel; 
    MaxLengthEdit: TEdit; 
    Monitor: TCheckBox; 
    ApdComPort1: TApdComPort; 
    Button6: TButton; 
    Label6: TLabel; 
    Button41: TButton; 
    CheckBox1: TCheckBox; 
    CheckBox2: TCheckBox; 
    Edit2: TEdit; 
    Label7: TLabel; 
    Button8: TButton; 
    Label3: TLabel; 
    Label10: TLabel; 
    Label11: TLabel; 
    ApdTapiDevice1: TApdTapiDevice; 
    Timer1: TTimer; 
    Button1: TButton; 
    Button10: TButton; 
    ComboBox1: TComboBox; 
    Button7: TButton; 
    MMACM1: TMMACM; 
    MMDesigner1: TMMDesigner; 
    MMWaveFile1: TMMWaveFile; 
    MMWaveOpenDialog1: TMMWaveOpenDialog; 
    ApdTapiLog1: TApdTapiLog; 
    Label14: TLabel; 
    Button3: TButton; 
    Button5: TButton; 
    Button4: TButton; 
    Label8: TLabel; 
    ComboBox2: TComboBox; 
    Button11: TButton; 
    procedure CvtProgressCB(Sender: TObject; CurByte, NumBytes: Longint; 
         Var Cancel: Boolean); 
    procedure ConvertPCM; 
    procedure ConvertACM;     
    procedure Button2Click(Sender: TObject); 
    procedure Button9Click(Sender: TObject); 
    procedure ApdTapiDevice1TapiConnect(Sender: TObject); 
    procedure ApdTapiDevice1TapiWaveNotify(CP: TObject; Msg: TWaveMessage); 
    procedure ApdTapiDevice1TapiCallerID(CP: TObject; ID, IDName: String); 
    procedure MaxLengthEditExit(Sender: TObject); 
    procedure Button6Click(Sender: TObject); 
    procedure CheckBox1Click(Sender: TObject); 
    procedure ApdTapiDevice1TapiFail(Sender: TObject); 
    procedure Button41Click(Sender: TObject); 
    procedure ApdTapiDevice1TapiDTMF(CP: TObject; Digit: Char; 
      ErrorCode: Integer); 
    procedure CheckBox2Click(Sender: TObject); 
    procedure FormShow(Sender: TObject); 
    procedure Button8Click(Sender: TObject); 
    procedure MonitorClick(Sender: TObject); 
    procedure Label3Click(Sender: TObject); 
    procedure Label10Click(Sender: TObject); 
    procedure Timer1Timer(Sender: TObject); 
    procedure FormClose(Sender: TObject; var Action: TCloseAction); 
    procedure ApdTapiDevice1TapiStatus(CP: TObject; First, Last: Boolean; 
      Device, Message, Param1, Param2, Param3: Cardinal); 
   {注意:APRO4.x中最好把此两行改成以下 
   procedure ApdTapiDevice1TapiStatus(CP: TObject; First, 
       Last: Boolean; Device, Message, Param1, Param2, Param3: longint); } 
    procedure Button1Click(Sender: TObject); 
    procedure CallerIDChange(Sender: TObject); 
    procedure Button10Click(Sender: TObject); 
    procedure ComboBox1Change(Sender: TObject); 
    procedure Button7Click(Sender: TObject); 
    procedure Edit2Change(Sender: TObject); 
    procedure ApdTapiDevice1TapiWaveSilence(CP: TObject; var StopRecording, 
      Hangup: Boolean); 
    procedure ApdTapiDevice1TapiWaveRingback(CP: TObject; 
      var RingbackTimes: Integer; var StopRecording, Hangup: Boolean); 
    procedure ApdTapiDevice1TapiWaveBusy(CP: TObject; var StopRecording, 
      Hangup: Boolean); 
    procedure ComboBox1Exit(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Button3Click(Sender: TObject); 
    procedure Button5Click(Sender: TObject); 
    procedure Button11Click(Sender: TObject); 
    procedure ComboBox2Change(Sender: TObject); 
    procedure ComboBox2Exit(Sender: TObject); 
    procedure Button4Click(Sender: TObject); 
  private 
    { Private declarations } 
    RecordNextFile:boolean; 
    FileName : String; 
    files:integer; 
    caller:boolean; 
    Timer1Busy:boolean; //Timer1是否重新进入 
  public 
    Reg:TRegistry; 
    WaveFileDir : String; 
    { Public declarations } 
  end; 
 
var 
  FormMain: TFormMain; 
 
implementation 
 
uses UnitFmtDialog,UnitPlay, UnitCvtProgress, UnitPhoneBook, 
  UnitPhoneKeyboard, UnitRingDetect, UnitAbout; 
 
{$R *.DFM} 
procedure wait(msec:dword); 
var 
   t:DWORD; 
begin 
   t:=gettickcount; 
   while gettickcount-t tsIdle do  Application.ProcessMessages; 
         wait(1000); //等1秒 
         ApdTapiDevice1.OnTapiFail:=ApdTapiDevice1TapiFail; 
      end; 
      Label4.Caption := '已经断开'; 
      Button6.Enabled:=true; 
      Button8.Enabled:=true; 
      Button7.Enabled:=CheckBox2.checked; 
      timer1.enabled:=true; 
end; 
 
procedure TFormMain.ApdTapiDevice1TapiConnect(Sender: TObject); 
var 
  WaveFile:string; 
begin 
  if CurrentState = StateDial then 
  begin 
     Label4.Caption := '建立连接'; 
     CurrentState := StateDialing; 
     WaveFile:=WaveFileDir+'静音.wav'; 
     try 
        ApdTapiDevice1.PlayWaveFile(WaveFile); 
     except 
        MessageDlg('播放文件错误:'+WaveFile,mtInformation, [mbOk], 0); 
     end; 
  end 
  else if CurrentState = StateAnswer then 
  begin 
     CurrentState := StateGreeting; 
     Label4.Caption := '播放问候语'; 
     WaveFile:=combobox1.text; 
     if not fileexists(WaveFile) then WaveFile:=WaveFileDir+'静音.wav'; 
     try 
        ApdTapiDevice1.PlayWaveFile(WaveFile); 
     except 
        MessageDlg('播放文件错误:'+WaveFile,mtInformation, [mbOk], 0); 
     end; 
  end 
  else 
     caption:=inttostr(currentstate); 
end; 
 
procedure TFormMain.ApdTapiDevice1TapiWaveNotify(CP: TObject; 
  Msg: TWaveMessage); 
var 
  datetime : TDateTime; 
  year,month,day,hour,min,sec,msec : word; 
  max : integer; 
  sr : TSearchRec; 
begin 
  if (CurrentState = StateDialing)or(CurrentState = StateDial) then 
  begin 
    case Msg of 
    waPlayClose : 
       begin 
          ApdTapiDevice1.MaxMessageLength :=60*60; 
          try 
             ApdTapiDevice1.StartWaveRecord; 
             if RecordNextFile then //是否是第二个文件 
             begin 
                Label4.caption:='正在录音'; 
                RecordNextFile:=false; 
             end; 
          except 
          end; 
       end; 
    waDataReady: 
       begin 
          datetime:=now; 
          decodedate(datetime,year,month,day); 
          decodetime(datetime,hour,min,sec,msec); 
          if callerid.text=',' then 
             FileName := WaveFileDir+Format('%.2d-%.2d-%.2d %.2d:%.2d:%.2d',[year,month,day,hour,min,sec])+'录音.wav' 
          else FileName := WaveFileDir+Format('%.2d-%.2d-%.2d %.2d:%.2d:%.2d',[year,month,day,hour,min,sec])+'拨打'+callerid.text+'.wav'; 
          ApdTapiDevice1.SaveWaveFile(FileName, True); 
       end; 
    waRecordClose : 
       begin 
          if RecordNextFile then //是否播放第二个文件 
          begin 
             DeleteFile(FileName); 
             try 
                ApdTapiDevice1.PlayWaveFile(combobox2.text); //播放第二个文件 
                Label4.caption:='播放问候语'; 
             except 
                MessageDlg('播放文件错误:'+combobox2.text,mtInformation, [mbOk], 0); 
             end; 
          end 
          else begin //没有第二个播放文件 
             Button9Click(Self); 
             if findfirst(FileName,faAnyfile and not faDirectory,sr)=0 then 
             begin 
                if (sr.Size<=110*1024)or 
                   (pos('回铃音.....',Label14.caption)=1) then 
                   deletefile(FileName) 
                else begin 
                   inc(files); 
                   Button10.caption:=inttostr(files)+'个录音'; 
                end; 
             end; 
          end; 
       end; 
    end; 
  end 
  else begin 
    case Msg of 
    waPlayClose : 
      case CurrentState of 
      StateGreeting : 
          begin 
            CurrentState := StateBeeping; 
            try 
               ApdTapiDevice1.PlayWaveFile(WaveFileDir+'beep.wav'); 
            except 
                MessageDlg('播放文件错误:'+'beep.wav',mtInformation, [mbOk], 0); 
            end; 
          end; 
      StateBeeping : 
          begin 
            CurrentState := StateRecording; 
            if CheckBox1.Checked then max:=strtointdef(MaxLengthEdit.Text,60*60) 
            else max:=60*60; 
            ApdTapiDevice1.MaxMessageLength :=max; 
            try 
               ApdTapiDevice1.StartWaveRecord; 
               Label4.caption:='正在录音'; 
            except 
            end; 
          end; 
      end; 
    waDataReady : 
      begin 
        datetime:=now; 
        decodedate(datetime,year,month,day); 
        decodetime(datetime,hour,min,sec,msec); 
        if not caller then callerid.text:=''; 
        FileName := WaveFileDir+Format('%.2d-%.2d-%.2d %.2d:%.2d:%.2d',[year,month,day,hour,min,sec]) 
           +'接听'+callerid.text+'.wav'; 
        ApdTapiDevice1.SaveWaveFile(FileName, True);  
      end; 
    waRecordClose :  
       begin 
          Button9Click(Self); 
          inc(files);  
          Button10.caption:=inttostr(files)+'个录音'; 
       end; 
    end; 
  end; 
end; 
 
procedure TFormMain.ApdTapiDevice1TapiCallerID(CP: TObject; ID, 
  IDName: String); 
begin 
  CallerId.Text := ID; 
  CallerIdName.Text := IDName; 
  Caller:=true; 
end; 
 
procedure TFormMain.MaxLengthEditExit(Sender: TObject); 
begin 
   reg.writestring('AnswerRecordTime',MaxLengthEdit.text); 
end; 
 
procedure TFormMain.Button6Click(Sender: TObject); 
begin 
   Label14.caption:=''; 
   if not ApdTapiDevice1.EnableVoice then 
   begin 
      MessageDlg('没有选择正确的猫.', mtInformation, [mbOk], 0); 
      exit; 
   end; 
   callerid.text:=trim(callerid.text); 
   if callerid.text<>'' then 
   begin 
      try 
         ApdTapiDevice1.OnTapiFail:=nil; 
         ApdTapiDevice1.CancelCall; 
      finally 
         while ApdTapiDevice1.TapiState <> tsIdle do  Application.ProcessMessages; 
         wait(1000); //等1秒 
         ApdTapiDevice1.OnTapiFail:=ApdTapiDevice1TapiFail; 
      end; 
      Button6.Enabled:=false; 
      Button8.Enabled:=false; 
      Button7.Enabled:=false; 
      RecordNextFile:=false; //是否播放第二个文件 
      Label4.Caption := '正在拨号'; 
      CurrentState := StateDial; 
      ApdTapiDevice1.Dial(callerid.text); 
   end 
   else MessageDlg('请输入电话号码.', mtInformation, [mbOk], 0); 
end; 
 
procedure TFormMain.CheckBox1Click(Sender: TObject); 
begin 
   MaxLengthEdit.Enabled:=CheckBox1.Checked; 
   if CheckBox1.Checked then reg.writeinteger('AnswerRecord',1) 
   else reg.writeinteger('AnswerRecord',0); 
end; 
 
procedure TFormMain.ApdTapiDevice1TapiFail(Sender: TObject); 
begin   
  CurrentState := StateIdle; 
  Label4.Caption := '已经断开'; 
  Button6.Enabled:=true; 
  Button8.Enabled:=true; 
  Button7.Enabled:=CheckBox2.checked; 
  if CurrentState = StateAnswer then CheckBox2.checked:=false 
  else timer1.enabled:=true;   
end; 
 
procedure TFormMain.ConvertPCM; 
begin  
      FmtDialog.Wave := MMWaveFile1.Wave; 
      if (FmtDialog.ShowModal = mrOk) then 
      begin 
         try 
            try 
               with FormCvtProgress do 
               begin 
                  Gauge1.Progress := 0; 
                  BringToFront; 
                  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.