📄 main.pas
字号:
unit main;
interface
uses
WinTypes,
WinProcs,
Messages,
SysUtils,
Classes,
Graphics,
Controls,
Forms,
Dialogs,
StdCtrls,
ExtCtrls,
Menus,
AdTapi,
AdPort, OoMisc, ComCtrls, DB, DBTables, DBCtrls, Grids, DBGrids, Mask,
Buttons,variants,tapi;
const
State_Idle = 0; //空闲
state_s_greet = 1; //播放问候语的状态
State_s_Input = 2; //
state_s_inputwrong = 3; //
state_s_bye = 4; //
state_s_reply1 = 5; //
state_s_reply2 = 6; //
state_s_mark = 7;
state_s_over = 8;
type
TfrmMain = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Label1: TLabel;
Label2: TLabel;
CallerID: TEdit;
CallerIDName: TEdit;
TAPIButton: TButton;
AnswerButton: TButton;
CancelCall: TButton;
CallsListBox: TListBox;
Monitor: TCheckBox;
GroupBox1: TGroupBox;
lbStatus: TLabel;
ApdComPort1: TApdComPort;
ApdTapiDevice1: TApdTapiDevice;
Label6: TLabel;
AnswerOnRingEdit: TEdit;
DataSource1: TDataSource;
Table1: TTable;
SaveLogButton: TButton;
ClearLogButton: TButton;
Query1: TQuery;
GroupBox2: TGroupBox;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
GroupBox3: TGroupBox;
Label3: TLabel;
Label9: TLabel;
edtSearch: TEdit;
btnSearch: TButton;
btnMasterLogin: TButton;
Label8: TLabel;
btnMasterSearch: TButton;
Shape1: TShape;
Database1: TDatabase;
DataSource2: TDataSource;
DBEdit1: TDBEdit;
rdgrpSearch: TRadioGroup;
edtIDSearch: TEdit;
edtedtNameSearch: TEdit;
Query2: TQuery;
Timer1: TTimer;
Label11: TLabel;
edtWaitTime: TEdit;
Timer2: TTimer;
Database2: TDatabase;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure TAPIButtonClick(Sender: TObject);
procedure AnswerButtonClick(Sender: TObject);
procedure CancelCallClick(Sender: TObject);
procedure ApdTapiDevice1TapiConnect(Sender: TObject);
procedure ApdTapiDevice1TapiWaveNotify(CP: TObject; Msg: TWaveMessage);
procedure ApdTapiDevice1TapiCallerID(CP: TObject; ID, IDName: String);
procedure MaxLengthEditExit(Sender: TObject);
procedure Delete1Click(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure MonitorClick(Sender: TObject);
procedure ApdTapiDevice1TapiDTMF(CP: TObject; Digit: Char;
ErrorCode: Integer);
procedure AnswerOnRingEditExit(Sender: TObject);
procedure btnMasterLoginClick(Sender: TObject);
procedure Table1BeforeOpen(DataSet: TDataSet);
procedure btnMasterSearchClick(Sender: TObject);
procedure btnSearchClick(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure edtSearchExit(Sender: TObject);
procedure edtWaitTimeEnter(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Table1AfterClose(DataSet: TDataSet);
procedure Table1AfterOpen(DataSet: TDataSet);
procedure ClearLogButtonClick(Sender: TObject);
procedure SaveLogButtonClick(Sender: TObject);
private
{ Private declarations }
WaveFileDir : String; //
CallCount : Integer; //应答的电话数目
CurrentState : Integer; //当前的状态
MasterLogin:Boolean;
arID: array[1..6] of Integer;
IDCount:Integer;
IDCountAll:Integer;
arSCore:array[1..2] of Integer;
SCCount:Integer;
AnswerTime:Integer;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.DFM}
// 初始化
procedure TfrmMain.FormCreate(Sender: TObject);
var
tmpStr:String;
begin
tmpStr:='请确定已经开启数据库interbase'+chr(13)+chr(10);
tmpStr:=tmpStr+'并打开了数据库文件SCOREDATA.GDB'+chr(13)+chr(10);
tmpStr:=tmpStr+'使用可查询用户users,密码111'+chr(13)+chr(10);
tmpStr:=tmpStr+'修改成绩需要使用管理用户SYSDBA,密码masterkey';
showmessage(tmpStr);
MasterLogin:=False;
WaveFileDir := ExtractFilePath(ParamStr(0));
CallCount := 0;
CurrentState:=State_Idle;
ApdTapiDevice1.MonitorRecording := Monitor.Checked;
TAPIButtonClick(Sender);
AnswerButtonClick(Sender);
end;
//选择Modem,需在自动应答前设置
procedure TfrmMain.TAPIButtonClick(Sender: TObject);
begin
//使用语音功能的Modem,且能够检测DTMF键
ApdTapiDevice1.SelectDevice;
ApdTapiDevice1.EnableVoice := True;
end;
//自动响应,需要设置好Modem
procedure TfrmMain.AnswerButtonClick(Sender: TObject);
begin
if ApdTapiDevice1.EnableVoice then
begin
ApdTapiDevice1.AutoAnswer;
shape1.Brush.Color:=clGreen;
lbStatus.Caption :='等待来电';
end
else
MessageDlg('所选的设备不支持声卡扩声', mtInformation, [mbOk], 0);
end;
//清空当前的来电显示
procedure TfrmMain.CancelCallClick(Sender: TObject);
begin
ApdTapiDevice1.CancelCall;
shape1.Brush.Color:=clWhite;
lbStatus.Caption :='取消了自动应答';
CallerId.Text := '';
CallerIdName.Text := '';
end;
//连接成功事件的处理
procedure TfrmMain.ApdTapiDevice1TapiConnect(Sender: TObject);
var
FileName : String;
S : String;
Size : TSize;
Temp : array[0..255] of Char;
begin
inc(CallCount);
S := Format('%d. From: %s (%s) at %s', [CallCount,
CallerIdName.Text, CallerId.Text, DateTimeToStr(Now)]);
CallsListBox.Items.AddObject(S, TObject(CallCount));
//自动扩展日志列表
GetTextExtentPoint(
CallsListBox.Handle, StrPCopy(Temp, S), Length(S), Size);
if (Size.cx > CallsListBox.Width) then
PostMessage(CallsListBox.Handle,
LB_SETHORIZONTALEXTENT, Size.cx, 0);
lbStatus.Caption :='正在应答';
ApdTapiDevice1.UseSoundCard := False;
shape1.Brush.Color:=clOlive;
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\greet.wav');
CurrentState := state_s_greet;
IDCount:=0;
end;
//在播放和录制改变wave文件状态时的事件
procedure TfrmMain.ApdTapiDevice1TapiWaveNotify(CP: TObject;
Msg: TWaveMessage);
begin
case Msg of
waPlayClose :
case CurrentState of
state_s_greet:
begin
CurrentState := state_s_input;
IDCount:=0;
Timer1.Enabled :=True;
AnswerTime:=0;
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\input.wav');
Exit;
end;
state_s_inputwrong :
begin
inc(AnswerTime);
if AnswerTime>3 then
begin
currentstate:=state_s_bye;
Timer1.Enabled :=False;
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\bye.wav');
Exit;
end
else
begin
CurrentState :=state_s_input;
IDCount:=0;
Timer1.Enabled:=True;
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\reinput.wav');
Exit;
end
end;
state_s_reply1 :
begin
if IDCount>=IDCountAll then
begin
CurrentState := state_s_reply2;
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\reply2.wav');
Exit;
end
else
begin
inc(IDCount);
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\'+IntToStr(arID[IDCount])+'.wav');
Exit;
end;
end;
state_s_reply2 :
begin
case SCCount of
0://十位数
begin
inc(SCCount);
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\'+IntToStr(arScore[1])+'.wav');
Exit;
end;
1://"十"
begin
inc(SCCount);
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\10.wav');
Exit;
end;
2://个位数
begin
inc(SCCount);
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\'+IntToStr(arScore[2])+'.wav');
Exit;
end;
3://"分"
begin
CurrentState := state_s_mark;
//
ApdTapiDevice1.PlayWaveFile(WaveFileDir+'\sound\mark.wav');
Exit;
end;
end;
end;
state_s_mark :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -