📄 shortsmsactiveimpl1.pas
字号:
//发送短信结果没有返回,可能与模块的连接终止
begin
Result:= -6; //发送短信结果没有返回,可能与模块的连接终止
end;
end;
IfExecCmd:= False;
except
Result:= -1;
IfExecCmd:= False;
end;
end;
end;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来从SIM卡中读出指定的短信息内容
//函数名:ReadInfo
//参 数:1、Index: 索引
// 2、HandNum: WideString 发送方手机号码
// 3、Info:WideString 读出的短信息内容
// 4、SendTime: WideString 接收到的发送时间
//返回值:Shortint
// 0:读短信成功
// -1:读短信失败
// -2:模块忙
// -3:短信索引不能小于1
// -4:设置短信模式失败
// -5:短短信失败,并且可能需要重新设置短信模式
// -6:读短信结果没有返回,可能与模块的连接终止
//作 者:卞伟 2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.ReadInfo(Index: Word; var HandNum, Info,
SendTime: WideString): Smallint;
var
OutData: string;
OKNum: Integer;
CMGRNum: Integer;
ATNum,ErrNum: Integer;
StartTime: TDateTime;
MsgInfo: WideString;
TempHandNum,TempInfo,TempSendTime: string;
begin
Result:= 0;
if IfExecCmd then
begin
//模块忙
Result:= -2;
Exit;
end;
if Index < 1 then
begin
//短信索引不能小于1
Result:= -3;
Exit;
end;
if SetModemCMGF(0) < 0 then
begin
//设置接收模式失败
Result:= -4;
IfExecCmd:= False;
Exit;
end;
try
IfExecCmd:= True;
OutData:= 'AT+CMGR=' + IntToStr(Index) + #13 + #10;
if Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
begin
StartTime:= Now();
while Now() <= StartTime + 30 * (1/24/60/60) do
begin
DoEvents;
ATNum:= Pos('AT+CMGR=',ReceiveData);
OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
CMGRNum:= Postion(#13 + #10 + '+CMGR: ',ReceiveData,ATNum) + ATNum;
ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;
if (CMGRNum > ATNum) and (OKNum > CMGRNum) then
begin
//读短信成功
MsgInfo:= MidBStr(ReceiveData,CMGRNum,OKNum - CMGRNum + 4);
Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
SMSDecode(MsgInfo,TempHandNum,TempInfo,TempSendTime);
HandNum:= TempHandNum;
Info:= TempInfo;
SendTime:= TempSendTime;
if Pos(RightBStr('000' + IntToStr(Index),3),CMTIIndex) > 0 then
Delete(CMTIIndex,Pos(RightBStr('000' + IntToStr(Index),3),CMTIIndex),3);
IfExecCmd:= False;
Result:= 0;
Exit;
end;
if ErrNum > ATNum then
begin
//读短信失败
Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
Result:= -5;
IfExecCmd:= False;
Exit;
end;
Result:= -6;
end;
IfExecCmd:= False;
Exit;
end
else
begin
Result:= -1;
IfExecCmd:= False;
Exit;
end;
except
Result:= -1;
IfExecCmd:= False;
Exit;
end;
end;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来从SIM卡中读出接收到的新短信息
//函数名:ReadNewInfo
//参 数:1、HandNum: WideString 发送方手机号码
// 2、Info:WideString 读出的短信息内容
// 3、SendTime: WideString 接收到的发送时间
//返回值:Shortint
// >0:返回信息的索引号
// 0:读短信成功
// -1:读短信失败
// -2:模块忙
// -3:短信索引不能小于1
// -4:设置短信模式失败
// -5:短短信失败,并且可能需要重新设置短信模式
// -6:读短信结果没有返回,可能与模块的连接终止
//作 者:卞伟 2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.ReadNewInfo(var HandNum, Info,
SendTime: WideString): Smallint;
var
TempIndex: Byte;
Resu: ShortInt;
begin
if Length(CMTIIndex) <= 0 then
begin
Result:= 0;
Exit;
end;
try
TempIndex:= StrToInt(LeftBStr(CMTIIndex,3));
Resu:= ReadInfo(TempIndex,HandNum,Info,SendTime);
if Resu>= 0 then
Result:= TempIndex
else
Result:= Resu;
except
Result:= -1;
end;
end;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来把SIM卡中的短信删除掉
//函数名:DelInfo
//参 数:1、Index: 索引
//返回值:Shortint
// 0:删除短信成功
// -1:删除短信失败
// -2:模块忙
// -3:短信索引不能小于1
// -4:删除短信失败,并且可能需要重新设置短信模式
// -5:删除短信结果没有返回,可能与模块的连接终止
//作 者:卞伟 2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.DelInfo(Index: Word): Smallint;
var
OutData: string;
OKNum,ATNum: Integer;
StartTime: TDateTime;
ErrNum: Integer;
begin
Result:= 0;
if IfExecCmd then
begin
Result:= -2;
Exit;
end;
if Index < 1 then
begin
Result:= -3;
Exit;
End;
OutData:= 'AT+CMGD=' + IntToStr(Index) + #13 + #10;
if Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
begin
StartTime:= Now();
while Now() <= StartTime + 6 * (1/24/60/60) do
begin
DoEvents;
ATNum:= Pos('AT+CMGD='+ IntToStr(Index),ReceiveData);
OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;
if OKNum > ATNum then
begin
Result:= 0;
Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
IfExecCmd:= False;
Exit;
end
else if (ErrNum > ATNum) then
begin
Result:= -1;
Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
IfExecCmd:= False;
Exit;
end
else
Result:= -5;
end;
IfExecCmd:= False;
end
else
begin
IfExecCmd:= False;
Result:= -1;
end;
end;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来得到模块的生产序号
//函数名:GetModemIMEINO
//参 数:无
//返回值:WideString
// 成功返回生产序号
// 失败返回空值
//作 者:卞伟 2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.GetModemIMEINO: WideString;
var
OutData: string;
OKNum,ATNum: Integer;
ErrNum: Integer;
StartTime: TDateTime;
begin
if IfExecCmd then
Exit;
OutData:= 'AT+CGSN' + Chr(13) + Chr(10);
if not Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
Exit;
StartTime:= Now();
while Now() <= StartTime + 1 * (1/24/60/60) do
begin
DoEvents;
ATNum:= Pos('AT+CGSN',ReceiveData);
OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;
if OKNum > ATNum then
begin
Result:= Trim(MidBStr(ReceiveData,ATNum + 7,OKnum - ATNum - 7));
Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
IfExecCmd:= False;
Exit;
end;
if ErrNum > ATNum then
begin
Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
IfExecCmd:= False;
Exit;
end;
end;
end;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来恢复模块的默认设置
//函数名:SetModemATZ
//参 数:无
//返回值:ShortInt
// 0:成功
// -1:失败
// -2:模块忙
// -3:没有返回成功或失败标志
//作 者:卞伟 2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SetModemATZ: Smallint;
var
OutData: string;
OKNum,ATNum: Integer;
ErrNum: Integer;
StartTime: TDateTime;
begin
if IfExecCmd then
begin
Result:= -2;
Exit;
end;
OutData:= 'ATZ' + Chr(13) + Chr(10);
if not Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
begin
Result:= -1;
Exit;
end;
StartTime:= Now();
while Now() <= StartTime + 1 * (1/24/60/60) do
begin
DoEvents;
ATNum:= Pos('ATZ',ReceiveData);
OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;
if OKNum > ATNum then
begin
Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
Result:= 0;
IfExecCmd:= False;
Exit;
end;
if ErrNum > ATNum then
begin
Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
Result:= -1;
IfExecCmd:= False;
Exit;
end;
Result:= -3;
end;
end;
/////////////////////////////////////////////////////////////
//说 明:此函数是用来设置新信息来到时的提示方式
//函数名:SetModemCNMI
//参 数:无
//返回值:ShortInt
// 0:成功
// -1:失败
// -2:模块忙
// -3:没有返回成功或失败标志
//作 者:卞伟 2003年6月
/////////////////////////////////////////////////////////////
function TShortSMSActiveX.SetModemCNMI: Smallint;
var
OutData: string;
OKNum,ATNum: Integer;
ErrNum: Integer;
StartTime: TDateTime;
begin
if IfExecCmd then
begin
Result:= -2;
Exit;
end;
OutData:= 'AT+CNMI=2,1,0,0,1' + Chr(13) + Chr(10);
if not Comm1.WriteCommData(PChar(OutData),Length(PChar(OutData))) then
begin
Result:= -1;
Exit;
end;
StartTime:= Now();
while Now() <= StartTime + 2 * (1/24/60/60) do
begin
DoEvents;
ATNum:= Pos('AT+CNMI=2,1,0,0,1',ReceiveData);
OKNum:= Postion(#13 + #10 + 'OK' + #13 + #10,ReceiveData,ATNum) + ATNum;
ErrNum:= Postion(#13 + #10 + 'ERROR' + #13 + #10,ReceiveData,ATNum) + ATNum;
if OKNum > ATNum then
begin
Delete(ReceiveData,ATNum,OKNum - ATNum + 6);
Result:= 0;
IfExecCmd:= False;
Exit;
end;
if ErrNum > ATNum then
begin
Delete(ReceiveData,ATNum,ErrNum - ATNum + 9);
Result:= -1;
IfExecCmd:= False;
Exit;
end;
Result:= -3;
end;
end;
procedure TShortSMSActiveX.ActiveFormCreate(Sender: TObject);
begin
Image1.Width:= 32;
Image1.Height:= 32;
Width:= 32;
Height:= 32;
end;
initialization
TActiveFormFactory.Create(
ComServer,
TActiveFormControl,
TShortSMSActiveX,
Class_ShortSMSActiveX,
1,
'',
// OLEMISC_SIMPLEFRAME or OLEMISC_ACTSLIKELABEL,
OLEMISC_INVISIBLEATRUNTIME or OLEMISC_ACTSLIKELABEL,// or OLEMISC_SIMPLEFRAME,
tmApartment);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -