unit Msgsender;interfaceuses
Windows, SysUtils, Classes, Variants, Messages, Dialogs,
MSCommLib_TLB, ExtCtrls;Type
TMsgSender=Class(Tobject)
F_MSCOM:TMSComm;
F_Tm:TTimer;
procedure F_TmTimer(Sender: TObject);
procedure F_MSCOMComm(Sender: TObject);
private
F_ComInputNotNull:Boolean;
F_ComTime:integer;
F_Port:integer;
F_Msg:string;
F_Phon:string;
procedure CloseCOM();
procedure OpenCOm();
public
constructor Create();
procedure Open();
procedure Sender();
procedure Close();
published
property Port:integer read F_Port write F_Port default 1;
property Msg:string read F_Msg write F_Msg;
property Phon:string read F_Phon write F_Phon;
end;implementationprocedure TMsgSender.CloseCOM();
begin
If F_MSCOM.PortOpen Then
F_MSCOM.PortOpen:=false;
end;procedure TMsgSender.OpenCOm();
begin
If F_MSCOM.PortOpen Then
F_MSCOM.PortOpen:=false;
F_MSCOM.CommPort:=F_Port;
try
F_MSCOM.PortOpen:=true;
except
showmessage('无法打开端口,请检测!');
end;
end;constructor TMsgSender.Create();
beginend;procedure TMsgSender.Open();
begin
//F_MSCOM:=TMSComm.create();
//F_Tm:=TTimer.Create(self);
F_ComInputNotNull:=false;
F_ComTime:=0;
F_Port:=1;
F_Msg:='';
F_Phon:='';
CloseCOM;
F_MSCOM.Handshaking:=3-comRTSXOnXOff;
F_MSCOM.RThreshold:=1;
F_Tm.Enabled:=false;
F_Tm.Interval:=30;
end;procedure TMsgSender.F_TmTimer(Sender:TObject);
begin
If F_ComTime<500 Then
begin
If F_MSCOM.Input<>'' Then
F_ComInputNotNull:=True;
F_ComTime:=F_ComTime+1;
end
Else
begin
F_Tm.Enabled:=false;
F_ComTime :=0;
If not(F_ComInputNotNull) Then
showmessage('发送不成功,请检查设备!');
F_ComInputNotNull:=false;
end;
end;procedure TMsgSender.F_MSCOMComm(Sender: TObject);
var
s:string;
si:integer;
begin
s:=F_MSCOM.Input;
If s<>'' Then
Begin
F_ComInputNotNull:=True;
si := Pos('>',s);
If si>0 Then
F_MSCOM.Output:=F_Msg+chr(26);
si := pos('ERROR',s);
If si>0 then
begin
F_MSCOM.InBufferCount:=0;
F_MSCOM.OutBufferCount:=0;
showmessage('发送不成功,请检测设备及SIM卡!');
end;
End;
end;procedure TMsgSender.Sender();
var
s:string;
begin
s:=trim(F_Msg);
If s='' Then
showmessage('缺少发送方号码!')
Else
begin
OpenCOM();
If F_MSCOM.PortOpen Then
Begin
F_Tm.Enabled:=true;
F_MSCOM.Output:='at+cmgs="'+s+'"';
sleep(20);
F_MSCOM.Output:=chr(13);
end;
end;
end;procedure TMsgSender.Close();
begin
F_Tm.Enabled:=false;
CloseCOM();
end;end.//==============================================unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Msgsender, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
MySender: TMsgSender;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
MySender:=TMsgSender.Create();
mysender.Open;
MySender.Port:=1;
MySender.Phon:=edit2.Text;
MySender.Msg:=edit1.Text;
MySender.Sender;
// MySender.Close;
end;end.//=================================
只用到MSCOMM控件
运行时报:
Access violation at address 0045B840 in module 'project.exe'.Read of address 00000220.
Windows, SysUtils, Classes, Variants, Messages, Dialogs,
MSCommLib_TLB, ExtCtrls;Type
TMsgSender=Class(Tobject)
F_MSCOM:TMSComm;
F_Tm:TTimer;
procedure F_TmTimer(Sender: TObject);
procedure F_MSCOMComm(Sender: TObject);
private
F_ComInputNotNull:Boolean;
F_ComTime:integer;
F_Port:integer;
F_Msg:string;
F_Phon:string;
procedure CloseCOM();
procedure OpenCOm();
public
constructor Create();
procedure Open();
procedure Sender();
procedure Close();
published
property Port:integer read F_Port write F_Port default 1;
property Msg:string read F_Msg write F_Msg;
property Phon:string read F_Phon write F_Phon;
end;implementationprocedure TMsgSender.CloseCOM();
begin
If F_MSCOM.PortOpen Then
F_MSCOM.PortOpen:=false;
end;procedure TMsgSender.OpenCOm();
begin
If F_MSCOM.PortOpen Then
F_MSCOM.PortOpen:=false;
F_MSCOM.CommPort:=F_Port;
try
F_MSCOM.PortOpen:=true;
except
showmessage('无法打开端口,请检测!');
end;
end;constructor TMsgSender.Create();
beginend;procedure TMsgSender.Open();
begin
//F_MSCOM:=TMSComm.create();
//F_Tm:=TTimer.Create(self);
F_ComInputNotNull:=false;
F_ComTime:=0;
F_Port:=1;
F_Msg:='';
F_Phon:='';
CloseCOM;
F_MSCOM.Handshaking:=3-comRTSXOnXOff;
F_MSCOM.RThreshold:=1;
F_Tm.Enabled:=false;
F_Tm.Interval:=30;
end;procedure TMsgSender.F_TmTimer(Sender:TObject);
begin
If F_ComTime<500 Then
begin
If F_MSCOM.Input<>'' Then
F_ComInputNotNull:=True;
F_ComTime:=F_ComTime+1;
end
Else
begin
F_Tm.Enabled:=false;
F_ComTime :=0;
If not(F_ComInputNotNull) Then
showmessage('发送不成功,请检查设备!');
F_ComInputNotNull:=false;
end;
end;procedure TMsgSender.F_MSCOMComm(Sender: TObject);
var
s:string;
si:integer;
begin
s:=F_MSCOM.Input;
If s<>'' Then
Begin
F_ComInputNotNull:=True;
si := Pos('>',s);
If si>0 Then
F_MSCOM.Output:=F_Msg+chr(26);
si := pos('ERROR',s);
If si>0 then
begin
F_MSCOM.InBufferCount:=0;
F_MSCOM.OutBufferCount:=0;
showmessage('发送不成功,请检测设备及SIM卡!');
end;
End;
end;procedure TMsgSender.Sender();
var
s:string;
begin
s:=trim(F_Msg);
If s='' Then
showmessage('缺少发送方号码!')
Else
begin
OpenCOM();
If F_MSCOM.PortOpen Then
Begin
F_Tm.Enabled:=true;
F_MSCOM.Output:='at+cmgs="'+s+'"';
sleep(20);
F_MSCOM.Output:=chr(13);
end;
end;
end;procedure TMsgSender.Close();
begin
F_Tm.Enabled:=false;
CloseCOM();
end;end.//==============================================unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Msgsender, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
MySender: TMsgSender;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
MySender:=TMsgSender.Create();
mysender.Open;
MySender.Port:=1;
MySender.Phon:=edit2.Text;
MySender.Msg:=edit1.Text;
MySender.Sender;
// MySender.Close;
end;end.//=================================
只用到MSCOMM控件
运行时报:
Access violation at address 0045B840 in module 'project.exe'.Read of address 00000220.
你注释掉这句,
也就是说,你根本没创建 F_MSCOM 的实例,就访问使用它,那当然要出错了
TMsgSender=Class(Tobject)
F_MSCOM:TMSComm;
F_Tm:TTimer;
是放在外面的,不是直接可以当变量用么?
估计Timer也不可能正常工作吧
unit Msgsender;interfaceuses
Windows, SysUtils, Classes, Variants, Messages, Dialogs,
MSCommLib_TLB, ExtCtrls;Type
TMsgSender=Class(Tobject)
private
F_MSCOM:TMSComm;
F_Tm:TTimer;
F_ComInputNotNull:Boolean;
F_ComTime:integer;
F_Port:integer;
F_Msg:string;
F_Phon:string;
procedure F_TmTimer(Sender: TObject);
procedure F_MSCOMComm(Sender: TObject);
procedure CloseCOM(MCOM:TMSComm);
procedure OpenCOm(MCOM:TMSComm);
public
constructor Create();
procedure Sender();
destructor Destroy; override;
published
property Port:integer read F_Port write F_Port;
property Msg:string read F_Msg write F_Msg;
property Phon:string read F_Phon write F_Phon;
end;implementationconstructor TMsgSender.Create();
begin
F_MSCOM:=TMSComm.Create(F_MSCOM);
F_Tm:=TTimer.Create(F_Tm);
F_TM.Enabled:=false;
F_Tm.OnTimer:=F_TmTimer;
F_MSCOM.OnComm:=F_MSCOMComm;
F_ComTime:=0;
F_Port:=1;
F_ComInputNotNull:=false;
F_Msg:='';
F_Phon:='';
F_MSCOM.Handshaking:=3;//3-comRTSXOnXOff;//1-comXOnXoff;//
F_MSCOM.RThreshold:=1;
F_Tm.Enabled:=false;
F_Tm.Interval:=30;
end;procedure TMsgSender.CloseCOM(MCOM:TMSComm);
begin
If MCOM.PortOpen Then
MCOM.PortOpen:=false;
end;procedure TMsgSender.OpenCOM(MCOM:TMSComm);
begin
If MCOM.PortOpen Then
MCOM.PortOpen:=false;
MCOM.CommPort:=F_Port;
try
MCOM.PortOpen:=true;
except
showmessage('无法打开端口,请检测!');
end;
end;procedure TMsgSender.F_TmTimer(Sender: TObject);
begin
If F_ComTime<100 Then
begin
If F_MSCOM.Input<>'' Then
F_ComInputNotNull:=True;
F_ComTime:=F_ComTime+1;
end
Else
begin
F_Tm.Enabled:=false;
F_ComTime :=0;
If not(F_ComInputNotNull) Then
showmessage('发送不成功,请检查设备!');
F_ComInputNotNull:=false;
end;
end;procedure TMsgSender.F_MSCOMComm(Sender: TObject);
var
s:string;
si:integer;
begin
s:=F_MSCOM.Input;
If s<>'' Then
Begin
F_ComInputNotNull:=True;
si := Pos('>',s);
If si>0 Then
F_MSCOM.Output:=F_Msg+chr(26);
si := pos('ERROR',s);
If si>0 then
begin
F_MSCOM.InBufferCount:=0;
F_MSCOM.OutBufferCount:=0;
showmessage('发送不成功,请检测设备及SIM卡!');
end;
End;
end;
procedure TMsgSender.Sender();
var
s:string;
begin
s:=trim(F_Phon);
If s='' Then
showmessage('缺少发送方号码!')
Else
begin
OpenCOM(F_MSCOM);
If F_MSCOM.PortOpen Then
Begin
F_Tm.Enabled:=true;
F_MSCOM.Output:='at+cmgs="'+s+'"';
sleep(20);
F_MSCOM.Output:=chr(13);
sleep(20);
end;
end;
end;
destructor TMsgSender.Destroy;
begin
F_Tm.Enabled:=false;
CloseCOM(F_MSCOM);
F_Tm.Free;
F_Tm:=nil;
F_MSCOM.Free;
F_MSCOM:=nil;
end;end.