FrmVmsMsgVideoMngrF.cpp 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537
  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. TItsMap<String, TSymbFmt*> g_SymbFmtLists;
  98. //---------------------------------------------------------------------------
  99. __fastcall TFrmVmsMsgVideoMngr::TFrmVmsMsgVideoMngr(TComponent* Owner)
  100. : TForm(Owner)
  101. {
  102. //CMM_SetFormPosition(g_AppCfg.bSaveForm);
  103. ITSSkin_Initialize(Application, g_AppCfg.sLang);
  104. ITSSkin_Caption(false);
  105. ITSSkin_Load(this);
  106. //CMM_LoadForm(g_sFormsDir, this);
  107. SetColorScheme(g_AppCfg.sSkinName);
  108. PnlSymbol->Align = alClient;
  109. FUpdate= false;
  110. FTitle = Caption;//"VMS 심볼이미지 관리";
  111. PgSymb->Properties->HideTabs = true;
  112. PgSymb->Properties->ActivePage = TsSbt6;
  113. //ChangeSymbPage(SBT_GENERAL);
  114. EditMode = false;
  115. FIsUpdate = false;
  116. TvList->OptionsView->DataRowHeight = 0;
  117. TvList->OptionsView->CellAutoHeight = true;
  118. TvList->OptionsView->Indicator = false;
  119. TvList->OptionsCustomize->ColumnMoving = false;
  120. TvList->OptionsCustomize->ColumnSorting = false;
  121. TvList->Columns[0]->Width = 60;
  122. TvList->Columns[0]->Options->HorzSizing = false;
  123. g_SymbFmtLists.Push("avi", new TSymbFmt("avi", "AV"));
  124. g_SymbFmtLists.Push("mpge", new TSymbFmt("mpeg", "MP"));
  125. g_SymbFmtLists.Push("mkv", new TSymbFmt("mkv", "MK"));
  126. g_SymbFmtLists.Push("mp4", new TSymbFmt("mp4", "M4"));
  127. CURR_SYMB_DATA = new TMemoryStream();
  128. CURR_SYMB_AVI_DATA = new TMemoryStream();
  129. FThumbNail = 0;
  130. FMakeThumbNail = false;
  131. FFDecoder1->SetLicenseKey(LICENSE_KEY);
  132. String sAVILibDir = g_sAppDir + "LibAV";
  133. FFPlayer1->SetLicenseKey(LICENSE_KEY);
  134. FFPlayer1->DisableFPUExceptions();
  135. if (!FFPlayer1->LoadAVLib(sAVILibDir))
  136. {
  137. Application->MessageBox(L"Stream display library load failed.", L"Stream display fail", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  138. }
  139. FPlayStream = false;
  140. }
  141. //---------------------------------------------------------------------------
  142. void __fastcall TFrmVmsMsgVideoMngr::SetColorScheme(String ASkinName)
  143. {
  144. dxSkinController1->SkinName = ASkinName;
  145. dxSkinController1->Refresh();
  146. }
  147. //---------------------------------------------------------------------------
  148. void __fastcall TFrmVmsMsgVideoMngr::CommClose()
  149. {
  150. try
  151. {
  152. #if 0
  153. if (CURR_SYMB_DATA) {
  154. CURR_SYMB_DATA->Free();
  155. }
  156. if (CURR_SYMB_AVI_DATA) {
  157. CURR_SYMB_AVI_DATA->Free();
  158. }
  159. #endif
  160. ITSSkin_Term();
  161. //CMM_SaveForm(g_sFormsDir, this);
  162. }
  163. catch(...)
  164. {
  165. }
  166. }
  167. //---------------------------------------------------------------------------
  168. void __fastcall TFrmVmsMsgVideoMngr::FormShow(TObject *Sender)
  169. {
  170. Refresh();
  171. InitDbLoading();
  172. FormInit();
  173. ChangeEditMode(1);
  174. TmrShow->Enabled = true;
  175. }
  176. //---------------------------------------------------------------------------
  177. void __fastcall TFrmVmsMsgVideoMngr::InitDbLoading()
  178. {
  179. Application->ProcessMessages();
  180. if (!VmsCtlrManager) {
  181. VmsCtlrManager = new TVmsCtlrManager();
  182. }
  183. VmsCtlrManager->LoadVmsModlSize();
  184. VmsCtlrManager->LoadFromDb();
  185. }
  186. //---------------------------------------------------------------------------
  187. void __fastcall TFrmVmsMsgVideoMngr::FormInit()
  188. {
  189. EdNmbr->Text = "";
  190. EdName->Text = "";
  191. EdExpl->Text = "";
  192. SeSize->Value = 0;
  193. SeWidth->Value = 0;
  194. SeHeight->Value = 0;
  195. //EdImageFileName->Text = "";
  196. #if 0
  197. ImgGeneral->Picture->Bitmap->FreeImage();
  198. ImgGeneral->Picture->Bitmap = NULL;
  199. ImgVideo->Picture->Bitmap->FreeImage();
  200. ImgVideo->Picture->Bitmap = NULL;
  201. ImgTemp->Picture->Bitmap->FreeImage();
  202. ImgTemp->Picture->Bitmap = NULL;
  203. #endif
  204. FNewDb = false;
  205. }
  206. //---------------------------------------------------------------------------
  207. void __fastcall TFrmVmsMsgVideoMngr::TmrShowTimer(TObject *Sender)
  208. {
  209. TmrShow->Enabled = false;
  210. LoadImageSymbol();
  211. }
  212. //---------------------------------------------------------------------------
  213. void __fastcall TFrmVmsMsgVideoMngr::BtnCloseClick(TObject *Sender)
  214. {
  215. Close();
  216. }
  217. //---------------------------------------------------------------------------
  218. void __fastcall TFrmVmsMsgVideoMngr::FormClose(TObject *Sender, TCloseAction &Action)
  219. {
  220. CommClose();
  221. FrmVmsMsgVideoMngr = NULL;
  222. Action = caFree;
  223. }
  224. //---------------------------------------------------------------------------
  225. void __fastcall TFrmVmsMsgVideoMngr::LoadingImage(TImage *AImage, String AFileName)
  226. {
  227. try {
  228. AImage->Picture->LoadFromFile(AFileName);
  229. if (AImage->Picture->Graphic->ClassName() == "TGIFImage") {
  230. ((TGIFImage *)AImage->Picture->Graphic)->Animate = true;
  231. AImage->Transparent = true;
  232. }
  233. else {
  234. AImage->Transparent = false;
  235. }
  236. }
  237. catch(Exception &e) {
  238. String errMsg = "이미지를 읽어오는 중에 오류가 발생했습니다.\r\n" + e.Message;
  239. Application->MessageBox(errMsg.c_str(), L"이미지 로딩 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  240. }
  241. }
  242. //---------------------------------------------------------------------------
  243. void __fastcall TFrmVmsMsgVideoMngr::DisplayInfo()
  244. {
  245. FormInit();
  246. int nRow = TvList->DataController->FocusedRecordIndex;
  247. if( nRow <= -1 )
  248. return;
  249. TcxGridDataController *pGDC = TvList->DataController;
  250. nRow = pGDC->FocusedRecordIndex;
  251. CURR_VMS_FORM_OBJ_ID= pGDC->Values[nRow][ColSYMB_NMBR->Index];
  252. CURR_PICT_NM = pGDC->Values[nRow][ColSYMB_NM->Index];
  253. CURR_PICT_EXT = pGDC->Values[nRow][ColSYMB_FILE_EXT->Index];
  254. CURR_PICT_DATA_SZ = pGDC->Values[nRow][ColSYMB_SIZE->Index];
  255. //CURR_PICT_WDTH = pGDC->Values[nRow][ColSYMB_WDTH->Index];
  256. //CURR_PICT_HGHT = pGDC->Values[nRow][ColSYMB_HGHT->Index];
  257. //CURR_USE_YN = pGDC->Values[nRow][ColUSE_YN->Index];
  258. String imageFilePath = pGDC->Values[nRow][ColImagePath->Index];
  259. String videoFilePath = pGDC->Values[nRow][ColVideoPath->Index];
  260. CURR_LOCAL_FILE_NM = pGDC->Values[nRow][ColVideoPath->Index];
  261. LoadingImage(ImgVideo, imageFilePath);
  262. EdNmbr->Text = CURR_VMS_FORM_OBJ_ID;
  263. EdName->Text = CURR_PICT_NM;
  264. SeSize->Value = CURR_PICT_DATA_SZ;
  265. SeWidth->Value = CURR_PICT_WDTH;
  266. SeHeight->Value = CURR_PICT_HGHT;
  267. EdImageFileName->Text = CURR_LOCAL_FILE_NM;
  268. ChangeEditMode(3);
  269. BtnPlay->Enabled = true;
  270. BtnStop->Enabled = false;
  271. BtnPause->Enabled = false;
  272. }
  273. //---------------------------------------------------------------------------
  274. void __fastcall TFrmVmsMsgVideoMngr::BtnEditClick(TObject *Sender)
  275. {
  276. if (BtnEdit->Caption == "편집")//"편집")
  277. {
  278. ChangeEditMode(0);
  279. FNewDb = false;
  280. }
  281. else
  282. {
  283. String sId = EdNmbr->Text;
  284. ChangeEditMode(1);
  285. if (CMM_FindGridData(TvList->DataController, sId, ColSYMB_NMBR->Index) >= 0)
  286. {
  287. CMM_SetGridRow(CxList, TvList, sId, ColSYMB_NMBR->Index);
  288. DisplayInfo();
  289. }
  290. }
  291. }
  292. //---------------------------------------------------------------------------
  293. void __fastcall TFrmVmsMsgVideoMngr::ChangeEditMode(int AEdit)
  294. {
  295. FImageUpdate = false;
  296. bool bEnabled = false;
  297. switch(AEdit)
  298. {
  299. case 0: //편집버튼클릭
  300. {
  301. BtnEdit->Enabled = true;
  302. BtnInsert->Enabled = false;
  303. BtnDelete->Enabled = false;
  304. BtnSave->Enabled = true;
  305. BtnEdit->Caption = "취소";//"취소";
  306. BtnEdit->Hint = "데이터 편집 취소";//데이터 편집 취소";
  307. EditMode = true;
  308. //EdImageFileName->Enabled = FIsUpdate;
  309. }
  310. break;
  311. case 1: //편집[취소]버튼클릭
  312. {
  313. FormInit(); //화면을 모두 지운다.
  314. BtnEdit->Enabled = false;
  315. BtnInsert->Enabled = true;
  316. BtnDelete->Enabled = false;
  317. BtnSave->Enabled = false;
  318. BtnEdit->Caption = "편집";//"편집";
  319. BtnEdit->Hint = "데이터 편집";//데이터 편집";
  320. //bEnabled = true;
  321. EditMode = false;
  322. //EdImageFileName->Enabled = false;
  323. }
  324. break;
  325. case 2: //추가
  326. {
  327. BtnEdit->Enabled = true;
  328. BtnInsert->Enabled = false;
  329. BtnDelete->Enabled = false;
  330. BtnSave->Enabled = true;
  331. BtnEdit->Caption = "취소";//"취소";
  332. BtnEdit->Hint = "데이터 편집 취소";//데이터 편집 취소";
  333. EditMode = true;
  334. //EdImageFileName->Enabled = true;
  335. }
  336. break;
  337. case 3: //수정모드
  338. {
  339. BtnEdit->Enabled = true;
  340. BtnInsert->Enabled = true;
  341. BtnDelete->Enabled = true;
  342. BtnSave->Enabled = false;
  343. BtnEdit->Caption = "편집";//"편집";
  344. BtnEdit->Hint = "데이터 편집";//데이터 편집";
  345. bEnabled = true;
  346. EditMode = false;
  347. //EdImageFileName->Enabled = FIsUpdate;
  348. }
  349. break;
  350. }
  351. BtnSaveImgFile->Enabled = false;
  352. if (FSymbImag != NULL && FSymbImag->Picture->Bitmap != NULL)
  353. {
  354. if (FSymbImag->Picture->Bitmap->Height != 0)
  355. {
  356. BtnSaveImgFile->Enabled = true;
  357. }
  358. }
  359. if (AEdit == 0 || AEdit == 2)
  360. {
  361. GrpList->Enabled = false;
  362. PnlCmd->Enabled = true;
  363. }
  364. else
  365. {
  366. GrpList->Enabled = true;
  367. PnlCmd->Enabled = false;
  368. }
  369. //PnlEdit->Enabled = EditMode;
  370. }
  371. //---------------------------------------------------------------------------
  372. void __fastcall TFrmVmsMsgVideoMngr::BtnSaveClick(TObject *Sender)
  373. {
  374. if (EdNmbr->Text.IsEmpty()) {
  375. Application->MessageBox(L"VMS 동영상 저장\r\VMS 폼객체 ID를 입력하세요.",
  376. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  377. return;
  378. }
  379. if (EdName->Text.Trim().IsEmpty()) {
  380. Application->MessageBox(L"VMS 동영상 저장\r\n동영상 명칭을 입력하세요.",
  381. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  382. return;
  383. }
  384. bool bResult = false;
  385. String sNmbr = EdNmbr->Text;
  386. CURR_VMS_FORM_OBJ_ID = sNmbr;
  387. CURR_PICT_NM = EdName->Text.Trim();
  388. CURR_PICT_DATA_SZ = SeSize->Value;
  389. CURR_PICT_WDTH = SeWidth->Value;
  390. CURR_PICT_HGHT = SeHeight->Value;
  391. if (!FNewDb) {
  392. bResult = UpdateVmsSymbLib(CURR_VMS_FORM_OBJ_ID, CURR_PICT_NM);
  393. }
  394. else {
  395. CURR_BASE_YN = "Y";
  396. CURR_USE_YN = "Y";
  397. bResult = InsertVmsSymbLib(CURR_VMS_FORM_OBJ_ID,
  398. CURR_PICT_NM,
  399. CURR_PICT_EXT,
  400. CURR_PICT_DATA_SZ,
  401. CURR_PICT_WDTH,
  402. CURR_PICT_HGHT,
  403. CURR_USE_YN);
  404. }
  405. if (bResult)
  406. {
  407. Application->MessageBox(L"VMS 동영상 저장\r\nVMS 동영상 정보를 저장 하였습니다.",
  408. FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  409. FUpdate = true;
  410. LoadImageSymbol();
  411. CMM_SetGridRow(CxList, TvList, sNmbr, ColSYMB_NMBR->Index);
  412. //DisplayInfo();
  413. }
  414. }
  415. //---------------------------------------------------------------------------
  416. void __fastcall TFrmVmsMsgVideoMngr::BtnInsertClick(TObject *Sender)
  417. {
  418. MnuAddVmsSymbClick((TObject*)MnuVideo);
  419. }
  420. //---------------------------------------------------------------------------
  421. void __fastcall TFrmVmsMsgVideoMngr::BtnDeleteClick(TObject *Sender)
  422. {
  423. int nIdx = TvList->DataController->FocusedRecordIndex;
  424. if (nIdx < 0) return;
  425. String sId = EdNmbr->Text;
  426. if (sId.IsEmpty()) {
  427. Application->MessageBox(L"삭제할 VMS 동영상을 목록에서 선택하세요.\r\n목록에서 더블클릭하여 선택합니다.",
  428. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  429. return;
  430. }
  431. if (CheckFormObjectUseCount(sId) > 0)
  432. {
  433. Application->MessageBox(L"삭제할 동영상이 VMS 폼에서 사용되고 있습니다.\r\n먼저 해당 폼에서 삭제해주시기 바랍니다.",
  434. FTitle.c_str(), MB_OK|MB_ICONERROR|MB_APPLMODAL);
  435. return;
  436. }
  437. String sMsg;
  438. sMsg = "VMS 폼객체 ID: " + sId;
  439. sMsg+= "\r\n선택하신 VMS 폼객체 동영상 정보를 삭제하시겠습니까?";
  440. if (Application->MessageBox(sMsg.c_str(), FTitle.c_str(), MB_YESNO|MB_ICONQUESTION|MB_APPLMODAL) == IDYES) {
  441. if (DeleteVmsSymbLib(sId, true))
  442. {
  443. FUpdate = true;
  444. String msg = "VMS 폼객체 동영상 정보삭제\r\nVMS 폼객체 동영상 정보를 삭제 하였습니다.";
  445. Application->MessageBox(msg.c_str(), FTitle.c_str(), MB_OK|MB_ICONINFORMATION|MB_APPLMODAL);
  446. FormInit();
  447. ChangeEditMode(1);
  448. LoadImageSymbol();
  449. }
  450. }
  451. }
  452. //---------------------------------------------------------------------------
  453. void __fastcall TFrmVmsMsgVideoMngr::BtnSaveImgFileClick(TObject *Sender)
  454. {
  455. SaveDialog->Title = FTitle;
  456. SaveDialog->InitialDir = ExtractFilePath(Application->ExeName);
  457. SaveDialog->Filter = "이미지 파일 (*." + CURR_PICT_EXT + ")|*." + CURR_PICT_EXT;
  458. SaveDialog->FileName = EdNmbr->Text + "." + CURR_PICT_EXT;
  459. if (SaveDialog->Execute()) {
  460. try {
  461. String sFileName = SaveDialog->FileName;
  462. ImgGeneral->Picture->SaveToFile(sFileName);
  463. }
  464. catch (Exception &exception) {
  465. Application->ShowException(&exception);
  466. }
  467. }
  468. }
  469. //---------------------------------------------------------------------------
  470. void __fastcall TFrmVmsMsgVideoMngr::EdImageFileNameClick(TObject *Sender)
  471. {
  472. #if 0
  473. if (OpenBmp->InitialDir == "") {
  474. OpenBmp->InitialDir = g_sAppDir;
  475. }
  476. OpenBmp->Title = FTitle;
  477. OpenBmp->FileName = "";
  478. OpenBmp->Execute();
  479. #endif
  480. }
  481. //---------------------------------------------------------------------------
  482. void __fastcall TFrmVmsMsgVideoMngr::OpenBmpCanClose(TObject *Sender, bool &CanClose)
  483. {
  484. CURR_LOCAL_FILE_NM = OpenBmp->FileName;
  485. String sFilePath = ExtractFilePath(CURR_LOCAL_FILE_NM);
  486. CURR_PIC_FILE_NM = ExtractFileName(CURR_LOCAL_FILE_NM);
  487. String sFileExt = ExtractFileExt(CURR_LOCAL_FILE_NM);
  488. OpenBmp->InitialDir = sFilePath;
  489. CURR_USE_YN = "Y";
  490. CURR_PICT_EXT = "";
  491. sFileExt = StringReplace(sFileExt, ".", "", TReplaceFlags() << rfReplaceAll);
  492. sFileExt = sFileExt.LowerCase();
  493. TSymbFmt *symbFmt = g_SymbFmtLists.Find(sFileExt);
  494. if (symbFmt == NULL) {
  495. Application->MessageBox(L"VMS 동영상으로 지원하지 않는 형식입니다.\r\n지원형식(avi, mpeg, mkv, mp4)", L"동영상 추가 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  496. BtnInsertClick((TObject*)BtnInsert);
  497. return;
  498. }
  499. CURR_PICT_EXT = symbFmt->fmt;
  500. FImageUpdate = false;
  501. //CURR_SYMB_AVI_DATA->Clear();
  502. //CURR_SYMB_AVI_DATA->Position = 0;
  503. //CURR_SYMB_AVI_DATA->LoadFromFile(CURR_LOCAL_FILE_NM);
  504. //CURR_PICT_DATA_SZ = CURR_SYMB_AVI_DATA->Size;
  505. //TMemoryStream *pPicStream = new TMemoryStream();
  506. try {
  507. try {
  508. ////////////////////////////////////////////////
  509. if (!FFDecoder1->LoadFile(CURR_LOCAL_FILE_NM))
  510. {
  511. Application->MessageBox(L"동영상 파일을 읽어 오는데 실패하였습니다.", L"VMS 이미지 선택", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  512. return;
  513. }
  514. if (FFDecoder1->Decode()) {
  515. FFDecoder1->CopyToBitmap(ImgTemp->Picture->Bitmap);
  516. ImgVideo->Picture->Bitmap->Width = ImgVideo->Width;
  517. ImgVideo->Picture->Bitmap->Height = ImgVideo->Height;
  518. APP_ImageClear(ImgVideo->Canvas, 0, 0, ImgVideo->Width, ImgVideo->Height, clBlack);
  519. SetStretchBltMode(ImgVideo->Canvas->Handle, MAXSTRETCHBLTMODE);//HALFTONE);//MAXSTRETCHBLTMODE)//STRETCH_HALFTONE;
  520. ImgVideo->Canvas->CopyRect(Classes::Rect(0, 0, ImgVideo->Width, ImgVideo->Height),
  521. ImgTemp->Picture->Bitmap->Canvas,
  522. Classes::Rect(0, 0, ImgTemp->Picture->Bitmap->Width, ImgTemp->Picture->Bitmap->Height));
  523. CURR_PICT_WDTH = ImgTemp->Picture->Bitmap->Width;
  524. CURR_PICT_HGHT = ImgTemp->Picture->Bitmap->Height;
  525. CURR_PICT_DATA_SZ = FFDecoder1->FileSize;
  526. //CURR_PICT_DATA_SZ = pPicStream->Size;
  527. ImgVideo->Picture->Bitmap->SaveToStream(CURR_SYMB_DATA);
  528. }
  529. FFDecoder1->CloseFile();
  530. BtnPlay->Enabled = true;
  531. BtnStop->Enabled = false;
  532. BtnPause->Enabled = false;
  533. SeSize->Value = CURR_PICT_DATA_SZ;
  534. SeWidth->Value = CURR_PICT_WDTH;
  535. SeHeight->Value = CURR_PICT_HGHT;
  536. FImageUpdate = true;
  537. }
  538. catch(Exception &e) {
  539. String errMsg = "동영상 처리 중에 오류가 발생했습니다.\r\n" + e.Message;
  540. Application->MessageBox(errMsg.c_str(), L"동영상 추가 실패", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  541. }
  542. }
  543. __finally {
  544. //SAFE_DELETE(pPicStream);
  545. }
  546. if (FImageUpdate == false) {
  547. BtnInsertClick((TObject*)BtnInsert);
  548. }
  549. }
  550. //---------------------------------------------------------------------------
  551. void __fastcall TFrmVmsMsgVideoMngr::ClearListMemory()
  552. {
  553. #if 0
  554. try {
  555. TvList->BeginUpdate();
  556. int nRowCnt = TvList->ViewData->RecordCount;
  557. for (int ii = 0; ii < nRowCnt; ii++) {
  558. TcxCustomGridRow* ARow = TvList->ViewData->Rows[ii];
  559. TMemoryStream *pImgStream = (TMemoryStream *)(int)ARow->Values[Column99->Index];
  560. SAFE_DELETE(pImgStream);
  561. }
  562. }
  563. __finally {
  564. TvList->EndUpdate();
  565. }
  566. #endif
  567. CMM_ClearGridTableView(TvList);
  568. }
  569. //---------------------------------------------------------------------------
  570. void __fastcall TFrmVmsMsgVideoMngr::LoadImageSymbol()
  571. {
  572. FormInit();
  573. ClearListMemory();
  574. String sQry;
  575. TADOQuery *pADO = NULL;
  576. sQry = "SELECT * \r\n"
  577. " FROM TB_VMS_FORM_OBJ_MOV \r\n"
  578. " WHERE 1=1 \r\n"
  579. " ORDER BY VMS_FORM_OBJ_ID \r\n";
  580. int nRowHeight = 0;
  581. try
  582. {
  583. int nRow;
  584. TcxDataController *pGDC = TvList->DataController;
  585. TvList->BeginUpdate();
  586. try
  587. {
  588. pADO = new TADOQuery(NULL);
  589. pADO->Close();
  590. pADO->Connection = ITSDb_GetConnection();
  591. ITSDb_SQLText(pADO, sQry);
  592. ITSDb_SQLOpen(pADO);
  593. String imageFilePath;
  594. String videoFilePath;
  595. String saveDirPath = TPath::GetTempPath() + "VMS\\";
  596. ForceDirectories(saveDirPath.c_str());
  597. for( ; !pADO->Eof; pADO->Next())
  598. {
  599. nRow = pGDC->AppendRecord();
  600. String VMS_FORM_OBJ_ID = pADO->FieldByName("VMS_FORM_OBJ_ID")->AsString;
  601. String MOV_TYPE = pADO->FieldByName("MOV_TYPE")->AsString;
  602. pGDC->Values[nRow][ColSYMB_NMBR->Index] = VMS_FORM_OBJ_ID;
  603. pGDC->Values[nRow][ColSYMB_NM->Index] = pADO->FieldByName("MOV_NM")->AsString;
  604. pGDC->Values[nRow][ColSYMB_DATA->Index] = pADO->FieldByName("THMB_IMG")->AsVariant;
  605. pGDC->Values[nRow][ColSYMB_FILE_EXT->Index] = DbMovieTypeToReal(MOV_TYPE);
  606. pGDC->Values[nRow][ColSYMB_SIZE->Index] = pADO->FieldByName("MOV_DATA_SZ")->AsInteger;
  607. //pGDC->Values[nRow][ColSYMB_WDTH->Index] = pADO->FieldByName("PICT_WDTH")->AsInteger;
  608. //pGDC->Values[nRow][ColSYMB_HGHT->Index] = pADO->FieldByName("PICT_HGHT")->AsInteger;
  609. pGDC->Values[nRow][ColMOV_TYPE->Index] = MOV_TYPE;
  610. String MOVIE_FILE_EXT = DbMovieTypeToReal(MOV_TYPE);
  611. TMemoryStream *pAviStream = new TMemoryStream();
  612. pAviStream->LoadFromStream(pADO->CreateBlobStream(pADO->FieldByName("MOV_DATA"), bmRead));
  613. videoFilePath = saveDirPath + VMS_FORM_OBJ_ID + "." + MOVIE_FILE_EXT;
  614. pAviStream->SaveToFile(videoFilePath);
  615. SAFE_DELETE(pAviStream);
  616. TMemoryStream *pImgStream = new TMemoryStream();
  617. pImgStream->LoadFromStream(pADO->CreateBlobStream(pADO->FieldByName("THMB_IMG"), bmRead));
  618. String MOVE_EXT = DbMovieTypeToReal(MOV_TYPE);
  619. imageFilePath = saveDirPath + VMS_FORM_OBJ_ID + ".bmp";
  620. pImgStream->SaveToFile(imageFilePath);
  621. SAFE_DELETE(pImgStream);
  622. pGDC->Values[nRow][ColImagePath->Index] = imageFilePath;
  623. pGDC->Values[nRow][ColVideoPath->Index] = videoFilePath;
  624. }
  625. }
  626. catch(EDatabaseError &E)
  627. {
  628. DBERRORMSG("TFrmVmsSymbMngr::LoadImageSymbol", String(E.ClassName()), E.Message, sQry);
  629. throw Exception(String(E.ClassName()) + E.Message);
  630. }
  631. catch(Exception &e)
  632. {
  633. DBERRORMSG("TFrmVmsSymbMngr::LoadImageSymbol", String(e.ClassName()), e.Message, sQry);
  634. throw Exception(String(e.ClassName()) + e.Message);
  635. }
  636. }
  637. __finally
  638. {
  639. if (pADO)
  640. {
  641. pADO->Close();
  642. delete pADO;
  643. }
  644. TvList->EndUpdate();
  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::GetNewVmsFormObjId()
  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::GetNewVmsFormObjId", String(E.ClassName()), E.Message, sQry);
  895. return result;
  896. }
  897. catch(Exception &e)
  898. {
  899. DBERRORMSG("TFrmVmsSymbMngr::GetNewVmsFormObjId", 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 = GetNewVmsFormObjId();
  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. String __fastcall TFrmVmsMsgVideoMngr::DbPictTypeToReal(String APictType)
  1294. {
  1295. if (APictType == "B") return "bmp";
  1296. if (APictType == "G") return "gif";
  1297. if (APictType == "A") return "gif";
  1298. if (APictType == "J") return "jpg";
  1299. if (APictType == "P") return "png";
  1300. if (APictType == "I") return "ico";
  1301. return "bmp";
  1302. }
  1303. //---------------------------------------------------------------------------
  1304. String __fastcall TFrmVmsMsgVideoMngr::RealPictTypeToDb(String APictType)
  1305. {
  1306. if (APictType == "B") return "bmp";
  1307. //if (APictType == "gif") return "G";
  1308. if (APictType == "gif") return "A";
  1309. if (APictType == "jpg") return "J";
  1310. if (APictType == "jpeg")return "J";
  1311. if (APictType == "png") return "P";
  1312. if (APictType == "ico") return "I";
  1313. return "B";
  1314. }
  1315. //---------------------------------------------------------------------------
  1316. int __fastcall TFrmVmsMsgVideoMngr::CheckFormObjectUseCount(String AFORM_OBJ_ID)
  1317. {
  1318. String sQry;
  1319. TADOQuery *pADO = NULL;
  1320. int nResult = 0;
  1321. sQry = "SELECT COUNT(1) AS CNT \r\n"
  1322. " FROM TB_VMS_FORM_VMS_FORM_OBJ \r\n"
  1323. " WHERE VMS_FORM_OBJ_ID = :p01 \r\n";
  1324. try {
  1325. try {
  1326. pADO = new TADOQuery(NULL);
  1327. pADO->Close();
  1328. pADO->Connection = ITSDb_GetConnection();
  1329. ITSDb_SQLText(pADO, sQry);
  1330. ITSDb_SQLBind(pADO, "p01", AFORM_OBJ_ID);
  1331. ITSDb_SQLOpen(pADO);
  1332. nResult = pADO->FieldByName("CNT")->AsInteger;
  1333. }
  1334. catch(EDatabaseError &E) {
  1335. DBERRORMSG("CheckFormObjectUseCount", String(E.ClassName()), E.Message, sQry);
  1336. return 1;
  1337. }
  1338. catch(Exception &e) {
  1339. DBERRORMSG("CheckFormObjectUseCount", String(e.ClassName()), e.Message, sQry);
  1340. return 1;
  1341. }
  1342. }
  1343. __finally {
  1344. if (pADO) {
  1345. pADO->Close();
  1346. delete pADO;
  1347. }
  1348. }
  1349. return nResult;
  1350. }
  1351. //---------------------------------------------------------------------------