VMSM420MF.cpp 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304
  1. /****************************************************************************
  2. * @source :
  3. * @description :
  4. ****************************************************************************
  5. * DATE AUTHOR DESCRIPTION
  6. * --------------------------------------------------------------------------
  7. * 2016/07/10 shjung 최초작성
  8. *
  9. ****************************************************************************/
  10. //---------------------------------------------------------------------------
  11. #include <vcl.h>
  12. #include "ITSSkinF.h"
  13. #include "ITSUtilF.h"
  14. #include "AppGlobalF.h"
  15. #pragma hdrstop
  16. #include "VMSM420MF.h"
  17. //---------------------------------------------------------------------------
  18. #pragma package(smart_init)
  19. #pragma link "cxButtons"
  20. #pragma link "cxCalendar"
  21. #pragma link "cxContainer"
  22. #pragma link "cxControls"
  23. #pragma link "cxDropDownEdit"
  24. #pragma link "cxEdit"
  25. #pragma link "cxGraphics"
  26. #pragma link "cxGroupBox"
  27. #pragma link "cxLabel"
  28. #pragma link "cxLookAndFeelPainters"
  29. #pragma link "cxLookAndFeels"
  30. #pragma link "cxMaskEdit"
  31. #pragma link "cxPC"
  32. #pragma link "cxPCdxBarPopupMenu"
  33. #pragma link "cxSpinEdit"
  34. #pragma link "cxSplitter"
  35. #pragma link "cxTextEdit"
  36. #pragma link "cxTimeEdit"
  37. #pragma link "dxSkinBlack"
  38. #pragma link "dxSkinBlue"
  39. #pragma link "dxSkinCaramel"
  40. #pragma link "dxSkinCoffee"
  41. #pragma link "dxSkinDarkRoom"
  42. #pragma link "dxSkinDarkSide"
  43. #pragma link "dxSkinFoggy"
  44. #pragma link "dxSkinGlassOceans"
  45. #pragma link "dxSkiniMaginary"
  46. #pragma link "dxSkinLilian"
  47. #pragma link "dxSkinLiquidSky"
  48. #pragma link "dxSkinLondonLiquidSky"
  49. #pragma link "dxSkinMcSkin"
  50. #pragma link "dxSkinMoneyTwins"
  51. #pragma link "dxSkinOffice2007Black"
  52. #pragma link "dxSkinOffice2007Blue"
  53. #pragma link "dxSkinOffice2007Green"
  54. #pragma link "dxSkinOffice2007Pink"
  55. #pragma link "dxSkinOffice2007Silver"
  56. #pragma link "dxSkinOffice2010Black"
  57. #pragma link "dxSkinOffice2010Blue"
  58. #pragma link "dxSkinOffice2010Silver"
  59. #pragma link "dxSkinsCore"
  60. #pragma link "dxSkinscxPCPainter"
  61. #pragma link "dxSkinSeven"
  62. #pragma link "dxSkinSharp"
  63. #pragma link "dxSkinSilver"
  64. #pragma link "dxSkinStardust"
  65. #pragma link "cxRadioGroup"
  66. #pragma link "cxClasses"
  67. #pragma link "cxCustomData"
  68. #pragma link "cxData"
  69. #pragma link "cxDataStorage"
  70. #pragma link "cxDBData"
  71. #pragma link "cxFilter"
  72. #pragma link "cxGrid"
  73. #pragma link "cxGridCustomTableView"
  74. #pragma link "cxGridCustomView"
  75. #pragma link "cxGridDBTableView"
  76. #pragma link "cxGridLevel"
  77. #pragma link "cxGridTableView"
  78. #pragma link "cxStyles"
  79. #pragma link "cxCheckBox"
  80. #pragma link "cxImage"
  81. #pragma link "cxButtonEdit"
  82. #pragma link "cxBlobEdit"
  83. #pragma resource "*.dfm"
  84. TVMSM420M *VMSM420M = NULL;
  85. //---------------------------------------------------------------------------
  86. __fastcall TVMSM420M::TVMSM420M(TComponent* Owner)
  87. : TForm(Owner)
  88. {
  89. ITSSkin_Load(this);
  90. CMM_LoadForm(g_sFormsDir, this);
  91. FUpdate= false;
  92. FTitle = "VMS 소통정보 이미지관리";
  93. FListSymb = new TList;
  94. EditMode = false;
  95. APP_InitDisplayColor();
  96. TvList->OptionsView->DataRowHeight = 0;
  97. TvList->OptionsView->CellAutoHeight = true;
  98. TvList->OptionsView->Indicator = false;
  99. TvList->OptionsCustomize->ColumnMoving = false;
  100. TvList->OptionsCustomize->ColumnSorting = false;
  101. TvList->Columns[0]->Width = 60;
  102. TvList->Columns[0]->Options->HorzSizing = false;
  103. }
  104. //---------------------------------------------------------------------------
  105. /*
  106. * 닫기버튼 이나 x버튼 클릭시 공통으로 처리하는 로직이들어간다..
  107. * Form과 DataModule class를 delete시킨다.
  108. * arguments
  109. *
  110. * return
  111. * void
  112. */
  113. void __fastcall TVMSM420M::CommClose()
  114. {
  115. try
  116. {
  117. ClearSymbloList();
  118. SAFE_DELETE(FListSymb);
  119. CMM_SaveForm(g_sFormsDir, this);
  120. }
  121. catch(...)
  122. {
  123. }
  124. }
  125. //---------------------------------------------------------------------------
  126. /*
  127. * Form을 보여줄때 호출되는 event 메서드이다.
  128. * arguments
  129. * Sender : event handler 객체
  130. * return
  131. * void
  132. */
  133. void __fastcall TVMSM420M::FormShow(TObject *Sender)
  134. {
  135. Refresh();
  136. FormInit();
  137. ChangeEditMode(1);
  138. TmrShow->Enabled = true;
  139. }
  140. //---------------------------------------------------------------------------
  141. /*
  142. * form 초기화
  143. *
  144. * arguments
  145. *
  146. * return
  147. * void
  148. */
  149. void __fastcall TVMSM420M::FormInit()
  150. {
  151. EdNmbr->Text = "";
  152. EdExpl->Text = "";
  153. EdImageFileName->Text = "";
  154. ImgPreView->Picture->Bitmap->FreeImage();
  155. ImgPreView->Picture->Bitmap = NULL;
  156. ImgTemp->Picture->Bitmap->FreeImage();
  157. ImgTemp->Picture->Bitmap = NULL;
  158. SePosX->Value = 0;
  159. SePosY->Value = 0;
  160. SeCellId->Value = 1;
  161. CMM_ClearGridTableView(TvImageCell);
  162. FNewDb = false;
  163. }
  164. //---------------------------------------------------------------------------
  165. /*
  166. * Form이 Show되고 난 후 최초 1회 수행되는 타이머 이벤트
  167. * arguments
  168. * Sender : event handler 객체
  169. * return
  170. * void
  171. */
  172. void __fastcall TVMSM420M::TmrShowTimer(TObject *Sender)
  173. {
  174. TmrShow->Enabled = false;
  175. LoadImageSymbol();
  176. }
  177. //---------------------------------------------------------------------------
  178. /*
  179. * Close 버튼 클릭 이벤트 핸들러
  180. * arguments
  181. * Sender : event handler 객체
  182. * return
  183. * void
  184. */
  185. void __fastcall TVMSM420M::BtnCloseClick(TObject *Sender)
  186. {
  187. Close();
  188. }
  189. //---------------------------------------------------------------------------
  190. void __fastcall TVMSM420M::FormClose(TObject *Sender, TCloseAction &Action)
  191. {
  192. CommClose();
  193. VMSM420M = NULL;
  194. Action = caFree;
  195. }
  196. //---------------------------------------------------------------------------
  197. void __fastcall TVMSM420M::FormCloseQuery(TObject *Sender, bool &CanClose)
  198. {
  199. if (FUpdate)
  200. {
  201. POST_MSG(Application->MainForm->Handle, WM_DATABASE_REFRESH, WP_MSG_14, 0);
  202. }
  203. }
  204. //---------------------------------------------------------------------------
  205. void __fastcall TVMSM420M::DisplayInfo()
  206. {
  207. FormInit();
  208. int nRow = TvList->DataController->FocusedRecordIndex;
  209. if( nRow <= -1 )
  210. return;
  211. TcxGridDataController *pDc = TvList->DataController;
  212. nRow = pDc->FocusedRecordIndex;
  213. if (nRow < FListSymb->Count)
  214. {
  215. Graphics::TBitmap *bitmap = (Graphics::TBitmap*)FListSymb->Items[nRow];
  216. ImgPreView->Picture->Bitmap->Assign(bitmap);
  217. ImgTemp->Picture->Bitmap->Assign(bitmap);
  218. }
  219. EdNmbr->Text = VarToStr(pDc->Values[nRow][ColLink1->Index]);
  220. EdExpl->Text = VarToStr(pDc->Values[nRow][ColLink3->Index]);
  221. EdVmsCd->Text = VarToStr(pDc->Values[nRow][ColLink4->Index]);
  222. //셀정보 업데이트
  223. LoadImageSymbolCell(EdNmbr->Text);
  224. UpdateCellColor();
  225. ChangeEditMode(3);
  226. }
  227. //---------------------------------------------------------------------------
  228. void __fastcall TVMSM420M::BtnEditClick(TObject *Sender)
  229. {
  230. if (BtnEdit->Caption == MSG903)
  231. {
  232. ChangeEditMode(0);
  233. FNewDb = false;
  234. }
  235. else
  236. {
  237. String sId = EdNmbr->Text;
  238. ChangeEditMode(1);
  239. if (CMM_FindGridData(TvList->DataController, sId, ColLink1->Index) >= 0)
  240. {
  241. CMM_SetGridRow(CxList, TvList, sId, ColLink1->Index);
  242. DisplayInfo();
  243. }
  244. }
  245. }
  246. //---------------------------------------------------------------------------
  247. void __fastcall TVMSM420M::ChangeEditMode(int AEdit)
  248. {
  249. bool bEnabled = false;
  250. switch(AEdit)
  251. {
  252. case 0: //편집버튼클릭
  253. {
  254. BtnEdit->Enabled = true;
  255. BtnInsert->Enabled = false;
  256. BtnDelete->Enabled = false;
  257. BtnSave->Enabled = true;
  258. BtnEdit->Caption = MSG901;
  259. BtnEdit->Hint = MSG902;
  260. EditMode = true;
  261. EdImageFileName->Enabled = false;
  262. }
  263. break;
  264. case 1: //편집[취소]버튼클릭
  265. {
  266. FormInit(); //화면을 모두 지운다.
  267. BtnEdit->Enabled = false;
  268. BtnInsert->Enabled = true;
  269. BtnDelete->Enabled = false;
  270. BtnSave->Enabled = false;
  271. BtnEdit->Caption = MSG903;
  272. BtnEdit->Hint = MSG904;
  273. //bEnabled = true;
  274. EditMode = false;
  275. EdImageFileName->Enabled = false;
  276. }
  277. break;
  278. case 2: //추가
  279. {
  280. BtnEdit->Enabled = true;
  281. BtnInsert->Enabled = false;
  282. BtnDelete->Enabled = false;
  283. BtnSave->Enabled = true;
  284. BtnEdit->Caption = MSG901;
  285. BtnEdit->Hint = MSG902;
  286. EditMode = true;
  287. EdImageFileName->Enabled = true;
  288. }
  289. break;
  290. case 3: //수정모드
  291. {
  292. BtnEdit->Enabled = true;
  293. BtnInsert->Enabled = true;
  294. BtnDelete->Enabled = true;
  295. BtnSave->Enabled = false;
  296. BtnEdit->Caption = MSG903;
  297. BtnEdit->Hint = MSG904;
  298. bEnabled = true;
  299. EditMode = false;
  300. EdImageFileName->Enabled = false;
  301. }
  302. break;
  303. }
  304. BtnSaveImgFile->Enabled = false;
  305. if (ImgPreView->Picture->Bitmap != NULL)
  306. {
  307. if (ImgPreView->Picture->Bitmap->Height != 0)
  308. {
  309. BtnSaveImgFile->Enabled = true;
  310. }
  311. }
  312. if (AEdit == 0 || AEdit == 2)
  313. {
  314. PnlCmd->Enabled = true;
  315. GrpList->Enabled = false;
  316. }
  317. else
  318. {
  319. PnlCmd->Enabled = false;
  320. GrpList->Enabled = true;
  321. }
  322. //PnlEdit->Enabled = EditMode;
  323. }
  324. //---------------------------------------------------------------------------
  325. bool __fastcall TVMSM420M::UpdateVmsImage(String ANmbr, String AExpl)
  326. {
  327. String sQry;
  328. TADOQuery *pADO = NULL;
  329. sQry = "UPDATE TB_VMS_SYMB_LIB \r\n"
  330. " SET RGST_DT = TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'), \r\n"
  331. " SYMB_EXPL = :p02 \r\n"
  332. " WHERE SYMBLIB_NMBR = :p01 \r\n";
  333. int nRowHeight = 0;
  334. try
  335. {
  336. try
  337. {
  338. pADO = new TADOQuery(NULL);
  339. pADO->Close();
  340. pADO->Connection = ITSDb_GetConnection();
  341. ITSDb_SQLText(pADO, sQry);
  342. ITSDb_SQLBind(pADO, "p01", ANmbr);
  343. ITSDb_SQLBind(pADO, "p02", AExpl);
  344. pADO->ExecSQL();
  345. return true;
  346. }
  347. catch(EDatabaseError &E)
  348. {
  349. DBERRORMSG("VMS이미지정보업데이트", String(E.ClassName()), E.Message, sQry);
  350. throw Exception(String(E.ClassName()) + E.Message);
  351. }
  352. catch(Exception &e)
  353. {
  354. DBERRORMSG("VMS이미지정보업데이트", String(e.ClassName()), e.Message, sQry);
  355. throw Exception(String(e.ClassName()) + e.Message);
  356. }
  357. }
  358. __finally
  359. {
  360. if (pADO)
  361. {
  362. pADO->Close();
  363. delete pADO;
  364. }
  365. }
  366. return true;
  367. }
  368. //---------------------------------------------------------------------------
  369. bool __fastcall TVMSM420M::InsertVmsImage(String ANmbr, String AExpl, String ATypeCd)
  370. {
  371. String sQry;
  372. TADOQuery *pADO = NULL;
  373. sQry = "INSERT INTO TB_VMS_SYMB_LIB(SYMBLIB_NMBR, RGST_DT, SYMB_EXPL, IMAG_DATA, VMS_TYPE_CD) \r\n"
  374. " VALUES(:p01, :p02, :p03, :p04, :p05) \r\n";
  375. int nRowHeight = 0;
  376. TMemoryStream *dataStream = new TMemoryStream();
  377. //ImgPreView->Picture->Bitmap->SaveToStream(dataStream);
  378. ImgTemp->Picture->Bitmap->SaveToStream(dataStream);
  379. try
  380. {
  381. try
  382. {
  383. pADO = new TADOQuery(NULL);
  384. pADO->Close();
  385. pADO->Connection = ITSDb_GetConnection();
  386. ITSDb_SQLText(pADO, sQry);
  387. ITSDb_SQLBind(pADO, "p01", ANmbr);
  388. ITSDb_SQLBind(pADO, "p02", Now().FormatString("yyyymmddhhnnss"));
  389. ITSDb_SQLBind(pADO, "p03", AExpl);
  390. pADO->Parameters->ParamByName("p04")->LoadFromStream(dataStream, ftBlob);
  391. ITSDb_SQLBind(pADO, "p05", ATypeCd);
  392. pADO->ExecSQL();
  393. return true;
  394. }
  395. catch(EDatabaseError &E)
  396. {
  397. DBERRORMSG("VMS이미지정보업데이트", String(E.ClassName()), E.Message, sQry);
  398. throw Exception(String(E.ClassName()) + E.Message);
  399. }
  400. catch(Exception &e)
  401. {
  402. DBERRORMSG("VMS이미지정보업데이트", String(e.ClassName()), e.Message, sQry);
  403. throw Exception(String(e.ClassName()) + e.Message);
  404. }
  405. }
  406. __finally
  407. {
  408. if (pADO)
  409. {
  410. pADO->Close();
  411. delete pADO;
  412. }
  413. if (dataStream) delete dataStream;
  414. dataStream = NULL;
  415. }
  416. return true;
  417. }
  418. //---------------------------------------------------------------------------
  419. void __fastcall TVMSM420M::BtnSaveClick(TObject *Sender)
  420. {
  421. if (EdNmbr->Text.IsEmpty())
  422. {
  423. Application->MessageBox(L"VMS 이미지정보 저장\r\n이미지 번호를 입력하세요.",
  424. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  425. return;
  426. }
  427. if (EdExpl->Text.Trim().IsEmpty())
  428. {
  429. Application->MessageBox(L"VMS 이미지정보 저장\r\n이미지 설명을 입력하세요.",
  430. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  431. return;
  432. }
  433. String sNmbr = EdNmbr->Text;
  434. String sExpl = EdExpl->Text.Trim();
  435. if (TvImageCell->DataController->RecordCount == 0)
  436. {
  437. Application->MessageBox(L"VMS 이미지정보 저장\r\n이미지 좌표 정보가 없습니다.\r\n이미지 이미지를 클릭하여 이미지 좌표를 설정하세요.",
  438. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  439. return;
  440. #if 0
  441. String sMsg;
  442. sMsg = "VMS이미지번호: " + sNmbr;
  443. sMsg+= "\r\n이미지 좌표 정보가 없습니다.\r\n소통정보 이미지 정보를 저장하시겠습니까?";
  444. if (Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES) return;
  445. #endif
  446. }
  447. bool bResult = false;
  448. if (!FNewDb)
  449. {
  450. bResult = UpdateVmsImage(sNmbr, sExpl);
  451. }
  452. else
  453. {
  454. if (EdImageFileName->Text.Trim().IsEmpty())
  455. {
  456. Application->MessageBox(L"VMS 이미지정보 저장\r\n이미지를 선택하셔야 합니다.",
  457. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  458. return;
  459. }
  460. bResult = InsertVmsImage(sNmbr, sExpl, "VMP2");
  461. }
  462. if (!bResult) return;
  463. String ANmbr = sNmbr;
  464. String sQry;
  465. TADOQuery *pADO = NULL;
  466. try
  467. {
  468. try
  469. {
  470. pADO = new TADOQuery(NULL);
  471. pADO->Close();
  472. pADO->Connection = ITSDb_GetConnection();
  473. sQry = "DELETE TB_VMS_SYMB_IFSC \r\n"
  474. " WHERE SYMBLIB_NMBR = :p01 \r\n";
  475. ITSDb_SQLText(pADO, sQry);
  476. ITSDb_SQLBind(pADO, "p01", ANmbr);
  477. pADO->ExecSQL();
  478. sQry = "INSERT INTO TB_VMS_SYMB_IFSC ( \r\n"
  479. " SYMBLIB_NMBR, \r\n"
  480. " CELL_ID, \r\n"
  481. " POSX, \r\n"
  482. " POSY, \r\n"
  483. " VMS_IFSC_ID) \r\n"
  484. " VALUES ( \r\n"
  485. " :p01, \r\n"
  486. " :p02, \r\n"
  487. " :p03, \r\n"
  488. " :p04, \r\n"
  489. " :p05 ) \r\n";
  490. ITSDb_SQLText(pADO, sQry);
  491. ITSDb_GetConnection()->BeginTrans();
  492. TcxGridDataController *pGDC = TvImageCell->DataController;
  493. int nRows = pGDC->RecordCount;
  494. for (int ii = 0; ii < nRows; ii++)
  495. {
  496. String sCellId = VarToStr(pGDC->Values[ii][ColCellId->Index]);
  497. String sPosX = VarToStr(pGDC->Values[ii][ColCellPosX->Index]);
  498. String sPosY = VarToStr(pGDC->Values[ii][ColCellPosY->Index]);
  499. String sIfscId = VarToStr(pGDC->Values[ii][ColIfscId->Index]);
  500. ITSDb_SQLBind(pADO, "p01", ANmbr);
  501. ITSDb_SQLBind(pADO, "p02", sCellId);
  502. ITSDb_SQLBind(pADO, "p03", sPosX);
  503. ITSDb_SQLBind(pADO, "p04", sPosY);
  504. ITSDb_SQLBind(pADO, "p05", sIfscId);
  505. ITSDb_SQLExec(pADO);
  506. }
  507. ITSDb_GetConnection()->CommitTrans();
  508. bResult = true;
  509. }
  510. catch(EDatabaseError &E)
  511. {
  512. ITSDb_GetConnection()->RollbackTrans();
  513. DBERRORMSG("VMS이미지셀정보저장", String(E.ClassName()), E.Message, sQry);
  514. throw Exception(String(E.ClassName()) + E.Message);
  515. }
  516. catch(Exception &e)
  517. {
  518. ITSDb_GetConnection()->RollbackTrans();
  519. DBERRORMSG("VMS이미지셀정보저장", String(e.ClassName()), e.Message, sQry);
  520. throw Exception(String(e.ClassName()) + e.Message);
  521. }
  522. }
  523. __finally
  524. {
  525. if (pADO)
  526. {
  527. pADO->Close();
  528. delete pADO;
  529. }
  530. }
  531. if (bResult)
  532. {
  533. Application->MessageBox(L"VMS 소통정보 이미지정보 저장\r\nVMS 소통정보 이미지정보를 저장 하였습니다.",
  534. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  535. FUpdate = true;
  536. LoadImageSymbol();
  537. CMM_SetGridRow(CxList, TvList, sNmbr, ColLink1->Index);
  538. DisplayInfo();
  539. VComm_VmsImageTrafficUpdate(); // VMS서버로 이미지가 업데이트 되었음을 알린다.
  540. POST_MSG(Application->MainForm->Handle, WM_DATABASE_REFRESH, WP_MSG_14, 0);
  541. }
  542. }
  543. //---------------------------------------------------------------------------
  544. void __fastcall TVMSM420M::BtnInsertClick(TObject *Sender)
  545. {
  546. FormInit();
  547. //신규아이디를 얻어와서 화면을 초기화한다.
  548. int nNmbr;
  549. if (!GetNextVmsImgeId(nNmbr))
  550. {
  551. Application->MessageBox(L"새로운 VMS 이미지정보를 생성하지 못하였습니다.\r\n프로그램 종료후에 다시 시도해 보세요.",
  552. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  553. return;
  554. }
  555. EdNmbr->Text = String(nNmbr);
  556. ChangeEditMode(2);
  557. FNewDb = true;
  558. }
  559. //---------------------------------------------------------------------------
  560. bool __fastcall TVMSM420M::GetNextVmsImgeId(int &ANmbr)
  561. {
  562. String sQry;
  563. TADOQuery *pADO = NULL;
  564. sQry = "SELECT NVL(MAX(SYMBLIB_NMBR), 7999)+1 AS NEWID FROM TB_VMS_SYMB_LIB WHERE SYMBLIB_NMBR BETWEEN 8000 AND 8999 \r\n";
  565. try
  566. {
  567. try
  568. {
  569. pADO = new TADOQuery(NULL);
  570. pADO->Close();
  571. pADO->Connection = ITSDb_GetConnection();
  572. pADO->SQL->Clear();
  573. pADO->SQL->Text = sQry;
  574. pADO->Open();
  575. ANmbr = pADO->FieldByName("NEWID")->AsInteger;
  576. return true;
  577. }
  578. catch(EDatabaseError &E)
  579. {
  580. DBERRORLOG("VMS이미지ID조회", String(E.ClassName()), E.Message, sQry);
  581. throw Exception(String(E.ClassName()) + E.Message);
  582. }
  583. catch(Exception &e)
  584. {
  585. DBERRORLOG("VMS이미지ID조회", String(e.ClassName()), e.Message, sQry);
  586. throw Exception(String(e.ClassName()) + e.Message);
  587. }
  588. }
  589. __finally
  590. {
  591. if (pADO)
  592. {
  593. pADO->Close();
  594. delete pADO;
  595. }
  596. }
  597. return false;
  598. }
  599. //---------------------------------------------------------------------------
  600. bool __fastcall TVMSM420M::CheckImageUse(String ANmbr)
  601. {
  602. String sQry;
  603. TADOQuery *pADO = NULL;
  604. sQry = "SELECT COUNT(1) AS CNT \r\n"
  605. " FROM TB_VMS_FORM_OBJECT \r\n"
  606. " WHERE SYMBLIB_NMBR = :p01 \r\n";
  607. int nRowHeight = 0;
  608. try
  609. {
  610. try
  611. {
  612. pADO = new TADOQuery(NULL);
  613. pADO->Close();
  614. pADO->Connection = ITSDb_GetConnection();
  615. ITSDb_SQLText(pADO, sQry);
  616. ITSDb_SQLBind(pADO, "p01", ANmbr);
  617. ITSDb_SQLOpen(pADO);
  618. if (pADO->FieldByName("CNT")->AsInteger > 0)
  619. {
  620. Application->MessageBox(L"삭제할 이미지가 VMS 폼에서 사용되고 있습니다.\r\n먼저 해당 폼에서 삭제해주시기 바랍니다.", FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  621. return false;
  622. }
  623. }
  624. catch(EDatabaseError &E)
  625. {
  626. DBERRORMSG("VMS이미지사용정보조회", String(E.ClassName()), E.Message, sQry);
  627. throw Exception(String(E.ClassName()) + E.Message);
  628. }
  629. catch(Exception &e)
  630. {
  631. DBERRORMSG("VMS이미지사용정보조회", String(e.ClassName()), e.Message, sQry);
  632. throw Exception(String(e.ClassName()) + e.Message);
  633. }
  634. }
  635. __finally
  636. {
  637. if (pADO)
  638. {
  639. pADO->Close();
  640. delete pADO;
  641. }
  642. }
  643. return true;
  644. }
  645. //---------------------------------------------------------------------------
  646. bool __fastcall TVMSM420M::DelVmsImage(String ANmbr)
  647. {
  648. String sQry;
  649. TADOQuery *pADO = NULL;
  650. int nRowHeight = 0;
  651. try
  652. {
  653. try
  654. {
  655. pADO = new TADOQuery(NULL);
  656. pADO->Close();
  657. pADO->Connection = ITSDb_GetConnection();
  658. sQry = "DELETE TB_VMS_SYMB_IFSC \r\n"
  659. " WHERE SYMBLIB_NMBR = :p01 \r\n";
  660. ITSDb_SQLText(pADO, sQry);
  661. ITSDb_SQLBind(pADO, "p01", ANmbr);
  662. pADO->ExecSQL();
  663. sQry = "DELETE TB_VMS_SYMB_LIB \r\n"
  664. " WHERE SYMBLIB_NMBR = :p01 \r\n";
  665. ITSDb_SQLText(pADO, sQry);
  666. ITSDb_SQLBind(pADO, "p01", ANmbr);
  667. pADO->ExecSQL();
  668. return true;
  669. }
  670. catch(EDatabaseError &E)
  671. {
  672. DBERRORMSG("VMS이미지정보삭제", String(E.ClassName()), E.Message, sQry);
  673. throw Exception(String(E.ClassName()) + E.Message);
  674. }
  675. catch(Exception &e)
  676. {
  677. DBERRORMSG("VMS이미지정보삭제", String(e.ClassName()), e.Message, sQry);
  678. throw Exception(String(e.ClassName()) + e.Message);
  679. }
  680. }
  681. __finally
  682. {
  683. if (pADO)
  684. {
  685. pADO->Close();
  686. delete pADO;
  687. }
  688. }
  689. return true;
  690. }
  691. //---------------------------------------------------------------------------
  692. void __fastcall TVMSM420M::BtnDeleteClick(TObject *Sender)
  693. {
  694. int nIdx = TvList->DataController->FocusedRecordIndex;
  695. if (nIdx < 0) return;
  696. String sId = EdNmbr->Text;
  697. if (sId.IsEmpty())
  698. {
  699. Application->MessageBox(L"삭제할 VMS 이미지를 목록에서 선택하세요.\r\n목록에서 더블클릭하여 선택합니다.", FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  700. return;
  701. }
  702. if (!CheckImageUse(sId)) return;
  703. String sMsg;
  704. sMsg = "VMS이미지번호: " + sId;
  705. sMsg+= "\r\n선택하신 VMS 이미지 정보를 삭제하시겠습니까?";
  706. if (Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) != IDYES) return;
  707. if (DelVmsImage(sId))
  708. {
  709. FUpdate = true;
  710. Application->MessageBox(L"VMS 이미지정보삭제\r\nVMS 이미지정보를 삭제 하였습니다.",
  711. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  712. FormInit();
  713. ChangeEditMode(1);
  714. LoadImageSymbol();
  715. VComm_VmsImageTrafficUpdate(); // VMS서버로 이미지가 업데이트 되었음을 알린다.
  716. POST_MSG(Application->MainForm->Handle, WM_DATABASE_REFRESH, WP_MSG_14, 0);
  717. }
  718. }
  719. //---------------------------------------------------------------------------
  720. void __fastcall TVMSM420M::BtnSaveImgFileClick(TObject *Sender)
  721. {
  722. SaveDialog->Title = FTitle;
  723. SaveDialog->InitialDir = ExtractFilePath(Application->ExeName);
  724. SaveDialog->Filter = "Bitmap image Files (*.bmp)|*.bmp";
  725. SaveDialog->FileName = EdNmbr->Text + ".bmp";
  726. if (SaveDialog->Execute())
  727. {
  728. try {
  729. String sFileName = SaveDialog->FileName;
  730. int iRet = sFileName.Pos(".bmp");
  731. if (iRet == 0)
  732. {
  733. sFileName = SaveDialog->FileName + ".bmp";
  734. }
  735. //ImgPreView->Picture->SaveToFile(sFileName);
  736. ImgTemp->Picture->SaveToFile(sFileName);
  737. }
  738. catch (Exception &exception)
  739. {
  740. Application->ShowException(&exception);
  741. }
  742. }
  743. }
  744. //---------------------------------------------------------------------------
  745. void __fastcall TVMSM420M::EdImageFileNameClick(TObject *Sender)
  746. {
  747. OpenBmp->Title = FTitle;
  748. OpenBmp->FileName = "";
  749. OpenBmp->Execute();
  750. }
  751. //---------------------------------------------------------------------------
  752. void __fastcall TVMSM420M::OpenBmpCanClose(TObject *Sender, bool &CanClose)
  753. {
  754. String sFName = OpenBmp->FileName;
  755. sFName = sFName.UpperCase();
  756. String sMsgTitle, sMsgString;
  757. sMsgTitle = "VMS 이미지 선택";
  758. if (sFName.SubString(sFName.Length()-2, 3) != "BMP")
  759. {
  760. sMsgString = "BMP 파일만 적용 가능합니다.";
  761. Application->MessageBox(sMsgString.c_str(), sMsgTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  762. return;
  763. }
  764. try
  765. {
  766. DWORD dwFileSize = ITSUtil_GetFileSize(sFName);
  767. if (dwFileSize <= 0)
  768. {
  769. sMsgString = "이미지 파일을 읽어 오는데 실패하였습니다.";
  770. Application->MessageBox(sMsgString.c_str(), sMsgTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  771. return;
  772. }
  773. if (dwFileSize > (1024 * 32)) // Max 32Kbytes
  774. {
  775. sMsgString = "이미지 파일의 최대 크기는 32KBytes를 넘을 수 없습니다.\r\n이미지 파일의 용량을 줄여 주세요.";
  776. Application->MessageBox(sMsgString.c_str(), sMsgTitle.c_str(), MB_OK|MB_ICONWARNING|MB_APPLMODAL);
  777. return;
  778. }
  779. //EdImageSize->Text = String(dwFileSize);//GetFileSize(sFName));
  780. EdImageFileName->Text = sFName;
  781. ImgPreView->Picture->Bitmap->FreeImage();
  782. ImgPreView->Picture->Bitmap = NULL;
  783. ImgPreView->Picture->Bitmap->LoadFromFile(sFName);
  784. ImgTemp->Picture->Bitmap->FreeImage();
  785. ImgTemp->Picture->Bitmap = NULL;
  786. ImgTemp->Picture->Bitmap->LoadFromFile(sFName);
  787. }
  788. catch(...)
  789. {
  790. }
  791. }
  792. //---------------------------------------------------------------------------
  793. void __fastcall TVMSM420M::ClearSymbloList()
  794. {
  795. for(int ii = 0; ii < FListSymb->Count; ii++)
  796. {
  797. Graphics::TBitmap *bitmap = (Graphics::TBitmap *)FListSymb->Items[ii];
  798. delete bitmap;
  799. }
  800. FListSymb->Clear();
  801. }
  802. //---------------------------------------------------------------------------
  803. void __fastcall TVMSM420M::LoadImageSymbol()
  804. {
  805. FormInit();
  806. CMM_ClearGridTableView(TvList);
  807. ClearSymbloList();
  808. String sQry;
  809. TADOQuery *pADO = NULL;
  810. sQry = "SELECT SYMBLIB_NMBR, \r\n"
  811. " IMAG_DATA, \r\n"
  812. " SYMB_EXPL, VMS_TYPE_CD \r\n"
  813. " FROM TB_VMS_SYMB_LIB \r\n"
  814. " WHERE SYMBLIB_NMBR BETWEEN 8000 AND 8999 \r\n"
  815. " ORDER BY SYMBLIB_NMBR \r\n";
  816. int nRowHeight = 0;
  817. try
  818. {
  819. int nRow;
  820. TcxDataController *pGDC = TvList->DataController;
  821. TvList->BeginUpdate();
  822. try
  823. {
  824. pADO = new TADOQuery(NULL);
  825. pADO->Close();
  826. pADO->Connection = ITSDb_GetConnection();
  827. ITSDb_SQLText(pADO, sQry);
  828. ITSDb_SQLOpen(pADO);
  829. for( ; !pADO->Eof; pADO->Next())
  830. {
  831. nRow = pGDC->AppendRecord();
  832. pGDC->Values[nRow][ColLink1->Index] = pADO->FieldByName("SYMBLIB_NMBR")->AsString;
  833. pGDC->Values[nRow][ColLink2->Index] = pADO->FieldByName("IMAG_DATA")->AsVariant;
  834. pGDC->Values[nRow][ColLink3->Index] = pADO->FieldByName("SYMB_EXPL")->AsString;
  835. pGDC->Values[nRow][ColLink4->Index] = pADO->FieldByName("VMS_TYPE_CD")->AsString;
  836. Graphics::TBitmap *bitmap = new Graphics::TBitmap;
  837. bitmap->LoadFromStream(pADO->CreateBlobStream(pADO->FieldByName("IMAG_DATA"), bmRead));
  838. FListSymb->Add(bitmap);
  839. if (bitmap->Height+2 > nRowHeight) nRowHeight = bitmap->Height+3;
  840. }
  841. }
  842. catch(EDatabaseError &E)
  843. {
  844. DBERRORMSG("VMS이미지정보조회", String(E.ClassName()), E.Message, sQry);
  845. throw Exception(String(E.ClassName()) + E.Message);
  846. }
  847. catch(Exception &e)
  848. {
  849. DBERRORMSG("VMS이미지정보조회", String(e.ClassName()), e.Message, sQry);
  850. throw Exception(String(e.ClassName()) + e.Message);
  851. }
  852. }
  853. __finally
  854. {
  855. if (pADO)
  856. {
  857. pADO->Close();
  858. delete pADO;
  859. }
  860. TvList->OptionsView->DataRowHeight = nRowHeight;
  861. TvList->EndUpdate();
  862. }
  863. }
  864. //---------------------------------------------------------------------------
  865. void __fastcall TVMSM420M::LoadImageSymbolCell(String ANmbr)
  866. {
  867. CMM_ClearGridTableView(TvImageCell);
  868. String sQry;
  869. TADOQuery *pADO = NULL;
  870. sQry = "SELECT A.SYMBLIB_NMBR, \r\n"
  871. " A.CELL_ID, \r\n"
  872. " A.POSX, POSY, \r\n"
  873. " A.VMS_IFSC_ID, \r\n"
  874. " B.VMS_IFSC_NM, \r\n"
  875. " B.DSPL_STRT_NODE_NM, \r\n"
  876. " B.DSPL_END_NODE_NM \r\n"
  877. " FROM TB_VMS_SYMB_IFSC A, \r\n"
  878. " TB_VMS_IFSC B \r\n"
  879. " WHERE A.SYMBLIB_NMBR = :p01 \r\n"
  880. " AND A.VMS_IFSC_ID = B.VMS_IFSC_ID(+) \r\n"
  881. " ORDER BY CELL_ID \r\n";
  882. try
  883. {
  884. int nRow;
  885. TcxDataController *pGDC = TvImageCell->DataController;
  886. TvImageCell->BeginUpdate();
  887. try
  888. {
  889. pADO = new TADOQuery(NULL);
  890. pADO->Close();
  891. pADO->Connection = ITSDb_GetConnection();
  892. ITSDb_SQLText(pADO, sQry);
  893. ITSDb_SQLBind(pADO, "p01", ANmbr);
  894. ITSDb_SQLOpen(pADO);
  895. for( ; !pADO->Eof; pADO->Next())
  896. {
  897. nRow = pGDC->AppendRecord();
  898. pGDC->Values[nRow][ColCellId->Index] = pADO->FieldByName("CELL_ID")->AsString;
  899. pGDC->Values[nRow][ColCellPosX->Index] = pADO->FieldByName("POSX")->AsString;
  900. pGDC->Values[nRow][ColCellPosY->Index] = pADO->FieldByName("POSY")->AsString;
  901. pGDC->Values[nRow][ColIfscId->Index] = pADO->FieldByName("VMS_IFSC_ID")->AsString;
  902. pGDC->Values[nRow][ColIfscNm->Index] = pADO->FieldByName("VMS_IFSC_NM")->AsString;
  903. pGDC->Values[nRow][ColStrNm->Index] = pADO->FieldByName("DSPL_STRT_NODE_NM")->AsString;
  904. pGDC->Values[nRow][ColEndNm->Index] = pADO->FieldByName("DSPL_END_NODE_NM")->AsString;
  905. }
  906. }
  907. catch(EDatabaseError &E)
  908. {
  909. DBERRORMSG("VMS이미지정보조회", String(E.ClassName()), E.Message, sQry);
  910. throw Exception(String(E.ClassName()) + E.Message);
  911. }
  912. catch(Exception &e)
  913. {
  914. DBERRORMSG("VMS이미지정보조회", String(e.ClassName()), e.Message, sQry);
  915. throw Exception(String(e.ClassName()) + e.Message);
  916. }
  917. }
  918. __finally
  919. {
  920. if (pADO)
  921. {
  922. pADO->Close();
  923. delete pADO;
  924. }
  925. TvImageCell->EndUpdate();
  926. }
  927. }
  928. //---------------------------------------------------------------------------
  929. void __fastcall TVMSM420M::TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  930. TMouseButton AButton, TShiftState AShift,
  931. bool &AHandled)
  932. {
  933. if (!ACellViewInfo) return;
  934. DisplayInfo();
  935. }
  936. //---------------------------------------------------------------------------
  937. void __fastcall TVMSM420M::ColLink2CustomDrawCell(TcxCustomGridTableView *Sender,
  938. TcxCanvas *ACanvas, TcxGridTableDataCellViewInfo *AViewInfo,
  939. bool &ADone)
  940. {
  941. #if 0
  942. int nRow = AViewInfo->GridRecord->RecordIndex;
  943. if (nRow < 0) return;
  944. if (nRow >= FListSymb->Count)
  945. {
  946. return;
  947. }
  948. try
  949. {
  950. Graphics::TBitmap *pBmp = (Graphics::TBitmap*)FListSymb->Items[nRow];
  951. TRect rc;
  952. TRect rcOrg = AViewInfo->Bounds;
  953. int nH = ( (rcOrg.Bottom - rcOrg.Top) - pBmp->Height ) / 2;
  954. rc.Top = rcOrg.Top + nH+1;
  955. rc.Bottom = rcOrg.Bottom - nH+1;
  956. rc.Left = rcOrg.Left + 1;
  957. rc.Right = rc.Left + pBmp->Width;
  958. ACanvas->Canvas->StretchDraw(rc, pBmp);
  959. ADone = true;
  960. }
  961. catch(Exception &e)
  962. {
  963. }
  964. #endif
  965. }
  966. //---------------------------------------------------------------------------
  967. void __fastcall TVMSM420M::BtnCellDeleteClick(TObject *Sender)
  968. {
  969. TcxGridDataController *pGDC = TvImageCell->DataController;
  970. int nSelIdx = pGDC->FocusedRecordIndex;
  971. if (nSelIdx < 0) return;
  972. pGDC->BeginUpdate();
  973. pGDC->DeleteRecord(nSelIdx);
  974. pGDC->EndUpdate();
  975. UpdateCellColor();
  976. }
  977. //---------------------------------------------------------------------------
  978. void __fastcall TVMSM420M::BtnCellApplyClick(TObject *Sender)
  979. {
  980. TcxGridDataController *pGDC = TvImageCell->DataController;
  981. String sCellId;
  982. String sPosX;
  983. String sPosY;
  984. int nCellId = SeCellId->Value;
  985. int nPosX = SePosX->Value;
  986. int nPosY = SePosY->Value;
  987. int nMaxCellId = 0;
  988. bool bFound = false;
  989. sCellId = String(nCellId);
  990. sPosX = String(nPosX);
  991. sPosY = String(nPosY);
  992. int nFocusedIndex = 0;
  993. try
  994. {
  995. int nRows = pGDC->RecordCount;
  996. TvImageCell->BeginUpdate();
  997. pGDC->BeginUpdate();
  998. for (int ii = 0; ii < nRows; ii++)
  999. {
  1000. String sTmpId = pGDC->Values[ii][ColCellId->Index];
  1001. if (sTmpId == sCellId)
  1002. {
  1003. nFocusedIndex = ii;
  1004. bFound = true;
  1005. }
  1006. }
  1007. if (!bFound)
  1008. {
  1009. nFocusedIndex = pGDC->AppendRecord();
  1010. //SeCellId->Value = nRows+1;
  1011. pGDC->Values[nFocusedIndex][ColCellId->Index] = String(nRows+1);
  1012. }
  1013. pGDC->Values[nFocusedIndex][ColCellPosX->Index] = sPosX;
  1014. pGDC->Values[nFocusedIndex][ColCellPosY->Index] = sPosY;
  1015. }
  1016. __finally
  1017. {
  1018. pGDC->EndUpdate();
  1019. TvImageCell->EndUpdate();
  1020. //if (pGDC->RecordCount > 0) pGDC->FocusedRecordIndex = nFocusedIndex;
  1021. //SeCellId->Value = pGDC->RecordCount+1;
  1022. }
  1023. UpdateCellColor();
  1024. }
  1025. //---------------------------------------------------------------------------
  1026. void __fastcall TVMSM420M::ImgPreViewMouseDown(TObject *Sender, TMouseButton Button,
  1027. TShiftState Shift, int X, int Y)
  1028. {
  1029. try {
  1030. SePosX->Value = X;
  1031. SePosY->Value = Y;
  1032. UpdateCellColor();
  1033. TColor FOldColor = ImgPreView->Picture->Bitmap->Canvas->Pixels[SePosX->Value][SePosY->Value];
  1034. ImgPreView->Picture->Bitmap->Canvas->Brush->Color = clWhite;
  1035. ImgPreView->Picture->Bitmap->Canvas->FloodFill(SePosX->Value, SePosY->Value, FOldColor, fsSurface);
  1036. BtnCellApplyClick(NULL);
  1037. } catch(...) {}
  1038. }
  1039. //---------------------------------------------------------------------------
  1040. void __fastcall TVMSM420M::ColAreaCustomDrawCell(TcxCustomGridTableView *Sender,
  1041. TcxCanvas *ACanvas, TcxGridTableDataCellViewInfo *AViewInfo,
  1042. bool &ADone)
  1043. {
  1044. int nIdx = AViewInfo->GridRecord->RecordIndex;
  1045. if (nIdx < 0)
  1046. return;
  1047. try
  1048. {
  1049. String sCellId = VarToStr(TvImageCell->DataController->Values[nIdx][ColCellId->Index]);
  1050. nIdx = sCellId.ToIntDef(0);
  1051. ACanvas->Brush->Color = APP_GetDisplayColor(nIdx);
  1052. ACanvas->Font->Color = ACanvas->Brush->Color;
  1053. }
  1054. catch(...)
  1055. {
  1056. }
  1057. }
  1058. //---------------------------------------------------------------------------
  1059. void __fastcall TVMSM420M::TvImageCellFocusedRecordChanged(TcxCustomGridTableView *Sender,
  1060. TcxCustomGridRecord *APrevFocusedRecord, TcxCustomGridRecord *AFocusedRecord,
  1061. bool ANewItemRecordFocusingChanged)
  1062. {
  1063. TcxGridDataController *pGDC = TvImageCell->DataController;
  1064. int nSelIdx = pGDC->FocusedRecordIndex;
  1065. if (nSelIdx < 0) return;
  1066. String sCellId = VarToStr(pGDC->Values[nSelIdx][ColCellId->Index]);
  1067. String sPosX = VarToStr(pGDC->Values[nSelIdx][ColCellPosX->Index]);
  1068. String sPosY = VarToStr(pGDC->Values[nSelIdx][ColCellPosY->Index]);
  1069. SeCellId->Value = sCellId.ToIntDef(0);
  1070. SePosX->Value = sPosX.ToIntDef(0);
  1071. SePosY->Value = sPosY.ToIntDef(0);
  1072. #if 0
  1073. try {
  1074. TColor FOldColor = ImgPreView->Picture->Bitmap->Canvas->Pixels[SePosX->Value][SePosY->Value];
  1075. if (FOldColor == clYellow) return;
  1076. ImgPreView->Picture->Bitmap->Canvas->Brush->Color = clYellow;
  1077. ImgPreView->Picture->Bitmap->Canvas->FloodFill(SePosX->Value, SePosY->Value, FOldColor, fsSurface);
  1078. } catch(...) {}
  1079. #endif
  1080. }
  1081. //---------------------------------------------------------------------------
  1082. void __fastcall TVMSM420M::UpdateCellColor()
  1083. {
  1084. ImgPreView->Picture->Bitmap->FreeImage();
  1085. ImgPreView->Picture->Bitmap = NULL;
  1086. ImgPreView->Picture->Bitmap->Assign(ImgTemp->Picture->Bitmap);
  1087. ImgPreView->Width = ImgPreView->Picture->Bitmap->Width;
  1088. ImgPreView->Height = ImgPreView->Picture->Bitmap->Height;
  1089. TcxGridDataController *pGDC = TvImageCell->DataController;
  1090. int nRows = pGDC->RecordCount;
  1091. try
  1092. {
  1093. TvImageCell->BeginUpdate();
  1094. pGDC->BeginUpdate();
  1095. for (int ii = 0; ii < nRows; ii++)
  1096. {
  1097. String sCellId = VarToStr(pGDC->Values[ii][ColCellId->Index]);
  1098. String sPosX = VarToStr(pGDC->Values[ii][ColCellPosX->Index]);
  1099. String sPosY = VarToStr(pGDC->Values[ii][ColCellPosY->Index]);
  1100. int X = sPosX.ToIntDef(0);
  1101. int Y = sPosY.ToIntDef(0);
  1102. TColor FOldColor = ImgPreView->Picture->Bitmap->Canvas->Pixels[X][Y];
  1103. int nIdx = sCellId.ToIntDef(0);
  1104. ImgPreView->Picture->Bitmap->Canvas->Brush->Color = APP_GetDisplayColor(nIdx);
  1105. ImgPreView->Picture->Bitmap->Canvas->FloodFill(X, Y, FOldColor, fsSurface);
  1106. }
  1107. }
  1108. __finally
  1109. {
  1110. pGDC->EndUpdate();
  1111. TvImageCell->EndUpdate();
  1112. }
  1113. }
  1114. //---------------------------------------------------------------------------
  1115. void __fastcall TVMSM420M::SeCellIdPropertiesChange(TObject *Sender)
  1116. {
  1117. if (((TcxSpinEdit*)Sender)->Value < ((TcxSpinEdit*)Sender)->Properties->MinValue)
  1118. ((TcxSpinEdit*)Sender)->Value = ((TcxSpinEdit*)Sender)->Properties->MinValue;
  1119. else if(((TcxSpinEdit*)Sender)->Value > ((TcxSpinEdit*)Sender)->Properties->MaxValue &&
  1120. ((TcxSpinEdit*)Sender)->Properties->MaxValue)
  1121. ((TcxSpinEdit*)Sender)->Value = ((TcxSpinEdit*)Sender)->Properties->MaxValue;
  1122. }
  1123. //---------------------------------------------------------------------------
  1124. void __fastcall TVMSM420M::TvListFocusedRecordChanged(TcxCustomGridTableView *Sender,
  1125. TcxCustomGridRecord *APrevFocusedRecord, TcxCustomGridRecord *AFocusedRecord,
  1126. bool ANewItemRecordFocusingChanged)
  1127. {
  1128. if (!AFocusedRecord) return;
  1129. DisplayInfo();
  1130. }
  1131. //---------------------------------------------------------------------------