建了一个用来发短信的类,可是运行时总是报错,大家帮忙看看!

ghostone 2006-03-31 06:20:04
unit Msgsender;

interface

uses
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;

implementation

procedure 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();
begin

end;

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;

interface

uses
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.
...全文
164 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghostone 2006-04-05
  • 打赏
  • 举报
回复
问题解决了,现在把修改过的代码贴出来,希望大家看看还有其他问题么?
unit Msgsender;

interface

uses
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;

implementation

constructor 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.
ghostone 2006-04-05
  • 打赏
  • 举报
回复
靠,跑到这里来做广告
Comer 2006-04-01
  • 打赏
  • 举报
回复
mark

进来学习的
clasj 2006-03-31
  • 打赏
  • 举报
回复
你这个东东问题还不少啊。。。
估计Timer也不可能正常工作吧。。。
ghostone 2006-03-31
  • 打赏
  • 举报
回复
还有
TMsgSender=Class(Tobject)
F_MSCOM:TMSComm;
F_Tm:TTimer;
是放在外面的,不是直接可以当变量用么?
ghostone 2006-03-31
  • 打赏
  • 举报
回复
可是加了编译都编译不过去
aiirii 2006-03-31
  • 打赏
  • 举报
回复
//F_MSCOM:=TMSComm.create();
你注释掉这句,
也就是说,你根本没创建 F_MSCOM 的实例,就访问使用它,那当然要出错了

5,392

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧