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.

解决方案 »

  1.   

    //F_MSCOM:=TMSComm.create();
    你注释掉这句,
    也就是说,你根本没创建  F_MSCOM 的实例,就访问使用它,那当然要出错了
      

  2.   

    还有
      TMsgSender=Class(Tobject)
        F_MSCOM:TMSComm;
        F_Tm:TTimer;
    是放在外面的,不是直接可以当变量用么?
      

  3.   

    你这个东东问题还不少啊
    估计Timer也不可能正常工作吧
      

  4.   

    问题解决了,现在把修改过的代码贴出来,希望大家看看还有其他问题么?
    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.