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


//---------------------------------------------------------------------------

#include <vcl.h>
#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; i<spi.PortList->Count; 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 &amt; 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 &amt;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 &amt;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 &amt;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 &amt;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 &amt; Xon/Xoff (硬&amt;软)" , //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 &amt; Xon/Xoff (硬&amt;軟)" , //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[] =
{
"&amt;OK" , // 0 MsgOK
"&amt;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 &amt; 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
"&amt;About" , //24 MsgAbout
"&amt;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
};
//---------------------------------------------------------------------------