FrmVmsMsgVideoMngrF.cpp 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include <IOUtils.hpp>
  4. #include "ITSSkinF.h"
  5. #include "ITSUtilF.h"
  6. #include "AppGlobalF.h"
  7. #include <jpeg.hpp>
  8. #include <GIFimg.hpp>
  9. #pragma hdrstop
  10. #include "FrmVmsMsgVideoMngrF.h"
  11. //---------------------------------------------------------------------------
  12. #pragma package(smart_init)
  13. #pragma link "cxButtons"
  14. #pragma link "cxCalendar"
  15. #pragma link "cxContainer"
  16. #pragma link "cxControls"
  17. #pragma link "cxDropDownEdit"
  18. #pragma link "cxEdit"
  19. #pragma link "cxGraphics"
  20. #pragma link "cxGroupBox"
  21. #pragma link "cxLabel"
  22. #pragma link "cxLookAndFeelPainters"
  23. #pragma link "cxLookAndFeels"
  24. #pragma link "cxMaskEdit"
  25. #pragma link "cxPC"
  26. #pragma link "cxPCdxBarPopupMenu"
  27. #pragma link "cxSpinEdit"
  28. #pragma link "cxSplitter"
  29. #pragma link "cxTextEdit"
  30. #pragma link "cxTimeEdit"
  31. #pragma link "dxSkinBlack"
  32. #pragma link "dxSkinBlue"
  33. #pragma link "dxSkinCaramel"
  34. #pragma link "dxSkinCoffee"
  35. #pragma link "dxSkinDarkRoom"
  36. #pragma link "dxSkinDarkSide"
  37. #pragma link "dxSkinFoggy"
  38. #pragma link "dxSkinGlassOceans"
  39. #pragma link "dxSkiniMaginary"
  40. #pragma link "dxSkinLilian"
  41. #pragma link "dxSkinLiquidSky"
  42. #pragma link "dxSkinLondonLiquidSky"
  43. #pragma link "dxSkinMcSkin"
  44. #pragma link "dxSkinMoneyTwins"
  45. #pragma link "dxSkinOffice2007Black"
  46. #pragma link "dxSkinOffice2007Blue"
  47. #pragma link "dxSkinOffice2007Green"
  48. #pragma link "dxSkinOffice2007Pink"
  49. #pragma link "dxSkinOffice2007Silver"
  50. #pragma link "dxSkinOffice2010Black"
  51. #pragma link "dxSkinOffice2010Blue"
  52. #pragma link "dxSkinOffice2010Silver"
  53. #pragma link "dxSkinsCore"
  54. #pragma link "dxSkinscxPCPainter"
  55. #pragma link "dxSkinSeven"
  56. #pragma link "dxSkinSharp"
  57. #pragma link "dxSkinSilver"
  58. #pragma link "dxSkinStardust"
  59. #pragma link "cxRadioGroup"
  60. #pragma link "cxClasses"
  61. #pragma link "cxCustomData"
  62. #pragma link "cxData"
  63. #pragma link "cxDataStorage"
  64. #pragma link "cxDBData"
  65. #pragma link "cxFilter"
  66. #pragma link "cxGrid"
  67. #pragma link "cxGridCustomTableView"
  68. #pragma link "cxGridCustomView"
  69. #pragma link "cxGridDBTableView"
  70. #pragma link "cxGridLevel"
  71. #pragma link "cxGridTableView"
  72. #pragma link "cxStyles"
  73. #pragma link "cxCheckBox"
  74. #pragma link "cxImage"
  75. #pragma link "cxButtonEdit"
  76. #pragma link "cxBlobEdit"
  77. #pragma link "cxHint"
  78. #pragma link "dxCustomHint"
  79. #pragma link "dxScreenTip"
  80. #pragma link "dxSkinsForm"
  81. #pragma link "FFBaseComponent"
  82. #pragma link "FFBasePlay"
  83. #pragma link "FFPlay"
  84. #pragma link "dxGDIPlusClasses"
  85. #pragma link "FFDecode"
  86. #pragma link "cxCalc"
  87. #pragma resource "*.dfm"
  88. #define LICENSE_KEY "FSXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX"
  89. #define SBT_GENERAL "SBT1" // 일반
  90. #define SBT_TRAFFIC "SBT2" // 소통정보
  91. #define SBT_ATMP "SBT3" // 대기환경
  92. #define SBT_WEATHER "SBT4" // 기상정보
  93. #define SBT_INCIDENT "SBT5" // 돌발
  94. #define SBT_VIDEO "SBT6" // 동영상
  95. #define SBT_TRAFBAK "SBT7" // 소통정보배경
  96. TFrmVmsMsgVideoMngr *FrmVmsMsgVideoMngr = NULL;
  97. //---------------------------------------------------------------------------
  98. __fastcall TFrmVmsMsgVideoMngr::TFrmVmsMsgVideoMngr(TComponent* Owner)
  99. : TForm(Owner)
  100. {
  101. //CMM_SetFormPosition(g_AppCfg.bSaveForm);
  102. ITSSkin_Initialize(Application, g_AppCfg.sLang);
  103. ITSSkin_Caption(false);
  104. ITSSkin_Load(this);
  105. //CMM_LoadForm(g_sFormsDir, this);
  106. SetColorScheme(g_AppCfg.sSkinName);
  107. PnlSymbol->Align = alClient;
  108. FUpdate= false;
  109. FTitle = Caption;//"VMS 심볼이미지 관리";
  110. PgSymb->Properties->HideTabs = true;
  111. PgSymb->Properties->ActivePage = TsSbt6;
  112. //ChangeSymbPage(SBT_GENERAL);
  113. EditMode = false;
  114. FIsUpdate = false;
  115. TvList->OptionsView->DataRowHeight = 160;//0;
  116. TvList->OptionsView->CellAutoHeight = true;
  117. TvList->OptionsView->Indicator = false;
  118. TvList->OptionsCustomize->ColumnMoving = false;
  119. TvList->OptionsCustomize->ColumnSorting = false;
  120. TvList->Columns[0]->Width = 60;
  121. TvList->Columns[0]->Options->HorzSizing = false;
  122. FSymbFmtLists.Push("avi", new TSymbFmt("avi", "AV"));
  123. FSymbFmtLists.Push("mpge", new TSymbFmt("mpeg", "MP"));
  124. FSymbFmtLists.Push("mkv", new TSymbFmt("mkv", "MK"));
  125. FSymbFmtLists.Push("mp4", new TSymbFmt("mp4", "M4"));
  126. CURR_SYMB_DATA = new TMemoryStream();
  127. CURR_SYMB_AVI_DATA = new TMemoryStream();
  128. FThumbNail = 0;
  129. FMakeThumbNail = false;
  130. FFDecoder1->SetLicenseKey(LICENSE_KEY);
  131. String sAVILibDir = g_sAppDir + "LibAV";
  132. FFPlayer1->SetLicenseKey(LICENSE_KEY);
  133. FFPlayer1->DisableFPUExceptions();
  134. if (!FFPlayer1->LoadAVLib(sAVILibDir))
  135. {
  136. Application->MessageBox(L"Stream display library load failed.", L"Stream display fail", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  137. }
  138. FPlayStream = false;
  139. }
  140. //---------------------------------------------------------------------------
  141. void __fastcall TFrmVmsMsgVideoMngr::SetColorScheme(String ASkinName)
  142. {
  143. dxSkinController1->SkinName = ASkinName;
  144. dxSkinController1->Refresh();
  145. }
  146. //---------------------------------------------------------------------------
  147. void __fastcall TFrmVmsMsgVideoMngr::CommClose()
  148. {
  149. try
  150. {
  151. #if 0
  152. if (CURR_SYMB_DATA) {
  153. CURR_SYMB_DATA->Free();
  154. }
  155. if (CURR_SYMB_AVI_DATA) {
  156. CURR_SYMB_AVI_DATA->Free();
  157. }
  158. #endif
  159. ITSSkin_Term();
  160. //CMM_SaveForm(g_sFormsDir, this);
  161. }
  162. catch(...)
  163. {
  164. }
  165. }
  166. //---------------------------------------------------------------------------
  167. void __fastcall TFrmVmsMsgVideoMngr::FormShow(TObject *Sender)
  168. {
  169. Refresh();
  170. InitDbLoading();
  171. FormInit();
  172. ChangeEditMode(1);
  173. TmrShow->Enabled = true;
  174. }
  175. //---------------------------------------------------------------------------
  176. void __fastcall TFrmVmsMsgVideoMngr::InitDbLoading()
  177. {
  178. Application->ProcessMessages();
  179. if (!VmsCtlrManager) {
  180. VmsCtlrManager = new TVmsCtlrManager();
  181. }
  182. VmsCtlrManager->LoadVmsModlSize();
  183. VmsCtlrManager->LoadFromDb();
  184. }
  185. //---------------------------------------------------------------------------
  186. void __fastcall TFrmVmsMsgVideoMngr::FormInit()
  187. {
  188. EdNmbr->Text = "";
  189. EdName->Text = "";
  190. EdExpl->Text = "";
  191. SeSize->Value = 0;
  192. SeWidth->Value = 0;
  193. SeHeight->Value = 0;
  194. //EdImageFileName->Text = "";
  195. #if 0
  196. ImgGeneral->Picture->Bitmap->FreeImage();
  197. ImgGeneral->Picture->Bitmap = NULL;
  198. ImgVideo->Picture->Bitmap->FreeImage();
  199. ImgVideo->Picture->Bitmap = NULL;
  200. ImgTemp->Picture->Bitmap->FreeImage();
  201. ImgTemp->Picture->Bitmap = NULL;
  202. #endif
  203. FNewDb = false;
  204. }
  205. //---------------------------------------------------------------------------
  206. void __fastcall TFrmVmsMsgVideoMngr::TmrShowTimer(TObject *Sender)
  207. {
  208. TmrShow->Enabled = false;
  209. LoadImageSymbol();
  210. }
  211. //---------------------------------------------------------------------------
  212. void __fastcall TFrmVmsMsgVideoMngr::BtnCloseClick(TObject *Sender)
  213. {
  214. Close();
  215. }
  216. //---------------------------------------------------------------------------
  217. void __fastcall TFrmVmsMsgVideoMngr::FormClose(TObject *Sender, TCloseAction &Action)
  218. {
  219. CommClose();
  220. FrmVmsMsgVideoMngr = NULL;
  221. Action = caFree;
  222. }
  223. //---------------------------------------------------------------------------
  224. void __fastcall TFrmVmsMsgVideoMngr::LoadingImage(TImage *AImage, String AFileName)
  225. {
  226. try {
  227. AImage->Picture->LoadFromFile(AFileName);
  228. if (AImage->Picture->Graphic->ClassName() == "TGIFImage") {
  229. ((TGIFImage *)AImage->Picture->Graphic)->Animate = true;
  230. AImage->Transparent = true;
  231. }
  232. else {
  233. AImage->Transparent = false;
  234. }
  235. }
  236. catch(Exception &e) {
  237. String errMsg = "이미지를 읽어오는 중에 오류가 발생했습니다.\r\n" + e.Message;
  238. Application->MessageBox(errMsg.c_str(), L"이미지 로딩 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  239. }
  240. }
  241. //---------------------------------------------------------------------------
  242. void __fastcall TFrmVmsMsgVideoMngr::DisplayInfo()
  243. {
  244. FormInit();
  245. int nRow = TvList->DataController->FocusedRecordIndex;
  246. if( nRow <= -1 )
  247. return;
  248. TcxGridDataController *pGDC = TvList->DataController;
  249. nRow = pGDC->FocusedRecordIndex;
  250. CURR_VMS_FORM_OBJ_ID= pGDC->Values[nRow][ColSYMB_NMBR->Index];
  251. CURR_PICT_NM = pGDC->Values[nRow][ColSYMB_NM->Index];
  252. CURR_PICT_EXT = pGDC->Values[nRow][ColSYMB_FILE_EXT->Index];
  253. CURR_PICT_DATA_SZ = pGDC->Values[nRow][ColSYMB_SIZE->Index];
  254. //CURR_PICT_WDTH = pGDC->Values[nRow][ColSYMB_WDTH->Index];
  255. //CURR_PICT_HGHT = pGDC->Values[nRow][ColSYMB_HGHT->Index];
  256. //CURR_USE_YN = pGDC->Values[nRow][ColUSE_YN->Index];
  257. String imageFilePath = pGDC->Values[nRow][ColImagePath->Index];
  258. String videoFilePath = pGDC->Values[nRow][ColVideoPath->Index];
  259. CURR_LOCAL_FILE_NM = pGDC->Values[nRow][ColVideoPath->Index];
  260. LoadingImage(ImgVideo, imageFilePath);
  261. EdNmbr->Text = CURR_VMS_FORM_OBJ_ID;
  262. EdName->Text = CURR_PICT_NM;
  263. SeSize->Value = CURR_PICT_DATA_SZ;
  264. SeWidth->Value = CURR_PICT_WDTH;
  265. SeHeight->Value = CURR_PICT_HGHT;
  266. EdImageFileName->Text = CURR_LOCAL_FILE_NM;
  267. ChangeEditMode(3);
  268. BtnPlay->Enabled = true;
  269. BtnStop->Enabled = false;
  270. BtnPause->Enabled = false;
  271. }
  272. //---------------------------------------------------------------------------
  273. void __fastcall TFrmVmsMsgVideoMngr::BtnEditClick(TObject *Sender)
  274. {
  275. if (BtnEdit->Caption == "편집")//"편집")
  276. {
  277. ChangeEditMode(0);
  278. FNewDb = false;
  279. }
  280. else
  281. {
  282. String sId = EdNmbr->Text;
  283. ChangeEditMode(1);
  284. if (CMM_FindGridData(TvList->DataController, sId, ColSYMB_NMBR->Index) >= 0)
  285. {
  286. CMM_SetGridRow(CxList, TvList, sId, ColSYMB_NMBR->Index);
  287. DisplayInfo();
  288. }
  289. }
  290. }
  291. //---------------------------------------------------------------------------
  292. void __fastcall TFrmVmsMsgVideoMngr::ChangeEditMode(int AEdit)
  293. {
  294. FImageUpdate = false;
  295. bool bEnabled = false;
  296. switch(AEdit)
  297. {
  298. case 0: //편집버튼클릭
  299. {
  300. BtnEdit->Enabled = true;
  301. BtnInsert->Enabled = false;
  302. BtnDelete->Enabled = false;
  303. BtnSave->Enabled = true;
  304. BtnEdit->Caption = "취소";//"취소";
  305. BtnEdit->Hint = "데이터 편집 취소";//데이터 편집 취소";
  306. EditMode = true;
  307. //EdImageFileName->Enabled = FIsUpdate;
  308. }
  309. break;
  310. case 1: //편집[취소]버튼클릭
  311. {
  312. FormInit(); //화면을 모두 지운다.
  313. BtnEdit->Enabled = false;
  314. BtnInsert->Enabled = true;
  315. BtnDelete->Enabled = false;
  316. BtnSave->Enabled = false;
  317. BtnEdit->Caption = "편집";//"편집";
  318. BtnEdit->Hint = "데이터 편집";//데이터 편집";
  319. //bEnabled = true;
  320. EditMode = false;
  321. //EdImageFileName->Enabled = false;
  322. }
  323. break;
  324. case 2: //추가
  325. {
  326. BtnEdit->Enabled = true;
  327. BtnInsert->Enabled = false;
  328. BtnDelete->Enabled = false;
  329. BtnSave->Enabled = true;
  330. BtnEdit->Caption = "취소";//"취소";
  331. BtnEdit->Hint = "데이터 편집 취소";//데이터 편집 취소";
  332. EditMode = true;
  333. //EdImageFileName->Enabled = true;
  334. }
  335. break;
  336. case 3: //수정모드
  337. {
  338. BtnEdit->Enabled = true;
  339. BtnInsert->Enabled = true;
  340. BtnDelete->Enabled = true;
  341. BtnSave->Enabled = false;
  342. BtnEdit->Caption = "편집";//"편집";
  343. BtnEdit->Hint = "데이터 편집";//데이터 편집";
  344. bEnabled = true;
  345. EditMode = false;
  346. //EdImageFileName->Enabled = FIsUpdate;
  347. }
  348. break;
  349. }
  350. BtnSaveImgFile->Enabled = false;
  351. if (FSymbImag != NULL && FSymbImag->Picture->Bitmap != NULL)
  352. {
  353. if (FSymbImag->Picture->Bitmap->Height != 0)
  354. {
  355. BtnSaveImgFile->Enabled = true;
  356. }
  357. }
  358. if (AEdit == 0 || AEdit == 2)
  359. {
  360. GrpList->Enabled = false;
  361. PnlCmd->Enabled = true;
  362. }
  363. else
  364. {
  365. GrpList->Enabled = true;
  366. PnlCmd->Enabled = false;
  367. }
  368. //PnlEdit->Enabled = EditMode;
  369. }
  370. //---------------------------------------------------------------------------
  371. void __fastcall TFrmVmsMsgVideoMngr::BtnSaveClick(TObject *Sender)
  372. {
  373. if (EdNmbr->Text.IsEmpty()) {
  374. Application->MessageBox(L"VMS 동영상 저장\r\VMS 폼객체 ID를 입력하세요.",
  375. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  376. return;
  377. }
  378. if (EdName->Text.Trim().IsEmpty()) {
  379. Application->MessageBox(L"VMS 동영상 저장\r\n동영상 명칭을 입력하세요.",
  380. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  381. return;
  382. }
  383. bool bResult = false;
  384. String sNmbr = EdNmbr->Text;
  385. CURR_VMS_FORM_OBJ_ID = sNmbr;
  386. CURR_PICT_NM = EdName->Text.Trim();
  387. CURR_PICT_DATA_SZ = SeSize->Value;
  388. CURR_PICT_WDTH = SeWidth->Value;
  389. CURR_PICT_HGHT = SeHeight->Value;
  390. if (!FNewDb) {
  391. bResult = UpdateVmsSymbLib(CURR_VMS_FORM_OBJ_ID, CURR_PICT_NM);
  392. }
  393. else {
  394. CURR_BASE_YN = "Y";
  395. CURR_USE_YN = "Y";
  396. bResult = InsertVmsSymbLib(CURR_VMS_FORM_OBJ_ID,
  397. CURR_PICT_NM,
  398. CURR_PICT_EXT,
  399. CURR_PICT_DATA_SZ,
  400. CURR_PICT_WDTH,
  401. CURR_PICT_HGHT,
  402. CURR_USE_YN);
  403. }
  404. if (bResult)
  405. {
  406. Application->MessageBox(L"VMS 동영상 저장\r\nVMS 동영상 정보를 저장 하였습니다.",
  407. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  408. FUpdate = true;
  409. LoadImageSymbol();
  410. CMM_SetGridRow(CxList, TvList, sNmbr, ColSYMB_NMBR->Index);
  411. //DisplayInfo();
  412. }
  413. }
  414. //---------------------------------------------------------------------------
  415. void __fastcall TFrmVmsMsgVideoMngr::BtnInsertClick(TObject *Sender)
  416. {
  417. MnuAddVmsSymbClick((TObject*)MnuVideo);
  418. }
  419. //---------------------------------------------------------------------------
  420. void __fastcall TFrmVmsMsgVideoMngr::BtnDeleteClick(TObject *Sender)
  421. {
  422. int nIdx = TvList->DataController->FocusedRecordIndex;
  423. if (nIdx < 0) return;
  424. String sId = EdNmbr->Text;
  425. if (sId.IsEmpty()) {
  426. Application->MessageBox(L"삭제할 VMS 동영상을 목록에서 선택하세요.\r\n목록에서 더블클릭하여 선택합니다.",
  427. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  428. return;
  429. }
  430. if (CheckFormObjectUseCount(sId) > 0)
  431. {
  432. Application->MessageBox(L"삭제할 동영상이 VMS 폼에서 사용되고 있습니다.\r\n먼저 해당 폼에서 삭제해주시기 바랍니다.",
  433. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  434. return;
  435. }
  436. String sMsg;
  437. sMsg = "VMS 폼객체 ID: " + sId;
  438. sMsg+= "\r\n선택하신 VMS 폼객체 동영상 정보를 삭제하시겠습니까?";
  439. if (Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) == IDYES) {
  440. if (DeleteVmsSymbLib(sId, true))
  441. {
  442. FUpdate = true;
  443. String msg = "VMS 폼객체 동영상 정보삭제\r\nVMS 폼객체 동영상 정보를 삭제 하였습니다.";
  444. Application->MessageBox(msg.c_str(), FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  445. FormInit();
  446. ChangeEditMode(1);
  447. LoadImageSymbol();
  448. }
  449. }
  450. }
  451. //---------------------------------------------------------------------------
  452. void __fastcall TFrmVmsMsgVideoMngr::BtnSaveImgFileClick(TObject *Sender)
  453. {
  454. SaveDialog->Title = FTitle;
  455. SaveDialog->InitialDir = ExtractFilePath(Application->ExeName);
  456. SaveDialog->Filter = "이미지 파일 (*." + CURR_PICT_EXT + ")|*." + CURR_PICT_EXT;
  457. SaveDialog->FileName = EdNmbr->Text + "." + CURR_PICT_EXT;
  458. if (SaveDialog->Execute()) {
  459. try {
  460. String sFileName = SaveDialog->FileName;
  461. ImgGeneral->Picture->SaveToFile(sFileName);
  462. }
  463. catch (Exception &exception) {
  464. Application->ShowException(&exception);
  465. }
  466. }
  467. }
  468. //---------------------------------------------------------------------------
  469. void __fastcall TFrmVmsMsgVideoMngr::EdImageFileNameClick(TObject *Sender)
  470. {
  471. #if 0
  472. if (OpenBmp->InitialDir == "") {
  473. OpenBmp->InitialDir = g_sAppDir;
  474. }
  475. OpenBmp->Title = FTitle;
  476. OpenBmp->FileName = "";
  477. OpenBmp->Execute();
  478. #endif
  479. }
  480. //---------------------------------------------------------------------------
  481. void __fastcall TFrmVmsMsgVideoMngr::OpenBmpCanClose(TObject *Sender, bool &CanClose)
  482. {
  483. CURR_LOCAL_FILE_NM = OpenBmp->FileName;
  484. String sFilePath = ExtractFilePath(CURR_LOCAL_FILE_NM);
  485. CURR_PIC_FILE_NM = ExtractFileName(CURR_LOCAL_FILE_NM);
  486. String sFileExt = ExtractFileExt(CURR_LOCAL_FILE_NM);
  487. OpenBmp->InitialDir = sFilePath;
  488. CURR_USE_YN = "Y";
  489. CURR_PICT_EXT = "";
  490. sFileExt = StringReplace(sFileExt, ".", "", TReplaceFlags() << rfReplaceAll);
  491. sFileExt = sFileExt.LowerCase();
  492. TSymbFmt *symbFmt = FSymbFmtLists.Find(sFileExt);
  493. if (symbFmt == NULL) {
  494. Application->MessageBox(L"VMS 동영상으로 지원하지 않는 형식입니다.\r\n지원형식(avi, mpeg, mkv, mp4)", L"동영상 추가 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  495. BtnInsertClick((TObject*)BtnInsert);
  496. return;
  497. }
  498. CURR_PICT_EXT = symbFmt->fmt;
  499. FImageUpdate = false;
  500. //CURR_SYMB_AVI_DATA->Clear();
  501. //CURR_SYMB_AVI_DATA->Position = 0;
  502. //CURR_SYMB_AVI_DATA->LoadFromFile(CURR_LOCAL_FILE_NM);
  503. //CURR_PICT_DATA_SZ = CURR_SYMB_AVI_DATA->Size;
  504. //TMemoryStream *pPicStream = new TMemoryStream();
  505. try {
  506. try {
  507. ////////////////////////////////////////////////
  508. if (!FFDecoder1->LoadFile(CURR_LOCAL_FILE_NM))
  509. {
  510. Application->MessageBox(L"동영상 파일을 읽어 오는데 실패하였습니다.", L"VMS 이미지 선택", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  511. return;
  512. }
  513. if (FFDecoder1->Decode()) {
  514. FFDecoder1->CopyToBitmap(ImgTemp->Picture->Bitmap);
  515. ImgVideo->Picture->Bitmap->Width = ImgVideo->Width;
  516. ImgVideo->Picture->Bitmap->Height = ImgVideo->Height;
  517. APP_ImageClear(ImgVideo->Canvas, 0, 0, ImgVideo->Width, ImgVideo->Height, clBlack);
  518. SetStretchBltMode(ImgVideo->Canvas->Handle, MAXSTRETCHBLTMODE);//HALFTONE);//MAXSTRETCHBLTMODE)//STRETCH_HALFTONE;
  519. ImgVideo->Canvas->CopyRect(Classes::Rect(0, 0, ImgVideo->Width, ImgVideo->Height),
  520. ImgTemp->Picture->Bitmap->Canvas,
  521. Classes::Rect(0, 0, ImgTemp->Picture->Bitmap->Width, ImgTemp->Picture->Bitmap->Height));
  522. CURR_PICT_WDTH = ImgTemp->Picture->Bitmap->Width;
  523. CURR_PICT_HGHT = ImgTemp->Picture->Bitmap->Height;
  524. CURR_PICT_DATA_SZ = FFDecoder1->FileSize;
  525. //CURR_PICT_DATA_SZ = pPicStream->Size;
  526. ImgVideo->Picture->Bitmap->SaveToStream(CURR_SYMB_DATA);
  527. }
  528. FFDecoder1->CloseFile();
  529. BtnPlay->Enabled = true;
  530. BtnStop->Enabled = false;
  531. BtnPause->Enabled = false;
  532. SeSize->Value = CURR_PICT_DATA_SZ;
  533. SeWidth->Value = CURR_PICT_WDTH;
  534. SeHeight->Value = CURR_PICT_HGHT;
  535. FImageUpdate = true;
  536. }
  537. catch(Exception &e) {
  538. String errMsg = "동영상 처리 중에 오류가 발생했습니다.\r\n" + e.Message;
  539. Application->MessageBox(errMsg.c_str(), L"동영상 추가 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  540. }
  541. }
  542. __finally {
  543. //SAFE_DELETE(pPicStream);
  544. }
  545. if (FImageUpdate == false) {
  546. BtnInsertClick((TObject*)BtnInsert);
  547. }
  548. }
  549. //---------------------------------------------------------------------------
  550. void __fastcall TFrmVmsMsgVideoMngr::ClearListMemory()
  551. {
  552. #if 0
  553. try {
  554. TvList->BeginUpdate();
  555. int nRowCnt = TvList->ViewData->RecordCount;
  556. for (int ii = 0; ii < nRowCnt; ii++) {
  557. TcxCustomGridRow* ARow = TvList->ViewData->Rows[ii];
  558. TMemoryStream *pImgStream = (TMemoryStream *)(int)ARow->Values[Column99->Index];
  559. SAFE_DELETE(pImgStream);
  560. }
  561. }
  562. __finally {
  563. TvList->EndUpdate();
  564. }
  565. #endif
  566. CMM_ClearGridTableView(TvList);
  567. }
  568. //---------------------------------------------------------------------------
  569. void __fastcall TFrmVmsMsgVideoMngr::LoadImageSymbol()
  570. {
  571. FormInit();
  572. ClearListMemory();
  573. String sQry;
  574. TADOQuery *pADO = NULL;
  575. sQry = "SELECT * \r\n"
  576. " FROM TB_VMS_FORM_OBJ_MOV \r\n"
  577. " WHERE 1=1 \r\n"
  578. " ORDER BY VMS_FORM_OBJ_ID \r\n";
  579. int nRowHeight = 0;
  580. try
  581. {
  582. int nRow;
  583. TcxDataController *pGDC = TvList->DataController;
  584. TvList->BeginUpdate();
  585. try
  586. {
  587. pADO = new TADOQuery(NULL);
  588. pADO->Close();
  589. pADO->Connection = ITSDb_GetConnection();
  590. ITSDb_SQLText(pADO, sQry);
  591. ITSDb_SQLOpen(pADO);
  592. String imageFilePath;
  593. String videoFilePath;
  594. String saveDirPath = TPath::GetTempPath() + "VMS\\";
  595. ForceDirectories(saveDirPath.c_str());
  596. for( ; !pADO->Eof; pADO->Next())
  597. {
  598. nRow = pGDC->AppendRecord();
  599. String VMS_FORM_OBJ_ID = pADO->FieldByName("VMS_FORM_OBJ_ID")->AsString;
  600. String MOV_TYPE = pADO->FieldByName("MOV_TYPE")->AsString;
  601. pGDC->Values[nRow][ColSYMB_NMBR->Index] = VMS_FORM_OBJ_ID;
  602. pGDC->Values[nRow][ColSYMB_NM->Index] = pADO->FieldByName("MOV_NM")->AsString;
  603. pGDC->Values[nRow][ColSYMB_DATA->Index] = pADO->FieldByName("THMB_IMG")->AsVariant;
  604. pGDC->Values[nRow][ColSYMB_FILE_EXT->Index] = DbMovieTypeToReal(MOV_TYPE);
  605. pGDC->Values[nRow][ColSYMB_SIZE->Index] = pADO->FieldByName("MOV_DATA_SZ")->AsInteger;
  606. //pGDC->Values[nRow][ColSYMB_WDTH->Index] = pADO->FieldByName("PICT_WDTH")->AsInteger;
  607. //pGDC->Values[nRow][ColSYMB_HGHT->Index] = pADO->FieldByName("PICT_HGHT")->AsInteger;
  608. pGDC->Values[nRow][ColMOV_TYPE->Index] = MOV_TYPE;
  609. String MOVIE_FILE_EXT = DbMovieTypeToReal(MOV_TYPE);
  610. TMemoryStream *pAviStream = new TMemoryStream();
  611. pAviStream->LoadFromStream(pADO->CreateBlobStream(pADO->FieldByName("MOV_DATA"), bmRead));
  612. videoFilePath = saveDirPath + VMS_FORM_OBJ_ID + "." + MOVIE_FILE_EXT;
  613. pAviStream->SaveToFile(videoFilePath);
  614. SAFE_DELETE(pAviStream);
  615. TMemoryStream *pImgStream = new TMemoryStream();
  616. pImgStream->LoadFromStream(pADO->CreateBlobStream(pADO->FieldByName("THMB_IMG"), bmRead));
  617. String MOVE_EXT = DbMovieTypeToReal(MOV_TYPE);
  618. imageFilePath = saveDirPath + VMS_FORM_OBJ_ID + ".bmp";
  619. pImgStream->SaveToFile(imageFilePath);
  620. SAFE_DELETE(pImgStream);
  621. pGDC->Values[nRow][ColImagePath->Index] = imageFilePath;
  622. pGDC->Values[nRow][ColVideoPath->Index] = videoFilePath;
  623. }
  624. }
  625. catch(EDatabaseError &E)
  626. {
  627. DBERRORMSG("TFrmVmsSymbMngr::LoadImageSymbol", String(E.ClassName()), E.Message, sQry);
  628. throw Exception(String(E.ClassName()) + E.Message);
  629. }
  630. catch(Exception &e)
  631. {
  632. DBERRORMSG("TFrmVmsSymbMngr::LoadImageSymbol", String(e.ClassName()), e.Message, sQry);
  633. throw Exception(String(e.ClassName()) + e.Message);
  634. }
  635. }
  636. __finally
  637. {
  638. if (pADO)
  639. {
  640. pADO->Close();
  641. delete pADO;
  642. }
  643. TvList->EndUpdate();
  644. TvList->ApplyBestFit(NULL, false, false);
  645. }
  646. }
  647. //---------------------------------------------------------------------------
  648. void __fastcall TFrmVmsMsgVideoMngr::TvListCellDblClick(TcxCustomGridTableView *Sender, TcxGridTableDataCellViewInfo *ACellViewInfo,
  649. TMouseButton AButton, TShiftState AShift,
  650. bool &AHandled)
  651. {
  652. if (!ACellViewInfo) return;
  653. DisplayInfo();
  654. }
  655. //---------------------------------------------------------------------------
  656. void __fastcall TFrmVmsMsgVideoMngr::ColSYMB_DATACustomDrawCell(TcxCustomGridTableView *Sender,
  657. TcxCanvas *ACanvas, TcxGridTableDataCellViewInfo *AViewInfo,
  658. bool &ADone)
  659. {
  660. #if 0
  661. int nRow = AViewInfo->GridRecord->RecordIndex;
  662. if (nRow < 0) return;
  663. try
  664. {
  665. Graphics::TBitmap *pBmp = (Graphics::TBitmap*)FListSymb->Items[nRow];
  666. TRect rc;
  667. TRect rcOrg = AViewInfo->Bounds;
  668. int nH = ( (rcOrg.Bottom - rcOrg.Top) - pBmp->Height ) / 2;
  669. rc.Top = rcOrg.Top + nH+1;
  670. rc.Bottom = rcOrg.Bottom - nH+1;
  671. rc.Left = rcOrg.Left + 1;
  672. rc.Right = rc.Left + pBmp->Width;
  673. ACanvas->Canvas->StretchDraw(rc, pBmp);
  674. ADone = true;
  675. }
  676. catch(Exception &e)
  677. {
  678. }
  679. #endif
  680. }
  681. //---------------------------------------------------------------------------
  682. void __fastcall TFrmVmsMsgVideoMngr::TvListFocusedRecordChanged(TcxCustomGridTableView *Sender,
  683. TcxCustomGridRecord *APrevFocusedRecord, TcxCustomGridRecord *AFocusedRecord,
  684. bool ANewItemRecordFocusingChanged)
  685. {
  686. if (!AFocusedRecord) return;
  687. DisplayInfo();
  688. }
  689. //---------------------------------------------------------------------------
  690. void __fastcall TFrmVmsMsgVideoMngr::CbTypePropertiesChange(TObject *Sender)
  691. {
  692. if (CbType->Text.Pos(SBT_GENERAL)) {
  693. //if (LblDesc->Visible) LblDesc->Visible = false;
  694. }
  695. else {
  696. //if (LblDesc->Visible == false) LblDesc->Visible = true;
  697. }
  698. }
  699. //---------------------------------------------------------------------------
  700. void __fastcall TFrmVmsMsgVideoMngr::PnlMenuDblClick(TObject *Sender)
  701. {
  702. FIsUpdate = true;
  703. }
  704. //---------------------------------------------------------------------------
  705. bool __fastcall TFrmVmsMsgVideoMngr::DeleteVmsSymbLib(String VMS_FORM_OBJ_ID, bool ADelete)
  706. {
  707. String sQry;
  708. TADOQuery *pADO = NULL;
  709. if (ADelete) {
  710. sQry = "DELETE TB_VMS_FORM_OBJ_MOV \r\n"
  711. " WHERE VMS_FORM_OBJ_ID = :p01 \r\n";
  712. }
  713. else {
  714. sQry = "UPDATE TB_VMS_FORM_OBJ_MOV \r\n"
  715. " SET CHNGR_ID = :p02, \r\n"
  716. " CHG_DT = SYSDATE \r\n"
  717. " WHERE VMS_FORM_OBJ_ID = :p01 \r\n";
  718. }
  719. try
  720. {
  721. try
  722. {
  723. pADO = new TADOQuery(NULL);
  724. pADO->Close();
  725. pADO->Connection = ITSDb_GetConnection();
  726. ITSDb_SQLText(pADO, sQry);
  727. pADO->Parameters->ParamByName("p01")->Value = VMS_FORM_OBJ_ID;
  728. if (!ADelete) {
  729. pADO->Parameters->ParamByName("p02")->Value = g_AppCfg.OPER_ID;
  730. }
  731. pADO->ExecSQL();
  732. }
  733. catch(EDatabaseError &E)
  734. {
  735. DBERRORMSG("TFrmVmsSymbMngr::DeleteVmsSymbLib", String(E.ClassName()), E.Message, sQry);
  736. return false;
  737. }
  738. catch(Exception &e)
  739. {
  740. DBERRORMSG("TFrmVmsSymbMngr::DeleteVmsSymbLib", String(e.ClassName()), e.Message, sQry);
  741. return false;
  742. }
  743. }
  744. __finally
  745. {
  746. if (pADO)
  747. {
  748. pADO->Close();
  749. delete pADO;
  750. }
  751. }
  752. return true;
  753. }
  754. //---------------------------------------------------------------------------
  755. bool __fastcall TFrmVmsMsgVideoMngr::UpdateVmsSymbLib(String VMS_FORM_OBJ_ID, String PICT_NM)
  756. {
  757. String sQry;
  758. TADOQuery *pADO = NULL;
  759. sQry = "UPDATE TB_VMS_FORM_OBJ_MOV \r\n"
  760. " SET MOV_NM = :p02, \r\n"
  761. " CHNGR_ID = :p03, \r\n"
  762. " CHG_DT = SYSDATE \r\n"
  763. " WHERE VMS_FORM_OBJ_ID = :p01 \r\n";
  764. try
  765. {
  766. try
  767. {
  768. pADO = new TADOQuery(NULL);
  769. pADO->Close();
  770. pADO->Connection = ITSDb_GetConnection();
  771. ITSDb_SQLText(pADO, sQry);
  772. pADO->Parameters->ParamByName("p01")->Value = VMS_FORM_OBJ_ID;
  773. pADO->Parameters->ParamByName("p02")->Value = PICT_NM;
  774. pADO->Parameters->ParamByName("p03")->Value = g_AppCfg.OPER_ID;
  775. pADO->ExecSQL();
  776. }
  777. catch(EDatabaseError &E)
  778. {
  779. DBERRORMSG("TFrmVmsSymbMngr::UpdateVmsSymbLib", String(E.ClassName()), E.Message, sQry);
  780. return false;
  781. }
  782. catch(Exception &e)
  783. {
  784. DBERRORMSG("TFrmVmsSymbMngr::UpdateVmsSymbLib", String(e.ClassName()), e.Message, sQry);
  785. return false;
  786. }
  787. }
  788. __finally
  789. {
  790. if (pADO)
  791. {
  792. pADO->Close();
  793. delete pADO;
  794. }
  795. }
  796. return true;
  797. }
  798. //---------------------------------------------------------------------------
  799. bool __fastcall TFrmVmsMsgVideoMngr::InsertVmsSymbLib(String VMS_FORM_OBJ_ID,
  800. String PICT_NM,
  801. String PICT_EXT,
  802. int PICT_DATA_SZ,
  803. int PICT_WDTH,
  804. int PICT_HGHT,
  805. String USE_YN) {
  806. String sQry;
  807. TADOQuery *pADO = NULL;
  808. sQry = "INSERT INTO TB_VMS_FORM_OBJ_MOV ( \r\n"
  809. " VMS_FORM_OBJ_ID, \r\n"
  810. " MOV_NM, \r\n"
  811. " MOV_DATA_SZ, \r\n"
  812. " MOV_DATA, \r\n"
  813. " MOV_TYPE, \r\n"
  814. " THMB_IMG_SZ, \r\n"
  815. " THMB_IMG, \r\n"
  816. " RGSTR_ID, \r\n"
  817. " REG_DT ) \r\n"
  818. " VALUES ( \r\n"
  819. " :p01, \r\n"
  820. " :p02, \r\n"
  821. " :p03, \r\n"
  822. " :p04, \r\n"
  823. " :p05, \r\n"
  824. " :p06, \r\n"
  825. " :p07, \r\n"
  826. " :p08, \r\n"
  827. " SYSDATE ) \r\n";
  828. TMemoryStream *dataStream = new TMemoryStream();
  829. TMemoryStream *imagStream = new TMemoryStream();
  830. try
  831. {
  832. dataStream->LoadFromFile(CURR_LOCAL_FILE_NM);
  833. ImgTemp->Picture->Bitmap->SaveToStream(imagStream);
  834. try
  835. {
  836. pADO = new TADOQuery(NULL);
  837. pADO->Close();
  838. pADO->Connection = ITSDb_GetConnection();
  839. ITSDb_SQLText(pADO, sQry);
  840. pADO->Parameters->ParamByName("p01")->Value = VMS_FORM_OBJ_ID;
  841. pADO->Parameters->ParamByName("p02")->Value = PICT_NM;
  842. pADO->Parameters->ParamByName("p03")->Value = PICT_DATA_SZ;
  843. pADO->Parameters->ParamByName("p04")->LoadFromStream(dataStream, ftBlob);
  844. pADO->Parameters->ParamByName("p05")->Value = RealMovieTypeToDb(PICT_EXT);
  845. pADO->Parameters->ParamByName("p06")->Value = imagStream->Size;
  846. pADO->Parameters->ParamByName("p07")->LoadFromStream(imagStream, ftBlob);
  847. pADO->Parameters->ParamByName("p08")->Value = g_AppCfg.OPER_ID;
  848. pADO->ExecSQL();
  849. }
  850. catch(EDatabaseError &E)
  851. {
  852. DBERRORMSG("TFrmVmsSymbMngr::InsertVmsSymbLib", String(E.ClassName()), E.Message, sQry);
  853. return false;
  854. }
  855. catch(Exception &e)
  856. {
  857. DBERRORMSG("TFrmVmsSymbMngr::InsertVmsSymbLib", String(e.ClassName()), e.Message, sQry);
  858. return false;
  859. }
  860. }
  861. __finally
  862. {
  863. if (pADO)
  864. {
  865. pADO->Close();
  866. delete pADO;
  867. }
  868. SAFE_DELETE(dataStream);
  869. SAFE_DELETE(imagStream);
  870. }
  871. return true;
  872. }
  873. //---------------------------------------------------------------------------
  874. String __fastcall TFrmVmsMsgVideoMngr::GetNewVmsFormMovObjId()
  875. {
  876. String sQry;
  877. TADOQuery *pADO = NULL;
  878. String result = "MV-0000000";
  879. sQry = "SELECT 'MV-' || LPAD(NVL(MAX(SUBSTR(VMS_FORM_OBJ_ID, -7)), '0000000') + 1, 7, '0') AS NEWID FROM TB_VMS_FORM_OBJ_MOV WHERE SUBSTR(VMS_FORM_OBJ_ID, 1,3) = 'MV-'\r\n";
  880. try
  881. {
  882. try
  883. {
  884. pADO = new TADOQuery(NULL);
  885. pADO->Close();
  886. pADO->Connection = ITSDb_GetConnection();
  887. ITSDb_SQLText(pADO, sQry);
  888. ITSDb_SQLOpen(pADO);
  889. pADO->Open();
  890. result = pADO->FieldByName("NEWID")->AsString;
  891. }
  892. catch(EDatabaseError &E)
  893. {
  894. DBERRORMSG("TFrmVmsSymbMngr::GetNewVmsFormMovObjId", String(E.ClassName()), E.Message, sQry);
  895. return result;
  896. }
  897. catch(Exception &e)
  898. {
  899. DBERRORMSG("TFrmVmsSymbMngr::GetNewVmsFormMovObjId", String(e.ClassName()), e.Message, sQry);
  900. return result;
  901. }
  902. }
  903. __finally
  904. {
  905. if (pADO)
  906. {
  907. pADO->Close();
  908. delete pADO;
  909. }
  910. }
  911. return result;
  912. }
  913. //---------------------------------------------------------------------------
  914. void __fastcall TFrmVmsMsgVideoMngr::MnuAddVmsSymbClick(TObject *Sender)
  915. {
  916. int START_NMBR, END_NMBR;
  917. TMenuItem *pMenu = (TMenuItem*)Sender;
  918. switch(pMenu->Tag) {
  919. case 1: CURR_SYMB_TYPE = SBT_GENERAL; START_NMBR = 1000; END_NMBR = 1999; break; // 일반
  920. case 2: CURR_SYMB_TYPE = SBT_TRAFFIC; START_NMBR = 2000; END_NMBR = 2999; break; // 소통정보
  921. case 3: CURR_SYMB_TYPE = SBT_ATMP; START_NMBR = 3000; END_NMBR = 3999; break; // 대기환경
  922. case 4: CURR_SYMB_TYPE = SBT_WEATHER; START_NMBR = 4000; END_NMBR = 4999; break; // 기상정보
  923. case 5: CURR_SYMB_TYPE = SBT_INCIDENT; START_NMBR = 5000; END_NMBR = 5999; break; // 돌발
  924. case 6: CURR_SYMB_TYPE = SBT_VIDEO; START_NMBR = 6000; END_NMBR = 6999; break; // 동영상
  925. case 7: CURR_SYMB_TYPE = SBT_TRAFBAK; START_NMBR = 7000; END_NMBR = 7999; break; // 소통정보배경
  926. default: return;
  927. }
  928. String symbDefExt = "";
  929. String symbFilter = "";
  930. #if 0
  931. switch(pMenu->Tag) {
  932. case 1: symbDefExt = "bmp"; symbFilter = "심벌 (*.gif;*.png;*.jpg;*.jpeg;*.bmp;*.ico)|*.gif;*.png;*.jpg;*.jpeg;*.bmp;*.ico"; break; // 일반
  933. case 2: symbDefExt = "bmp"; symbFilter = "소통정보 (*.bmp)|*.bmp"; break; // 소통정보
  934. case 3: symbDefExt = "bmp"; symbFilter = "대기환경 (*.gif;*.png;*.jpg;*.jpeg;*.bmp)|*.gif;*.png;*.jpg;*.jpeg;*.bmp"; break; // 대기환경
  935. case 4: symbDefExt = "bmp"; symbFilter = "기상정보 (*.gif;*.png;*.jpg;*.jpeg;*.bmp;*.avi)|*.gif;*.png;*.jpg;*.jpeg;*.bmp;*.avi"; break; // 기상정보
  936. case 5: symbDefExt = "bmp"; symbFilter = "돌발 (*.gif;*.png;*.jpg;*.jpeg;*.bmp)|*.gif;*.png;*.jpg;*.jpeg;*.bmp"; break; // 돌발
  937. case 6: symbDefExt = "avi"; symbFilter = "동영상 (*.avi)|*.avi"; break; // 동영상
  938. case 7: symbDefExt = "bmp"; symbFilter = "소통정보배경 (*.bmp)|*.bmp"; break; // 소통정보배경
  939. default: return;
  940. }
  941. #else
  942. switch(pMenu->Tag) {
  943. case 1: symbDefExt = "bmp"; symbFilter = "심벌 (*.gif;*.bmp)|*.gif;*.bmp"; break; // 일반
  944. case 2: symbDefExt = "bmp"; symbFilter = "소통정보 (*.bmp)|*.bmp"; break; // 소통정보
  945. case 3: symbDefExt = "bmp"; symbFilter = "대기환경 (*.gif;*.bmp)|*.gif;*.bmp"; break; // 대기환경
  946. case 4: symbDefExt = "bmp"; symbFilter = "기상정보 (*.gif;*.bmp)|*.gif;*.bmp"; break; // 기상정보
  947. case 5: symbDefExt = "bmp"; symbFilter = "돌발 (*.gif;*.bmp)|*.gif;*.bmp"; break; // 돌발
  948. case 6: symbDefExt = "avi"; symbFilter = "동영상 (*.avi;*.mpeg;*.mkv;*.mp4)|*.avi;*.mpeg;*.mkv;*.mp4"; break; // 동영상
  949. case 7: symbDefExt = "bmp"; symbFilter = "소통정보배경 (*.bmp)|*.bmp"; break; // 소통정보배경
  950. default: return;
  951. }
  952. #endif
  953. OpenBmp->DefaultExt = symbDefExt;
  954. OpenBmp->Filter = symbFilter;
  955. FormInit();
  956. CURR_VMS_FORM_OBJ_ID = GetNewVmsFormMovObjId();
  957. EdNmbr->Text = CURR_VMS_FORM_OBJ_ID;
  958. ChangeEditMode(2);
  959. FNewDb = true;
  960. if (OpenBmp->InitialDir == "") {
  961. OpenBmp->InitialDir = g_sAppDir;
  962. }
  963. OpenBmp->Title = FTitle;
  964. OpenBmp->FileName = "";
  965. if (!OpenBmp->Execute()) {
  966. ChangeEditMode(1);
  967. }
  968. }
  969. //---------------------------------------------------------------------------
  970. void __fastcall TFrmVmsMsgVideoMngr::ChangeSymbPage(String ASymbType)
  971. {
  972. int itemIdx = -1;
  973. for (int ii = 0; ii < CbType->Properties->Items->Count; ii++) {
  974. String itemText = CbType->Properties->Items->Strings[ii];
  975. if (itemText.Pos(ASymbType)) {
  976. itemIdx = ii;
  977. break;
  978. }
  979. }
  980. CbType->ItemIndex = itemIdx;
  981. if (ASymbType == SBT_TRAFFIC
  982. || ASymbType == SBT_ATMP
  983. || ASymbType == SBT_WEATHER
  984. || ASymbType == SBT_INCIDENT) {
  985. EdExpl->Properties->ReadOnly = true;
  986. }
  987. else EdExpl->Properties->ReadOnly = false;
  988. TcxTabSheet *pNewActive = NULL;
  989. String grpSymbCaption = "▶ 일반 심볼 이미지";
  990. if (ASymbType == SBT_GENERAL) {
  991. pNewActive = TsSbt1;
  992. grpSymbCaption = "▶ 일반 심볼 이미지";
  993. }
  994. else if (ASymbType == SBT_TRAFFIC) {
  995. pNewActive = TsSbt2;
  996. grpSymbCaption = "▶ 소통정보 심볼 이미지";
  997. }
  998. else if (ASymbType == SBT_ATMP)
  999. {
  1000. pNewActive = TsSbt3;
  1001. grpSymbCaption = "▶ 대기환경 심볼 이미지";
  1002. }
  1003. else if (ASymbType == SBT_WEATHER) {
  1004. pNewActive = TsSbt4;
  1005. grpSymbCaption = "▶ 기상정보 심볼 이미지";
  1006. }
  1007. else if (ASymbType == SBT_INCIDENT) {
  1008. pNewActive = TsSbt5;
  1009. grpSymbCaption = "▶ 돌발 심볼 이미지";
  1010. }
  1011. else if (ASymbType == SBT_VIDEO) {
  1012. pNewActive = TsSbt6;
  1013. grpSymbCaption = "▶ 동영상 심볼 이미지";
  1014. }
  1015. else if (ASymbType == SBT_TRAFBAK) {
  1016. pNewActive = TsSbt7;
  1017. grpSymbCaption = "▶ 소통정보 배경 심볼 이미지";
  1018. }
  1019. else return;
  1020. TcxTabSheet *pCurActive = PgSymb->Properties->ActivePage;
  1021. if (pNewActive != pCurActive) {
  1022. PgSymb->Properties->ActivePage = pNewActive;
  1023. GrpSymbBox->Caption = grpSymbCaption;
  1024. }
  1025. }
  1026. //---------------------------------------------------------------------------
  1027. String __fastcall TFrmVmsMsgVideoMngr::GetSymbTypeDesc(String ASymbType)
  1028. {
  1029. if (ASymbType == SBT_GENERAL) {
  1030. return "일반";
  1031. }
  1032. else if (ASymbType == SBT_TRAFFIC) {
  1033. return "소통정보";
  1034. }
  1035. else if (ASymbType == SBT_ATMP)
  1036. {
  1037. return "대기환경";
  1038. }
  1039. else if (ASymbType == SBT_WEATHER) {
  1040. return "기상정보";
  1041. }
  1042. else if (ASymbType == SBT_INCIDENT) {
  1043. return "돌발";
  1044. }
  1045. else if (ASymbType == SBT_VIDEO) {
  1046. return "동영상";
  1047. }
  1048. else if (ASymbType == SBT_TRAFBAK) {
  1049. return "소통정보 배경";
  1050. }
  1051. return "?-" + ASymbType;
  1052. }
  1053. //---------------------------------------------------------------------------
  1054. void __fastcall TFrmVmsMsgVideoMngr::FFPlayer1FileOpen(TObject *Sender, const __int64 ADuration, int AFrameWidth, int AFrameHeight,
  1055. int &AScreenWidth, int &AScreenHeight)
  1056. {
  1057. #if 0
  1058. FPlayTime = (ADuration + 5000) / 1000000;
  1059. FPlayTime++;
  1060. FThumbNail = 0;
  1061. FMakeThumbNail = true;
  1062. #endif
  1063. FDuration = ADuration;
  1064. lblDuration->Caption = DurationToStr(ADuration);
  1065. lblCurrentPTS->Caption = "N/A";
  1066. // setup track bar
  1067. TrackBar->Frequency = 5;
  1068. TrackBar->TickStyle = tsAuto;
  1069. TrackBar->Max = TrackBar->Width;
  1070. TrackBar->SelStart = 0;
  1071. TrackBar->SelEnd = 0;
  1072. TrackBar->SliderVisible = ADuration > 0;
  1073. FTrackChanging = true;
  1074. try
  1075. {
  1076. TrackBar->Position = 0;
  1077. }
  1078. __finally
  1079. {
  1080. FTrackChanging = false;
  1081. }
  1082. }
  1083. //---------------------------------------------------------------------------
  1084. void __fastcall TFrmVmsMsgVideoMngr::FFPlayer1OpenFailed(TObject *Sender)
  1085. {
  1086. String sLastErrMsg = FFPlayer1->LastErrMsg;
  1087. PnlPlayer->Caption = sLastErrMsg;
  1088. }
  1089. //---------------------------------------------------------------------------
  1090. void __fastcall TFrmVmsMsgVideoMngr::FFPlayer1Position(TObject *Sender, const __int64 APTS)
  1091. {
  1092. lblCurrentPTS->Caption = DurationToStr(APTS);
  1093. if ((APTS >= 0) && (FDuration > 0))
  1094. {
  1095. TrackBar->SelEnd = TrackBar->Max * APTS / FDuration;
  1096. if (FTrackChanging == false && (IsMouseDown() == false || TrackBar->Focused() == false))
  1097. {
  1098. FTrackChanging = true;
  1099. try
  1100. {
  1101. TrackBar->Position = TrackBar->Max * APTS / FDuration;
  1102. }
  1103. __finally
  1104. {
  1105. FTrackChanging = false;
  1106. }
  1107. }
  1108. if (FMakeThumbNail)
  1109. {
  1110. FThumbNail++;
  1111. if (FThumbNail > 2)
  1112. {
  1113. //섬네일이미지 생성
  1114. FMakeThumbNail = false;
  1115. }
  1116. }
  1117. }
  1118. }
  1119. //---------------------------------------------------------------------------
  1120. void __fastcall TFrmVmsMsgVideoMngr::FFPlayer1State(TObject *Sender, TPlayState APlayState)
  1121. {
  1122. switch(APlayState)
  1123. {
  1124. case Ffbasecomponent::psPlay:
  1125. case Ffbasecomponent::psResume:
  1126. break;
  1127. case Ffbasecomponent::psPause:
  1128. case Ffbasecomponent::psStep:
  1129. break;
  1130. case Ffbasecomponent::psStop:
  1131. if (FFPlayer1->ScreenHandle != NULL)
  1132. {
  1133. PostMessage(FFPlayer1->ScreenHandle, CM_INVALIDATE, 0, 0);
  1134. UpdateWindow(FFPlayer1->ScreenHandle);
  1135. }
  1136. break;
  1137. case Ffbasecomponent::psEnd:
  1138. {
  1139. FFPlayer1->Stop(true);
  1140. //FFPlayer1->Seek((__int64)0, TSeekFlags()<<sfBackward);
  1141. }
  1142. break;
  1143. }
  1144. }
  1145. //---------------------------------------------------------------------------
  1146. void __fastcall TFrmVmsMsgVideoMngr::TrackBarChange(TObject *Sender)
  1147. {
  1148. if (!FTrackChanging && !IsMouseDown())
  1149. {
  1150. FFPlayer1->Seek(FDuration * TrackBar->Position / TrackBar->Max);
  1151. }
  1152. }
  1153. //---------------------------------------------------------------------------
  1154. void __fastcall TFrmVmsMsgVideoMngr::BtnPlayClick(TObject *Sender)
  1155. {
  1156. BtnPlay->Enabled = false;
  1157. Application->ProcessMessages();
  1158. try {
  1159. if (FFPlayer1->ScreenHandle != NULL)
  1160. {
  1161. FFPlayer1->Stop(true);
  1162. PostMessage(FFPlayer1->ScreenHandle, CM_INVALIDATE, 0, 0);
  1163. UpdateWindow(FFPlayer1->ScreenHandle);
  1164. }
  1165. FFPlayer1->AspectRatio = ChkFitScreen->Checked ? -1 : 0;
  1166. FFPlayer1->TryOpen(CURR_LOCAL_FILE_NM, PnlPlayer->Handle);
  1167. Application->ProcessMessages();
  1168. }
  1169. catch(Exception &e)
  1170. {
  1171. }
  1172. BtnStop->Enabled = true;
  1173. BtnPause->Enabled = true;
  1174. FPlayStream = true;
  1175. ImgVideo->Visible = false;
  1176. }
  1177. //---------------------------------------------------------------------------
  1178. void __fastcall TFrmVmsMsgVideoMngr::BtnStopClick(TObject *Sender)
  1179. {
  1180. BtnStop->Enabled = false;
  1181. BtnPause->Enabled = false;
  1182. if (FFPlayer1->ScreenHandle != NULL) {
  1183. FFPlayer1->Stop(true);
  1184. }
  1185. BtnPlay->Enabled = true;
  1186. FPlayStream = false;
  1187. ImgVideo->Visible = true;
  1188. }
  1189. //---------------------------------------------------------------------------
  1190. void __fastcall TFrmVmsMsgVideoMngr::BtnPauseClick(TObject *Sender)
  1191. {
  1192. try
  1193. {
  1194. if (FFPlayer1->ScreenHandle != NULL)
  1195. {
  1196. FFPlayer1->TogglePause();
  1197. }
  1198. Application->ProcessMessages();
  1199. }
  1200. catch(Exception &e)
  1201. {
  1202. }
  1203. }
  1204. //---------------------------------------------------------------------------
  1205. void __fastcall TFrmVmsMsgVideoMngr::ChkFitScreenClick(TObject *Sender)
  1206. {
  1207. FFPlayer1->AspectRatio = ChkFitScreen->Checked ? -1 : 0;
  1208. }
  1209. //---------------------------------------------------------------------------
  1210. TImage* __fastcall TFrmVmsMsgVideoMngr::GetPreviewSymb(String ASymbType)
  1211. {
  1212. TImage *imagSymb = NULL;
  1213. if (ASymbType == SBT_GENERAL) {
  1214. imagSymb = ImgGeneral;
  1215. }
  1216. else if (ASymbType == SBT_TRAFFIC) {
  1217. imagSymb = ImagTraffic;
  1218. }
  1219. else if (ASymbType == SBT_ATMP) {
  1220. imagSymb = ImagAtmp;
  1221. }
  1222. else if (ASymbType == SBT_WEATHER) {
  1223. imagSymb = ImagWeather;
  1224. }
  1225. else if (ASymbType == SBT_INCIDENT) {
  1226. imagSymb = ImagIncident;
  1227. }
  1228. else if (ASymbType == SBT_VIDEO) {
  1229. imagSymb = ImgVideo;
  1230. }
  1231. else if (ASymbType == SBT_TRAFBAK) {
  1232. imagSymb = ImagTrafBack;
  1233. }
  1234. return imagSymb;
  1235. }
  1236. //---------------------------------------------------------------------------
  1237. void __fastcall TFrmVmsMsgVideoMngr::ImagTrafficMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
  1238. {
  1239. if (!FNewDb) return;
  1240. ImageClear(ImagTraffic1);
  1241. ImageClear(ImagTraffic2);
  1242. ImageClear(ImagTraffic3);
  1243. ImagTraffic1->Picture->Bitmap->Assign(ImagTraffic->Picture->Bitmap);
  1244. ImagTraffic2->Picture->Bitmap->Assign(ImagTraffic->Picture->Bitmap);
  1245. ImagTraffic3->Picture->Bitmap->Assign(ImagTraffic->Picture->Bitmap);
  1246. TColor FOldColor = ImagTraffic->Picture->Bitmap->Canvas->Pixels[X][Y];
  1247. ImagTraffic1->Picture->Bitmap->Canvas->Brush->Color = clLime;
  1248. ImagTraffic1->Picture->Bitmap->Canvas->FloodFill(X, Y, FOldColor, fsSurface);
  1249. ImagTraffic2->Picture->Bitmap->Canvas->Brush->Color = clYellow;
  1250. ImagTraffic2->Picture->Bitmap->Canvas->FloodFill(X, Y, FOldColor, fsSurface);
  1251. ImagTraffic3->Picture->Bitmap->Canvas->Brush->Color = clRed;
  1252. ImagTraffic3->Picture->Bitmap->Canvas->FloodFill(X, Y, FOldColor, fsSurface);
  1253. }
  1254. //---------------------------------------------------------------------------
  1255. void __fastcall TFrmVmsMsgVideoMngr::ImageClear(TImage *AImage)
  1256. {
  1257. AImage->Picture->Bitmap->FreeImage();
  1258. AImage->Picture->Bitmap->ReleaseHandle();
  1259. AImage->Picture->Assign(NULL);
  1260. AImage->Repaint();
  1261. AImage->Invalidate();
  1262. }
  1263. //---------------------------------------------------------------------------
  1264. void __fastcall TFrmVmsMsgVideoMngr::BtnSubImageSelectClick(TObject *Sender)
  1265. {
  1266. #if 0
  1267. TcxButton *pBtn = (TcxButton*)Sender;
  1268. FSelImag = NULL;
  1269. switch(pBtn->Tag) {
  1270. case 10: FSelImag = ImagAtmp1; break;
  1271. case 11: FSelImag = ImagAtmp2; break;
  1272. case 12: FSelImag = ImagAtmp3; break;
  1273. case 13: FSelImag = ImagAtmp4; break;
  1274. case 20: FSelImag = ImagWeather1; break;
  1275. case 21: FSelImag = ImagWeather2; break;
  1276. case 22: FSelImag = ImagWeather3; break;
  1277. case 23: FSelImag = ImagWeather4; break;
  1278. case 30: FSelImag = ImagIncident1; break;
  1279. case 31: FSelImag = ImagIncident2; break;
  1280. case 32: FSelImag = ImagIncident3; break;
  1281. case 33: FSelImag = ImagIncident4; break;
  1282. default: return;
  1283. }
  1284. OpenSubImag->DefaultExt = OpenBmp->DefaultExt;
  1285. OpenSubImag->Filter = OpenBmp->Filter;
  1286. OpenSubImag->InitialDir = OpenBmp->InitialDir;
  1287. OpenSubImag->Title = FTitle;
  1288. OpenSubImag->FileName = "";
  1289. OpenSubImag->Execute();
  1290. #endif
  1291. }
  1292. //---------------------------------------------------------------------------
  1293. int __fastcall TFrmVmsMsgVideoMngr::CheckFormObjectUseCount(String AFORM_OBJ_ID)
  1294. {
  1295. String sQry;
  1296. TADOQuery *pADO = NULL;
  1297. int nResult = 0;
  1298. sQry = "SELECT COUNT(1) AS CNT \r\n"
  1299. " FROM TB_VMS_FORM_VMS_FORM_OBJ \r\n"
  1300. " WHERE VMS_FORM_OBJ_ID = :p01 \r\n";
  1301. try {
  1302. try {
  1303. pADO = new TADOQuery(NULL);
  1304. pADO->Close();
  1305. pADO->Connection = ITSDb_GetConnection();
  1306. ITSDb_SQLText(pADO, sQry);
  1307. ITSDb_SQLBind(pADO, "p01", AFORM_OBJ_ID);
  1308. ITSDb_SQLOpen(pADO);
  1309. nResult = pADO->FieldByName("CNT")->AsInteger;
  1310. }
  1311. catch(EDatabaseError &E) {
  1312. DBERRORMSG("CheckFormObjectUseCount", String(E.ClassName()), E.Message, sQry);
  1313. return 1;
  1314. }
  1315. catch(Exception &e) {
  1316. DBERRORMSG("CheckFormObjectUseCount", String(e.ClassName()), e.Message, sQry);
  1317. return 1;
  1318. }
  1319. }
  1320. __finally {
  1321. if (pADO) {
  1322. pADO->Close();
  1323. delete pADO;
  1324. }
  1325. }
  1326. return nResult;
  1327. }
  1328. //---------------------------------------------------------------------------