PIS0030MF.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <winsock2.h>
  4. #include "ITSSkinF.h"
  5. #include "ITSUtilF.h"
  6. #include "AppGlobalF.h"
  7. #include "CenterCommF.h"
  8. #include "CDSFacilityF.h"
  9. #include "ITSLangTransF.h"
  10. #pragma hdrstop
  11. #include "PIS0030MF.h"
  12. //---------------------------------------------------------------------------
  13. #pragma package(smart_init)
  14. #pragma link "cxButtons"
  15. #pragma link "cxClasses"
  16. #pragma link "cxContainer"
  17. #pragma link "cxControls"
  18. #pragma link "cxCustomData"
  19. #pragma link "cxData"
  20. #pragma link "cxDataStorage"
  21. #pragma link "cxEdit"
  22. #pragma link "cxFilter"
  23. #pragma link "cxGraphics"
  24. #pragma link "cxGrid"
  25. #pragma link "cxGridCustomTableView"
  26. #pragma link "cxGridCustomView"
  27. #pragma link "cxGridLevel"
  28. #pragma link "cxGridTableView"
  29. #pragma link "cxGroupBox"
  30. #pragma link "cxLabel"
  31. #pragma link "cxLookAndFeelPainters"
  32. #pragma link "cxLookAndFeels"
  33. #pragma link "cxStyles"
  34. #pragma link "dxSkinBlack"
  35. #pragma link "dxSkinBlue"
  36. #pragma link "dxSkinsCore"
  37. #pragma link "dxSkinscxPCPainter"
  38. #pragma resource "*.dfm"
  39. TPIS0030M *PIS0030M = NULL;
  40. //---------------------------------------------------------------------------
  41. __fastcall TPIS0030M::TPIS0030M(TComponent* Owner)
  42. : TForm(Owner)
  43. {
  44. LangTrans->Translate(this, ITSDb_GetConnection());
  45. ITSSkin_Load(this);
  46. CMM_LoadForm(g_sFormsDir, this);
  47. FTitle = "주차장 제어";
  48. FReqSeq = 0;
  49. }
  50. //---------------------------------------------------------------------------
  51. void __fastcall TPIS0030M::CommClose()
  52. {
  53. try
  54. {
  55. CMM_SaveForm(g_sFormsDir, this);
  56. }
  57. catch(...)
  58. {
  59. }
  60. }
  61. //---------------------------------------------------------------------------
  62. void __fastcall TPIS0030M::FormShow(TObject *Sender)
  63. {
  64. Refresh();
  65. FormInit();
  66. TmrShow->Enabled = true;
  67. }
  68. //---------------------------------------------------------------------------
  69. void __fastcall TPIS0030M::FormInit()
  70. {
  71. LoadParkServerInfo();
  72. RefreshData();
  73. }
  74. //---------------------------------------------------------------------------
  75. void __fastcall TPIS0030M::TmrShowTimer(TObject *Sender)
  76. {
  77. TmrShow->Enabled = false;
  78. }
  79. //---------------------------------------------------------------------------
  80. void __fastcall TPIS0030M::BtnCloseClick(TObject *Sender)
  81. {
  82. Close();
  83. }
  84. //---------------------------------------------------------------------------
  85. void __fastcall TPIS0030M::FormClose(TObject *Sender, TCloseAction &Action)
  86. {
  87. CommClose();
  88. PIS0030M = NULL;
  89. Action = caFree;
  90. }
  91. //---------------------------------------------------------------------------
  92. void __fastcall TPIS0030M::BtnControlClick(TObject *Sender)
  93. {
  94. #ifdef USE_PARKxx
  95. if (CTLR_MNGM_NMBR->Text == "")
  96. {
  97. Application->MessageBox(L"주차장을 선택하지 않았습니다.", FTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  98. CxList->SetFocus();
  99. return;
  100. }
  101. if (COMM_STATE->Text != "정상")
  102. {
  103. Application->MessageBox(L"통신상태가 정상이 아닌 주차장으로는 주차면수 초기화명령을 전송할 수 없습니다.", FTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  104. return;
  105. }
  106. if (Application->MessageBox(L"주차장 주차면수 초기화 명령 확인\r\n선택한 주차장에 대하여 주차면수 초기화 명령을 전송하시겠습니까??",
  107. FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES) return;
  108. AnsiString sIpAddress = FIpAddress;
  109. int nPort = FPort;
  110. AnsiString sId;
  111. P_INIT_PARKING *pInfo;
  112. P_REQ_INIT_PARKING data;
  113. memset((char*) & data, 0x00, sizeof(P_REQ_INIT_PARKING));
  114. int ADataLen;
  115. data.Count = 1;
  116. pInfo = &data.Info[0];
  117. sId = CTLR_MNGM_NMBR->Text;
  118. sprintf(pInfo->Id, "%.*s", P_PARKING_ID_SIZE, sId.c_str()); // Id
  119. //pInfo->Total = (DWORD)StrToIntDef(Edit1->Text.Trim(), 0); // 총 주차여유 면수 주차장 전체 여유 면수 4 N
  120. pInfo->General = (DWORD)StrToIntDef(Edit2->Text.Trim(), 0); // 일반 주차여유 면수 일반 차량 주차 여유 면수 4 N
  121. pInfo->Disabled = (DWORD)StrToIntDef(Edit3->Text.Trim(), 0); // 장애인 주차여유 면수 장애인 차량 주차 여유 면수 4 N
  122. pInfo->Small = (DWORD)StrToIntDef(Edit4->Text.Trim(), 0); // 경차 주차여유 면수 경차 주차 여유 면수 4 N
  123. pInfo->Woman = (DWORD)StrToIntDef(Edit5->Text.Trim(), 0); // 여성전용 주차여유 면수 여성전용 주차여유 면수 4 N
  124. pInfo->Electric = (DWORD)StrToIntDef(Edit6->Text.Trim(), 0); // 전기차 주차여유 면수 전기차 전용 주차여유 면수 4 N
  125. pInfo->Total = pInfo->General +
  126. pInfo->Disabled +
  127. pInfo->Small +
  128. pInfo->Woman +
  129. pInfo->Electric;
  130. #if 0
  131. pInfo->Total = 200; // 총 주차여유 면수 주차장 전체 여유 면수 4 N
  132. pInfo->General = 0; // 일반 주차여유 면수 일반 차량 주차 여유 면수 4 N
  133. pInfo->Disabled = 14; // 장애인 주차여유 면수 장애인 차량 주차 여유 면수 4 N
  134. pInfo->Small = 10; // 경차 주차여유 면수 경차 주차 여유 면수 4 N
  135. pInfo->Woman = 22; // 여성전용 주차여유 면수 여성전용 주차여유 면수 4 N
  136. pInfo->Electric = 12; // 전기차 주차여유 면수 전기차 전용 주차여유 면수 4 N
  137. #endif
  138. ADataLen = 1 + (data.Count*sizeof(P_INIT_PARKING));
  139. P_INT_PACKET PKT;
  140. memset((char*) & PKT, 0x00, sizeof(P_INT_HEADER_SIZE));
  141. PKT.head.SendId = P_INT_ID_MAIN_OPER; /* 송신 시스템 ID */
  142. PKT.head.RecvId = P_INT_ID_PARK_SERVER; /* 수신 시스템 ID */
  143. PKT.head.TotalFrame = 1; /* 전체 프레임 갯수 */
  144. PKT.head.CurrentFrame = 1; /* 현재 프레임 번호 */
  145. PKT.head.Reserved = 0x00; /* Reserved */
  146. PKT.head.OPCode = INT_OP_PROC_EVENT; // INT_OP_COMM_COMMON; /* 명령어 */
  147. PKT.head.Length = htonl(ADataLen + 2); /* 데이터의 길이 */
  148. PKT.data.Data[0] = INT_OP_PARKING_INIT;
  149. PKT.data.Data[1] = 0X00;
  150. #if 0
  151. memcpy(&PKT.data.Data[2], (char*) & data, ADataLen);
  152. int result = CenterSendMessageB(sIpAddress, nPort, (char*) & PKT, P_INT_HEADER_SIZE + ADataLen + 2);
  153. Application->MessageBox(L"주차면수 초기화 제어명령을 전송 하였습니다.", FTitle.c_str(), MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);
  154. #endif
  155. #endif
  156. }
  157. //---------------------------------------------------------------------------
  158. void __fastcall TPIS0030M::OnMainFormMessage(TMessage &Msg)
  159. {
  160. #if 0
  161. IPCUDPMESSAGESTRUCT *pMsg; // 메시지 구조체
  162. IPCUDPDATASTRUCT *pPkt; // 내부 통신 패킷 구조체
  163. UNION_INT_DATA *pData; // 내부 통신 데이터부 구조체
  164. pMsg = (IPCUDPMESSAGESTRUCT*)Msg.LParam;
  165. pPkt = &pMsg->Frame;
  166. pData = &pPkt->Data.unData;
  167. switch(Msg.WParam)
  168. {
  169. case INT_OP_RSE_CONTROL_RES: /* 0xC1, RSE 제어정보 응답 */
  170. {
  171. INT_RSE_CONTROL_RES *pRseCtl;
  172. pRseCtl = (INT_RSE_CONTROL_RES*)pData;
  173. String sResId = String(pRseCtl->Head.RseId);
  174. String sResSeq = String(pRseCtl->Head.Seq);
  175. int nResult = pRseCtl->Data.ResType;
  176. try {
  177. TvResult->BeginUpdate();
  178. int nRowCnt = TvResult->ViewData->RecordCount;
  179. for (int ii = 0; ii < nRowCnt; ii++)
  180. {
  181. TcxCustomGridRow* ARow = FRAMEDsrcList1->TvList->ViewData->Rows[ii];
  182. if (((bool)ARow->Values[FRAMEDsrcList1->ColumnSel->Index]))
  183. {
  184. String sId = VarToStr(ARow->Values[ColResult1->Index]);
  185. String sSeq = VarToStr(ARow->Values[ColResult2->Index]);
  186. if (sResId == sId && sResSeq == sSeq) {
  187. String sResult = "Unknown";
  188. if (nResult == (int)INT_RSE_RESPONSE_SUCC)
  189. sResult = "성공";
  190. else if (nResult == (int)INT_RSE_RESPONSE_NACK)
  191. sResult = "실패";
  192. else if (nResult == (int)INT_RSE_RESPONSE_NONE)
  193. sResult = "응답없음";
  194. ARow->Values[ColResult4->Index] = sResult;
  195. break;
  196. }
  197. }
  198. }
  199. }
  200. __finally
  201. {
  202. TvResult->EndUpdate();
  203. }
  204. }
  205. break;
  206. default:
  207. break;
  208. } /* end switch */
  209. #endif
  210. }
  211. //---------------------------------------------------------------------------
  212. void __fastcall TPIS0030M::LoadParkServerInfo()
  213. {
  214. FIpAddress = "192.168.0.3";
  215. FPort = 4701;
  216. String sSvrID = "PARK01";
  217. String sIniFile = ChangeFileExt(ExtractFileName(Application->ExeName), ".ini");
  218. ReadConfigInfo(sIniFile, "APPLICATION", "PARKINGSERVERID", sSvrID);
  219. if (sSvrID == "")
  220. {
  221. sSvrID = "PARK01";
  222. }
  223. // 검색조건에 의한 링크 데이터 조회
  224. String sQry;
  225. TADOQuery *pADO = NULL;
  226. sQry = "SELECT A.* \r\n"
  227. " FROM TB_UNIT_SYST A \r\n"
  228. " WHERE A.SYST_ID = '" + sSvrID + "' \r\n";
  229. try
  230. {
  231. try
  232. {
  233. pADO = new TADOQuery(NULL);
  234. pADO->Close();
  235. pADO->Connection = ITSDb_GetConnection();
  236. pADO->SQL->Clear();
  237. pADO->SQL->Text = sQry;
  238. pADO->Open();
  239. for( ; !pADO->Eof; pADO->Next())
  240. {
  241. FIpAddress = pADO->FieldByName("SYST_IP_1")->AsString;
  242. FPort = pADO->FieldByName("PRGM_PORT")->AsString.ToIntDef(4701);
  243. }
  244. }
  245. catch(EDatabaseError &E)
  246. {
  247. throw Exception(String(E.ClassName()) + E.Message);
  248. }
  249. catch(Exception &exception)
  250. {
  251. throw Exception(String(exception.ClassName()) + exception.Message);
  252. }
  253. catch(...)
  254. {
  255. throw Exception(FrmLang->lblDbErr->Caption);//"[주차서버정보조회] 알수없는 DB 오류가 발생하였습니다.");
  256. }
  257. }
  258. __finally
  259. {
  260. if (pADO)
  261. {
  262. pADO->Close();
  263. delete pADO;
  264. }
  265. }
  266. }
  267. //---------------------------------------------------------------------------
  268. void __fastcall TPIS0030M::RefreshData()
  269. {
  270. // 검색조건에 의한 링크 데이터 조회
  271. String sQry;
  272. TADOQuery *pADO = NULL;
  273. ClearForm();
  274. sQry = "SELECT A.PRLT_CTLR_ID, A.PRLT_NM, B.* \r\n"
  275. " FROM TB_PRLT_CTLR A, \r\n"
  276. " TB_PRLT_RT_INFR B \r\n"
  277. " WHERE A.REAL_DATA_YN = 'Y' \r\n"
  278. " AND A.PRLT_CTLR_NMBR = B.PRLT_CTLR_NMBR \r\n"
  279. " ORDER BY A.PRLT_CTLR_NMBR, B.FLOR_NMBR \r\n";
  280. CMM_ClearGridTableView(TvList);
  281. try
  282. {
  283. int nRow;
  284. TvList->BeginUpdate();
  285. try
  286. {
  287. int nORD;
  288. pADO = new TADOQuery(NULL);
  289. pADO->Close();
  290. pADO->Connection = ITSDb_GetConnection();
  291. pADO->SQL->Clear();
  292. pADO->SQL->Text = sQry;
  293. pADO->Open();
  294. for( ; !pADO->Eof; pADO->Next())
  295. {
  296. //실시간주차정보제공 하는 주차장만 제어가능
  297. String REAL_DATA_YN = pADO->FieldByName("REAL_DATA_YN")->AsString;
  298. if (REAL_DATA_YN != "Y") continue;
  299. nRow = TvList->DataController->AppendRecord();
  300. String PRLT_CTLR_ID = pADO->FieldByName("PRLT_CTLR_ID")->AsString;
  301. TvList->DataController->Values[nRow][Col11->Index] = PRLT_CTLR_ID;
  302. TvList->DataController->Values[nRow][Col12->Index] = pADO->FieldByName("PRLT_NM")->AsString;
  303. TvList->DataController->Values[nRow][Col00->Index] = pADO->FieldByName("FLOR_NMBR")->AsString;
  304. //TvList->DataController->Values[nRow][Col01->Index] = pADO->FieldByName("FLORNM")->AsString;
  305. //TvList->DataController->Values[nRow][Col02->Index] = pADO->FieldByName("UPDT_DT")->AsString;
  306. TvList->DataController->Values[nRow][Col02->Index] = ITSUtil_StrToDateTime(pADO->FieldByName("UPDT_DT")->AsString).FormatString(STR_DATETIME);
  307. TvList->DataController->Values[nRow][Col03->Index] = pADO->FieldByName("GNRL_RMND_PRZN_NUM")->AsString;
  308. TvList->DataController->Values[nRow][Col04->Index] = pADO->FieldByName("LGVH_RMND_PRZN_NUM")->AsString;
  309. TvList->DataController->Values[nRow][Col05->Index] = pADO->FieldByName("HVVH_RMND_PRZN_NUM")->AsString;
  310. TvList->DataController->Values[nRow][Col06->Index] = pADO->FieldByName("EMVH_RMND_PRZN_NUM")->AsString;
  311. TvList->DataController->Values[nRow][Col07->Index] = pADO->FieldByName("HNDC_RMND_PRZN_NUM")->AsString;
  312. TvList->DataController->Values[nRow][Col08->Index] = pADO->FieldByName("WMON_RMND_PRZN_NUM")->AsString;
  313. TvList->DataController->Values[nRow][Col09->Index] = pADO->FieldByName("ELVH_RMND_PRZN_NUM")->AsString;
  314. TvList->DataController->Values[nRow][Col10->Index] = pADO->FieldByName("ETC_RMND_PRZN_NUM")->AsString;
  315. TItsFacility *pObj = ItsFacilityManager->FLists.Find(PRLT_CTLR_ID);
  316. if (pObj)
  317. {
  318. if (pObj->FComm == state_error)
  319. TvList->DataController->Values[nRow][Col13->Index] = "장애";
  320. else
  321. TvList->DataController->Values[nRow][Col13->Index] = "정상";
  322. }
  323. else
  324. {
  325. TvList->DataController->Values[nRow][Col10->Index] = FrmLang->lblUnknown->Caption;//"알수없음";
  326. }
  327. }
  328. }
  329. catch(EDatabaseError &E)
  330. {
  331. throw Exception(String(E.ClassName()) + E.Message);
  332. }
  333. catch(Exception &exception)
  334. {
  335. throw Exception(String(exception.ClassName()) + exception.Message);
  336. }
  337. catch(...)
  338. {
  339. throw Exception(FrmLang->lblDbErr->Caption);//"[주차현황조회] 알수없는 DB 오류가 발생하였습니다.");
  340. }
  341. }
  342. __finally
  343. {
  344. if (pADO)
  345. {
  346. pADO->Close();
  347. delete pADO;
  348. }
  349. TvList->EndUpdate();
  350. //cxGroupBox3->Caption = "▶ 주차정보";// (최종가공시각: " + FRAMETrafficLinkList1->FLastAnsTime + ")";
  351. }
  352. }
  353. //---------------------------------------------------------------------------
  354. void __fastcall TPIS0030M::Edit1KeyPress(TObject *Sender, wchar_t &Key)
  355. {
  356. if (Key > '9' || Key < '0')
  357. {
  358. if (Key != VK_BACK && Key != VK_TAB && Key != VK_DELETE)
  359. Key = 0;
  360. }
  361. }
  362. //---------------------------------------------------------------------------
  363. void __fastcall TPIS0030M::BtnSearchClick(TObject *Sender)
  364. {
  365. Application->ProcessMessages();
  366. TSqlCursor sqlCrs((TControl*)BtnSearch);
  367. RefreshData();
  368. }
  369. //---------------------------------------------------------------------------
  370. void __fastcall TPIS0030M::Col13CustomDrawCell(TcxCustomGridTableView *Sender, TcxCanvas *ACanvas,
  371. TcxGridTableDataCellViewInfo *AViewInfo, bool &ADone)
  372. {
  373. if (AViewInfo->Value == "정상")
  374. {
  375. ACanvas->Canvas->Brush->Color = clWhite;
  376. ACanvas->Canvas->Font->Color = clBlack;
  377. }
  378. else
  379. {
  380. ACanvas->Canvas->Brush->Color = clRed;
  381. ACanvas->Canvas->Font->Color = clWhite;
  382. }
  383. }
  384. //---------------------------------------------------------------------------
  385. void __fastcall TPIS0030M::TvListCellClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  386. TMouseButton AButton, TShiftState AShift,
  387. bool &AHandled)
  388. {
  389. DisplayInfo();
  390. }
  391. //---------------------------------------------------------------------------
  392. void __fastcall TPIS0030M::TvListFocusedRecordChanged(TcxCustomGridTableView *Sender,
  393. TcxCustomGridRecord *APrevFocusedRecord, TcxCustomGridRecord *AFocusedRecord,
  394. bool ANewItemRecordFocusingChanged)
  395. {
  396. DisplayInfo();
  397. }
  398. //---------------------------------------------------------------------------
  399. void __fastcall TPIS0030M::DisplayInfo()
  400. {
  401. ClearForm();
  402. if (TvList->ViewData->RecordCount <= 0) return;
  403. int nIndex = TvList->DataController->FocusedRecordIndex;
  404. if (nIndex < 0) return;
  405. CTLR_MNGM_NMBR->Text = VarToStr(TvList->DataController->Values[nIndex][Col11->Index]);
  406. CTLR_MNGM_NM->Text = VarToStr(TvList->DataController->Values[nIndex][Col12->Index]);
  407. COMM_STATE->Text = VarToStr(TvList->DataController->Values[nIndex][Col10->Index]);
  408. #if 0
  409. int GNRL_RMND_PRZN_NUM = pObj->GENERAL; // N NUMBER(3) Y 0 일반 잔여 주차구역 개수
  410. int LGVH_RMND_PRZN_NUM = pObj->SMALL; // N NUMBER(3) Y 0 경차 잔여 주차구역 개수
  411. int HVVH_RMND_PRZN_NUM = 0; // N NUMBER(3) Y 0 대형 잔여 주차구역 개수
  412. int EMVH_RMND_PRZN_NUM = 0; // N NUMBER(3) Y 0 긴급차량 잔여 주차구역 개수
  413. int HNDC_RMND_PRZN_NUM = pObj->DISABLED; // N NUMBER(3) Y 0 장애인 잔여 주차구역 개수
  414. int WMON_RMND_PRZN_NUM = pObj->WOMAN; // N NUMBER(3) Y 0 여성전용 잔여 주차구역 개수
  415. int ETC_RMND_PRZN_NUM = pObj->ELECTRIC; // N NUMBER(3) Y 0 기타 잔여 주차구역 개수
  416. #endif
  417. Edit1->Text = "0";//VarToStr(TvList->DataController->Values[nIndex][Col09->Index]);
  418. Edit2->Text = VarToStr(TvList->DataController->Values[nIndex][Col03->Index]);
  419. Edit3->Text = VarToStr(TvList->DataController->Values[nIndex][Col07->Index]);
  420. Edit4->Text = VarToStr(TvList->DataController->Values[nIndex][Col04->Index]);
  421. Edit5->Text = VarToStr(TvList->DataController->Values[nIndex][Col08->Index]);
  422. Edit6->Text = VarToStr(TvList->DataController->Values[nIndex][Col09->Index]);
  423. if (COMM_STATE->Text == "정상")
  424. BtnControl->Enabled = true;
  425. else
  426. BtnControl->Enabled = false;
  427. }
  428. //---------------------------------------------------------------------------
  429. void __fastcall TPIS0030M::ClearForm()
  430. {
  431. CTLR_MNGM_NMBR->Text = "";
  432. CTLR_MNGM_NM->Text = "";
  433. COMM_STATE->Text = "-";
  434. #if 0
  435. Edit1// 총 주차여유 면수 주차장 전체 여유 면수 4 N
  436. Edit2// 일반 주차여유 면수 일반 차량 주차 여유 면수 4 N
  437. Edit3// 장애인 주차여유 면수 장애인 차량 주차 여유 면수 4 N
  438. Edit4// 경차 주차여유 면수 경차 주차 여유 면수 4 N
  439. Edit5// 여성전용 주차여유 면수 여성전용 주차여유 면수 4 N
  440. Edit6// 전기차 주차여유 면수 전기차 전용 주차여유 면수 4 N
  441. #endif
  442. Edit1->Text = "0";
  443. Edit2->Text = "0";
  444. Edit3->Text = "0";
  445. Edit4->Text = "0";
  446. Edit5->Text = "0";
  447. Edit6->Text = "0";
  448. BtnControl->Enabled = false;
  449. }
  450. //---------------------------------------------------------------------------