unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, StdCtrls, ExtCtrls, ComCtrls, RzTray, Spin,
  IdBaseComponent, IdComponent, IdRawBase, IdRawClient, IdIcmpClient;type
  TForm1 = class(TForm)
    ADOQ1: TADOQuery;
    Timer1: TTimer;
    ADOQ2: TADOQuery;
    ADOConnection1: TADOConnection;
    RzTrayIcon1: TRzTrayIcon;
    Timer2: TTimer;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    Button1: TButton;
    Button3: TButton;
    Edit4: TEdit;
    GroupBox2: TGroupBox;
    ListView1: TListView;
    GroupBox3: TGroupBox;
    Label8: TLabel;
    Button4: TButton;
    Button5: TButton;
    GroupBox4: TGroupBox;
    Button6: TButton;
    Memo2: TMemo;
    GroupBox5: TGroupBox;
    Label9: TLabel;
    Edit5: TEdit;
    Button7: TButton;
    Button8: TButton;
    Timer3: TTimer;
    ADOQ3: TADOQuery;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    TabSheet5: TTabSheet;
    Panel2: TPanel;
    Label2: TLabel;
    edtHost: TEdit;
    spnPing: TSpinEdit;
    lstReplies: TListBox;
    btnPing: TButton;
    Button9: TButton;
    ICMP: TIdIcmpClient;
    Timer4: TTimer;
    Label1: TLabel;
    CPUBut: TButton;
    CUPButRetPhone: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure btnPingClick(Sender: TObject);
    procedure ICMPReply(ASender: TComponent;
      const AReplyStatus: TReplyStatus);
    procedure Timer4Timer(Sender: TObject);
    procedure CPUButClick(Sender: TObject);
    procedure CUPButRetPhoneClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  function GetBuMen(PhoneNumber:String):string;
  end;
  function Sms_Connection(CopyRight:pchar;Com_Port,Com_BaudRate:integer;var Mobile_Type,CopyRightToCOM:PChar):integer;stdcall;external 'sms.dll';
  function Sms_Send(Sms_TelNum:string;Sms_Text:string):integer;stdcall;external 'sms.dll';
  Function Sms_Receive(Sms_Type:string;var Sms_Text:PChar):integer;stdcall;external 'sms.dll';
  function Sms_Delete(Sms_Index:string):integer;stdcall;external 'sms.dll';
  function Sms_AutoFlag :integer;stdcall;external 'sms.dll';
  function Sms_NewFlag :integer;stdcall;external 'sms.dll';
  function Sms_Disconnection :integer;stdcall;external 'sms.dll';
var
  Form1: TForm1;
  myList : TListItem;
  strs1 :TStrings;
  strs2 :TStrings;
  PingStrTrue,PingStrFalse,FShouJiHao : string;
implementation
//修改为2012-09-27,主要为ADOQ1提示出错:不能打开一个关闭的数据集。
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
Mobile_Type:pchar;
CopyRight:pchar;
CopyRightToCOM:pchar;
begin
CopyRight:=PChar('//上海迅赛信息技术有限公司,网址www.xunsai.com//');
if Sms_Connection(CopyRight,StrToInt(Edit1.text),9600,Mobile_Type,CopyRightToCOM)<>0 then
   begin
     Label3.Caption:='连接成功,芯片为:'+Mobile_Type+'!';
   end
 else
   Label3.Caption:='连接失败!'
end;procedure TForm1.Button2Click(Sender: TObject);
var
  i : integer;
begin
  ADOQ1.Close;     //修改为2012-09-27
  ADOQ1.SQL.Clear;
  ADOQ1.SQL.Add('select * from  TB_SendMessage where isSent = 0 ');
  ADOQ1.Open;
  for i := 0 to ADOQ1.RecordCount - 1 do
  begin
    Edit2.Clear;
    edit3.Clear;
    Edit4.Clear;
    edit2.Text := trim(ADOQ1.fieldbyname('receivers').AsString);
    Edit3.Text := trim(ADOQ1.fieldbyname('title').AsString);
    edit4.Text := trim(ADOQ1.fieldbyname('ID').AsString);
    if Edit2.Text = '' then
    begin
      ;
    end else
    begin
      if Sms_Send(Edit2.Text,Edit3.Text)=1 then
      begin
        showmessage('发送成功!');
          myList := listView1.Items.Add;
          MyList.Caption := '';
          MyList.SubItems.Add(Edit2.Text);
          Mylist.SubItems.Add(Edit3.Text);
          Mylist.SubItems.Add(datetimetostr(now()));
          Mylist.SubItems.Add('发送成功');
          ADOQ2.SQL.Clear;
          ADOQ2.SQL.Add('update TB_SendMessage set isSent = 1 where ID= '+quotedstr(Edit4.Text)+'');
          ADOQ2.ExecSQL;
          ADOQ2.Close;
        sleep(15000);
      end
      else
      begin
        showmessage('发送失败!');
          myList := listView1.Items.Add;
          MyList.Caption := '';
          MyList.SubItems.Add(Edit2.Text);
          Mylist.SubItems.Add(Edit3.Text);
          Mylist.SubItems.Add(datetimetostr(now()));
          Mylist.SubItems.Add('发送失败');
        sleep(15000);
      end;
    end;
    ADOQ1.Next;
  end;
  //ADOQ1.Close;   //修改为2012-09-27
end;procedure TForm1.Button3Click(Sender: TObject);
begin
  Sms_Disconnection;
  Label3.Caption:='已断开!';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
  i : integer;
begin
  ADOQ1.Close;    ///修改为2012-09-27
  ADOQ1.SQL.Clear;
  ADOQ1.SQL.Add('select * from  TB_SendMessage where isSent = 0 ');
  ADOQ1.Open;
  for i := 0 to ADOQ1.RecordCount - 1 do
  begin
    Edit2.Clear;
    edit3.Clear;
    Edit4.Clear;
    edit2.Text := trim(ADOQ1.fieldbyname('receivers').AsString);
    Edit3.Text := trim(ADOQ1.fieldbyname('title').AsString);
    edit4.Text := trim(ADOQ1.fieldbyname('ID').AsString);
    if Sms_Send(Edit2.Text,Edit3.Text)=1 then
    begin
      //showmessage('发送成功!');
        myList := listView1.Items.Add;
        MyList.Caption := '';
        MyList.SubItems.Add(Edit2.Text);
        Mylist.SubItems.Add(Edit3.Text);
        Mylist.SubItems.Add(datetimetostr(now()));
        Mylist.SubItems.Add('发送成功');
        ADOQ2.SQL.Clear;
        ADOQ2.SQL.Add('update TB_SendMessage set isSent = 1 where ID= '+quotedstr(Edit4.Text)+'');
        ADOQ2.ExecSQL;
        ADOQ2.Close;
      sleep(5000);
    end
    else
    begin
      //showmessage('发送失败!');
        myList := listView1.Items.Add;
        MyList.Caption := '';
        MyList.SubItems.Add(Edit2.Text);
        Mylist.SubItems.Add(Edit3.Text);
        Mylist.SubItems.Add(datetimetostr(now()));
        Mylist.SubItems.Add('发送失败');
      sleep(5000);
    end;
    ADOQ1.Next;
  end;
  //ADOQ1.Close;    /修改为2012-09-27
end;procedure TForm1.FormActivate(Sender: TObject);
begin
  sleep(2000);
  strs1 := TstringList.Create;
  strs1.Delimiter := '|';
  strs2 := TstringList.Create;
  strs2.Delimiter := '#';
  Button1.OnClick(button1);
end;procedure TForm1.Timer2Timer(Sender: TObject);
begin
  if Sms_NewFlag()=1 then
    begin
      Label8.Caption:='有新短信,请查收!';
    end
  else
      Label8.Caption:='无短信!';
end;procedure TForm1.Button4Click(Sender: TObject);
begin
Timer2.enabled:=True;
end;procedure TForm1.Button5Click(Sender: TObject);
begin
Timer2.enabled:=False;
end;procedure TForm1.Button6Click(Sender: TObject);
var
StrSmsReceive:pchar;
RecReult:integer;
i,j :Integer;
XuHao1,XuHao2,FJieShouNeiRong,FJieShouShiJian,FBuMen:string;
begin
//RecReult:=Sms_Receive('4',StrSmsReceive);
//Memo2.lines.text:=StrSmsReceive;
  
  //if Sms_NewFlag()=1 then
  //begin
    RecReult:=Sms_Receive('4',StrSmsReceive);
    //sleep(5000);
    
    //showmessage(StrSmsReceive);
    if (length(trim(StrSmsReceive))>0) then
    begin
      Memo2.lines.text:=StrSmsReceive;
      StrSmsReceive:=pchar(StringReplace(StrSmsReceive,   ' ',   '',   [rfReplaceAll]));
      StrSmsReceive:=pchar(StringReplace(StrSmsReceive,   #13,   '',   [rfReplaceAll]));
      //showmessage(StrSmsReceive);      strs1.DelimitedText  := StrSmsReceive;
      for i := 0 to strs1.Count-1 do
      begin
        if length(trim(strs1[i]))>0 then
        begin
          //showmessage(strs1[i]);          strs2.DelimitedText  := strs1[i];
          //showmessage(inttostr(strs2.Count));
          if strs2.Count=5 then
          begin
            XuHao1 := strs2[0];
            XuHao2 := strs2[1];
            FShouJiHao := strs2[2];
            FJieShouNeiRong := strs2[3];
            if FJieShouNeiRong='112' then
            begin
              btnPing.OnClick(self);
              CUPButRetPhone.OnClick(self);
            end;
            FJieShouShiJian := copy(strs2[4],0,8)+ ' '+copy(strs2[4],9,(length(strs2[4])-8));
            FBuMen := GetBuMen(strs2[2]);
            ADOQ3.SQL.Clear;
            ADOQ3.SQL.Add('INSERT INTO TB_DXM_ReceiveMessage'
            +'(FDuXinID1, FDuXinID2,FShouJiHao,FJieShouNeiRong,FJieShouShiJian,FBuMen) VALUES '
            +' ('+XuHao1+','+XuHao2+','''+FShouJiHao+''','''+FJieShouNeiRong+''','''+FJieShouShiJian+''','''+FBuMen+''')');
            ADOQ3.ExecSQL;
            ADOQ3.Close;
            Sms_Delete(trim(strs2[0]));
          end;
        end
      end;
    end;
  //end;
end;procedure TForm1.Button7Click(Sender: TObject);
var
DelReult:integer;
begin
DelReult:=Sms_Delete(Edit5.text);
end;

解决方案 »

  1.   

    procedure TForm1.Button8Click(Sender: TObject);
    //var
    //StrSmsReceive:pchar;
    //RecReult:integer;
    ///strs1 :TStrings;
    //strs2 :TStrings;
    //i,j :Integer;
    //XuHao1,XuHao2,FShouJiHao,FJieShouNeiRong,FJieShouShiJian,FBuMen:string;
    begin
      {strs1 := TstringList.Create;
      strs1.Delimiter := '|';
      strs2 := TstringList.Create;
      strs2.Delimiter := '#';
      //if Sms_NewFlag()=1 then
      //begin
        RecReult:=Sms_Receive('4',StrSmsReceive);
        //sleep(5000);
        Memo2.lines.text:=StrSmsReceive;
        showmessage(StrSmsReceive);
        if (length(trim(StrSmsReceive))>0) then
        begin
          strs1.CommaText := StrSmsReceive;
          for i := 0 to strs1.Count-1 do
          begin
            if length(trim(strs1[i]))>0 then
            begin
              showmessage(strs1[i]);
              strs2.CommaText := strs1[i];
              XuHao1 := strs2[0];
              XuHao2 := strs2[1];
              FShouJiHao := strs2[2];
              FJieShouNeiRong := strs2[3];
              FJieShouShiJian := strs2[4];
              if (length(trim(FShouJiHao))=11) then
              begin
                FBuMen := GetBuMen('86'+strs2[2]);
              end else
              begin
                FBuMen := GetBuMen(strs2[2]);
              end;          ADOQ1.SQL.Clear;
              ADOQ1.SQL.Add('INSERT INTO TB_DXM_ReceiveMessage'
              +'(FDuXinID1, FDuXinID2,FShouJiHao,FJieShouNeiRong,FJieShouShiJian,FBuMen) VALUES '
              +' ('+XuHao1+','+XuHao2+','''+FShouJiHao+''','''+FJieShouNeiRong+''','''+FJieShouShiJian+''','''+FBuMen+''')');
              ADOQ1.ExecSQL;
            end
          end;
        end;
      //end;  }
    end;function TForm1.GetBuMen(PhoneNumber: String): string;
    var
      ReturnStr : string;
      i : integer;
    begin
      ReturnStr := '';
      ADOQ3.SQL.Clear;
      ADOQ3.SQL.Add('select senderId,receivers from  TB_SendMessage');
      ADOQ3.Open;
      ADOQ3.First;
      for i := 0 to ADOQ3.RecordCount - 1 do
      begin
        if ('86'+trim(ADOQ3.fieldbyname('receivers').AsString)= PhoneNumber)  and (trim(ADOQ3.fieldbyname('senderId').AsString)='13588888888') then
        begin       if   StrPos(PChar(ReturnStr),PChar('8S'))   <>   nil   then
           begin
             ;
           end else
           begin
             ReturnStr := ReturnStr+'8S';
           end;    end;
        if ('86'+trim(ADOQ3.fieldbyname('receivers').AsString) = PhoneNumber)  and (trim(ADOQ3.fieldbyname('senderId').AsString)='13511111111') then
        begin       if   StrPos(PChar(ReturnStr),PChar('资金平衡管理软件'))   <>   nil   then
           begin
             ;
           end else
           begin
             ReturnStr := ReturnStr+'资金平衡管理软件';
           end;        end;
        if ('86'+trim(ADOQ3.fieldbyname('receivers').AsString) = PhoneNumber)  and (trim(ADOQ3.fieldbyname('senderId').AsString) ='13938960795') then
        begin       if   StrPos(PChar(ReturnStr),PChar('质量信息管理平台'))   <>   nil   then
           begin
             ;
           end else
           begin
             ReturnStr := ReturnStr+'质量信息管理平台';
           end;
        end;
        if (trim(ADOQ3.fieldbyname('senderId').AsString) <> '13938960795') and (trim(ADOQ3.fieldbyname('senderId').AsString) <> '13511111111') and (trim(ADOQ3.fieldbyname('senderId').AsString) <> '13588888888') then
        begin       if   StrPos(PChar(ReturnStr),PChar('其它'))   <>   nil   then
           begin
             ;
           end else
           begin
             ReturnStr := ReturnStr+'其它';
           end;
           
        end;
        ADOQ3.Next;
      end;
      ADOQ3.Close;
      Result := ReturnStr;
    end;procedure TForm1.Timer3Timer(Sender: TObject);
    begin
      button6.OnClick(button6);
    end;procedure TForm1.btnPingClick(Sender: TObject);
    var
      i: integer;
    begin
      ICMP.OnReply := ICMPReply;
      ICMP.ReceiveTimeout := 1000;
      btnPing.Enabled := False;
       try
        ICMP.Host := edtHost.Text;
        for i := 1 to spnPing.Value do begin
          ICMP.Ping;
          Application.ProcessMessages;
        end;
      finally
        btnPing.Enabled := True;
      end;
    end;procedure TForm1.ICMPReply(ASender: TComponent;
      const AReplyStatus: TReplyStatus);
    var
      sTime: string;
    begin
      // TODO: check for error on ping reply (ReplyStatus.MsgType?)
      PingStrFalse := '';
      PingStrTrue := '';
      if (AReplyStatus.MsRoundTripTime = 0) then
        sTime := '<1'                                      
      else
        sTime := '=';  lstReplies.Items.Add(Format('%d bytes from %s: icmp_seq=%d ttl=%d time%s%d ms',
        [AReplyStatus.BytesReceived,
        AReplyStatus.FromIpAddress,
        AReplyStatus.SequenceId,
        AReplyStatus.TimeToLive,
        sTime,
        AReplyStatus.MsRoundTripTime]));    if AReplyStatus.BytesReceived = 0 then
        begin
          //Sms_Send('13598299760','无法ping通测试机器,可能是市电已停。');      PingStrFalse := '无法ping通测试机器,可能是市电已停。' ;    end else
        begin
          //Sms_Send('13598299760','ping通测试机器,市电正常。');
          
          PingStrTrue := 'ping通测试机器,市电正常。';
        end;
    end;procedure TForm1.Timer4Timer(Sender: TObject);     //timer4自动调用btnPing事件,测试市电是否正常,并发送短信。
    begin
      btnPing.OnClick(self);
      CPUBut.OnClick(self);
    end;procedure TForm1.CPUButClick(Sender: TObject); //CUP温度报警
    var
    strs :TStrings;
    i :Integer;
    Core0,Core1,Core2,Core3 : string;
    Core0Tem,Core1Tem,Core2Tem,Core3Tem : string;
    //(Core#0):,(Core#1):
    begin
      strs := TStringList.Create;
      strs.LoadFromFile('Core Temp\Temp Log.log');
      //for i := 0 to Strs.Count-1 do
        //ShowMessage(Strs[3]);
        //showmessage(Strs[(Strs.Count-4)]);
        //showmessage(Strs[(Strs.Count-3)]);
        //showmessage(Strs[(Strs.Count-2)]);
        //showmessage(Strs[(Strs.Count-1)]);
        {Core0 := Strs[(Strs.Count-4)];
        Core1 := Strs[(Strs.Count-3)];
        Core2 := Strs[(Strs.Count-2)];
        Core3 := Strs[(Strs.Count-1)];}
        Core0 := Strs[(Strs.Count-2)];
        Core1 := Strs[(Strs.Count-1)];
        Core0Tem := copy(Core0,(pos('(Core#0):',Core0))+10,2);
        //showmessage(Core0Tem);
        if  (strtoint(Core0Tem) > 53) or  (length(PingStrFalse) > 0) then
        begin
          Sms_Send('13598299760','1、cpu温度为'+Core0Tem+'度。2、'+PingStrTrue+PingStrFalse+',请及时关注。【机房报警系统】');
          sleep(5000);
          Sms_Send('13525686554','1、cpu温度为'+Core0Tem+'度。2、'+PingStrTrue+PingStrFalse+',请及时关注。【机房报警系统】');
          sleep(5000);
          Sms_Send('15236010037','1、cpu温度为'+Core0Tem+'度。2、'+PingStrTrue+PingStrFalse+',请及时关注。【机房报警系统】');
          Timer4.Interval := 4000000;
          Timer4.Enabled := true;
        end else
        begin
          Timer4.Interval := 100000;
          Timer4.Enabled := true;
          //Sms_Send('13598299760','1、cpu温度为'+Core0Tem+'度,在安全范围之内。2、'+PingStrTrue+PingStrFalse);
        end;end;procedure TForm1.CUPButRetPhoneClick(Sender: TObject);
    var
    strs :TStrings;
    i :Integer;
    Core0,Core1,Core2,Core3 : string;
    Core0Tem,Core1Tem,Core2Tem,Core3Tem : string;
    //(Core#0):,(Core#1):
    begin
      strs := TStringList.Create;
      strs.LoadFromFile('Core Temp\Temp Log.log');
      //for i := 0 to Strs.Count-1 do
        //ShowMessage(Strs[3]);
        //showmessage(Strs[(Strs.Count-4)]);
        //showmessage(Strs[(Strs.Count-3)]);
        //showmessage(Strs[(Strs.Count-2)]);
        //showmessage(Strs[(Strs.Count-1)]);
        {Core0 := Strs[(Strs.Count-4)];
        Core1 := Strs[(Strs.Count-3)];
        Core2 := Strs[(Strs.Count-2)];
        Core3 := Strs[(Strs.Count-1)];}
        Core0 := Strs[(Strs.Count-2)];
        Core1 := Strs[(Strs.Count-1)];
        Core0Tem := copy(Core0,(pos('(Core#0):',Core0))+10,2);
        //showmessage(Core0Tem);
        if  (strtoint(Core0Tem) > 53) or  (length(PingStrFalse) > 0) then
        begin
          Sms_Send(FShouJiHao,'1、cpu温度为'+Core0Tem+'度。2、'+PingStrTrue+PingStrFalse+',请及时关注。【机房报警系统】');
          Timer4.Interval := 100000;
          Timer4.Enabled := true;
        end else
        begin
          Sms_Send(FShouJiHao,'1、cpu温度为'+Core0Tem+'度,在安全范围之内。2、'+PingStrTrue+PingStrFalse+'【机房报警系统】');
          Timer4.Interval := 100000;
          Timer4.Enabled := true;
        end;end;end.
      

  2.   

      strs := TStringList.Create;
      你这个对象在过程里面,之后Create 但是没有Free  用完后应该: strs.free
      

  3.   

    太长啦。。你把有泄漏的部分指出来。。
    还有程序即使内存泄漏DELPHI好像也不会报out of memory的吧
      

  4.   

    忘记说了,我装的有EurekaLog,装上之后才提示的“out of memory”,我现在都搞不添楚到底是哪里导致的内存泄露,所以都贴出来了。希望高手指点。
      

  5.   

    我也遇到了,可能是Timer同步的问题,你检查下Timer执行时是否有交叉的两个Timer
      

  6.   

    timer同步问题?这种情况如何避免???
      

  7.   

    执行的时候把Timer置为False,执行完后,再置为True
      

  8.   

    呵呵   CSDN大牛真多
      

  9.   

    用NuMega BoundsChecker检测一下