procedure TMainForm.selectclassmateClick(Sender: Tobject);
begin
MainForm.Table1.Active:=False;
MainForm.Table1.TableName:=sAppDir+‘workphone.db’;
MainForm.Caption:=‘自动拨号——工作电话’;
MainForm.Table1.Active:=True;
end;
将TDBGrid的Options属性中的dgEditing设为True,允许用户直接修改表中的内容。在弹出菜单中定义DialPhone和DeleteRecord分别用于拨打电话号码和删除当前记录。下面主要介绍拨打电话的TAPI应用部分。电话号码是通过 MainForm.Table1.Fields.Fields[0].AsString作为字符串来传递的。
实现的代码部分如下,其中为了文章不会太长笔者省去了不必要的错误提示和部分代码。
变量定义
lineApp:THLineApp;//TAPI应用句柄
line:THLine;//线路句柄
call:THCall;//呼叫句柄
CallParams:TLineCallParams;//呼叫参数
nDevs,tapiVersion,errorcode:Longint;//线路设备数、TAPI版本号、错误代码
extid:TLineExtensionID;//TAPI扩展版本号
lineIcon:HICON;//线路设备图标
过程定义
procedure lineCallback(hDevice, dwMsg, dwCallbackInstance,
dwParam1, dwParam2, dwParam3: LongInt);//异步呼叫返回处理函数
{$IFDEF WIN32}
stdcall;
{$ELSE}
export;
{$ENDIF}
var
hCall: THCall;
begin
if dwMsg = LINE_REPLY then { LineMakeCall的响应结果}
if dwParam2 < 0 then {呼叫响应错误处理};
else if dwMsg = LINE_CALLSTATE then { 呼叫状态信息 }
begin
hCall := THCall(hDevice); //类型转换 THCall为LongInt类型
case dwParam1 of
LINECALLSTATE_IDLE: {呼叫无效处理}
if hcall <> 0 then
begin
lineDeallocateCall(hCall);
end;
LINECALLSTATE_PROCEEDING:{呼叫正常处理}
LINECALLSTATE_DIALTONE:{检测到拨号音}
LINECALLSTATE_DIALING: {正在拨号}
LINECALLSTATE_DISCONNECTED:{连接已断开}
begin{断开原因}
if dwParam2=LINEDISCONNECTMODE_NORMAL then{正常断开}
else if dwParam2=LINEDISCONNECTMODE_BUSY then {线路忙}
LINECALLSTATE_BUSY:{线路忙处理}
end;
end;
procedure TDialForm.(dialnumber:string);//dialnumber为电话号码字符串
begin
with CallParams do {CallParams的类型参考VC中的定义,将DWORD改为LongInt}
begin
dwTotalSize := sizeof(CallParams);
dwBearerMode := LINEBEARERMODE_VOICE;//承载模式为语音
dwMediaMode:=LINEMEDIAMODE_INTERACTIV
EVOICE;//媒体模式为交互式语音
end;
if lineInitialize(lineApp,Hinstance,lineCallBack,nil,nDevs)<0
then //线路不能初始化处理
else
if nDevs=0 then //无TAPI线路设备
begin
lineShutDown(lineApp);
lineApp:=0;
end
else
if lineNegotiateAPIVersion(lineApp,0,$00010004,$00020000,
tapiVersion,extid)<0 //协商TAPI版本号 TAPI1.4~TAPI2.0
then begin {TAPI版本不兼容}
lineShutDown(lineApp);
lineApp:=0;
end
else
errorcode:=lineOpen(lineApp,LINEMAPPER,line,tapiVersion,0,0,
LINECALLPRIVILEGE_NONE,LINEMEDIAMODE_
INTERACTIVEVOICE,@CallParams);//打开线路
if errorcode<0 then {线路不能打开}
else
begin{线路打开成功}
lineConfigDialog(0,Self.Handle,nil); //显示线路设备属性
lineGetIcon(0,`tapi/line`,lineIcon);
//lineIcon为线路设备图标句柄,可以赋值给TICON.Handle
if lineMakeCall(line,call,Pchar(dialnumber),0,@CallParams)<0 then{呼叫失败处理}
else
lineHandOff(call,`电话拨号程序`,LINEMEDIAMODE_INTERACTIVEVOICE);
//在程序中应当以按钮来触发lineHandOff,从TAPI控制转为人工控制电话
end;
end;
以上代码由于脱离了实际的程序显得有些凌乱,相信对delphi编程稍有了解的朋友很容易看懂。本程序运行后的效果是,首先出现一个数据库表格,用右键打开一个通讯录库文件,右键选择拨号弹出对话框显示线路处理的状态,在拨完号之后提示用户是否拿起听筒进行对话。整个过程类似系统自带的电话拨号程序,不过笔者介绍的TAPI方法可以让我们编写更多的功能和更友好的界面。今后笔者将针对TAPI编程进行深入的介绍,希望能对不太了解TAPI的朋友在开发程序时起到帮助。