www.pudn.com > CommSettings.rar > UnitCommSet.cpp


//--------------------------------------------------------------------------- 
 
#include  
#pragma hdrstop 
 
#include "UnitCommSet.h" 
#include "yb_base.h" 
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TFormCommSettings *FormCommSettings; 
//--------------------------------------------------------------------------- 
__fastcall TFormCommSettings::TFormCommSettings(TComponent* Owner, TYbCustomCommDevice *lpCommDevice, bool FActive) 
    : TForm(Owner) 
{ 
  Font->Name    = AppLang.FontName; 
  Font->Charset = AppLang.Charset; 
  Font->Size    = AppLang.FontSize; 
 
  _YbCommDevice = lpCommDevice; 
  _ForceActive  = FActive; 
 
  TMsgStrings Msg; 
  Caption             = Msg.MsgPortSet  ; //"端口设置" 
  GboxBase->Caption   = Msg.StrGbxBase  ; //"端口选项" 
  GBoxModem->Caption  = Msg.StrGbxModem ; //"调制解调器选项" 
  GBoxBuffer->Caption = Msg.StrGbxBuffer; //"缓存容量" 
  BnDefault->Caption  = Msg.MsgDefault  ; //"默认" 
  BnOK->Caption       = Msg.MsgOK       ; //"确定" 
  BnCancel->Caption   = Msg.MsgCancel   ; //"取消" 
 
  lbPort ->Caption = Msg.MsgPort  ; //"端口" 
  lbBaud ->Caption = Msg.MsgBaud  ; //"波特率" 
  lbCheck->Caption = Msg.MsgCheck ; //"校验" 
  lbBits ->Caption = Msg.MsgBits  ; //"数据位" 
  lbStops->Caption = Msg.MsgStops ; //"停止位" 
  lbFlow ->Caption = Msg.MsgFlow  ; //"数据流控" 
  lbAAns ->Caption = Msg.MsgAAns  ; //"自动应答" 
  lbInbs ->Caption = Msg.MsgInBuf ; //"输入缓存" 
  lbOutbs->Caption = Msg.MsgOutBuf; //"输出缓存" 
 
  TCommSerialPortInfo spi; 
  CbPort->Clear(); 
  for(int i=0; iCount; i++) 
    CbPort->Items->Add(spi.PortList->Strings[i]); 
 
  CbParity->Clear(); 
  CbParity->Items->Add(Msg.MsgNoParity); //"No parity (无)" 
  CbParity->Items->Add(Msg.MsgOdd     ); //"Odd (奇)" 
  CbParity->Items->Add(Msg.MsgEven    ); //"Even (偶)" 
  CbParity->Items->Add(Msg.MsgMark    ); //"Mark (标记)" 
 
  CbFlow->Clear(); 
  CbFlow->Items->Add(Msg.MsgNone   ); //"None (无)" 
  CbFlow->Items->Add(Msg.MsgRtsCts ); //"RTS/CTS (硬件)" 
  CbFlow->Items->Add(Msg.MsgXonXoff); //"Xon/Xoff (软件)" 
  CbFlow->Items->Add(Msg.MsgRtsXon ); //"RTS/CTS & Xon/Xoff (硬件和软件)" 
 
  _OldActive      = _YbCommDevice->Active; 
  _OldPortNo      = _YbCommDevice->PortNo; 
  _OldBaud        = _YbCommDevice->Baud; 
  _OldByteSize    = _YbCommDevice->ByteSize; 
  _OldParity      = _YbCommDevice->Parity; 
  _OldStopBits    = _YbCommDevice->StopBits; 
  _OldFlowControl = _YbCommDevice->FlowControl; 
  _OldAutoAAns    = _YbCommDevice->AutoAnswer; 
  _OldInBufSize   = _YbCommDevice->InBufSize; 
  _OldOutBufSize  = _YbCommDevice->OutBufSize; 
 
  CbPort->ItemIndex = CbPort->Items->IndexOf(TCommSerialPortInfo::PortName(_OldPortNo)); 
 
  switch(_OldBaud) 
   { 
     case TYbCommDevice::br110   : CbSelBaud->ItemIndex =  0; break; 
     case TYbCommDevice::br300   : CbSelBaud->ItemIndex =  1; break; 
     case TYbCommDevice::br600   : CbSelBaud->ItemIndex =  2; break; 
     case TYbCommDevice::br1200  : CbSelBaud->ItemIndex =  3; break; 
     case TYbCommDevice::br2400  : CbSelBaud->ItemIndex =  4; break; 
     case TYbCommDevice::br4800  : CbSelBaud->ItemIndex =  5; break; 
     case TYbCommDevice::br9600  : CbSelBaud->ItemIndex =  6; break; 
     case TYbCommDevice::br14400 : CbSelBaud->ItemIndex =  7; break; 
     case TYbCommDevice::br19200 : CbSelBaud->ItemIndex =  8; break; 
     case TYbCommDevice::br38400 : CbSelBaud->ItemIndex =  9; break; 
     case TYbCommDevice::br56000 : CbSelBaud->ItemIndex = 10; break; 
     case TYbCommDevice::br57600 : CbSelBaud->ItemIndex = 11; break; 
     case TYbCommDevice::br115200: CbSelBaud->ItemIndex = 12; break; 
     case TYbCommDevice::br128000: CbSelBaud->ItemIndex = 13; break; 
     case TYbCommDevice::br256000: CbSelBaud->ItemIndex = 14; break;  
   } 
 
  CbByteSize->ItemIndex = _OldByteSize-5; 
 
  switch(_OldParity) 
   { 
     case TYbCommDevice::ptNoParity  : CbParity->ItemIndex = 0; break; 
     case TYbCommDevice::ptOddParity : CbParity->ItemIndex = 1; break; 
     case TYbCommDevice::ptEvenParity: CbParity->ItemIndex = 2; break; 
     case TYbCommDevice::ptMarkParity: CbParity->ItemIndex = 3; break; 
     default                         : CbParity->ItemIndex =-1; break; 
   } 
 
  switch(_OldStopBits) 
   { 
     case TYbCommDevice::sbOneStopBit    : CbStopBits->ItemIndex = 0; break; 
     case TYbCommDevice::sbOne_5_StopBits: CbStopBits->ItemIndex = 1; break; 
     case TYbCommDevice::sbTwoStopBit    : CbStopBits->ItemIndex = 2; break; 
     default                             : CbStopBits->ItemIndex =-1; break; 
   } 
 
  switch(_OldFlowControl) 
   { 
     case TYbCommDevice::fcRtsCts:        CbFlow->ItemIndex = 1; break; //Rts/Cts 
     case TYbCommDevice::fcXonXoff:       CbFlow->ItemIndex = 2; break; //Xon/Xoff 
     case TYbCommDevice::fcTranXonXoff:   CbFlow->ItemIndex = 2; break; //Xon/Xoff 
     case TYbCommDevice::fcRtsCtsXonXoff: CbFlow->ItemIndex = 3; break; //Both 
     default:                             CbFlow->ItemIndex = 0; break; //None 
   } 
 
  EditAutoAns->Text = (int)_OldAutoAAns; 
  EditInBufSize->Text = _OldInBufSize; 
  EditOutBufSize->Text = _OldOutBufSize; 
} 
//--------------------------------------------------------------------------- 
void __fastcall TFormCommSettings::BnDefaultClick(TObject *Sender) 
{ 
  CbSelBaud->ItemIndex  = 12;   //TYbCommDevice::br115200; 
  CbParity->ItemIndex   = 0;    //TYbCommDevice::ptNoParity; 
  CbByteSize->ItemIndex = 8 - 5; 
  CbStopBits->ItemIndex = 0;    //TYbCommDevice::sbOneStopBit; 
  CbFlow->ItemIndex     = 0;    //TYbCommDevice::fcNone; 
  EditAutoAns->Text     = 0;    //No Auto Answer 
  EditInBufSize->Text   = 8192; //8kbytes 
  EditOutBufSize->Text  = 8192; //8kbytes 
} 
//--------------------------------------------------------------------------- 
void __fastcall TFormCommSettings::BnOKClick(TObject *Sender) 
{ 
  if(MoveCtrlFocus()) 
    return; //move focus 
 
  int  NewPortNo, NewByteSize, NewAutoAAns; 
  long NewInBufSize, NewOutBufSize; 
  TYbCommDevice::TBaudRate NewBaud; 
  TYbCommDevice::TParity    NewParity; 
  TYbCommDevice::TStopBits   NewStopBits; 
  TYbCommDevice::TFlowControl NewFlowControl; 
  AnsiString s; 
  TMsgStrings Msg; 
 
  //选择端口 
  if(CbPort->ItemIndex<0) 
   { 
     CbPort->SetFocus(); //"必须选择端口" 
     Application->MessageBox(Msg.ErrSelPort.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
     return; 
   } 
  NewPortNo = TCommSerialPortInfo::PortNo(CbPort->Items->Strings[CbPort->ItemIndex]); 
 
  //设置波特率 
  switch(CbSelBaud->ItemIndex) 
   { 
     case  0: NewBaud = TYbCommDevice::br110   ; break; 
     case  1: NewBaud = TYbCommDevice::br300   ; break; 
     case  2: NewBaud = TYbCommDevice::br600   ; break; 
     case  3: NewBaud = TYbCommDevice::br1200  ; break; 
     case  4: NewBaud = TYbCommDevice::br2400  ; break; 
     case  5: NewBaud = TYbCommDevice::br4800  ; break; 
     case  6: NewBaud = TYbCommDevice::br9600  ; break; 
     case  7: NewBaud = TYbCommDevice::br14400 ; break; 
     case  8: NewBaud = TYbCommDevice::br19200 ; break; 
     case  9: NewBaud = TYbCommDevice::br38400 ; break; 
     case 10: NewBaud = TYbCommDevice::br56000 ; break; 
     case 11: NewBaud = TYbCommDevice::br57600 ; break; 
     case 12: NewBaud = TYbCommDevice::br115200; break; 
     case 13: NewBaud = TYbCommDevice::br128000; break; 
     case 14: NewBaud = TYbCommDevice::br256000; break; 
     default: CbSelBaud->SetFocus(); //"必须输入/选择波特率" 
              Application->MessageBox(Msg.ErrSelBaud.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
              return; 
   } 
 
  //数据位数 
  if(CbByteSize->ItemIndex<0) 
   { 
     CbByteSize->SetFocus(); //"必须选择数据位" 
     Application->MessageBox(Msg.ErrSelBits.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
     return; 
   } 
  NewByteSize = CbByteSize->ItemIndex+5; 
 
  //校验位 
  switch(CbParity->ItemIndex) 
   { 
     case  0: NewParity = TYbCommDevice::ptNoParity  ; break; 
     case  1: NewParity = TYbCommDevice::ptOddParity ; break; 
     case  2: NewParity = TYbCommDevice::ptEvenParity; break; 
     case  3: NewParity = TYbCommDevice::ptMarkParity; break; 
     default: CbParity->SetFocus(); //"必须选择奇偶校验" 
              Application->MessageBox(Msg.ErrSelCheck.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
              return; 
   } 
 
  //停止位 
  switch(CbStopBits->ItemIndex) 
   { 
     case  0: NewStopBits = TYbCommDevice::sbOneStopBit    ; break; 
     case  1: NewStopBits = TYbCommDevice::sbOne_5_StopBits; break; 
     case  2: NewStopBits = TYbCommDevice::sbTwoStopBit    ; break; 
     default: CbStopBits->SetFocus(); //"必须选择停止位" 
              Application->MessageBox(Msg.ErrSelStops.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
              return; 
   } 
 
  //数据流控 
  switch(CbFlow->ItemIndex) 
   { 
     case  0: NewFlowControl = TYbCommDevice::fcNone         ; break; 
     case  1: NewFlowControl = TYbCommDevice::fcRtsCts       ; break; 
     case  2: NewFlowControl = TYbCommDevice::fcXonXoff      ; break; 
     case  3: NewFlowControl = TYbCommDevice::fcRtsCtsXonXoff; break; 
     default: CbFlow->SetFocus(); //"必须选择数据流控制" 
              Application->MessageBox(Msg.ErrSelFlow.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
              return; 
   } 
 
  //自动应答 
  try 
   { 
     s = EditAutoAns->Text.Trim(); 
     if(s.IsEmpty()) 
       throw Exception(Msg.ErrInvAAns); 
     int ians = StrToInt(s); 
     if((ians<0)||(ians>255)) 
       throw Exception(Msg.ErrInvAAns); 
     NewAutoAAns = ians; 
   } 
  catch(Exception &e) 
   { 
     EditAutoAns->SetFocus(); 
     Application->MessageBox(Msg.ErrInvAAns.c_str(),Caption.c_str(),MB_OK|MB_ICONSTOP); 
     return; 
   } 
 
  //输入缓存 
  try 
   { 
     s = EditInBufSize->Text.Trim(); 
     if(s.IsEmpty()) 
       throw Exception(Msg.ErrInvInBuf); 
     NewInBufSize = StrToInt(s); 
     if(NewInBufSize<4096) 
       throw Exception(Msg.ErrInvInBuf); 
   } 
  catch(Exception &e) 
   { 
     EditInBufSize->SetFocus(); 
     Application->MessageBox(Msg.ErrInvInBuf.c_str(),Caption.c_str(),MB_OK|MB_ICONSTOP); 
     return; 
   } 
 
  //输出缓存 
  try 
   { 
     s = EditOutBufSize->Text.Trim(); 
     if(s.IsEmpty()) 
       throw Exception(Msg.ErrInvOutBuf); 
     NewOutBufSize = StrToInt(s); 
     if(NewOutBufSize<4096) 
       throw Exception(Msg.ErrInvOutBuf); 
   } 
  catch(Exception &e) 
   { 
     EditOutBufSize->SetFocus(); 
     Application->MessageBox(Msg.ErrInvOutBuf.c_str(),Caption.c_str(),MB_OK|MB_ICONSTOP); 
     return; 
   } 
 
  //设置参数 
  try 
   { 
     _YbCommDevice->PortNo      = NewPortNo; 
     _YbCommDevice->Baud        = NewBaud; 
     _YbCommDevice->Parity      = NewParity; 
     _YbCommDevice->ByteSize    = NewByteSize; 
     _YbCommDevice->StopBits    = NewStopBits; 
     _YbCommDevice->FlowControl = NewFlowControl; 
     _YbCommDevice->AutoAnswer  = NewAutoAAns; 
     _YbCommDevice->InBufSize   = NewInBufSize; 
     _YbCommDevice->OutBufSize  = NewOutBufSize; 
     _YbCommDevice->Active      = _OldActive||_ForceActive; 
     ModalResult = IDOK; 
   } 
  catch(Exception &e) 
   { 
     try 
      { 
        _YbCommDevice->PortNo      = _OldPortNo; 
        _YbCommDevice->Baud        = _OldBaud; 
        _YbCommDevice->Parity      = _OldParity; 
        _YbCommDevice->ByteSize    = _OldByteSize; 
        _YbCommDevice->StopBits    = _OldStopBits; 
        _YbCommDevice->FlowControl = _OldFlowControl; 
        _YbCommDevice->AutoAnswer  = _OldAutoAAns; 
        _YbCommDevice->InBufSize   = _OldInBufSize; 
        _YbCommDevice->OutBufSize  = _OldOutBufSize; 
        _YbCommDevice->Active      = _OldActive; 
      } 
     catch(...) 
      { 
        //do nothing, ignore this error 
      } 
     CbPort->SetFocus(); 
     MessageBox(Handle, e.Message.c_str(), Caption.c_str(), MB_OK|MB_ICONSTOP); 
   } 
} 
//--------------------------------------------------------------------------- 
bool __fastcall TFormCommSettings::MoveCtrlFocus(void) 
{ 
  if(ActiveControl == CbPort       ){ ActiveControl = CbSelBaud     ; return true; } 
  if(ActiveControl == CbSelBaud    ){ ActiveControl = CbParity      ; return true; } 
  if(ActiveControl == CbParity     ){ ActiveControl = CbByteSize    ; return true; } 
  if(ActiveControl == CbByteSize   ){ ActiveControl = CbStopBits    ; return true; } 
  if(ActiveControl == CbStopBits   ){ ActiveControl = CbFlow        ; return true; } 
  if(ActiveControl == CbFlow       ){ ActiveControl = EditAutoAns   ; return true; } 
  if(ActiveControl == EditAutoAns  ){ ActiveControl = EditInBufSize ; return true; } 
  if(ActiveControl == EditInBufSize){ ActiveControl = EditOutBufSize; return true; } 
  return false; 
} 
//--------------------------------------------------------------------------- 
void __fastcall TFormCommSettings::BnCancelClick(TObject *Sender) 
{ 
  ModalResult = IDCANCEL; 
} 
//--------------------------------------------------------------------------- 
__fastcall TFormCommSettings::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 TFormCommSettings::TMsgStrings::fGetMsg(int mt) 
{ 
  return AppLang.FromGBK(_Msg[mt]); 
} 
//--------------------------------------------------------------------------- 
char *TFormCommSettings::TMsgStrings::_Msg_Chs[] = 
{ 
  "确定"                         , // 0 MsgOK 
  "取消"                         , // 1 MsgCancel 
  "端口设置"                     , // 2 MsgPortSet 
  "端口"                         , // 3 MsgPort 
  "波特率"                       , // 4 MsgBaud 
  "奇偶校验"                     , // 5 MsgCheck 
  "数据位"                       , // 6 MsgBits 
  "停止位"                       , // 7 MsgStops 
  "数据流控"                     , // 8 MsgFlow 
  "No parity (无)"               , // 9 MsgNoParity 
  "Odd (奇)"                     , //10 MsgOdd 
  "Even (偶)"                    , //11 MsgEven 
  "Mark (标记)"                  , //12 MsgMark 
  "None (无)"                    , //13 MsgNone 
  "RTS/CTS (硬件)"               , //14 MsgRtsCts 
  "Xon/Xoff (软件)"              , //15 MsgXonXoff 
  "RTS/CTS & Xon/Xoff (硬&软)"   , //16 MsgRtsXon 
  "必须选择端口"                 , //17 ErrSelPort 
  "必须输入/选择波特率"          , //18 ErrSelBaud 
  "无效的波特率"                 , //19 ErrInvBaud 
  "必须选择数据位"               , //20 ErrSelBits 
  "必须选择奇偶校验"             , //21 ErrSelCheck 
  "必须选择停止位"               , //22 ErrSelStops 
  "必须选择数据流控制"           , //23 ErrSelFlow 
  "关于"                         , //24 MsgAbout 
  "默认"                         , //25 MsgDefault 
  "端口选项"                     , //26 StrGbxBase 
  "调制解调器选项"               , //27 StrGbxModem 
  "缓存容量"                     , //28 StrGbxBuffer 
  "自动应答"                     , //29 MsgAAns 
  "输入缓存"                     , //30 MsgInBuf 
  "输出缓存"                     , //31 MsgOutBuf 
  "自动应答必须是 0 - 255 的整数", //32 ErrInvAAns 
  "输入缓存容量错误"             , //33 ErrInvInBuf 
  "输出缓存容量错误"             , //34 ErrInvOutBuf 
}; 
//--------------------------------------------------------------------------- 
char *TFormCommSettings::TMsgStrings::_Msg_Cht[] = 
{ 
  "確定"                         , // 0 MsgOK 
  "取消"                         , // 1 MsgCancel 
  "串列埠設置"                   , // 2 MsgPortSet 
  "串 列 埠"                     , // 3 MsgPort 
  "傳輸速率"                     , // 4 MsgBaud 
  "奇偶校驗"                     , // 5 MsgCheck 
  "資料位元"                     , // 6 MsgBits 
  "停止位元"                     , // 7 MsgStops 
  "資料流控"                     , // 8 MsgFlow 
  "No parity (無)"               , // 9 MsgNoParity 
  "Odd (奇)"                     , //10 MsgOdd 
  "Even (偶)"                    , //11 MsgEven 
  "Mark (標記)"                  , //12 MsgMark 
  "None (無)"                    , //13 MsgNone 
  "RTS/CTS (硬體)"               , //14 MsgRtsCts 
  "Xon/Xoff (軟體)"              , //15 MsgXonXoff 
  "RTS/CTS & Xon/Xoff (硬&軟)"   , //16 MsgRtsXon 
  "必須選擇串列埠"               , //17 ErrSelPort 
  "必須輸入/選擇串列傳輸速率"    , //18 ErrSelBaud 
  "無效的串列傳輸速率"           , //19 ErrInvBaud 
  "必須選擇資料位元"             , //20 ErrSelBits 
  "必須選擇奇偶校驗"             , //21 ErrSelCheck 
  "必須選擇停止位元"             , //22 ErrSelStops 
  "必須選擇資料流程控制"         , //23 ErrSelFlow 
  "關於"                         , //24 MsgAbout 
  "默認"                         , //25 MsgDefault 
  "埠選項"                       , //26 StrGbxBase 
  "數據機選項"                   , //27 StrGbxModem 
  "緩存容量"                     , //28 StrGbxBuffer 
  "自動回應"                     , //29 MsgAAns 
  "輸入緩存"                     , //30 MsgInBuf 
  "輸出緩存"                     , //31 MsgOutBuf 
  "自動回應必須是 0 - 255 的整數", //32 ErrInvAAns 
  "輸入緩存容量錯誤"             , //33 ErrInvInBuf 
  "輸出緩存容量錯誤"             , //34 ErrInvOutBuf 
}; 
//--------------------------------------------------------------------------- 
char *TFormCommSettings::TMsgStrings::_Msg_Enu[] = 
{ 
  "&OK"                       , // 0 MsgOK 
  "&Cancel"                   , // 1 MsgCancel 
  "COM port Setup"            , // 2 MsgPortSet 
  "COM port"                  , // 3 MsgPort 
  "Baud"                      , // 4 MsgBaud 
  "Parity"                    , // 5 MsgCheck 
  "Byte Size"                 , // 6 MsgBits 
  "Stop Bits"                 , // 7 MsgStops 
  "Flow Control"              , // 8 MsgFlow 
  "No parity"                 , // 9 MsgNoParity 
  "Odd"                       , //10 MsgOdd 
  "Even"                      , //11 MsgEven 
  "Mark"                      , //12 MsgMark 
  "None"                      , //13 MsgNone 
  "RTS/CTS"                   , //14 MsgRtsCts 
  "Xon/Xoff"                  , //15 MsgXonXoff 
  "RTS/CTS & Xon/Xoff"        , //16 MsgRtsXon 
  "Must select COM Port"      , //17 ErrSelPort 
  "Must select baud rate"     , //18 ErrSelBaud 
  "Invalid baud rate"         , //19 ErrInvBaud 
  "Must select byte size"     , //20 ErrSelBits 
  "Must select parity check"  , //21 ErrSelCheck 
  "Must select stop bits"     , //22 ErrSelStops 
  "Must select flow control"  , //23 ErrSelFlow 
  "&About"                    , //24 MsgAbout 
  "&Default"                  , //25 MsgDefault 
  "Port"                      , //26 StrGbxBase 
  "Modem"                     , //27 StrGbxModem 
  "Buffer"                    , //28 StrGbxBuffer 
  "Auto Answer"               , //29 MsgAAns 
  "Input Buf."                , //30 MsgInBuf 
  "Output Buf."               , //31 MsgOutBuf 
  "Auto Answer: 0 - 255"      , //32 ErrInvAAns 
  "Input Buffer size error"   , //33 ErrInvInBuf 
  "Output Buffer size error"  , //34 ErrInvOutBuf 
}; 
//---------------------------------------------------------------------------