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

📄 unithang.cpp

📁 C++Builder 串口编程的很好的控件包
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "UnitHang.h"
#include "yb_base.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFormHang *FormHang;
//---------------------------------------------------------------------------
__fastcall TFormHang::TFormHang(TComponent* Owner)
    : TForm(Owner)
{
  iWhatToDo = 0;
  iRetryTimes = 0;
  iTotalRetries = 0;
  iCloseDelay = 8; // 8 * TimerInterval = 2 (s)
  Modem = 0;

  Font->Name    = AppLang.FontName;
  Font->Charset = AppLang.Charset;
  Font->Size    = AppLang.FontSize;

  TMsgStrings Msgs;
  Caption              = Msgs.Msg[TMsgStrings::MsgHang   ]; //"挂机"
  LabelPrompt->Caption = Msgs.Msg[TMsgStrings::MsgHanging]; //"正在挂机, 请稍候……"
}
//---------------------------------------------------------------------------
__fastcall TFormHang::~TFormHang()
{
  if(Modem)
   {
     EscapeCommFunction(Modem->Handle, SETDTR);
   }
}
//---------------------------------------------------------------------------
int __fastcall TFormHang::Hang(TComm32 *lpModem, int Retries)
{
  iWhatToDo = 0;
  iTotalRetries = Retries>0?Retries:1;
  iRetryTimes = iTotalRetries;

  Modem = lpModem;
  Modem->DisableWrite = true;
  int iRetVal = ShowModal();
  Modem->DisableWrite = false;
  return iRetVal;
}
//---------------------------------------------------------------------------
void __fastcall TFormHang::TimerHangTimer(TObject *Sender)
{
  if(Modem)
   {
     if((Modem->ModemStatus & MS_RLSD_ON) == 0)
      {
        FinalOK();
      }
     else if(iRetryTimes>0)
      {
        DoHangProc();
      }
     else
      {
        FinalError();
      }
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormHang::DoHangProc(void)
{
  //... wait ... Command("+++") ... wait ... Command("ATH0\r") ... wait ...
  switch(iWhatToDo)
   {
     case  8: Modem->Command("+++"); break;
     case 16: Modem->Command("ATH0\r"); break;
     case 32: EscapeCommFunction(Modem->Handle, CLRDTR); break;
   }
  CheckResult();
}
//---------------------------------------------------------------------------
void __fastcall TFormHang::CheckResult(void)
{
  if(++iWhatToDo>80) // 80 * TimerInterval / 1000 = 20 (s)
   {
     iWhatToDo = 0;
     iRetryTimes--;
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormHang::FinalOK(void)
{
  if(iCloseDelay)
   {
     if(iCloseDelay>0)
      if(--iCloseDelay==0)
       ModalResult = IDOK;
   }
  else
   {
     ModalResult = IDOK;
   }
}
//---------------------------------------------------------------------------
void __fastcall TFormHang::FinalError(void)
{
  ModalResult = IDNO;
}
//---------------------------------------------------------------------------

__fastcall TFormHang::TMsgStrings::TMsgStrings()
{
  switch(AppLang.LangType)
   {
     case TAppLang::ltGbk:
          _Msg = _Msg_Chs;
          break;

     case TAppLang::ltBig5:
          _Msg = _Msg_Cht;
          break;

     default:
          _Msg = _Msg_Enu;
          break;
   }
}
//---------------------------------------------------------------------------

AnsiString __fastcall TFormHang::TMsgStrings::fGetMsg(TMsgType mt)
{
  if(mt>=0 && mt<MsgCount)
    return AppLang.FromGBK(_Msg[mt]);
  return "";
}
//---------------------------------------------------------------------------

char *TFormHang::TMsgStrings::_Msg_Chs[MsgCount] =
{
  "挂机"                , //MsgHang
  "正在挂机, 请稍候……", //MsgHanging
};
//---------------------------------------------------------------------------

char *TFormHang::TMsgStrings::_Msg_Cht[MsgCount] =
{
  "掛機"                , //MsgHang
  "正在掛機, 請稍候……", //MsgHanging
};

char *TFormHang::TMsgStrings::_Msg_Enu[MsgCount] =
{
  "Hang"                   , //MsgHang
  "Hanging, please wait...", //MsgHanging
};
//---------------------------------------------------------------------------

int RunDialogHang(TComponent* Owner, TComm32 *lpModem, int Retries)
{
  FormHang = new TFormHang(Owner);
  int iRetVal = FormHang->Hang(lpModem, Retries);
  delete FormHang;
  return iRetVal;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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