⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ufrmmain.pas.~242~

📁 用串口发送手机短信 需要GSM Mode设备
💻 ~242~
📖 第 1 页 / 共 3 页
字号:
unit uFrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, CheckLst, ADODB, Grids, activex, ComCtrls,
  uFrmTest, ExtCtrls, Menus, ShellAPI, uCom;

const
  MI_ICONEVENT = WM_USER + 2;
  sqlMSG :string='if not exists (select name from syscolumns where id = object_id(''报警数据'') and name like ''iMsg'')  Alter Table 报警数据 Add iMsg tinyint null';

type
  TfrmMain = class(TForm)
    sBar: TStatusBar;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    chkListWait: TCheckListBox;
    chkList: TCheckListBox;
    GroupBox1: TGroupBox;
    btnComPort: TSpeedButton;
    btnComBaud: TSpeedButton;
    btnMsgCent: TSpeedButton;
    cboMsgPort: TComboBox;
    cboMsgBaud: TComboBox;
    LstBoxPhone: TListBox;
    txtMsgCent: TEdit;
    GroupBox2: TGroupBox;
    btnSave: TBitBtn;
    GroupBox3: TGroupBox;
    txtName: TEdit;
    txtPhone: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    btnAddPhone: TSpeedButton;
    btnDelPhone: TSpeedButton;
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    N14: TMenuItem;
    N15: TMenuItem;
    N16: TMenuItem;
    N17: TMenuItem;
    N18: TMenuItem;
    N19: TMenuItem;
    N20: TMenuItem;
    N21: TMenuItem;
    mnuMsgCent: TMenuItem;
    N86130109115001: TMenuItem;
    N86130101805001: TMenuItem;
    N86130107615001: TMenuItem;
    N86130102405001: TMenuItem;
    N86130109805001: TMenuItem;
    N86130109505001: TMenuItem;
    N86130107015001: TMenuItem;
    N86130108795001: TMenuItem;
    N86130101125002: TMenuItem;
    imgIcon1: TImage;
    PopupMenu2: TPopupMenu;
    N22: TMenuItem;
    N23: TMenuItem;
    N24: TMenuItem;
    Timer1: TTimer;
    Button1: TButton;
    btnSetCent: TBitBtn;
    GroupBox4: TGroupBox;
    btnCeShiSB: TBitBtn;
    btnTestMsg: TSpeedButton;
    labHint: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormCanResize(Sender: TObject; var NewWidth, NewHeight: Integer;
      var Resize: Boolean);
    procedure mnuMsgCentClick(Sender: TObject);
    procedure btnComPortClick(Sender: TObject);
    procedure btnComBaudClick(Sender: TObject);
    procedure cboMsgBaudClick(Sender: TObject);
    procedure cboMsgPortClick(Sender: TObject);
    procedure btnAddPhoneClick(Sender: TObject);
    procedure btnSaveClick(Sender: TObject);
    procedure PageControl1Change(Sender: TObject);
    procedure txtPhoneKeyPress(Sender: TObject; var Key: Char);
    procedure txtMsgCentKeyPress(Sender: TObject; var Key: Char);
    procedure btnDelPhoneClick(Sender: TObject);
    procedure btnMsgCentClick(Sender: TObject);
    procedure txtMsgCentExit(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N22Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure btnCeShiSBClick(Sender: TObject);
    procedure btnTestMsgClick(Sender: TObject);
    procedure btnSetCentClick(Sender: TObject);
  private
    { Private declarations }
    bolPause :boolean;//
    bolSql   :boolean;

    procedure InstallIcon; //初始化系统托盘
    procedure UnInstallIcon; //删除托盘图标
    procedure IconOnClick(var message: TMessage); message MI_ICONEVENT;
    procedure WMQueryEndSession(var Msg: TMessage); message WM_QueryEndSession;

    procedure subWhile;        //线程中的死循环
    procedure dbFsh(sTmpDB:string; dtTime:TDateTime);   //库搜索
    procedure dbFshSnd(sTmpDB:string; dtTime:TDateTime);   //搜索库中已经发送的信息
    procedure grpOnePhoneAlt(sPhone:string;sMsg :WideString;var bytBuf:TBytes); //组合一个电话号码和一条报警信息
    procedure showSet;      //显示配置参数

    procedure frmMinClick(var msg:tmessage);message wm_syscommand;//声明自定义最小化事件
  public
    { Public declarations }
  end;

  TwpgThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

  procedure Delay(MSecs: Longint);

var
  frmMain: TfrmMain;
  wpgThread : TwpgThread;
  clsCom    : TclsCom;

implementation

uses
  uPU,uU1, uComMsg;

var
  add_ico:TNotifyIcondata;
  
{$R *.dfm}


procedure Delay(MSecs: Longint);
var
  FirstTick, NowTick: Longint;
begin
  FirstTick := GetTickCount;//获取结束计数值
  repeat
     Application.ProcessMessages;
     Sleep(1);
     NowTick := GetTickCount();
  until (NowTick-FirstTick >= MSecs) or (NowTick<FirstTick);

end;

procedure TwpgThread.Execute;
{  vartostr [Variants]     now sleep [SysUtils]
}
begin
    //Synchronize(frmMain.subWhile);
    CoInitialize (nil);
    frmMain.subWhile;
end;

procedure TfrmMain.subWhile;        //线程中的死循环
var
  iCnt :integer;
  AnsiStr:WideString;
  tmpBytes, ssb1,ssb2:TBytes;
  bytSend :array of byte;
  i, iPh, iWaitCly,oldLen :integer;
  sTmpDB, sID:string;
  dtTime:TDateTime;
begin
  iCnt :=1;       bolPause :=false;
  while True do begin
    if bolPause then begin
      sBar.Panels[1].Text :='外部请求,等待......';
      wpgThread.Suspend;
    end;

    if not bolSql then begin
      sBar.Panels[0].Text :=FormatDateTime('yyyy-MM-dd HH:mm:ss',Now);
      sBar.Panels[1].Text :='数据库未连接';
      Delay(1000);
      continue;
    end;

    Delay(400);
    sBar.Panels[0].Text :=FormatDateTime('yyyy-MM-dd HH:mm:ss',Now);

    if FormatDateTime('dd',dtTime)<>FormatDateTime('dd',Now) then begin
      //当不是同一天时
      sTmpDB :='kj78_'+FormatDateTime('yyMM',Now);
      uU1.sqlComdExec(sTmpDB,sqlMSG);
      dbFshSnd(sTmpDB, Now);   //搜索库中已经发送的信息
    end;

    dtTime :=Now;
    sTmpDB :='kj78_'+FormatDateTime('yyMM',dtTime);
    if chkListWait.Items.Count=0 then begin //当待发送缓存中没有记录时
      if (iCnt>=70) then begin   //每分钟执行一次库刷新操作,检索出当天所有未发送的报警
        iCnt :=1;
        uU1.sqlComdExec(sTmpDB,sqlMSG);
        dbFsh(sTmpDB,dtTime);   //库搜索
        sBar.Panels[1].Text :='刷新缓存';

        Delay(300);
      end;
      sBar.Panels[1].Text :='...'+inttostr(iCnt);
      Inc(iCnt);
    end else begin
      if lstPhone.Count=0 then
        sBar.Panels[1].Text :='请配置手机号'
      else
        sBar.Panels[1].Text :='等待缓存中取数据';
      //取出第一条
      sID     :=uPU.split_2(chkListWait.Items[0],'@');
      AnsiStr :=uPU.split_2(chkListWait.Items[0],'@',false);

      for iPh:=1 to lstPhone.Count do begin
          tmpBytes :=nil;
          grpOnePhoneAlt( split_2(lstPhone[iPh-1],':'), AnsiStr, tmpBytes); //组合一个电话号码和一条报警信息

          //转换发送格式
          if length(tmpBytes)>13 then begin
            sBar.Panels[1].Text :='发送数据准备完毕';
            Delay(300);
            SetLength(bytSend,length(tmpBytes));
            for i:=0 to high(tmpBytes) do begin
              bytSend[i] :=tmpBytes[i];
            end;

            //发送信息
            //if SendMsg( uPU.iComPort, uPU.iComBaud, bytSend ) then //此只能判断串口是否正常
            if clsCom.bytSendB(bytSend)  then //此只能判断串口是否正常
            begin
              //等待确定是否发送成功
              {
              for iWaitCly:=1 to 13 do begin
                sBar.Panels[1].Text :='等待发送回应  '+IntToStr(iWaitCly);
                sBar.Panels[0].Text :=FormatDateTime('yyyy-MM-dd HH:mm:ss',Now);
                Delay(1000);
              end;
              }
              for iWaitCly:=1 to 4 do begin
                sBar.Panels[1].Text :='等待发送回应  '+IntToStr(iWaitCly);
                sBar.Panels[0].Text :=FormatDateTime('yyyy-MM-dd HH:mm:ss',Now);
                Delay(1000);
              end;
              ssb2 :=nil;  setLength(ssb2,1);ssb2[0]:=0;
              ssb1 :=nil;
              ssb1 := clsCom.bytRecB;
              iWaitCly:=0;
              while high(ssb2)<30 do begin //当没有回应时,成为死循环
                Inc(iWaitCly);
                if high(ssb1)>3 then begin
                  oldLen :=high(ssb2)+1; //ssb2[0]存储的是返回串的数,比数组自身小1
                  setLength(ssb2,oldLen+high(ssb1));//ssb2[0]:=ssb2[0]+ssb1[0];
                  for i := 1 to high(ssb1) do ssb2[oldLen-1+i]:=ssb1[i];
                end;
                sBar.Panels[1].Text :='等待发送回应  '+IntToStr(iWaitCly+4);
                if(iWaitCly>15) then break;
                Delay(1000);     //CMP_Time2
                ssb1 :=nil;
                ssb1 := clsCom.bytRecB;   //组合接收串不分人员定位与瓦斯监控
              end;

              //ssb2 :=nil;
              //bytRecB( uPU.iComPort, uPU.iComBaud, ssb2 );//接收字节串(没有过滤)
              //ssb2 :=clsCom.bytRecB;

              if (ssb2<>nil)and(length(ssb2)>6) then begin
                ByteToStr(true,ssb2);   //将一个字节数组为字符串
                //是否存在回应
                if bolReply(ssb2) then begin
                  //发送信息添加到已发送表
                  if iPh=1 then begin  //有多个待发手机
                    chkList.Items.Add( AnsiStr );
                    //删除缓存
                    chkListWait.ItemIndex :=0;
                    chkListWait.DeleteSelected;
                  end else begin
                  end;
                  //修改库中的标志
                  sqlComdExec(sTmpDB,'update 报警数据 set iMsg=1 where [id]='+sID);
                  sBar.Panels[1].Text :='短信发送成功';
                  Delay(300);
                end else begin
                  sBar.Panels[1].Text :='回应失败';
                  Delay(300);
                end;
              end else begin
                sBar.Panels[1].Text :='回应字节流错误';
                Delay(300);
              end;
            end else begin
              sBar.Panels[1].Text :='串口检测失败';
            end;//if clsCom.bytSendB(bytSend)  then //此只能判断串口是否正常
          end;
      end;//for iPh:=1 to lstPhone.Count do
    end;//if chkListWait.Items.Count=0 then
    Delay(400);

  end;
end;


procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
  Application.Minimize;
  self.Visible :=false;
  Timer1.Enabled :=false;
end;

procedure TfrmMain.txtMsgCentExit(Sender: TObject);
begin
  txtMsgCent.Enabled :=false;
end;

procedure TfrmMain.txtMsgCentKeyPress(Sender: TObject; var Key: Char);
begin
  if ((key<#48)or(key>#57))and(key<>#8)and(key<>#46)and(key<>#43) then  begin

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -