VMSM620MF.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #include "ITSSkinF.h"
  4. #include "ITSUtilF.h"
  5. #include "AppGlobalF.h"
  6. #include "CDSVmsIfscF.h"
  7. #include "CDSFontF.h"
  8. #pragma hdrstop
  9. #include "VMSM620MF.h"
  10. //---------------------------------------------------------------------------
  11. #pragma package(smart_init)
  12. #pragma link "VmsDesignerF"
  13. #pragma link "FFBaseComponent"
  14. #pragma link "FFBasePlay"
  15. #pragma link "FFPlay"
  16. #pragma link "cxButtons"
  17. #pragma link "cxCheckBox"
  18. #pragma link "cxClasses"
  19. #pragma link "cxContainer"
  20. #pragma link "cxControls"
  21. #pragma link "cxCustomData"
  22. #pragma link "cxData"
  23. #pragma link "cxDataStorage"
  24. #pragma link "cxEdit"
  25. #pragma link "cxFilter"
  26. #pragma link "cxGraphics"
  27. #pragma link "cxGrid"
  28. #pragma link "cxGridCustomTableView"
  29. #pragma link "cxGridCustomView"
  30. #pragma link "cxGridLevel"
  31. #pragma link "cxGridTableView"
  32. #pragma link "cxGroupBox"
  33. #pragma link "cxImage"
  34. #pragma link "cxLabel"
  35. #pragma link "cxLookAndFeelPainters"
  36. #pragma link "cxLookAndFeels"
  37. #pragma link "cxMaskEdit"
  38. #pragma link "cxStyles"
  39. #pragma link "cxTextEdit"
  40. #pragma link "dxSkinBlack"
  41. #pragma link "dxSkinBlue"
  42. #pragma link "dxSkinCaramel"
  43. #pragma link "dxSkinCoffee"
  44. #pragma link "dxSkinDarkRoom"
  45. #pragma link "dxSkinDarkSide"
  46. #pragma link "dxSkinFoggy"
  47. #pragma link "dxSkinGlassOceans"
  48. #pragma link "dxSkiniMaginary"
  49. #pragma link "dxSkinLilian"
  50. #pragma link "dxSkinLiquidSky"
  51. #pragma link "dxSkinLondonLiquidSky"
  52. #pragma link "dxSkinMcSkin"
  53. #pragma link "dxSkinMoneyTwins"
  54. #pragma link "dxSkinOffice2007Black"
  55. #pragma link "dxSkinOffice2007Blue"
  56. #pragma link "dxSkinOffice2007Green"
  57. #pragma link "dxSkinOffice2007Pink"
  58. #pragma link "dxSkinOffice2007Silver"
  59. #pragma link "dxSkinOffice2010Black"
  60. #pragma link "dxSkinOffice2010Blue"
  61. #pragma link "dxSkinOffice2010Silver"
  62. #pragma link "dxSkinsCore"
  63. #pragma link "dxSkinscxPCPainter"
  64. #pragma link "dxSkinSeven"
  65. #pragma link "dxSkinSharp"
  66. #pragma link "dxSkinSilver"
  67. #pragma link "dxSkinStardust"
  68. #pragma link "cxBlobEdit"
  69. #pragma resource "*.dfm"
  70. #define LICENSE_KEY "FSXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX-XXXXXXXX"
  71. TVMSM620M *VMSM620M = NULL;
  72. //---------------------------------------------------------------------------
  73. __fastcall TVMSM620M::TVMSM620M(TComponent* Owner)
  74. : TForm(Owner)
  75. {
  76. ITSSkin_Load(this);
  77. ////CMM_LoadForm(g_sFormsDir, this);
  78. FSelected = false;
  79. FUpdate= false;
  80. FTitle = Caption;//"VMS 교통상황 폼 관리";
  81. FPlayerFile = "";
  82. FTrackBar = TrackBar1;
  83. FLblDuration = lblDuration1;
  84. FLblCurrPTS = lblCurrentPTS1;
  85. FFPlayer = FFPlayer1;
  86. FDispArea = PnlEdtBack;
  87. FDispArea->Tag = 0;
  88. FDispArea->ParentColor = false;
  89. FDispArea->Color = clBlack;
  90. FDispArea->Caption = "";
  91. FDispArea->Refresh();
  92. String sAVILibDir = g_sAppDir + "LibAV";
  93. FFPlayer1->SetLicenseKey(LICENSE_KEY);
  94. FFPlayer1->DisableFPUExceptions();
  95. if (!FFPlayer1->LoadAVLib(sAVILibDir))
  96. {
  97. if (g_AppCfg.sLang != "kr") Application->MessageBox(L"Stream display library load failed.", L"Stream display fail", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  98. else Application->MessageBox(L"영상표출 라이브러리를 로드하지 못하였습니다.", L"영상표출 오류", MB_OK|MB_ICONERROR|MB_APPLMODAL);
  99. }
  100. TvList->OptionsView->DataRowHeight = 0;
  101. TvList->OptionsView->CellAutoHeight = true;
  102. TvList->OptionsView->Indicator = false;
  103. TvList->OptionsCustomize->ColumnMoving = false;
  104. TvList->OptionsCustomize->ColumnSorting = false;
  105. FListSymb = new TList;
  106. #if 0
  107. //Col03->DataBinding->ValueTypeClass = __classid(TcxBLOBValueType);
  108. Col03->PropertiesClass = __classid(TcxImageProperties);
  109. ((TcxImageProperties*)Col03->Properties)->GraphicClassName = "TdxSmartImage";
  110. #endif
  111. }
  112. //---------------------------------------------------------------------------
  113. void __fastcall TVMSM620M::CommClose()
  114. {
  115. try
  116. {
  117. BtnStopClick(NULL);
  118. if (m_pEdtDesigner)
  119. {
  120. delete m_pEdtDesigner;
  121. m_pEdtDesigner = NULL;
  122. }
  123. ClearSymbloList();
  124. ////CMM_SaveForm(g_sFormsDir, this);
  125. }
  126. catch(...)
  127. {
  128. }
  129. }
  130. //---------------------------------------------------------------------------
  131. void __fastcall TVMSM620M::FormCreate(TObject *Sender)
  132. {
  133. m_pEdtDesigner = new TVmsFormDesigner(PnlEditForm);
  134. //FOR_STL(TCDSFontColor*, pObj, CDSFontManager->FColors)
  135. {
  136. //m_pEdtDesigner->InitFontColor(pObj->VMS_FONT_COLR_CD, (TColor)pObj->VMS_FONT_COLR_VAL);
  137. }
  138. }
  139. //---------------------------------------------------------------------------
  140. void __fastcall TVMSM620M::FormShow(TObject *Sender)
  141. {
  142. Refresh();
  143. FormInit();
  144. PnlEdtBack->Width = FVmsWidth+4;
  145. PnlEdtBack->Height= FVmsHeight+4;
  146. LoadVideoInfo();
  147. TmrShow->Enabled = true;
  148. }
  149. //---------------------------------------------------------------------------
  150. void __fastcall TVMSM620M::FormInit()
  151. {
  152. //TvObjList->OptionsView->NoDataToDisplayInfoText = "<등록되어 있는 객체 정보가 없습니다>";
  153. m_pEdtDesigner->ApplicationHandle = (long)Handle;
  154. FNewDb = false;
  155. }
  156. //---------------------------------------------------------------------------
  157. void __fastcall TVMSM620M::ClearSymbloList()
  158. {
  159. for(int ii = 0; ii < FListSymb->Count; ii++)
  160. {
  161. Graphics::TBitmap *bitmap = (Graphics::TBitmap *)FListSymb->Items[ii];
  162. delete bitmap;
  163. }
  164. FListSymb->Clear();
  165. }
  166. //---------------------------------------------------------------------------
  167. void __fastcall TVMSM620M::LoadVideoInfo()
  168. {
  169. CMM_ClearGridTableView(TvList);
  170. String sQry;
  171. TADOQuery *pADO = NULL;
  172. sQry = "SELECT SYMB_LIB_NMBR, \r\n"
  173. " IMAG_DATA, \r\n"
  174. " SYMB_EXPL, SYMB_FILE_NM, SYMB_TYPE, \r\n"
  175. " AVI_DATA \r\n"
  176. " FROM TB_VMS_SYMB_LIB \r\n"
  177. " WHERE SYMB_LIB_NMBR BETWEEN 5000 AND 5999 \r\n"
  178. " AND SYMB_TYPE = 'SBT3' \r\n"
  179. " AND DEL_YN = 'N' \r\n"
  180. " ORDER BY SYMB_LIB_NMBR \r\n";
  181. ForceDirectories(g_sVideoDir.c_str());
  182. String sFileName = "";
  183. try
  184. {
  185. int nRow;
  186. TcxDataController *pGDC = TvList->DataController;
  187. TvList->BeginUpdate();
  188. try
  189. {
  190. pADO = new TADOQuery(NULL);
  191. pADO->Close();
  192. pADO->Connection = ITSDb_GetConnection();
  193. ITSDb_SQLText(pADO, sQry);
  194. ITSDb_SQLOpen(pADO);
  195. for( ; !pADO->Eof; pADO->Next())
  196. {
  197. nRow = pGDC->AppendRecord();
  198. sFileName = pADO->FieldByName("SYMB_LIB_NMBR")->AsString;
  199. pGDC->Values[nRow][Col00->Index] = sFileName;
  200. pGDC->Values[nRow][Col01->Index] = pADO->FieldByName("SYMB_EXPL")->AsString;
  201. pGDC->Values[nRow][Col02->Index] = pADO->FieldByName("SYMB_FILE_NM")->AsString;
  202. pGDC->Values[nRow][Col03->Index] = pADO->FieldByName("IMAG_DATA")->AsVariant;
  203. String strmFileName = g_sVideoDir + pADO->FieldByName("SYMB_FILE_NM")->AsString;
  204. #if 0
  205. if (!FileExists(strmFileName))
  206. {
  207. TMemoryStream *Stream1 = (TMemoryStream *)pADO->CreateBlobStream(pADO->FieldByName("AVI_DATA"), bmRead);
  208. Stream1->SaveToFile(strmFileName);
  209. SAFE_DELETE(Stream1);
  210. }
  211. #endif
  212. if (sFileName == FSymbLibNmbr)
  213. {
  214. FPlayerFile = strmFileName;
  215. }
  216. Graphics::TBitmap *bitmap = new Graphics::TBitmap;
  217. try
  218. {
  219. bitmap->LoadFromStream(pADO->CreateBlobStream(pADO->FieldByName("IMAG_DATA"), bmRead));
  220. FListSymb->Add(bitmap);
  221. }
  222. catch(...)
  223. {
  224. }
  225. }
  226. }
  227. catch(EDatabaseError &E)
  228. {
  229. DBERRORMSG("TVMSM620M::LoadImageSymbol", String(E.ClassName()), E.Message, sQry);
  230. throw Exception(String(E.ClassName()) + E.Message);
  231. }
  232. catch(Exception &e)
  233. {
  234. DBERRORMSG("TVMSM620M::LoadImageSymbol", String(e.ClassName()), e.Message, sQry);
  235. throw Exception(String(e.ClassName()) + e.Message);
  236. }
  237. }
  238. __finally
  239. {
  240. if (pADO)
  241. {
  242. pADO->Close();
  243. delete pADO;
  244. }
  245. TvList->EndUpdate();
  246. }
  247. BtnPlay->Enabled = false;
  248. BtnStop->Enabled = false;
  249. BtnPause->Enabled = false;
  250. if (FileExists(FPlayerFile))
  251. {
  252. BtnPlay->Enabled = true;
  253. }
  254. EdSymbLibNmbr->Text = FSymbLibNmbr;
  255. EdStreamAddr->Text = FStreamAddr;
  256. }
  257. //---------------------------------------------------------------------------
  258. void __fastcall TVMSM620M::TmrShowTimer(TObject *Sender)
  259. {
  260. TmrShow->Enabled = false;
  261. BtnSearchClick(NULL);
  262. }
  263. //---------------------------------------------------------------------------
  264. void __fastcall TVMSM620M::BtnSearchClick(TObject *Sender)
  265. {
  266. RefreshData();
  267. EdFocus->SetFocus();
  268. }
  269. //---------------------------------------------------------------------------
  270. void __fastcall TVMSM620M::RefreshData()
  271. {
  272. // 검색조건에 의한 링크 데이터 조회
  273. FormClear();
  274. m_pEdtDesigner->Clear();
  275. m_pEdtDesigner->SizeType = FVmsTypeCd;
  276. m_pEdtDesigner->SetSize(FVmsWidth, FVmsHeight);
  277. m_pEdtDesigner->SetPos(0, 0);
  278. m_pEdtDesigner->BkColorCode = FFormColor;
  279. m_pEdtDesigner->EditMode = true;
  280. m_pEdtDesigner->Show();
  281. InitObjectList();
  282. LoadFormObjectInfo(FFormId, m_pEdtDesigner);
  283. DispObjectListData();
  284. }
  285. //---------------------------------------------------------------------------
  286. void __fastcall TVMSM620M::InitObjectList()
  287. {
  288. }
  289. //---------------------------------------------------------------------------
  290. void __fastcall TVMSM620M::DispObjectListData()
  291. {
  292. TVmsFormObject *pObj;
  293. int nObjCnt = m_pEdtDesigner->GetObjectCount();
  294. for(int ii = 0; ii < nObjCnt; ii++)
  295. {
  296. pObj = m_pEdtDesigner->GetObject(ii);
  297. if (pObj)
  298. {
  299. switch(pObj->ObjType.ToIntDef(0))
  300. {
  301. case 200: //동영상 기본이미지
  302. EdSymbLibNmbr->Text = pObj->ImageId;
  303. break;
  304. case 201: //@동영상이름
  305. EdStreamAddr->Text = pObj->Text;
  306. break;
  307. }
  308. }
  309. }
  310. }
  311. //---------------------------------------------------------------------------
  312. void __fastcall TVMSM620M::BtnClosexClick(TObject *Sender)
  313. {
  314. FSelected = false;
  315. Close();
  316. }
  317. //---------------------------------------------------------------------------
  318. void __fastcall TVMSM620M::FormClose(TObject *Sender, TCloseAction &Action)
  319. {
  320. CommClose();
  321. VMSM620M = NULL;
  322. //Action = caFree;
  323. }
  324. //---------------------------------------------------------------------------
  325. void __fastcall TVMSM620M::LoadFormObjectInfo(String AFormId, TVmsFormDesigner *ADesigner)
  326. {
  327. ADesigner->Clear();
  328. String sQry;
  329. TADOQuery *pADO = NULL;
  330. sQry = "SELECT A.*, \r\n"
  331. " C.VMS_FONT_NAME_NM, \r\n"
  332. " B.IMAG_DATA AS SYMB_IMG, \r\n"
  333. " B.SYMB_EXPL AS SYMB_IMG_NM, \r\n"
  334. " B.SYMB_FILE_NM AS SYMB_FILE_NM \r\n"
  335. " FROM TB_VMS_FORM_OBJECT A, \r\n"
  336. " TB_VMS_SYMB_LIB B, \r\n"
  337. " TB_VMS_FONT_NAME C, \r\n"
  338. " TB_VMS_FORM D \r\n"
  339. " WHERE D.VMS_FORM_ID = :p01 \r\n"
  340. " AND D.VMS_FORM_ID = A.VMS_FORM_ID \r\n"
  341. " AND B.SYMB_LIB_NMBR = :p02 \r\n"
  342. " AND A.VMS_FONT_NAME_CD = C.VMS_FONT_NAME_CD(+) \r\n"
  343. " ORDER BY A.VMS_FORM_OBJECT_ID ASC \r\n";
  344. try
  345. {
  346. try
  347. {
  348. pADO = new TADOQuery(NULL);
  349. pADO->Close();
  350. pADO->Connection = ITSDb_GetConnection();
  351. ITSDb_SQLText(pADO, sQry);
  352. ITSDb_SQLBind(pADO, "p01", AFormId);
  353. ITSDb_SQLBind(pADO, "p02", FSymbLibNmbr);
  354. ITSDb_SQLOpen(pADO);
  355. int nDrawType;
  356. String sObjKind;
  357. for( ; !pADO->Eof; pADO->Next())
  358. {
  359. int nFormId = pADO->FieldByName("VMS_FORM_ID")->AsInteger;
  360. int nObjId = pADO->FieldByName("VMS_FORM_OBJECT_ID")->AsInteger;
  361. int nObjType = pADO->FieldByName("VMS_FORM_OBJECT_TYPE_CD")->AsInteger;
  362. if (nObjType == 1 || //심볼
  363. nObjType == 2 || //이미지
  364. nObjType == 3 || //배경이미지
  365. nObjType == 17 || //@소통정보이미지 (1열)
  366. nObjType == 27 || //@소통정보이미지2(2열)
  367. nObjType == 37 || //@소통정보이미지3(3열)
  368. nObjType == 47 || //소통이미지4
  369. nObjType == 200 || //동영상
  370. nObjType == 300 || //스트리밍영상
  371. nObjType == 406 || //@통합대기등급 이미지
  372. nObjType == 407 || //@미세먼지등급 이미지
  373. nObjType == 408 || //@초미세먼지등급 이미지
  374. nObjType == 413 //@오존등급이미지
  375. )
  376. {
  377. sObjKind = OBJKIND_IMAGEID; //Image Id
  378. nDrawType = 1; //이미지그리기
  379. }
  380. else
  381. {
  382. sObjKind = OBJKIND_TEXT; //문자열
  383. nDrawType = 0; //문자열그리기
  384. }
  385. //실재 맵핑된 구간의 정보를 표출하도록 한다.
  386. int nBlinking = pADO->FieldByName("VMS_DSPL_BLINKING")->AsInteger;
  387. int nPosX = pADO->FieldByName("VMS_DSPL_XCRDN")->AsInteger;
  388. int nPosY = pADO->FieldByName("VMS_DSPL_YCRDN")->AsInteger;
  389. TVmsFormObject *pObj = ADesigner->AddObject((VmsObjectDrawType)nDrawType);
  390. if (!pObj) continue;
  391. pObj->Text = pADO->FieldByName("SYMB_IMG_NM")->AsString.Trim();
  392. if (FStreamAddr == "") pObj->RunText = pObj->Text;
  393. else pObj->RunText = FStreamAddr; //pObj->Text;
  394. pObj->EditMode = false;
  395. pObj->ObjSeq = nObjId;
  396. pObj->ObjId = nObjId;
  397. pObj->ObjKind = sObjKind;
  398. pObj->Tag = pADO->FieldByName("VMS_IFSC_ID")->AsString;
  399. pObj->ObjType = pADO->FieldByName("VMS_FORM_OBJECT_TYPE_CD")->AsString;
  400. pObj->ObjSize = pADO->FieldByName("VMS_DSPL_SIZE")->AsInteger;
  401. pObj->BkColorCode = pADO->FieldByName("VMS_DSPL_BKCOLOR")->AsString;
  402. pObj->Blink = nBlinking == 1 ? true : false;
  403. pObj->ImageId = pADO->FieldByName("SYMB_LIB_NMBR")->AsString;
  404. pObj->SetPos(nPosX, nPosY);
  405. if (pObj->ObjKind == OBJKIND_TEXT) // 문자열
  406. {
  407. int nFontBold = pADO->FieldByName("VMS_FONT_BOLD")->AsInteger;
  408. pObj->Text = pADO->FieldByName("SYMB_FILE_NM")->AsString;
  409. pObj->FontName = pADO->FieldByName("VMS_FONT_NAME_NM")->AsString;
  410. pObj->FontNameCode = pADO->FieldByName("VMS_FONT_NAME_CD")->AsString;
  411. pObj->FontColorCode = pADO->FieldByName("VMS_FONT_COLR_CD")->AsString;
  412. pObj->FontSize = pADO->FieldByName("VMS_FONT_SIZE")->AsInteger;
  413. pObj->FontBold = nFontBold == 1 ? true : false;
  414. pObj->TextAlign = pADO->FieldByName("VMS_FONT_ALIGN")->AsInteger;
  415. pObj->SetSize(pADO->FieldByName("VMS_DSPL_WIDTH")->AsInteger, pADO->FieldByName("VMS_DSPL_HEIGHT")->AsInteger);
  416. pObj->SetRuntimeText(pObj->RunText);
  417. }
  418. else //if (sObjKind == "1" || sObjKind == "2") // 이미지(1), 이미지 ID(2)
  419. {
  420. if (pObj->ObjKind == OBJKIND_IMAGEID)
  421. {
  422. pObj->Text = pADO->FieldByName("SYMB_LIB_NMBR")->AsString;
  423. }
  424. TStream *pStream = NULL;
  425. //pStream = pADO->CreateBlobStream(pADO->FieldByName("VMS_DSPL_FIGR"), bmRead);
  426. pStream = pADO->CreateBlobStream(pADO->FieldByName("SYMB_IMG"), bmRead);
  427. try
  428. {
  429. if (pStream && pStream->Size > 0)
  430. {
  431. Graphics::TBitmap *Bitmap = pObj->GetBitmap();
  432. pStream->Position = 0;
  433. Bitmap->LoadFromStream(pStream);
  434. pObj->SetSize(Bitmap->Width, Bitmap->Height);
  435. if (FSymbLibNmbr != "200" && FSymbLibNmbr != "300")
  436. pObj->SetPos(0, 0);
  437. }
  438. }
  439. __finally
  440. {
  441. SAFE_DELETE(pStream);
  442. }
  443. }
  444. #if 0
  445. switch(nObjType)
  446. {
  447. case 200: pObj->Text = FSymbLibNmbr; break;
  448. case 201: pObj->Text = FStreamAddr; break;
  449. case 300: pObj->Text = FSymbLibNmbr; break;
  450. case 301: pObj->Text = FStreamAddr; break;
  451. }
  452. #endif
  453. pObj->Show();
  454. pObj->BringToFront();
  455. }
  456. }
  457. catch(EDatabaseError &E)
  458. {
  459. DBERRORMSG("TVMSM620M::LoadFormObjectInfo", String(E.ClassName()), E.Message, sQry);
  460. throw Exception(String(E.ClassName()) + E.Message);
  461. }
  462. catch(Exception &exception)
  463. {
  464. DBERRORMSG("TVMSM620M::LoadFormObjectInfo", String(exception.ClassName()), exception.Message, sQry);
  465. throw Exception(String(exception.ClassName()) + exception.Message);
  466. }
  467. }
  468. __finally
  469. {
  470. if (pADO)
  471. {
  472. pADO->Close();
  473. delete pADO;
  474. }
  475. }
  476. }
  477. //---------------------------------------------------------------------------
  478. void __fastcall TVMSM620M::FormClear()
  479. {
  480. FSelIdx = -1;
  481. EdFormId->Clear();
  482. EdObjId->Clear();
  483. FNewDb = false;
  484. }
  485. //---------------------------------------------------------------------------
  486. void __fastcall TVMSM620M::BtnSaveClick(TObject *Sender)
  487. {
  488. FSymbLibNmbr = EdSymbLibNmbr->Text;
  489. FStreamAddr = EdStreamAddr->Text;
  490. m_pEdtDesigner->GetVmsFormImage(ImgForm);
  491. FSelected = true;
  492. Close();
  493. }
  494. //---------------------------------------------------------------------------
  495. void __fastcall TVMSM620M::TrackBar1Change(TObject *Sender)
  496. {
  497. if (!FTrackChanging && !IsMouseDown())
  498. {
  499. FFPlayer->Seek(FDuration * FTrackBar->Position / FTrackBar->Max);
  500. }
  501. }
  502. //---------------------------------------------------------------------------
  503. void __fastcall TVMSM620M::FFPlayer1FileOpen(TObject *Sender, const __int64 ADuration, int AFrameWidth, int AFrameHeight,
  504. int &AScreenWidth, int &AScreenHeight)
  505. {
  506. if (PnlEditForm->Visible) PnlEditForm->Visible = false;
  507. FDuration = ADuration;
  508. FLblDuration->Caption = DurationToStr(ADuration);
  509. FLblCurrPTS->Caption = "N/A";
  510. // setup track bar
  511. FTrackBar->Frequency = 5;
  512. FTrackBar->TickStyle = tsAuto;
  513. FTrackBar->Max = FTrackBar->Width;
  514. FTrackBar->SelStart = 0;
  515. FTrackBar->SelEnd = 0;
  516. FTrackBar->SliderVisible = ADuration > 0;
  517. FTrackChanging = true;
  518. try
  519. {
  520. FTrackBar->Position = 0;
  521. }
  522. __finally
  523. {
  524. FTrackChanging= false;
  525. }
  526. }
  527. //---------------------------------------------------------------------------
  528. void __fastcall TVMSM620M::FFPlayer1OpenFailed(TObject *Sender)
  529. {
  530. String sLastErrMsg = FFPlayer->LastErrMsg;
  531. FDispArea->Caption = sLastErrMsg;
  532. }
  533. //---------------------------------------------------------------------------
  534. void __fastcall TVMSM620M::FFPlayer1Position(TObject *Sender, const __int64 APTS)
  535. {
  536. FLblCurrPTS->Caption = DurationToStr(APTS);
  537. if ((APTS >= 0) && (FDuration > 0))
  538. {
  539. FTrackBar->SelEnd = FTrackBar->Max * APTS / FDuration;
  540. if (FTrackChanging == false && (IsMouseDown() == false || FTrackBar->Focused() == false))
  541. {
  542. FTrackChanging = true;
  543. try
  544. {
  545. FTrackBar->Position = FTrackBar->Max * APTS / FDuration;
  546. }
  547. __finally
  548. {
  549. FTrackChanging = false;
  550. }
  551. }
  552. }
  553. }
  554. //---------------------------------------------------------------------------
  555. void __fastcall TVMSM620M::FFPlayer1State(TObject *Sender, TPlayState APlayState)
  556. {
  557. switch(APlayState)
  558. {
  559. case Ffbasecomponent::psPlay:
  560. case Ffbasecomponent::psResume:
  561. break;
  562. case Ffbasecomponent::psPause:
  563. case Ffbasecomponent::psStep:
  564. break;
  565. case Ffbasecomponent::psStop:
  566. if (FFPlayer->ScreenHandle != NULL)
  567. {
  568. PostMessage(FFPlayer->ScreenHandle, CM_INVALIDATE, 0, 0);
  569. UpdateWindow(FFPlayer->ScreenHandle);
  570. }
  571. break;
  572. case Ffbasecomponent::psEnd:
  573. {
  574. FFPlayer->Stop(true);
  575. if (PnlEditForm->Visible == false) PnlEditForm->Visible = true;
  576. //FFPlayer[nTag]->Seek((__int64)0, TSeekFlags()<<sfBackward);
  577. }
  578. break;
  579. }
  580. }
  581. //---------------------------------------------------------------------------
  582. void __fastcall TVMSM620M::BtnPlayClick(TObject *Sender)
  583. {
  584. BtnPlay->Enabled = false;
  585. Application->ProcessMessages();
  586. try
  587. {
  588. if (FPlayerFile != "")
  589. {
  590. if (FFPlayer->ScreenHandle != NULL)
  591. {
  592. FFPlayer->Stop(true);
  593. PostMessage(FFPlayer->ScreenHandle, CM_INVALIDATE, 0, 0);
  594. UpdateWindow(FFPlayer->ScreenHandle);
  595. }
  596. }
  597. FFPlayer->AspectRatio = ChkFullScreen->Checked ? -1 : 0;
  598. FFPlayer->TryOpen(FPlayerFile, FDispArea->Handle);
  599. Application->ProcessMessages();
  600. }
  601. catch(Exception &e)
  602. {
  603. }
  604. //CxList->Enabled = false;
  605. BtnStop->Enabled = true;
  606. BtnPause->Enabled = true;
  607. }
  608. //---------------------------------------------------------------------------
  609. void __fastcall TVMSM620M::BtnStopClick(TObject *Sender)
  610. {
  611. BtnStop->Enabled = false;
  612. BtnPause->Enabled = false;
  613. try
  614. {
  615. if (FFPlayer->ScreenHandle != NULL)
  616. {
  617. FFPlayer->Stop(true);
  618. }
  619. Application->ProcessMessages();
  620. }
  621. catch(Exception &e)
  622. {
  623. }
  624. //CxList->Enabled = true;
  625. BtnPlay->Enabled = true;
  626. if (PnlEditForm->Visible == false) PnlEditForm->Visible = true;
  627. }
  628. //---------------------------------------------------------------------------
  629. void __fastcall TVMSM620M::BtnPauseClick(TObject *Sender)
  630. {
  631. try
  632. {
  633. if (FFPlayer->ScreenHandle != NULL)
  634. {
  635. FFPlayer->TogglePause();
  636. }
  637. Application->ProcessMessages();
  638. }
  639. catch(Exception &e)
  640. {
  641. }
  642. }
  643. //---------------------------------------------------------------------------
  644. void __fastcall TVMSM620M::TvListFocusedRecordChanged(TcxCustomGridTableView *Sender, TcxCustomGridRecord *APrevFocusedRecord,
  645. TcxCustomGridRecord *AFocusedRecord, bool ANewItemRecordFocusingChanged)
  646. {
  647. if (!AFocusedRecord) return;
  648. int nRow = TvList->DataController->FocusedRecordIndex;
  649. if( nRow <= -1 )
  650. return;
  651. TcxDataController *pGDC = TvList->DataController;
  652. EdSymbLibNmbr->Text = VarToStr(pGDC->Values[nRow][Col00->Index]);
  653. EdStreamAddr->Text = VarToStr(pGDC->Values[nRow][Col02->Index]);
  654. if (BtnStop->Enabled)
  655. BtnStop->Click();
  656. FPlayerFile = g_sVideoDir + EdStreamAddr->Text;
  657. BtnPlay->Enabled = false;
  658. BtnStop->Enabled = false;
  659. BtnPause->Enabled = false;
  660. if (FileExists(FPlayerFile))
  661. {
  662. BtnPlay->Enabled = true;
  663. }
  664. else {
  665. BtnPlay->Enabled = false;
  666. }
  667. //CxList->Enabled = false;
  668. BtnPlay->Enabled = true;
  669. BtnStop->Enabled = false;
  670. BtnPause->Enabled = false;
  671. TVmsFormObject *pObj;
  672. int nObjCnt = m_pEdtDesigner->GetObjectCount();
  673. for(int ii = 0; ii < nObjCnt; ii++)
  674. {
  675. pObj = m_pEdtDesigner->GetObject(ii);
  676. if (!pObj) continue;
  677. int nObjType = pObj->ObjType.ToIntDef(0);
  678. switch(nObjType)
  679. {
  680. case 200: case 300:
  681. {
  682. #if 0
  683. TdxSmartImage* image = new TdxSmartImage();
  684. image->Load
  685. ASmartImage: TdxSmartImage;
  686. ...
  687. AValue := TcxGridRecordCellHitTest(AHitTest).GridRecord.Values[cxGrid1DBTableView1Image.Index];
  688. ASmartImage := TdxSmartImage.Create;
  689. ASmartImage.LoadFromFieldValue(AValue);
  690. ASmartImage.ConvertToBitmap;
  691. dxScreenTipRepository1ScreenTip1.Width := ASmartImage.Width + 15;
  692. dxScreenTipRepository1ScreenTip1.Header.Glyph.Assign(ASmartImage);
  693. ASmartImage.Free;
  694. Graphics::TBitmap *bitmap = (Graphics::TBitmap *)pGDC->Values[nRow][Col03->Index];
  695. #endif
  696. if (nRow < FListSymb->Count)
  697. {
  698. Graphics::TBitmap *bitmap = (Graphics::TBitmap*)FListSymb->Items[nRow];
  699. pObj->SetBitmap(bitmap);
  700. pObj->SetPos(0, 0);
  701. }
  702. #if 0
  703. Variant v = pGDC->Values[nRow][Col03->Index];
  704. v.VPointer;
  705. TMemoryStream* stream = new TMemoryStream();
  706. Graphics::TBitmap *bitmap = new Graphics::TBitmap();
  707. void* p = VarArrayLock(v);
  708. stream->Position = 0;
  709. stream->Size = VarArrayHighBound(v, 1) - VarArrayLowBound(v, 1) + 1;
  710. stream->Write (p, stream->Size);
  711. VarArrayUnlock(v);
  712. stream->Position = 0;
  713. bitmap->LoadFromStream(stream);
  714. pObj->SetBitmap(bitmap);
  715. VariantClear(v);
  716. delete stream;
  717. #endif
  718. }
  719. break;
  720. case 201: case 301:
  721. pObj->RunText = VarToStr(pGDC->Values[nRow][Col02->Index]);
  722. pObj->SetRuntimeText(pObj->RunText);
  723. break;
  724. }
  725. }
  726. }
  727. //---------------------------------------------------------------------------