diff --git a/.github/meta.yml b/.github/meta.yml index d4e13ac..3ddb417 100644 --- a/.github/meta.yml +++ b/.github/meta.yml @@ -3,4 +3,4 @@ url: vcl-dashboards-store-layout-template-database website: https://docs.devexpress.com/VCL/405642/ExpressDashboards/vcl-dashboards tags: [vcl, dashboards, layout, database] description: | - DevExpress VCL Dashboards - Store Dashboard Layouts in a Database + DevExpress Dashboards for Delphi/C++Builder - Store Dashboard Layouts in a Database diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..941fd82 --- /dev/null +++ b/.gitignore @@ -0,0 +1,92 @@ +# Default Delphi compiler directories +# Content of these directories are generated with each Compile/Construct of a project. +Win32/ +Win64/ +Win64x/ + +# Delphi compiler-generated binaries (safe to delete) +*.exe +*.exe.* +*.dll +*.bpl +*.bpi +*.dcp +*.so +*.apk +*.drc +*.map +*.dres +*.rsm +*.tds +*.dcu +*.lib +*.a +*.o +*.ocx + +# Delphi autogenerated files (duplicated info) +*.cfg +*.hpp +*Resource.rc +*.rsp + +# Delphi local files (user-specific info) +*.local +*.identcache +*.projdata +*.tvsconfig +*.dsk +*.dsv + +# Delphi history and backups +__history/ +__recovery/ +*.~* + + +# ------------------------------------------------------------ +# C++Builder specific +# ------------------------------------------------------------ + +# C++Builder compiler outputs +*.obj +*.hpp +*.ilc +*.ild +*.ilf +*.ils +*.map +*.tds +# Program Database file that stores debugging symbols +*.pdb + + +# Precompiled headers +*.pch + +# C++Builder packages and libraries +*.bpl +*.bpi +*.lib +*.a +*.dll +*.so + +# C++Builder intermediate / cache files +*.cbproj.local +*.cbproj.identcache +*.cbproj.user +*.cbtemp + + +# Castalia statistics file (since XE7 Castalia is distributed with Delphi) +*.stat + +# Boss dependency manager vendor folder https://github.com/HashLoad/boss +modules/ + +# Output files +*.pdf +*.docx +*.zip +data.dat diff --git a/CPB/DashboardTemplate.cbproj b/CPB/StoreDashboardInDB.cbproj similarity index 92% rename from CPB/DashboardTemplate.cbproj rename to CPB/StoreDashboardInDB.cbproj index d233d3d..8a1e2e4 100644 --- a/CPB/DashboardTemplate.cbproj +++ b/CPB/StoreDashboardInDB.cbproj @@ -1,14 +1,14 @@ - + {78325D59-9C55-4DF5-9E88-7E84FAB72DB5} 20.3 VCL - DashboardTemplate.cpp + StoreDashboardInDB.cpp Application True Debug Win64x - DashboardTemplate + StoreDashboardInDB 1048579 @@ -87,7 +87,7 @@ $(BDSLIB)\$(PLATFORM)\release\$(LANGDIR);$(ILINK_TranslatedLibraryPath) CppVCLApplication System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - rtl.lib;vcl.lib;dbrtl.lib;FireDAC.lib;FireDACCommonDriver.lib;FireDACCommon.lib;xmlrtl.lib;vclFireDAC.lib;vcldb.lib;vclwinx.lib;vclimg.lib;bindengine.lib;vclx.lib;cxLibraryRS29.lib;dxGDIPlusRS29.lib;dxCoreRS29.lib;dbexpress.lib;DbxCommonDriver.lib;vclie.lib;vcledge.lib;cxGridRS29.lib;cxExportRS29.lib;dxSpreadSheetCoreRS29.lib;dxComnRS29.lib;dxSpreadSheetRS29.lib;dxServerModeRS29.lib;dxReportsRS29.lib;dxPSCoreRS29.lib;dxPSdxPDFViewerLnkRS29.lib;dxPDFViewerRS29.lib;FireDACMSAccDriver.lib;FireDACCommonODBC.lib;dxmdsRS29.lib;dxSkinsCoreRS29.lib;dxBackendRS29.lib;dxDashboardsRS29.lib + rtl.lib;vcl.lib;dbrtl.lib;FireDAC.lib;FireDACCommonDriver.lib;FireDACCommon.lib;xmlrtl.lib;vclFireDAC.lib;vcldb.lib;vclwinx.lib;vclimg.lib;bindengine.lib;vclx.lib;dbexpress.lib;DbxCommonDriver.lib;vclie.lib;vcledge.lib;FireDACMSAccDriver.lib;FireDACCommonODBC.lib;cxLibraryRS37.lib;dxGDIPlusRS37.lib;dxCoreRS37.lib;cxGridRS37.lib;cxExportRS37.lib;dxSpreadSheetCoreRS37.lib;dxComnRS37.lib;dxSpreadSheetRS37.lib;dxServerModeRS37.lib;dxmdsRS37.lib;dxBackendRS37.lib;dxPSCoreRS37.lib;dxPSdxPDFViewerLnkRS37.lib;dxPDFViewerRS37.lib;dxReportsRS37.lib;dxDashboardsRS37.lib;dxSkinsCoreRS37.lib <_TCHARMapping>wchar_t true $(BDS)\bin\cbuilder_PROJECTICON.ico @@ -95,7 +95,7 @@ $(BDS)\bin\Artwork\Windows\UWP\cppreg_UwpDefault_150.png ..\..\VCLExamples\ReportsTemplate\CPB\;$(IncludePath) ..\..\VCLExamples\ReportsTemplate\CPB\;$(ILINK_LibraryPath) - DashboardTemplate + StoreDashboardInDB adortl;appanalytics;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindcompvclsmp;bindcompvclwinx;bindengine;CloudService;CustomIPTransport;cxADOAdaptersRS29;cxExportRS29;cxFireDACAdaptersRS29;cxGridEMFRS29;cxGridRS29;cxIBXAdaptersRS29;cxLibraryRS29;cxPivotGridChartRS29;cxPivotGridOLAPRS29;cxPivotGridRS29;cxSchedulerGridRS29;cxSchedulerRibbonStyleEventEditorRS29;cxSchedulerRS29;cxSchedulerTreeBrowserRS29;cxSchedulerWebServiceStorageRS29;cxTreeListdxBarPopupMenuRS29;cxTreeListRS29;cxVerticalGridRS29;DataSnapClient;DataSnapCommon;DataSnapConnectors;DatasnapConnectorsFreePascal;DataSnapFireDAC;DataSnapIndy10ServerTransport;DataSnapNativeClient;DataSnapProviderClient;DataSnapServer;DataSnapServerMidas;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXDb2Driver;DBXFirebirdDriver;DBXInformixDriver;DBXInterBaseDriver;DBXMSSQLDriver;DBXMySQLDriver;DBXOdbcDriver;DBXOracleDriver;DBXSqliteDriver;DBXSybaseASADriver;DBXSybaseASEDriver;dsnap;dsnapcon;dsnapxml;dxADOEMFRS29;dxADOServerModeRS29;dxBarDBNavRS29;dxBarExtDBItemsRS29;dxBarExtItemsRS29;dxBarRS29;dxChartControlRS29;dxCloudServiceLibraryRS29;dxComnRS29;dxCoreRS29;dxdborRS29;dxdbtrRS29;dxDBXServerModeRS29;dxDockingRS29;dxEMFRS29;dxFireDACEMFRS29;dxFireDACServerModeRS29;dxFlowChartAdvancedCustomizeFormRS29;dxFlowChartDesignerRS29;dxFlowChartLayoutsRS29;dxFlowChartRS29;dxGanttControlRS29;dxGaugeControlRS29;dxGDIPlusRS29;dxHttpIndyRequestRS29;dxMapControlRS29;dxmdsRS29;dxNavBarRS29;dxOrgChartAdvancedCustomizeFormRS29;dxorgcRS29;dxPDFViewerRS29;dxPSCoreRS29;dxPScxCommonRS29;dxPScxExtCommonRS29;dxPScxGridLnkRS29;dxPScxPCProdRS29;dxPScxPivotGridLnkRS29;dxPScxSchedulerLnkRS29;dxPScxTLLnkRS29;dxPScxVGridLnkRS29;dxPSDBTeeChartRS29;dxPSdxChartControlLnkRS29;dxPSdxDBOCLnkRS29;dxPSdxDBTVLnkRS29;dxPSdxFCLnkRS29;dxPSdxGaugeControlLnkRS29;dxPSdxLCLnkRS29;dxPSdxMapControlLnkRS29;dxPSdxOCLnkRS29;dxPSdxPDFViewerLnkRS29;dxPSdxSpreadSheetLnkRS29;dxPSLnksRS29;dxPsPrVwAdvRS29;dxPSPrVwRibbonRS29;dxPSRichEditControlLnkRS29;dxPSTeeChartRS29;dxReportsRS29;dxRibbonCustomizationFormRS29;dxRibbonRS29;dxRichEditControlCoreRS29;dxRichEditControlRS29;dxRichEditCoreRS29;dxRichEditDocumentModelRS29;dxServerModeRS29;dxSkinsCoreRS29;dxSpellCheckerRS29;dxSpreadSheetConditionalFormattingDialogsRS29;dxSpreadSheetCoreConditionalFormattingDialogsRS29;dxSpreadSheetCoreRS29;dxSpreadSheetReportDesignerRS29;dxSpreadSheetRS29;dxTabbedMDIRS29;dxTileControlRS29;dxtrmdRS29;dxWizardControlRS29;emsclient;emsclientfiredac;emsedge;emshosting;emsserverresource;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACDb2Driver;FireDACDBXDriver;FireDACDSDriver;FireDACIBDriver;FireDACInfxDriver;FireDACMongoDBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;FireDACTDataDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;ibmonitor;ibxbindings;ibxpress;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;inetstn;RESTBackendComponents;RESTComponents;rtl;Skia;soapmidas;soaprtl;soapserver;Tee;TeeDB;TeeUI;tethering;vcl;vclactnband;vcldb;vcldsnap;vcledge;vclFireDAC;vclib;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports) @@ -106,7 +106,7 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 $(BDS)\bin\default_app.manifest - DashboardTemplatePCH1.h + StoreDashboardInDBPCH1.h adortl;appanalytics;bcbie;bcbsmp;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindcompvclsmp;bindcompvclwinx;bindengine;CloudService;CustomIPTransport;cxADOAdaptersRS29;cxExportRS29;cxFireDACAdaptersRS29;cxGridEMFRS29;cxGridRS29;cxIBXAdaptersRS29;cxLibraryRS29;cxPivotGridChartRS29;cxPivotGridOLAPRS29;cxPivotGridRS29;cxSchedulerGridRS29;cxSchedulerRibbonStyleEventEditorRS29;cxSchedulerRS29;cxSchedulerTreeBrowserRS29;cxSchedulerWebServiceStorageRS29;cxTreeListdxBarPopupMenuRS29;cxTreeListRS29;cxVerticalGridRS29;DataSnapClient;DataSnapCommon;DataSnapConnectors;DatasnapConnectorsFreePascal;DataSnapFireDAC;DataSnapIndy10ServerTransport;DataSnapNativeClient;DataSnapProviderClient;DataSnapServer;DataSnapServerMidas;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXDb2Driver;DBXFirebirdDriver;DBXInformixDriver;DBXInterBaseDriver;DBXMSSQLDriver;DBXMySQLDriver;DBXOdbcDriver;DBXOracleDriver;DBXSqliteDriver;DBXSybaseASADriver;DBXSybaseASEDriver;dsnap;dsnapcon;dsnapxml;dxADOEMFRS29;dxADOServerModeRS29;dxBarDBNavRS29;dxBarExtDBItemsRS29;dxBarExtItemsRS29;dxBarRS29;dxChartControlRS29;dxCloudServiceLibraryRS29;dxComnRS29;dxCoreRS29;dxdborRS29;dxdbtrRS29;dxDBXServerModeRS29;dxDockingRS29;dxEMFRS29;dxFireDACEMFRS29;dxFireDACServerModeRS29;dxFlowChartAdvancedCustomizeFormRS29;dxFlowChartDesignerRS29;dxFlowChartLayoutsRS29;dxFlowChartRS29;dxGanttControlRS29;dxGaugeControlRS29;dxGDIPlusRS29;dxHttpIndyRequestRS29;dxMapControlRS29;dxmdsRS29;dxNavBarRS29;dxOrgChartAdvancedCustomizeFormRS29;dxorgcRS29;dxPDFViewerRS29;dxPSCoreRS29;dxPScxCommonRS29;dxPScxExtCommonRS29;dxPScxGridLnkRS29;dxPScxPCProdRS29;dxPScxPivotGridLnkRS29;dxPScxSchedulerLnkRS29;dxPScxTLLnkRS29;dxPScxVGridLnkRS29;dxPSDBTeeChartRS29;dxPSdxChartControlLnkRS29;dxPSdxDBOCLnkRS29;dxPSdxDBTVLnkRS29;dxPSdxFCLnkRS29;dxPSdxGaugeControlLnkRS29;dxPSdxLCLnkRS29;dxPSdxMapControlLnkRS29;dxPSdxOCLnkRS29;dxPSdxPDFViewerLnkRS29;dxPSdxSpreadSheetLnkRS29;dxPSLnksRS29;dxPsPrVwAdvRS29;dxPSPrVwRibbonRS29;dxPSRichEditControlLnkRS29;dxPSTeeChartRS29;dxReportsRS29;dxRibbonCustomizationFormRS29;dxRibbonRS29;dxRichEditControlCoreRS29;dxRichEditControlRS29;dxRichEditCoreRS29;dxRichEditDocumentModelRS29;dxServerModeRS29;dxSkinsCoreRS29;dxSpellCheckerRS29;dxSpreadSheetConditionalFormattingDialogsRS29;dxSpreadSheetCoreConditionalFormattingDialogsRS29;dxSpreadSheetCoreRS29;dxSpreadSheetReportDesignerRS29;dxSpreadSheetRS29;dxTabbedMDIRS29;dxTileControlRS29;dxtrmdRS29;dxWizardControlRS29;emsclient;emsclientfiredac;emsedge;emshosting;emsserverresource;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACDb2Driver;FireDACDBXDriver;FireDACDSDriver;FireDACIBDriver;FireDACInfxDriver;FireDACMongoDBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;FireDACTDataDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;ibmonitor;ibxbindings;ibxpress;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;inetstn;RESTBackendComponents;RESTComponents;rtl;Skia;soapmidas;soaprtl;soapserver;Tee;TeeDB;TeeUI;tethering;vcl;vclactnband;vcldb;vcldsnap;vcledge;vclFireDAC;vclib;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports) @@ -117,7 +117,7 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 $(BDS)\bin\default_app.manifest - DashboardTemplatePCH1.h + StoreDashboardInDBPCH1.h adortl;bindcomp;bindcompdbx;bindcompfmx;bindcompvcl;bindcompvclsmp;bindcompvclwinx;bindengine;CloudService;CustomIPTransport;cxADOAdaptersRS29;cxExportRS29;cxFireDACAdaptersRS29;cxGridEMFRS29;cxGridRS29;cxIBXAdaptersRS29;cxLibraryRS29;cxPivotGridChartRS29;cxPivotGridOLAPRS29;cxPivotGridRS29;cxSchedulerGridRS29;cxSchedulerRibbonStyleEventEditorRS29;cxSchedulerRS29;cxSchedulerTreeBrowserRS29;cxSchedulerWebServiceStorageRS29;cxTreeListdxBarPopupMenuRS29;cxTreeListRS29;cxVerticalGridRS29;DataSnapClient;DataSnapCommon;DataSnapConnectors;DatasnapConnectorsFreePascal;DataSnapFireDAC;DataSnapIndy10ServerTransport;DataSnapNativeClient;DataSnapProviderClient;DataSnapServer;DataSnapServerMidas;dbexpress;dbrtl;dbxcds;DbxClientDriver;DbxCommonDriver;DBXDb2Driver;DBXFirebirdDriver;DBXInformixDriver;DBXInterBaseDriver;DBXMSSQLDriver;DBXMySQLDriver;DBXOdbcDriver;DBXOracleDriver;DBXSqliteDriver;DBXSybaseASADriver;DBXSybaseASEDriver;dsnap;dsnapcon;dsnapxml;dxADOEMFRS29;dxADOServerModeRS29;dxBarDBNavRS29;dxBarExtDBItemsRS29;dxBarExtItemsRS29;dxBarRS29;dxChartControlRS29;dxCloudServiceLibraryRS29;dxComnRS29;dxCoreRS29;dxdborRS29;dxdbtrRS29;dxDBXServerModeRS29;dxDockingRS29;dxEMFRS29;dxFireDACEMFRS29;dxFireDACServerModeRS29;dxFlowChartAdvancedCustomizeFormRS29;dxFlowChartDesignerRS29;dxFlowChartLayoutsRS29;dxFlowChartRS29;dxGanttControlRS29;dxGaugeControlRS29;dxGDIPlusRS29;dxHttpIndyRequestRS29;dxMapControlRS29;dxmdsRS29;dxNavBarRS29;dxOrgChartAdvancedCustomizeFormRS29;dxorgcRS29;dxPDFViewerRS29;dxPSCoreRS29;dxPScxCommonRS29;dxPScxExtCommonRS29;dxPScxGridLnkRS29;dxPScxPCProdRS29;dxPScxPivotGridLnkRS29;dxPScxSchedulerLnkRS29;dxPScxTLLnkRS29;dxPScxVGridLnkRS29;dxPSDBTeeChartRS29;dxPSdxChartControlLnkRS29;dxPSdxDBOCLnkRS29;dxPSdxDBTVLnkRS29;dxPSdxFCLnkRS29;dxPSdxGaugeControlLnkRS29;dxPSdxLCLnkRS29;dxPSdxMapControlLnkRS29;dxPSdxOCLnkRS29;dxPSdxPDFViewerLnkRS29;dxPSdxSpreadSheetLnkRS29;dxPSLnksRS29;dxPsPrVwAdvRS29;dxPSPrVwRibbonRS29;dxPSRichEditControlLnkRS29;dxPSTeeChartRS29;dxReportsRS29;dxRibbonCustomizationFormRS29;dxRibbonRS29;dxRichEditControlCoreRS29;dxRichEditControlRS29;dxRichEditCoreRS29;dxRichEditDocumentModelRS29;dxServerModeRS29;dxSkinsCoreRS29;dxSpellCheckerRS29;dxSpreadSheetConditionalFormattingDialogsRS29;dxSpreadSheetCoreConditionalFormattingDialogsRS29;dxSpreadSheetCoreRS29;dxSpreadSheetReportDesignerRS29;dxSpreadSheetRS29;dxTabbedMDIRS29;dxTileControlRS29;dxtrmdRS29;dxWizardControlRS29;emsclient;emsclientfiredac;emsedge;emshosting;emsserverresource;FireDAC;FireDACADSDriver;FireDACASADriver;FireDACCommon;FireDACCommonDriver;FireDACCommonODBC;FireDACDb2Driver;FireDACDBXDriver;FireDACDSDriver;FireDACIBDriver;FireDACInfxDriver;FireDACMongoDBDriver;FireDACMSAccDriver;FireDACMSSQLDriver;FireDACMySQLDriver;FireDACODBCDriver;FireDACOracleDriver;FireDACPgDriver;FireDACSqliteDriver;FireDACTDataDriver;fmx;fmxase;fmxdae;fmxFireDAC;fmxobj;FMXTee;FmxTeeUI;ibmonitor;ibxbindings;ibxpress;IndyCore;IndyIPClient;IndyIPCommon;IndyIPServer;IndyProtocols;IndySystem;inet;inetdb;inetdbxpress;inetstn;RESTBackendComponents;RESTComponents;rtl;Skia;soapmidas;soaprtl;soapserver;Tee;TeeDB;TeeUI;tethering;vcl;vclactnband;vcldb;vcldsnap;vcledge;vclFireDAC;vclib;vclie;vclimg;VCLRESTComponents;VclSmp;vcltouch;vclwinx;vclx;xmlrtl;$(PackageImports) @@ -128,7 +128,7 @@ 1033 $(BDS)\bin\default_app.manifest true - DashboardTemplatePCH1.h + StoreDashboardInDBPCH1.h @@ -167,7 +167,7 @@ $(PostBuildEvent)]]> PerMonitorV2 - rtl.bpi;vcl.bpi;dbrtl.bpi;FireDAC.bpi;FireDACCommonDriver.bpi;FireDACCommon.bpi;xmlrtl.bpi;vclFireDAC.bpi;vcldb.bpi;vclwinx.bpi;vclimg.bpi;bindengine.bpi;vclx.bpi;cxLibraryRS29.bpi;dxGDIPlusRS29.bpi;dxCoreRS29.bpi;dbexpress.bpi;DbxCommonDriver.bpi;vclie.bpi;vcledge.bpi;cxGridRS29.bpi;cxExportRS29.bpi;dxSpreadSheetCoreRS29.bpi;dxComnRS29.bpi;dxSpreadSheetRS29.bpi;dxServerModeRS29.bpi;dxReportsRS29.bpi;dxPSCoreRS29.bpi;dxPSdxPDFViewerLnkRS29.bpi;dxPDFViewerRS29.bpi;FireDACMSAccDriver.bpi;FireDACCommonODBC.bpi;dxmdsRS29.bpi;dxSkinsCoreRS29.bpi;dxBackendRS29.bpi;dxDashboardsRS29.bpi + rtl.bpi;vcl.bpi;dbrtl.bpi;FireDAC.bpi;FireDACCommonDriver.bpi;FireDACCommon.bpi;xmlrtl.bpi;vclFireDAC.bpi;vcldb.bpi;vclwinx.bpi;vclimg.bpi;bindengine.bpi;vclx.bpi;dbexpress.bpi;DbxCommonDriver.bpi;vclie.bpi;vcledge.bpi;FireDACMSAccDriver.bpi;FireDACCommonODBC.bpi;cxLibraryRS37.bpi;dxGDIPlusRS37.bpi;dxCoreRS37.bpi;cxGridRS37.bpi;cxExportRS37.bpi;dxSpreadSheetCoreRS37.bpi;dxComnRS37.bpi;dxSpreadSheetRS37.bpi;dxServerModeRS37.bpi;dxmdsRS37.bpi;dxBackendRS37.bpi;dxPSCoreRS37.bpi;dxPSdxPDFViewerLnkRS37.bpi;dxPDFViewerRS37.bpi;dxReportsRS37.bpi;dxDashboardsRS37.bpi;dxSkinsCoreRS37.bpi true 1033 @@ -186,13 +186,13 @@ $(PostBuildEvent)]]> PerMonitorV2 - + 0 - + 4 - + 1 true @@ -209,8 +209,6 @@ $(PostBuildEvent)]]> uMainForm.h 2 - - Base @@ -235,13 +233,13 @@ $(PostBuildEvent)]]> False - DashboardTemplate.cpp + StoreDashboardInDB.cpp - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components @@ -270,6 +268,16 @@ $(PostBuildEvent)]]> true + + + true + + + + + true + + true @@ -285,6 +293,16 @@ $(PostBuildEvent)]]> true + + + true + + + + + true + + true @@ -295,15 +313,25 @@ $(PostBuildEvent)]]> true - + + + true + + + + + true + + + - DashboardTemplate.exe + StoreDashboardInDB.exe true - + - DashboardTemplate.pdb + StoreDashboardInDB.pdb true @@ -1290,8 +1318,7 @@ $(PostBuildEvent)]]> False False - copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) - + copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) False @@ -1299,8 +1326,7 @@ $(PostBuildEvent)]]> False False - copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) - + copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) False diff --git a/CPB/DashboardTemplate.cpp b/CPB/StoreDashboardInDB.cpp similarity index 92% rename from CPB/DashboardTemplate.cpp rename to CPB/StoreDashboardInDB.cpp index 1c5e291..5db9d73 100644 --- a/CPB/DashboardTemplate.cpp +++ b/CPB/StoreDashboardInDB.cpp @@ -13,6 +13,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { Application->Initialize(); Application->MainFormOnTaskBar = true; + Application->Title = "DevExpress VCL: Store Dashboard Layout in a Database"; Application->CreateForm(__classid(TDataModule1), &DataModule1); Application->CreateForm(__classid(TMainForm), &MainForm); Application->Run(); diff --git a/CPB/DashboardTemplate.dxSettings.cpp b/CPB/StoreDashboardInDB.dxSettings.cpp similarity index 100% rename from CPB/DashboardTemplate.dxSettings.cpp rename to CPB/StoreDashboardInDB.dxSettings.cpp diff --git a/CPB/DashboardTemplate.dxsettings b/CPB/StoreDashboardInDB.dxsettings similarity index 100% rename from CPB/DashboardTemplate.dxsettings rename to CPB/StoreDashboardInDB.dxsettings diff --git a/CPB/DashboardTemplatePCH1.h b/CPB/StoreDashboardInDB.h similarity index 100% rename from CPB/DashboardTemplatePCH1.h rename to CPB/StoreDashboardInDB.h diff --git a/CPB/uMainForm.cpp b/CPB/uMainForm.cpp index 29759e2..ddd2462 100644 --- a/CPB/uMainForm.cpp +++ b/CPB/uMainForm.cpp @@ -1,149 +1,145 @@ -//--------------------------------------------------------------------------- - -#include -#pragma hdrstop - -#include "uMainForm.h" -//--------------------------------------------------------------------------- -#pragma package(smart_init) -#pragma link "cxButtons" -#pragma link "cxClasses" -#pragma link "cxControls" -#pragma link "cxCustomData" -#pragma link "cxData" -#pragma link "cxDataStorage" -#pragma link "cxDBData" -#pragma link "cxEdit" -#pragma link "cxFilter" -#pragma link "cxGraphics" -#pragma link "cxGrid" -#pragma link "cxGridCustomTableView" -#pragma link "cxGridCustomView" -#pragma link "cxGridDBTableView" -#pragma link "cxGridLevel" -#pragma link "cxGridTableView" -#pragma link "cxLookAndFeelPainters" -#pragma link "cxLookAndFeels" -#pragma link "cxNavigator" -#pragma link "cxStyles" -#pragma link "dxDateRanges" -#pragma link "dxReport" - -#pragma link "dxScrollbarAnnotations" -#pragma link "dxmdaset" -#pragma link "cxImageList" -#pragma link "dxLayoutContainer" -#pragma link "dxLayoutControl" -#pragma link "dxLayoutControlAdapters" -#pragma link "dxBackend.Utils.WebBrowserForm" -#pragma link "dxDashboard.Control" -#pragma link "dxAI" -#pragma link "dxAI.Commands.SmartPaste" -#pragma link "cxTextEdit" -#pragma resource "*.dfm" -TMainForm *MainForm; -//--------------------------------------------------------------------------- -__fastcall TMainForm::TMainForm(TComponent* Owner) - : TForm(Owner) -{ - -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::FormCreate(TObject *Sender) -{ - LoadLayoutAndState(); -} - //--------------------------------------------------------------------------- -void __fastcall TMainForm::LoadLayoutAndState() -{ - if ((DataModule1->mdLayouts->RecordCount == 0) && - (DataModule1->mdLayouts->State != dsInsert)) - { - dxDashboardControl1->Clear(); - return; - } - - dxDashboardControl1->DashboardName = DataModule1->mdLayoutsName->AsString; - dxDashboardControl1->Layout->Assign(DataModule1->mdLayoutsLayout); - - if (!DataModule1->mdLayoutsState->IsNull) - dxDashboardControl1->State->Assign(DataModule1->mdLayoutsState); -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::btnDeleteClick(TObject *Sender) -{ - DataModule1->mdLayouts->Delete(); -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::btnDesignClick(TObject *Sender) -{ - dxDashboardControl1->ShowDesigner(); -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::btnNewDashboardClick(TObject *Sender) -{ - dxDashboardControl1->Clear(); - dxDashboardControl1->ShowDesigner(); -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::gvLayoutsNamePropertiesValidate(TObject *Sender, TcxEditValue &DisplayValue, - TCaption &ErrorText, bool &Error) -{ - if (DisplayValue == "") - { - Error = true; - ErrorText = L"Dashboard name cannot be blank."; - } -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::gvLayoutsEditValueChanged(TcxCustomGridTableView *Sender, - TcxCustomGridTableItem *AItem) -{ - if (AItem == gvLayoutsName) - dxDashboardControl1->DashboardName = AItem->EditValue; -} -//--------------------------------------------------------------------------- - -void __fastcall TMainForm::gvLayoutsFocusedRecordChanged( - TcxCustomGridTableView *Sender, - TcxCustomGridRecord *APrevFocusedRecord, - TcxCustomGridRecord *AFocusedRecord, - bool ANewItemRecordFocusingChanged) -{ - if (AFocusedRecord == nullptr) - dxDashboardControl1->Clear(); - - if ((AFocusedRecord != APrevFocusedRecord) && - (DataModule1->mdLayouts->State != dsInsert)) - { - LoadLayoutAndState(); - } -} -//--------------------------------------------------------------------------- - -void __fastcall TMainForm::dxDashboardControl1LayoutChanged( - TdxCustomDashboardControl *ASender) -{ - if (DataModule1->mdLayoutsName->AsString != dxDashboardControl1->DashboardName) - { - DataModule1->mdLayouts->Append(); - DataModule1->mdLayoutsName->AsString = dxDashboardControl1->DashboardName; - } - else - DataModule1->mdLayouts->Edit(); - - DataModule1->mdLayoutsLayout->Assign(dxDashboardControl1->Layout); - DataModule1->mdLayouts->Post(); -} -//--------------------------------------------------------------------------- -void __fastcall TMainForm::dxDashboardControl1StateChanged( - TdxCustomDashboardControl *ASender) -{ - DataModule1->mdLayouts->Edit(); - DataModule1->mdLayoutsState->Assign(dxDashboardControl1->State); - DataModule1->mdLayouts->Post(); -} -//--------------------------------------------------------------------------- - - -//--------------------------------------------------------------------------- +//--------------------------------------------------------------------------- + +#include +#pragma hdrstop + +#include "uMainForm.h" +//--------------------------------------------------------------------------- +#pragma package(smart_init) +#pragma link "cxButtons" +#pragma link "cxClasses" +#pragma link "cxControls" +#pragma link "cxCustomData" +#pragma link "cxData" +#pragma link "cxDataStorage" +#pragma link "cxDBData" +#pragma link "cxEdit" +#pragma link "cxFilter" +#pragma link "cxGraphics" +#pragma link "cxGrid" +#pragma link "cxGridCustomTableView" +#pragma link "cxGridCustomView" +#pragma link "cxGridDBTableView" +#pragma link "cxGridLevel" +#pragma link "cxGridTableView" +#pragma link "cxLookAndFeelPainters" +#pragma link "cxLookAndFeels" +#pragma link "cxNavigator" +#pragma link "cxStyles" +#pragma link "dxDateRanges" +#pragma link "dxReport" + +#pragma link "dxScrollbarAnnotations" +#pragma link "dxmdaset" +#pragma link "dxLayoutContainer" +#pragma link "dxLayoutControl" +#pragma link "dxLayoutControlAdapters" +#pragma link "dxDashboard.Control" +#pragma resource "*.dfm" +TMainForm *MainForm; +//--------------------------------------------------------------------------- +__fastcall TMainForm::TMainForm(TComponent* Owner) + : TForm(Owner) +{ + +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::FormCreate(TObject *Sender) +{ + LoadLayoutAndState(); +} + //--------------------------------------------------------------------------- +void __fastcall TMainForm::LoadLayoutAndState() +{ + if ((DataModule1->mdLayouts->RecordCount == 0) && + (DataModule1->mdLayouts->State != dsInsert)) + { + dxDashboardControl1->Clear(); + return; + } + + dxDashboardControl1->DashboardName = DataModule1->mdLayoutsName->AsString; + dxDashboardControl1->Layout->Assign(DataModule1->mdLayoutsLayout); + + if (!DataModule1->mdLayoutsState->IsNull) + dxDashboardControl1->State->Assign(DataModule1->mdLayoutsState); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::btnDeleteClick(TObject *Sender) +{ + DataModule1->mdLayouts->Delete(); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::btnDesignClick(TObject *Sender) +{ + dxDashboardControl1->ShowDesigner(); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::btnNewDashboardClick(TObject *Sender) +{ + dxDashboardControl1->Clear(); + dxDashboardControl1->ShowDesigner(); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::gvLayoutsNamePropertiesValidate(TObject *Sender, TcxEditValue &DisplayValue, + TCaption &ErrorText, bool &Error) +{ + if (DisplayValue == "") + { + Error = true; + ErrorText = L"Dashboard name cannot be blank."; + } +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::gvLayoutsEditValueChanged(TcxCustomGridTableView *Sender, + TcxCustomGridTableItem *AItem) +{ + if (AItem == gvLayoutsName) + dxDashboardControl1->DashboardName = AItem->EditValue; +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::gvLayoutsFocusedRecordChanged( + TcxCustomGridTableView *Sender, + TcxCustomGridRecord *APrevFocusedRecord, + TcxCustomGridRecord *AFocusedRecord, + bool ANewItemRecordFocusingChanged) +{ + if (AFocusedRecord == nullptr) + dxDashboardControl1->Clear(); + + if ((AFocusedRecord != APrevFocusedRecord) && + (DataModule1->mdLayouts->State != dsInsert)) + { + LoadLayoutAndState(); + } +} +//--------------------------------------------------------------------------- + +void __fastcall TMainForm::dxDashboardControl1LayoutChanged( + TdxCustomDashboardControl *ASender) +{ + if (DataModule1->mdLayoutsName->AsString != dxDashboardControl1->DashboardName) + { + DataModule1->mdLayouts->Append(); + DataModule1->mdLayoutsName->AsString = dxDashboardControl1->DashboardName; + } + else + DataModule1->mdLayouts->Edit(); + + DataModule1->mdLayoutsLayout->Assign(dxDashboardControl1->Layout); + DataModule1->mdLayouts->Post(); +} +//--------------------------------------------------------------------------- +void __fastcall TMainForm::dxDashboardControl1StateChanged( + TdxCustomDashboardControl *ASender) +{ + DataModule1->mdLayouts->Edit(); + DataModule1->mdLayoutsState->Assign(dxDashboardControl1->State); + DataModule1->mdLayouts->Post(); +} + +//--------------------------------------------------------------------------- + + +//--------------------------------------------------------------------------- diff --git a/CPB/uMainForm.dfm b/CPB/uMainForm.dfm index 7a30297..59cef2a 100644 --- a/CPB/uMainForm.dfm +++ b/CPB/uMainForm.dfm @@ -1,7 +1,7 @@ object MainForm: TMainForm Left = 0 Top = 0 - Caption = 'MainForm' + Caption = 'DevExpress VCL: Store Dashboard Layout in a Database' ClientHeight = 726 ClientWidth = 1222 Color = clBtnFace @@ -20,8 +20,6 @@ object MainForm: TMainForm Align = alClient TabOrder = 0 AutoSize = True - ExplicitWidth = 833 - ExplicitHeight = 504 object btnDesign: TcxButton Left = 414 Top = 12 diff --git a/CPB/uMainForm.h b/CPB/uMainForm.h index 446cd6e..572390f 100644 --- a/CPB/uMainForm.h +++ b/CPB/uMainForm.h @@ -38,8 +38,6 @@ #include "dxLayoutContainer.hpp" #include "dxLayoutControl.hpp" #include "dxLayoutControlAdapters.hpp" -#include -#include #include "dxBackend.Utils.WebBrowserForm.hpp" #include "dxDashboard.Control.hpp" #include "dxAI.Commands.SmartPaste.hpp" diff --git a/Delphi/DashboardTemplate.dpr b/Delphi/StoreDashboardInDB.dpr similarity index 64% rename from Delphi/DashboardTemplate.dpr rename to Delphi/StoreDashboardInDB.dpr index 0cab27f..be74686 100644 --- a/Delphi/DashboardTemplate.dpr +++ b/Delphi/StoreDashboardInDB.dpr @@ -1,16 +1,17 @@ -program DashboardTemplate; +program StoreDashboardInDB; uses Vcl.Forms, uMainForm in 'uMainForm.pas' {MainForm}, uData in 'uData.pas' {DataModule1: TDataModule}, - DashboardTemplate.dxSettings in 'DashboardTemplate.dxSettings.pas'; + StoreDashboardInDB.dxSettings in 'StoreDashboardInDB.dxSettings.pas'; {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; + Application.Title := 'DevExpress VCL: Store Dashboard Layout in a Database'; Application.CreateForm(TDataModule1, DataModule1); Application.CreateForm(TMainForm, MainForm); Application.Run; diff --git a/Delphi/DashboardTemplate.dproj b/Delphi/StoreDashboardInDB.dproj similarity index 96% rename from Delphi/DashboardTemplate.dproj rename to Delphi/StoreDashboardInDB.dproj index 229c957..afc3af0 100644 --- a/Delphi/DashboardTemplate.dproj +++ b/Delphi/StoreDashboardInDB.dproj @@ -1,4 +1,4 @@ - + {C8FCB972-B167-4D60-AB2D-37E035C49AE4} 20.3 @@ -6,10 +6,10 @@ True Debug Win32 - DashboardTemplate + StoreDashboardInDB 3 Application - DashboardTemplate.dpr + StoreDashboardInDB.dpr true @@ -60,7 +60,7 @@ .\$(Platform)\$(Config) - .\$(Platform)\$(Config) + . false false false @@ -70,29 +70,31 @@ $(BDS)\bin\delphi_PROJECTICON.ico $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - DashboardTemplate + StoreDashboardInDB + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= dxPScxCommonRS29;dxPSdxChartControlLnkRS29;dxRibbonRS29;vclwinx;DataSnapServer;dxPScxExtCommonRS29;dxRichEditControlCoreRS29;fmx;dxSpreadSheetReportDesignerRS29;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;dxComnRS29;dxFlowChartDesignerRS29;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;dxBarExtDBItemsRS29;dbxcds;vcledge;cxVerticalGridRS29;FmxTeeUI;cxFireDACAdaptersRS29;dxPSDBTeeChartRS29;cxSchedulerWebServiceStorageRS29;DBXFirebirdDriver;dxRichEditControlRS29;dxPsPrVwAdvRS29;FireDACSqliteDriver;DbxClientDriver;dxPSdxGaugeControlLnkRS29;soapmidas;dxRibbonCustomizationFormRS29;TeeUI;dbexpress;dxEMFRS29;dxDockingRS29;inet;vcltouch;dxPSdxFCLnkRS29;dxorgcRS29;FireDACDBXDriver;dxSpreadSheetCoreConditionalFormattingDialogsRS29;fmxdae;dxPSRichEditControlLnkRS29;dxPSdxSpreadSheetLnkRS29;CustomIPTransport;FireDACMSSQLDriver;cxADOAdaptersRS29;madExcept_;dxPSPrVwRibbonRS29;IndySystem;dxPScxTLLnkRS29;dxPSdxDBOCLnkRS29;dxGDIPlusRS29;ibxbindings;vclFireDAC;madDisAsm_;dxPSCoreRS29;dxSpreadSheetRS29;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;cxGridEMFRS29;dxPSdxMapControlLnkRS29;dxGanttControlRS29;dxPScxVGridLnkRS29;dxPScxPivotGridLnkRS29;dxWizardControlRS29;dxADOServerModeRS29;bindcompdbx;rtl;FireDACMySQLDriver;dxCloudServiceLibraryRS29;cxIBXAdaptersRS29;dxServerModeRS29;DBXSqliteDriver;dxBarDBNavRS29;DBXSybaseASEDriver;dxSpreadSheetCoreRS29;dxNavBarRS29;vclimg;DataSnapFireDAC;inetdbxpress;FireDAC;xmlrtl;ibxpress;dxFireDACEMFRS29;dsnap;FireDACDb2Driver;dxPSdxLCLnkRS29;DBXOracleDriver;DBXInformixDriver;vclib;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;dxPSLnksRS29;dxmdsRS29;dxPSdxOCLnkRS29;cxSchedulerGridRS29;dxPScxSchedulerLnkRS29;emshosting;dxADOEMFRS29;dxChartControlRS29;dxPSdxDBTVLnkRS29;FireDACCommonDriver;dxGaugeControlRS29;IndyIPClient;dxPDFViewerRS29;bindcompvclwinx;dxOrgChartAdvancedCustomizeFormRS29;emsedge;bindcompfmx;dxBarExtItemsRS29;madBasic_;dxReportsRS29;dxFlowChartLayoutsRS29;inetdb;dxdborRS29;ibmonitor;FireDACASADriver;Tee;dxPScxGridLnkRS29;cxPivotGridChartRS29;vclactnband;fmxFireDAC;FireDACInfxDriver;dxRichEditCoreRS29;cxTreeListdxBarPopupMenuRS29;DBXMySQLDriver;dxFlowChartAdvancedCustomizeFormRS29;VclSmp;cxSchedulerRibbonStyleEventEditorRS29;DataSnapCommon;dxPSTeeChartRS29;fmxase;dxtrmdRS29;dxFlowChartRS29;DBXOdbcDriver;dbrtl;dxPScxPCProdRS29;FireDACOracleDriver;Skia.Package.FMX;TeeDB;FireDACMSAccDriver;cxGridRS29;dxSpellCheckerRS29;DataSnapIndy10ServerTransport;dxRichEditDocumentModelRS29;dxMapControlRS29;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FireDACTDataDriver;cxLibraryRS29;Skia.Package.VCL;vcldb;dxPSdxPDFViewerLnkRS29;cxSchedulerTreeBrowserRS29;bindcomp;dxTabbedMDIRS29;cxExportRS29;inetstn;IndyCore;RESTBackendComponents;dxHttpIndyRequestRS29;dxTileControlRS29;dxFireDACServerModeRS29;cxPivotGridOLAPRS29;FireDACADSDriver;RESTComponents;IndyIPServer;vcl;dsnapxml;adortl;dsnapcon;DataSnapClient;DataSnapProviderClient;dxCoreRS29;cxPivotGridRS29;dxdbtrRS29;DBXDb2Driver;dxSkinsCoreRS29;emsclientfiredac;FireDACPgDriver;FireDACDSDriver;dxBarRS29;tethering;bindcompvcl;CloudService;DBXSybaseASADriver;dxSpreadSheetConditionalFormattingDialogsRS29;cxTreeListRS29;FMXTee;soaprtl;cxSchedulerRS29;dxDBXServerModeRS29;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 + none $(BDS)\bin\default_app.manifest + StoreDashboardInDB_Icon.ico dxPScxCommonRS29;dxPSdxChartControlLnkRS29;dxRibbonRS29;vclwinx;DataSnapServer;dxPScxExtCommonRS29;dxRichEditControlCoreRS29;fmx;dxSpreadSheetReportDesignerRS29;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;dxComnRS29;dxFlowChartDesignerRS29;appanalytics;IndyProtocols;vclx;dxBarExtDBItemsRS29;dbxcds;vcledge;cxVerticalGridRS29;FmxTeeUI;cxFireDACAdaptersRS29;dxPSDBTeeChartRS29;cxSchedulerWebServiceStorageRS29;DBXFirebirdDriver;dxRichEditControlRS29;dxPsPrVwAdvRS29;FireDACSqliteDriver;DbxClientDriver;dxPSdxGaugeControlLnkRS29;soapmidas;dxRibbonCustomizationFormRS29;TeeUI;dbexpress;dxEMFRS29;dxDockingRS29;inet;vcltouch;dxPSdxFCLnkRS29;dxorgcRS29;FireDACDBXDriver;dxSpreadSheetCoreConditionalFormattingDialogsRS29;fmxdae;dxPSRichEditControlLnkRS29;dxPSdxSpreadSheetLnkRS29;CustomIPTransport;FireDACMSSQLDriver;cxADOAdaptersRS29;dxPSPrVwRibbonRS29;IndySystem;dxPScxTLLnkRS29;dxPSdxDBOCLnkRS29;dxGDIPlusRS29;ibxbindings;vclFireDAC;dxPSCoreRS29;dxSpreadSheetRS29;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;cxGridEMFRS29;dxPSdxMapControlLnkRS29;dxGanttControlRS29;dxPScxVGridLnkRS29;dxPScxPivotGridLnkRS29;dxWizardControlRS29;dxADOServerModeRS29;bindcompdbx;rtl;FireDACMySQLDriver;dxCloudServiceLibraryRS29;cxIBXAdaptersRS29;dxServerModeRS29;DBXSqliteDriver;dxBarDBNavRS29;DBXSybaseASEDriver;dxSpreadSheetCoreRS29;dxNavBarRS29;vclimg;DataSnapFireDAC;inetdbxpress;FireDAC;xmlrtl;ibxpress;dxFireDACEMFRS29;dsnap;FireDACDb2Driver;dxPSdxLCLnkRS29;DBXOracleDriver;DBXInformixDriver;vclib;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;dxPSLnksRS29;dxmdsRS29;dxPSdxOCLnkRS29;cxSchedulerGridRS29;dxPScxSchedulerLnkRS29;emshosting;dxADOEMFRS29;dxChartControlRS29;dxPSdxDBTVLnkRS29;FireDACCommonDriver;dxGaugeControlRS29;IndyIPClient;dxPDFViewerRS29;bindcompvclwinx;dxOrgChartAdvancedCustomizeFormRS29;emsedge;bindcompfmx;dxBarExtItemsRS29;dxReportsRS29;dxFlowChartLayoutsRS29;inetdb;dxdborRS29;ibmonitor;FireDACASADriver;Tee;dxPScxGridLnkRS29;cxPivotGridChartRS29;vclactnband;fmxFireDAC;FireDACInfxDriver;dxRichEditCoreRS29;cxTreeListdxBarPopupMenuRS29;DBXMySQLDriver;dxFlowChartAdvancedCustomizeFormRS29;VclSmp;cxSchedulerRibbonStyleEventEditorRS29;DataSnapCommon;dxPSTeeChartRS29;fmxase;dxtrmdRS29;dxFlowChartRS29;DBXOdbcDriver;dbrtl;dxPScxPCProdRS29;FireDACOracleDriver;TeeDB;FireDACMSAccDriver;cxGridRS29;dxSpellCheckerRS29;DataSnapIndy10ServerTransport;dxRichEditDocumentModelRS29;dxMapControlRS29;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;FireDACTDataDriver;cxLibraryRS29;Skia.Package.VCL;vcldb;dxPSdxPDFViewerLnkRS29;cxSchedulerTreeBrowserRS29;bindcomp;dxTabbedMDIRS29;cxExportRS29;inetstn;IndyCore;RESTBackendComponents;dxHttpIndyRequestRS29;dxTileControlRS29;dxFireDACServerModeRS29;cxPivotGridOLAPRS29;FireDACADSDriver;RESTComponents;IndyIPServer;vcl;dsnapxml;adortl;dsnapcon;DataSnapClient;DataSnapProviderClient;dxCoreRS29;cxPivotGridRS29;dxdbtrRS29;DBXDb2Driver;dxSkinsCoreRS29;emsclientfiredac;FireDACPgDriver;FireDACDSDriver;dxBarRS29;tethering;bindcompvcl;CloudService;DBXSybaseASADriver;dxSpreadSheetConditionalFormattingDialogsRS29;cxTreeListRS29;FMXTee;soaprtl;cxSchedulerRS29;dxDBXServerModeRS29;soapserver;FireDACIBDriver;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug true - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 + none $(BDS)\bin\default_app.manifest + StoreDashboardInDB_Icon.ico DEBUG;$(DCC_Define) @@ -140,7 +142,7 @@ $(PostBuildEvent)]]> dfm TDataModule - + Base @@ -159,19 +161,19 @@ $(PostBuildEvent)]]> - DashboardTemplate.dpr + StoreDashboardInDB.dpr - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components - + - DashboardTemplate.exe + StoreDashboardInDB.exe true @@ -1141,8 +1143,7 @@ $(PostBuildEvent)]]> False False - copy /Y "$(BDS)\Redist\win32\WebView2Loader.dll" $(OUTPUTDIR) - + copy /Y "$(BDS)\Redist\win32\WebView2Loader.dll" $(OUTPUTDIR) False @@ -1150,8 +1151,7 @@ $(PostBuildEvent)]]> False False - copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) - + copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) False @@ -1159,8 +1159,7 @@ $(PostBuildEvent)]]> False False - copy /Y "$(BDS)\Redist\win32\WebView2Loader.dll" $(OUTPUTDIR) - + copy /Y "$(BDS)\Redist\win32\WebView2Loader.dll" $(OUTPUTDIR) False @@ -1168,8 +1167,7 @@ $(PostBuildEvent)]]> False False - copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) - + copy /Y "$(BDS)\Redist\win64\WebView2Loader.dll" $(OUTPUTDIR) False diff --git a/Delphi/DashboardTemplate.dxSettings.pas b/Delphi/StoreDashboardInDB.dxSettings.pas similarity index 98% rename from Delphi/DashboardTemplate.dxSettings.pas rename to Delphi/StoreDashboardInDB.dxSettings.pas index 874ea54..661136b 100644 --- a/Delphi/DashboardTemplate.dxSettings.pas +++ b/Delphi/StoreDashboardInDB.dxSettings.pas @@ -14,7 +14,7 @@ { } {**********************************************************************} -unit DashboardTemplate.dxSettings; +unit StoreDashboardInDB.dxSettings; {$I cxVer.inc} diff --git a/Delphi/DashboardTemplate.dxsettings b/Delphi/StoreDashboardInDB.dxsettings similarity index 100% rename from Delphi/DashboardTemplate.dxsettings rename to Delphi/StoreDashboardInDB.dxsettings diff --git a/Delphi/StoreDashboardInDB.res b/Delphi/StoreDashboardInDB.res new file mode 100644 index 0000000..64e097b Binary files /dev/null and b/Delphi/StoreDashboardInDB.res differ diff --git a/Delphi/StoreDashboardInDB_Icon.ico b/Delphi/StoreDashboardInDB_Icon.ico new file mode 100644 index 0000000..60cda0a Binary files /dev/null and b/Delphi/StoreDashboardInDB_Icon.ico differ diff --git a/Delphi/layout.dat b/Delphi/layout.dat new file mode 100644 index 0000000..24fab53 Binary files /dev/null and b/Delphi/layout.dat differ diff --git a/Delphi/revenue.dat b/Delphi/revenue.dat new file mode 100644 index 0000000..d36ca0a Binary files /dev/null and b/Delphi/revenue.dat differ diff --git a/Delphi/uData.dfm b/Delphi/uData.dfm index a2433aa..001680b 100644 --- a/Delphi/uData.dfm +++ b/Delphi/uData.dfm @@ -1,152 +1,154 @@ object DataModule1: TDataModule1 OnCreate = DataModuleCreate OnDestroy = DataModuleDestroy - Height = 499 - Width = 740 - PixelsPerInch = 192 + Height = 374 + Width = 555 + PixelsPerInch = 144 object mdLayouts: TdxMemData Active = True Indexes = <> Persistent.Data = { 5665728FC2F5285C8FFE3F03000000000000000D0007004C61796F7574001400 - 0000140005004E616D6500000000000D00060053746174650050100000EFBBBF + 0000140005004E616D6500000000000D00060053746174650065100000EFBBBF 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D227574 662D38223F3E0D0A3C44617368626F6172642043757272656E637943756C7475 - 72653D22656E2D5553223E0D0A20203C5469746C6520546578743D2252657665 - 6E756520627920496E6475737472792220416C69676E6D656E743D224C656674 - 22202F3E0D0A20203C44617461536F75726365733E0D0A20202020203C4A736F - 6E44617461536F75726365204E616D653D22537461746973746963732220436F - 6E6E656374696F6E4E616D653D22526576656E75654279496E64757374727943 - 6F6E6E656374696F6E2220526F6F74456C656D656E743D226D64526576656E75 - 654279496E6475737472792220436F6D706F6E656E744E616D653D2264735374 - 6174697374696373223E0D0A2020202020203C536368656D613E0D0A20202020 - 202020203C4E6F6465204E616D653D22726F6F74222053656C65637465643D22 - 66616C736522204E6F6465547970653D224F626A6563742220446973636F7665 - 72794C696D69744170706C6965643D2274727565223E0D0A2020202020202020 - 20203C4E6F6465204E616D653D226D64526576656E75654279496E6475737472 - 79222053656C65637465643D227472756522204E6F6465547970653D22417272 - 6179223E0D0A2020202020202020202020203C4E6F6465204E616D653D224369 - 74792220547970653D2253797374656D2E537472696E67222053656C65637465 - 643D227472756522204E6F6465547970653D2250726F706572747922202F3E0D - 0A2020202020202020202020203C4E6F6465204E616D653D22496E6475737472 - 792220547970653D2253797374656D2E537472696E67222053656C6563746564 - 3D227472756522204E6F6465547970653D2250726F706572747922202F3E0D0A - 2020202020202020202020203C4E6F6465204E616D653D224C61746974756465 - 2220547970653D2253797374656D2E4E756C6C61626C6560315B53797374656D - 2E446F75626C655D222053656C65637465643D227472756522204E6F64655479 - 70653D2250726F706572747922202F3E0D0A2020202020202020202020203C4E - 6F6465204E616D653D224C6F6E6769747564652220547970653D225379737465 - 6D2E4E756C6C61626C6560315B53797374656D2E446F75626C655D222053656C - 65637465643D227472756522204E6F6465547970653D2250726F706572747922 - 202F3E0D0A2020202020202020202020203C4E6F6465204E616D653D22526563 - 49642220547970653D2253797374656D2E4E756C6C61626C6560315B53797374 - 656D2E496E7436345D222053656C65637465643D227472756522204E6F646554 - 7970653D2250726F706572747922202F3E0D0A2020202020202020202020203C - 4E6F6465204E616D653D22526576656E75652220547970653D2253797374656D - 2E4E756C6C61626C6560315B53797374656D2E496E7436345D222053656C6563 - 7465643D227472756522204E6F6465547970653D2250726F706572747922202F - 3E0D0A2020202020202020202020203C4E6F6465204E616D653D225374617465 - 2220547970653D2253797374656D2E537472696E67222053656C65637465643D - 227472756522204E6F6465547970653D2250726F706572747922202F3E0D0A20 - 2020202020202020203C2F4E6F64653E0D0A20202020202020203C2F4E6F6465 - 3E0D0A2020202020203C2F536368656D613E0D0A202020203C2F4A736F6E4461 - 7461536F757263653E0D0A20203C2F44617461536F75726365733E0D0A20203C - 4974656D733E0D0A202020203C47656F506F696E744D617020436F6D706F6E65 - 6E744E616D653D226D6170526576656E756542794369747922204E616D653D22 - 526576656E75652062792043697479222044617461536F757263653D22647353 - 7461746973746963732220536861706566696C65417265613D22555341222053 - 686170655469746C654174747269627574654E616D653D224E414D452220456E - 61626C65436C7573746572696E673D2274727565223E0D0A2020202020203C49 - 6E74657261637469766974794F7074696F6E73204D617374657246696C746572 - 4D6F64653D224D756C7469706C6522202F3E0D0A2020202020203C4461746149 - 74656D733E0D0A20202020202020203C44696D656E73696F6E20446174614D65 - 6D6265723D224C61746974756465222044656661756C7449643D224461746149 - 74656D3022202F3E0D0A20202020202020203C44696D656E73696F6E20446174 - 614D656D6265723D224C6F6E676974756465222044656661756C7449643D2244 - 6174614974656D3122202F3E0D0A20202020202020203C4D6561737572652044 - 6174614D656D6265723D22526576656E756522204E616D653D22526576656E75 - 65222044656661756C7449643D22446174614974656D3222202F3E0D0A202020 - 20202020203C44696D656E73696F6E20446174614D656D6265723D2243697479 - 222044656661756C7449643D22446174614974656D3322202F3E0D0A20202020 - 202020203C44696D656E73696F6E20446174614D656D6265723D22496E647573 - 747279222044656661756C7449643D22446174614974656D3422202F3E0D0A20 - 20202020203C2F446174614974656D733E0D0A2020202020203C566965774172 - 656120546F704C617469747564653D2234392E33363936373230363434383732 - 35342220426F74746F6D4C617469747564653D2232342E353432333439333430 - 30353632383322204C6566744C6F6E6769747564653D222D3132342E37303939 - 37373734393135313533222052696768744C6F6E6769747564653D222D36362E - 393837303232303535393834343832222043656E746572506F696E744C617469 - 747564653D2233372E393935303636343035313835353534222043656E746572 - 506F696E744C6F6E6769747564653D222D39352E383438343939393032353638 - 30303822202F3E0D0A2020202020203C4D61704C6567656E64202F3E0D0A2020 - 202020203C57656967687465644C6567656E64202F3E0D0A2020202020203C4C - 617469747564652044656661756C7449643D22446174614974656D3022202F3E - 0D0A2020202020203C4C6F6E6769747564652044656661756C7449643D224461 - 74614974656D3122202F3E0D0A2020202020203C546F6F6C74697044696D656E - 73696F6E733E0D0A20202020202020203C546F6F6C74697044696D656E73696F - 6E2044656661756C7449643D22446174614974656D3322202F3E0D0A20202020 - 202020203C546F6F6C74697044696D656E73696F6E2044656661756C7449643D - 22446174614974656D3422202F3E0D0A2020202020203C2F546F6F6C74697044 - 696D656E73696F6E733E0D0A2020202020203C56616C75652044656661756C74 - 49643D22446174614974656D3222202F3E0D0A202020203C2F47656F506F696E - 744D61703E0D0A202020203C4C697374426F7820436F6D706F6E656E744E616D - 653D226C697374426F78496E64757374727922204E616D653D22496E64757374 - 7279222044617461536F757263653D226473537461746973746963732220456E - 61626C655365617263683D2274727565223E0D0A2020202020203C496E746572 - 61637469766974794F7074696F6E732049676E6F72654D617374657246696C74 - 6572733D2266616C736522202F3E0D0A2020202020203C446174614974656D73 - 3E0D0A20202020202020203C44696D656E73696F6E20446174614D656D626572 - 3D22496E647573747279222044656661756C7449643D22446174614974656D30 - 22202F3E0D0A2020202020203C2F446174614974656D733E0D0A202020202020 - 3C46696C74657244696D656E73696F6E733E0D0A20202020202020203C44696D - 656E73696F6E2044656661756C7449643D22446174614974656D3022202F3E0D - 0A2020202020203C2F46696C74657244696D656E73696F6E733E0D0A20202020 - 3C2F4C697374426F783E0D0A20203C2F4974656D733E0D0A20203C4C61796F75 - 74547265653E0D0A202020203C4C61796F757447726F75703E0D0A2020202020 - 203C4C61796F75744974656D2044617368626F6172644974656D3D226C697374 - 426F78496E64757374727922205765696768743D2231372E3033363337393736 - 3932393930323522202F3E0D0A2020202020203C4C61796F75744974656D2044 - 617368626F6172644974656D3D226D6170526576656E75654279436974792220 - 5765696768743D2238322E39363336323032333037303039383222202F3E0D0A - 202020203C2F4C61796F757447726F75703E0D0A20203C2F4C61796F75745472 - 65653E0D0A20203C437573746F6D50726F706572746965733E0D0A202020203C - 4465736372697074696F6E3E5B225468652064617368626F6172642064697370 - 6C61797320726576656E7565206461746120627920696E6475737472792E222C - 22546865206C69737420626F78206F6E20746865206C656674206C6973747320 - 555320696E64757374726965732C207768696C6520746865206D617020696E64 - 69636174657320726576656E75657320666F7220616C6C20696E647573747269 - 6573206261736564206F6E2067656F67726170686963616C206C6F636174696F - 6E732E20596F752063616E2073656C656374206C69737420626F782076616C75 - 657320746F207669657720726576656E756520646973747269627574696F6E20 - 666F7220737065636966696320696E64757374726965732E20546865206D6170 - 20737570706F72747320636C7573746572696E67207768696368206973207573 - 656420746F2061676772656761746520627562626C6573206261736564206F6E - 206D61702073697A65206F72207A6F6F6D206C6576656C2E225D3C2F44657363 - 72697074696F6E3E0D0A202020203C4C696E6B733E5B7B2268726566223A2268 - 747470733A2F2F646F63732E646576657870726573732E636F6D2F4461736862 - 6F6172642F3131373336372F7765622D64617368626F6172642F637265617465 - 2D64617368626F617264732D6F6E2D7468652D7765622F64617368626F617264 - 2D6974656D2D73657474696E67732F66696C7465722D656C656D656E74732F66 - 696C7465722D656C656D656E74732D6F76657276696577222C2274657874223A - 2246696C74657220456C656D656E7473227D2C7B2268726566223A2268747470 - 733A2F2F646F63732E646576657870726573732E636F6D2F44617368626F6172 - 642F3131373136372F7765622D64617368626F6172642F6372656174652D6461 - 7368626F617264732D6F6E2D7468652D7765622F64617368626F6172642D6974 - 656D2D73657474696E67732F67656F2D706F696E742D6D617073222C22746578 - 74223A2247656F20506F696E74204D617073227D2C7B2268726566223A226874 - 7470733A2F2F646F63732E646576657870726573732E636F6D2F44617368626F - 6172642F3131373339302F7765622D64617368626F6172642F6372656174652D - 64617368626F617264732D6F6E2D7468652D7765622F64617368626F6172642D - 6974656D2D73657474696E67732F67656F2D706F696E742D6D6170732F636C75 - 73746572696E67222C2274657874223A22436C7573746572696E67227D5D3C2F - 4C696E6B733E0D0A20203C2F437573746F6D50726F706572746965733E0D0A3C - 2F44617368626F6172643E0D0A011100000052006500760065006E0075006500 - 4200790049006E006400750073007400720079003C000000EFBBBF7B22497465 - 6D73223A7B226C697374426F78496E647573747279223A7B224D617374657246 - 696C74657256616C756573223A5B5D7D7D7D0D0A} + 72653D22656E2D5553222052657175657374506172616D65746572733D226661 + 6C7365223E0D0A20203C5469746C6520546578743D22526576656E7565206279 + 20496E6475737472792220416C69676E6D656E743D224C65667422202F3E0D0A + 20203C44617461536F75726365733E0D0A202020203C4A736F6E44617461536F + 75726365204E616D653D22537461746973746963732220436F6E6E656374696F + 6E4E616D653D22526576656E75654279496E647573747279436F6E6E65637469 + 6F6E2220526F6F74456C656D656E743D226D64526576656E75654279496E6475 + 737472792220436F6D706F6E656E744E616D653D226473537461746973746963 + 73223E0D0A2020202020203C536368656D613E0D0A20202020202020203C4E6F + 6465204E616D653D22726F6F74222053656C65637465643D2266616C73652220 + 4E6F6465547970653D224F626A6563742220446973636F766572794C696D6974 + 4170706C6965643D2274727565223E0D0A202020202020202020203C4E6F6465 + 204E616D653D226D64526576656E75654279496E647573747279222053656C65 + 637465643D227472756522204E6F6465547970653D224172726179223E0D0A20 + 20202020202020202020203C4E6F6465204E616D653D22436974792220547970 + 653D2253797374656D2E537472696E67222053656C65637465643D2274727565 + 22204E6F6465547970653D2250726F706572747922202F3E0D0A202020202020 + 2020202020203C4E6F6465204E616D653D22496E647573747279222054797065 + 3D2253797374656D2E537472696E67222053656C65637465643D227472756522 + 204E6F6465547970653D2250726F706572747922202F3E0D0A20202020202020 + 20202020203C4E6F6465204E616D653D224C617469747564652220547970653D + 2253797374656D2E4E756C6C61626C6560315B53797374656D2E446F75626C65 + 5D222053656C65637465643D227472756522204E6F6465547970653D2250726F + 706572747922202F3E0D0A2020202020202020202020203C4E6F6465204E616D + 653D224C6F6E6769747564652220547970653D2253797374656D2E4E756C6C61 + 626C6560315B53797374656D2E446F75626C655D222053656C65637465643D22 + 7472756522204E6F6465547970653D2250726F706572747922202F3E0D0A2020 + 202020202020202020203C4E6F6465204E616D653D2252656349642220547970 + 653D2253797374656D2E4E756C6C61626C6560315B53797374656D2E496E7436 + 345D222053656C65637465643D227472756522204E6F6465547970653D225072 + 6F706572747922202F3E0D0A2020202020202020202020203C4E6F6465204E61 + 6D653D22526576656E75652220547970653D2253797374656D2E4E756C6C6162 + 6C6560315B53797374656D2E446F75626C655D222053656C65637465643D2274 + 72756522204E6F6465547970653D2250726F706572747922202F3E0D0A202020 + 2020202020202020203C4E6F6465204E616D653D225374617465222054797065 + 3D2253797374656D2E537472696E67222053656C65637465643D227472756522 + 204E6F6465547970653D2250726F706572747922202F3E0D0A20202020202020 + 2020203C2F4E6F64653E0D0A20202020202020203C2F4E6F64653E0D0A202020 + 2020203C2F536368656D613E0D0A202020203C2F4A736F6E44617461536F7572 + 63653E0D0A20203C2F44617461536F75726365733E0D0A20203C4974656D733E + 0D0A202020203C47656F506F696E744D617020436F6D706F6E656E744E616D65 + 3D226D6170526576656E756542794369747922204E616D653D22526576656E75 + 652062792043697479222044617461536F757263653D22647353746174697374 + 6963732220536861706566696C65417265613D22555341222053686170655469 + 746C654174747269627574654E616D653D224E414D452220456E61626C65436C + 7573746572696E673D2274727565223E0D0A2020202020203C496E7465726163 + 7469766974794F7074696F6E73204D617374657246696C7465724D6F64653D22 + 4D756C7469706C6522202F3E0D0A2020202020203C446174614974656D733E0D + 0A20202020202020203C44696D656E73696F6E20446174614D656D6265723D22 + 4C61746974756465222044656661756C7449643D22446174614974656D302220 + 2F3E0D0A20202020202020203C44696D656E73696F6E20446174614D656D6265 + 723D224C6F6E676974756465222044656661756C7449643D2244617461497465 + 6D3122202F3E0D0A20202020202020203C4D65617375726520446174614D656D + 6265723D22526576656E756522204E616D653D22526576656E75652220446566 + 61756C7449643D22446174614974656D3222202F3E0D0A20202020202020203C + 44696D656E73696F6E20446174614D656D6265723D2243697479222044656661 + 756C7449643D22446174614974656D3322202F3E0D0A20202020202020203C44 + 696D656E73696F6E20446174614D656D6265723D22496E647573747279222044 + 656661756C7449643D22446174614974656D3422202F3E0D0A2020202020203C + 2F446174614974656D733E0D0A2020202020203C566965774172656120546F70 + 4C617469747564653D2234392E3336393637323036343438373235342220426F + 74746F6D4C617469747564653D2232342E353432333439333430303536323833 + 22204C6566744C6F6E6769747564653D222D3132342E37303939373737343931 + 35313533222052696768744C6F6E6769747564653D222D36362E393837303232 + 3035353938343438222043656E746572506F696E744C617469747564653D2233 + 372E393935303636343035313835353534222043656E746572506F696E744C6F + 6E6769747564653D222D39352E383438343939393032353638303122202F3E0D + 0A2020202020203C4D61704C6567656E64202F3E0D0A2020202020203C576569 + 67687465644C6567656E64202F3E0D0A2020202020203C4C6174697475646520 + 44656661756C7449643D22446174614974656D3022202F3E0D0A202020202020 + 3C4C6F6E6769747564652044656661756C7449643D22446174614974656D3122 + 202F3E0D0A2020202020203C546F6F6C74697044696D656E73696F6E733E0D0A + 20202020202020203C546F6F6C74697044696D656E73696F6E2044656661756C + 7449643D22446174614974656D3322202F3E0D0A20202020202020203C546F6F + 6C74697044696D656E73696F6E2044656661756C7449643D2244617461497465 + 6D3422202F3E0D0A2020202020203C2F546F6F6C74697044696D656E73696F6E + 733E0D0A2020202020203C56616C75652044656661756C7449643D2244617461 + 4974656D3222202F3E0D0A202020203C2F47656F506F696E744D61703E0D0A20 + 2020203C4C697374426F7820436F6D706F6E656E744E616D653D226C69737442 + 6F78496E64757374727922204E616D653D22496E647573747279222044617461 + 536F757263653D226473537461746973746963732220456E61626C6553656172 + 63683D2274727565223E0D0A2020202020203C496E7465726163746976697479 + 4F7074696F6E732049676E6F72654D617374657246696C746572733D2266616C + 736522202F3E0D0A2020202020203C446174614974656D733E0D0A2020202020 + 2020203C44696D656E73696F6E20446174614D656D6265723D22496E64757374 + 7279222044656661756C7449643D22446174614974656D3022202F3E0D0A2020 + 202020203C2F446174614974656D733E0D0A2020202020203C46696C74657244 + 696D656E73696F6E733E0D0A20202020202020203C44696D656E73696F6E2044 + 656661756C7449643D22446174614974656D3022202F3E0D0A2020202020203C + 2F46696C74657244696D656E73696F6E733E0D0A202020203C2F4C697374426F + 783E0D0A20203C2F4974656D733E0D0A20203C4C61796F7574547265653E0D0A + 202020203C4C61796F757447726F75703E0D0A2020202020203C4C61796F7574 + 4974656D2044617368626F6172644974656D3D226C697374426F78496E647573 + 74727922205765696768743D2231382E35383031363838323630343730313822 + 202F3E0D0A2020202020203C4C61796F75744974656D2044617368626F617264 + 4974656D3D226D6170526576656E756542794369747922205765696768743D22 + 38312E343139383331313733393532393922202F3E0D0A202020203C2F4C6179 + 6F757447726F75703E0D0A20203C2F4C61796F7574547265653E0D0A20203C43 + 7573746F6D50726F706572746965733E0D0A202020203C446573637269707469 + 6F6E3E5B225468652064617368626F61726420646973706C6179732072657665 + 6E7565206461746120627920696E6475737472792E222C22546865206C697374 + 20626F78206F6E20746865206C656674206C6973747320555320696E64757374 + 726965732C207768696C6520746865206D617020696E64696361746573207265 + 76656E75657320666F7220616C6C20696E647573747269657320626173656420 + 6F6E2067656F67726170686963616C206C6F636174696F6E732E20596F752063 + 616E2073656C656374206C69737420626F782076616C75657320746F20766965 + 7720726576656E756520646973747269627574696F6E20666F72207370656369 + 66696320696E64757374726965732E20546865206D617020737570706F727473 + 20636C7573746572696E67207768696368206973207573656420746F20616767 + 72656761746520627562626C6573206261736564206F6E206D61702073697A65 + 206F72207A6F6F6D206C6576656C2E225D3C2F4465736372697074696F6E3E0D + 0A202020203C4C696E6B733E5B7B2268726566223A2268747470733A2F2F646F + 63732E646576657870726573732E636F6D2F44617368626F6172642F31313733 + 36372F7765622D64617368626F6172642F6372656174652D64617368626F6172 + 64732D6F6E2D7468652D7765622F64617368626F6172642D6974656D2D736574 + 74696E67732F66696C7465722D656C656D656E74732F66696C7465722D656C65 + 6D656E74732D6F76657276696577222C2274657874223A2246696C7465722045 + 6C656D656E7473227D2C7B2268726566223A2268747470733A2F2F646F63732E + 646576657870726573732E636F6D2F44617368626F6172642F3131373136372F + 7765622D64617368626F6172642F6372656174652D64617368626F617264732D + 6F6E2D7468652D7765622F64617368626F6172642D6974656D2D73657474696E + 67732F67656F2D706F696E742D6D617073222C2274657874223A2247656F2050 + 6F696E74204D617073227D2C7B2268726566223A2268747470733A2F2F646F63 + 732E646576657870726573732E636F6D2F44617368626F6172642F3131373339 + 302F7765622D64617368626F6172642F6372656174652D64617368626F617264 + 732D6F6E2D7468652D7765622F64617368626F6172642D6974656D2D73657474 + 696E67732F67656F2D706F696E742D6D6170732F636C7573746572696E67222C + 2274657874223A22436C7573746572696E67227D5D3C2F4C696E6B733E0D0A20 + 203C2F437573746F6D50726F706572746965733E0D0A3C2F44617368626F6172 + 643E011100000052006500760065006E00750065004200790049006E00640075 + 00730074007200790067000000EFBBBF7B224974656D73223A7B226D61705265 + 76656E7565427943697479223A7B224D617374657246696C74657256616C7565 + 73223A5B5D7D2C226C697374426F78496E647573747279223A7B224D61737465 + 7246696C74657256616C756573223A5B5D7D7D7D} SortOptions = [] - Left = 504 - Top = 112 + Left = 378 + Top = 84 object mdLayoutsLayout: TBlobField FieldName = 'Layout' end @@ -159,12 +161,12 @@ object DataModule1: TDataModule1 end object dsLayouts: TDataSource DataSet = mdLayouts - Left = 264 - Top = 104 + Left = 198 + Top = 78 end object dxBackendDataConnectionManager1: TdxBackendDataConnectionManager - Left = 144 - Top = 104 + Left = 108 + Top = 78 object ReportsNWindConnectionString: TdxBackendDatabaseSQLConnection DisplayName = 'NWindConnectionString' ConnectionString = @@ -179,9 +181,10 @@ object DataModule1: TDataModule1 end end object dxSkinController1: TdxSkinController + NativeStyle = False SkinName = 'WXI' - Left = 384 - Top = 112 + Left = 288 + Top = 84 end object mdRevenueByIndustry: TdxMemData Active = True @@ -3110,8 +3113,8 @@ object DataModule1: TDataModule1 00546974757376696C6C65010600000052657461696C01020000005041013542 3F53AFD1444001ACE63922DFEB53C00100000000C05C5541} SortOptions = [] - Left = 152 - Top = 232 + Left = 114 + Top = 174 object mdRevenueByIndustryCity: TStringField FieldName = 'City' end diff --git a/Delphi/uData.pas b/Delphi/uData.pas index 5c01a26..3563974 100644 --- a/Delphi/uData.pas +++ b/Delphi/uData.pas @@ -44,7 +44,7 @@ implementation {$R *.dfm} const - DataFileName = '..\..\data.dat'; + DataFileName = 'data.dat'; procedure TDataModule1.DataModuleCreate(Sender: TObject); begin diff --git a/Delphi/uMainForm.dfm b/Delphi/uMainForm.dfm index fffe3a9..121954e 100644 --- a/Delphi/uMainForm.dfm +++ b/Delphi/uMainForm.dfm @@ -1,7 +1,7 @@ object MainForm: TMainForm Left = 0 Top = 0 - Caption = 'MainForm' + Caption = 'DevExpress VCL: Store Dashboard Layout in a Database' ClientHeight = 536 ClientWidth = 843 Color = clBtnFace @@ -20,8 +20,8 @@ object MainForm: TMainForm Align = alClient TabOrder = 0 AutoSize = True - ExplicitWidth = 833 - ExplicitHeight = 504 + ExplicitWidth = 837 + ExplicitHeight = 519 object btnDesign: TcxButton Left = 287 Top = 12 @@ -86,7 +86,6 @@ object MainForm: TMainForm Top = 184 Width = 819 Height = 340 - DashboardName = 'Test' Parameters = <> TabOrder = 4 OnLayoutChanged = dxDashboardControl1LayoutChanged diff --git a/Delphi/uMainForm.pas b/Delphi/uMainForm.pas index bb5ba64..9f55b94 100644 --- a/Delphi/uMainForm.pas +++ b/Delphi/uMainForm.pas @@ -7,19 +7,19 @@ interface Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxClasses, dxReport, cxGraphics, cxLookAndFeels, cxLookAndFeelPainters, Vcl.Menus, cxButtons, cxControls, cxStyles, cxCustomData, cxFilter, cxData, - cxDataStorage, cxEdit, cxNavigator, dxDateRanges, dxScrollbarAnnotations, + cxDataStorage, cxEdit, cxNavigator, dxScrollbarAnnotations, Data.DB, cxDBData, cxGridLevel, cxGridCustomView, cxGridCustomTableView, - cxGridTableView, cxGridDBTableView, cxGrid, FireDAC.Comp.DataSet, - FireDAC.Comp.Client, - Vcl.StdCtrls, dxmdaset, uData, - dxLayoutControlAdapters, dxLayoutContainer, dxLayoutControl, - dxBackend.Utils.WebBrowserForm, dxDashboard.Control, dxAI, - dxAI.Commands.SmartPaste, cxTextEdit, cxMaskEdit; + cxGridTableView, cxGridDBTableView, cxGrid, + Vcl.StdCtrls, dxmdaset, dxLayoutControlAdapters, dxLayoutContainer, dxLayoutControl, + dxBackend.Utils.WebBrowserForm, dxDashboard.Control, cxTextEdit, cxMaskEdit; + type TMainForm = class(TForm) dxReport1: TdxReport; + btnNewDashboard: TcxButton; btnDesign: TcxButton; + btnDelete: TcxButton; gvLayouts: TcxGridDBTableView; cxGrid2Level1: TcxGridLevel; cxGrid2: TcxGrid; @@ -28,26 +28,22 @@ TMainForm = class(TForm) gvLayoutsName: TcxGridDBColumn; dxLayoutControl1Group_Root: TdxLayoutGroup; dxLayoutControl1: TdxLayoutControl; - liBtnShowDesigner: TdxLayoutItem; - liGrid: TdxLayoutItem; dxDashboardControl1: TdxDashboardControl; - liDashboardControl: TdxLayoutItem; - btnNewDashboard: TcxButton; - liBtnNew: TdxLayoutItem; lgButtons: TdxLayoutGroup; - btnDelete: TcxButton; + liBtnNew: TdxLayoutItem; + liBtnShowDesigner: TdxLayoutItem; liBtnDelete: TdxLayoutItem; - procedure btnDesignClick(Sender: TObject); - procedure dxDashboardControl1LayoutChanged( - ASender: TdxCustomDashboardControl); - procedure dxDashboardControl1StateChanged( - ASender: TdxCustomDashboardControl); + liGrid: TdxLayoutItem; + liDashboardControl: TdxLayoutItem; procedure btnNewDashboardClick(Sender: TObject); + procedure btnDesignClick(Sender: TObject); + procedure btnDeleteClick(Sender: TObject); + procedure dxDashboardControl1LayoutChanged(ASender: TdxCustomDashboardControl); + procedure dxDashboardControl1StateChanged(ASender: TdxCustomDashboardControl); procedure gvLayoutsFocusedRecordChanged(Sender: TcxCustomGridTableView; APrevFocusedRecord, AFocusedRecord: TcxCustomGridRecord; ANewItemRecordFocusingChanged: Boolean); procedure FormCreate(Sender: TObject); - procedure btnDeleteClick(Sender: TObject); procedure gvLayoutsEditValueChanged(Sender: TcxCustomGridTableView; AItem: TcxCustomGridTableItem); procedure gvLayoutsNamePropertiesValidate(Sender: TObject; @@ -67,6 +63,8 @@ implementation {$R *.dfm} +uses uData; + procedure TMainForm.FormCreate(Sender: TObject); begin LoadLayoutAndState; @@ -82,7 +80,9 @@ procedure TMainForm.LoadLayoutAndState; dxDashboardControl1.DashboardName := DataModule1.mdLayoutsName.AsString; dxDashboardControl1.Layout.Assign(DataModule1.mdLayoutsLayout); - if not DataModule1.mdLayoutsState.IsNull then + if DataModule1.mdLayoutsState.IsNull then + dxDashboardControl1.State.Assign(nil) + else dxDashboardControl1.State.Assign(DataModule1.mdLayoutsState); end; diff --git a/Images/vcl-dashboard-layout-database-sample-app.png b/Images/vcl-dashboard-layout-database-sample-app.png deleted file mode 100644 index c6cd408..0000000 Binary files a/Images/vcl-dashboard-layout-database-sample-app.png and /dev/null differ diff --git a/README.md b/README.md index e8ec0cc..f6b2652 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,22 @@ [![](https://img.shields.io/badge/💬_Leave_Feedback-feecdd?style=flat-square)](#does-this-example-address-your-development-requirementsobjectives) -# DevExpress VCL Dashboards — Store Dashboard Layouts in a Database +# DevExpress Dashboards for Delphi/C++Builder — Store Dashboard Layouts and State in a Database -This sample app stores a [dashboard layout](https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.Layout) (XML-based template) in the BLOB field of a memory-based dataset ([TdxMemData](https://docs.devexpress.com/VCL/dxmdaset.TdxMemData) inherited from the [TDataSet](https://docwiki.embarcadero.com/Libraries/Athens/en/Data.DB.TDataSet) class shipped with the standard VCL library). +This example application stores [DevExpress dashboard layouts][TdxCustomDashboardControl.Layout] +in a database. +The sample allows users to create new layouts, modify existing layouts using the built-in +Dashboard Designer, interact with dashboards, and save state or layout changes to the data source. + +> ![DevExpress VCL Dashboards - Database Layout Storage Example](./images/vcl-dashboard-layout-database-sample-app.png) -![DevExpress VCL Dashboards - Database Layout Storage Example](/Images/vcl-dashboard-layout-database-sample-app.png) ## Prerequisites -* Microsoft Windows 10 or newer -* Embarcadero RAD Studio IDE 12.3 (Athens) or newer (Community Edition is not supported) -* DevExpress VCL Components v25.2.3 or newer +[DevExpress Dashboards Prerequisites][req] + +[req]: https://docs.devexpress.com/VCL/405773/ExpressCrossPlatformLibrary/vcl-backend/reports-dashboards-app-deployment#vcl-reportsdashboards-prerequisites + ## Test the Example @@ -26,12 +31,229 @@ This sample app stores a [dashboard layout](https://docs.devexpress.com/VCL/dxDa 5. Close the app. The [TdxMemData](https://docs.devexpress.com/VCL/dxmdaset.TdxMemData) component will store layout data between sessions. 6. Run the sample again. Click on grid records to switch between loaded dashboards. -![DevExpress VCL Dashboards - Store Dashboard Layout Definitions in a Database](/Images/vcl-dashboards-store-layout-template-database.gif) +> ![DevExpress VCL Dashboards — Store Dashboard Layout Definitions in a Database](./images/vcl-dashboards-store-layout-template-database.gif) + + +## Implementation Details + +The example uses a DevExpress memory-based dataset for dashboard layout storage: [TdxMemData]. +You can modify the application to use any other [TDataSet] descendant instead. +To review our data module implementation, see the following file: [uData.pas]/[uData.cpp]. + +The instructions assume that you start with a Delphi or C++Builder project that already includes +a configured data source for DevExpress Dashboards. +The example uses a memory-based dataset as the dashboard's data source +(see `mdRevenueByIndustry` in the data module). +To configure a dashboard data source in your project, refer to the following tutorial: +[Create a dashboard using the Designer Dialog][designer]. + +### Step 1: Create a Dataset to Store Dashboard Layout and State Data + +1. Add a [TdxMemData] component to the data module (`mdLayouts` in the example). +1. Add a [TDataSource] component to the data module (`dsLayouts` in the example). + Assign the previously created dataset component to `TDataSource.DataSet`: + + > Object Inspector panel displaying TDataSource properties. + +1. Open the context menu for the dataset component and select **Field Editor…**: + + > Context menu for the TdxMemData component displaying a 'Field Editor' option. + +1. Click **Add…** to create a BLOB field for layout data ([]): + + > New Field dialog adding a 'Layout' field of type ftBlob + +1. Click **Add…** to create a string field for layout names: + + > New Field dialog adding a 'Name' field of type ftWideString + +1. Click **Add…** to create another BLOB field for dashboard stats: + + > New Field dialog adding a 'State' field of type ftBlob + +1. (*Optional*) Preload persistent data to the dataset to make layouts available in the application upon first launch. + + This example includes a sample dashboard layout that displays revenue data from an included dataset. + You can preload the layout and revenue from [layout.dat] and [revenue.dat] respectively. + Open the context menu for the dataset component, select **Persistent Editor…**, click **Load…**, and select the file. + + > Context menu for the TdxMemData component displaying a 'Persistent Editor' option. + + Alternatively, you can use the Dashboard Designer later to import dashboard data from an XML file. + + +## Step 2: Load a Dashboard Layout Definition + +To load a layout definition to the Dashboard Control ([TdxCustomDashboardControl]), you must specify +dashboard name ([TdxCustomDashboardControl.DashboardName]), layout ([TdxCustomDashboardControl.Layout]), +and, optionally, dashboard user interaction state ([TdxCustomDashboardControl.State]): + +```pas +procedure TMainForm.LoadLayoutDefinition; +begin + // Ensure that the dataset has at least one record or a new record is being created: + if (DataModule1.mdLayouts.RecordCount = 0) and (DataModule1.mdLayouts.State <> dsInsert) then + begin + dxDashboardControl1.Clear; + Exit; + end; + // Load dashboard name and layout from the database: + dxDashboardControl1.DashboardName := DataModule1.mdLayoutsName.AsString; + dxDashboardControl1.Layout.Assign(DataModule1.mdLayoutsLayout); + // Load dashboard state if it is stored in the database: + if not DataModule1.mdLayoutsState.IsNull then + dxDashboardControl1.State.Assign(DataModule1.mdLayoutsState); +end; +``` + +To load a different dashboard in the Dashboard Control, assign a new dashboard name and layout. +The assigned dashboard replaces the current layout definition and resets the dashboard state. + +You can also clear the Dashboard Control using [TdxCustomDashboardControl.Clear]. + + +### Step 3: Display the Dashboard Designer + +Once you assigned a dashboard layout definition to the Dashboard Control, +you can display the [Dashboard Designer][designer] dialog: + +```pas +procedure TMainForm.btnDesignClick(Sender: TObject); +begin + dxDashboardControl1.ShowDesigner; // Displays the Dashboard Designer +end; +``` + +### Step 4: Store Dashboard State in a Dataset + +When a user interacts with the dashboard in the Dashboard Control or Designer, +the value of [TdxCustomDashboardControl.State] changes and an +[OnStateChanged][TdxCustomDashboardControl.OnStateChanged] event is called. +Handle this event to save dashboard state changes to the database. + +```pas +procedure TMainForm.dxDashboardControl1StateChanged( + ASender: TdxCustomDashboardControl); +begin + // Start editing the active dataset record: + DataModule1.mdLayouts.Edit; + + // Save the current dashboard state to the active record: + DataModule1.mdLayoutsState.Assign(dxDashboardControl1.State); + + // Finish editing and post the modified record to the database: + DataModule1.mdLayouts.Post; +end; +``` + +### Step 5: Store Dashboard Layouts in a Dataset + +When a user edits and saves a dashboard in the Dashboard Designer, +the value of [TdxCustomDashboardControl.Layout] changes and an +[OnLayoutChanged][TdxCustomDashboardControl.OnLayoutChanged] event is called. +Handle this event to save layout changes to the database. + +```pas +procedure TMainForm.dxDashboardControl1LayoutChanged( + ASender: TdxCustomDashboardControl); +begin + if DataModule1.mdLayoutsName.AsString <> dxDashboardControl1.DashboardName then + begin + // Create and start editing a new dataset record + DataModule1.mdLayouts.Append; + DataModule1.mdLayoutsName.AsString := dxDashboardControl1.DashboardName; + end + else + // Start editing the active dataset record + DataModule1.mdLayouts.Edit; + + // Save dashboard layout to the database: + DataModule1.mdLayoutsLayout.Assign(dxDashboardControl1.Layout); + // Finish editing and post the modified record to the database: + DataModule1.mdLayouts.Post; +end; +``` + +## Files to Review + +- [uData.pas]/[uData.cpp] stores dashboard layouts and supplies data to the dashboard. +- [uMainForm.pas]/[uMainForm.cpp] loads dashboard layouts from the data module, + and displays Dashboard Control and Dashboard Designer. +- [layout.dat] and [revenue.dat] store memory-based dataset states that you can load to reproduce this example. +- [data.dat] stores the memory-based dataset state between application sessions. + ## Documentation -* [TdxCustomDashboardControl.Layout](https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.Layout) -* [TdxBackendDataSetJSONConnection](https://docs.devexpress.com/VCL/dxBackend.ConnectionString.JSON.DataSet.TdxBackendDataSetJSONConnection) +- [Introduction to VCL Dashboards][dashboards-intro] +- [Tutorial: Create a dashboard using the Designer Dialog][designer] +- [Use JSON as a data source for dashboards (as demonstrated in the current example)][json-data-source] +- [Save dashboard layout to file on every change (code example)][save-to-file] +- API reference: + - [TdxCustomDashboardControl] (used to display a dashboard in an application form) + - [TdxCustomDashboardControl.State] (a JSON-based representation of dashboard state that can be stored in a BLOB data field) + - [TdxCustomDashboardControl.Layout] (an XML-based layout template that can be stored in a BLOB data field) + - [TdxCustomDashboardControl.DashboardName] (internal dashboard name that is not included in the layout or state) + - [TdxCustomDashboardControl.OnStateChanged] (event called when user interacts with a dashboard and changes its state) + - [TdxCustomDashboardControl.OnLayoutChanged] (event called when user edits and saves a dashboard in the Dashboard Designer) + - [TdxMemData] (DevExpress in-memory dataset implementation) + - [TDataSet] (contains generic database connection methods) + - [TdxBackendDataSetJSONConnection] (supplies data to dashboards) + + + + +[dashboards-intro]: https://docs.devexpress.com/VCL/405642/ExpressDashboards/vcl-dashboards +[designer]: https://docs.devexpress.com/VCL/405774/ExpressDashboards/getting-started/create-dashboard-using-designer-dialog +[json-data-source]: https://docs.devexpress.com/VCL/405747/ExpressCrossPlatformLibrary/vcl-backend/database-engines/vcl-backend-memory-based-data-storage +[save-to-file]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.Layout#save-dashboard-layout-to-file-on-every-change +[supported-dbms]: https://docs.devexpress.com/VCL/405703/ExpressCrossPlatformLibrary/vcl-backend/vcl-backend-supported-database-systems + + +[TdxCustomDashboardControl]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl +[TdxCustomDashboardControl.Clear]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.Clear +[TdxCustomDashboardControl.DashboardName]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.Layout +[TdxCustomDashboardControl.Layout]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.Layout +[TdxCustomDashboardControl.State]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.State +[TdxCustomDashboardControl.OnLayoutChanged]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.OnLayoutChanged +[TdxCustomDashboardControl.OnStateChanged]: https://docs.devexpress.com/VCL/dxDashboard.Control.TdxCustomDashboardControl.OnStateChanged +[TdxBackendDataSetJSONConnection]: https://docs.devexpress.com/VCL/dxBackend.ConnectionString.JSON.DataSet.TdxBackendDataSetJSONConnection +[TdxMemData]: https://docs.devexpress.com/VCL/dxmdaset.TdxMemData + + + +[TDataSet]: https://docwiki.embarcadero.com/Libraries/Athens/en/Data.DB.TDataSet +[TDataSource]: https://docwiki.embarcadero.com/Libraries/Athens/en/Data.DB.TDataSource +[ftString]: https://docwiki.embarcadero.com/Libraries/Athens/en/Data.DB.TFieldType +[ftWideString]: https://docwiki.embarcadero.com/Libraries/Athens/en/Data.DB.TFieldType +[ftBlob]: https://docwiki.embarcadero.com/Libraries/Athens/en/Data.DB.TFieldType + + + +[uData.pas]: ./Delphi/uData.pas +[uData.cpp]: ./CPB/uData.cpp +[data.dat]: ./Delphi/data.dat +[layout.dat]: ./Delphi/layout.dat +[revenue.dat]: ./Delphi/revenue.dat +[uMainForm.pas]: ./Delphi/uMainForm.pas +[uMainForm.cpp]: ./CPB/uMainForm.cpp + + +## More Examples + +- [Pass Hidden Parameters to a SQL Query][hidden-parameter-example] +- [Generate Dashboards in a Backend / Service Application][non-interactive-example] +- [Store Layouts in XML Files (DevExpress Reports for Delphi/C++Builder)][file-example] + +[hidden-parameter-example]: https://github.com/DevExpress-Examples/vcl-dashboards-pass-hidden-parameters-to-custom-sql-query +[file-example]: https://github.com/DevExpress-Examples/vcl-reports-store-layout-template-file +[non-interactive-example]: https://github.com/DevExpress-Examples/vcl-reports-store-layout-template-database ## Does This Example Address Your Development Requirements/Objectives? diff --git a/images/create-bind-data-source.png b/images/create-bind-data-source.png new file mode 100644 index 0000000..6e1837e Binary files /dev/null and b/images/create-bind-data-source.png differ diff --git a/images/create-layout-field.png b/images/create-layout-field.png new file mode 100644 index 0000000..e380e05 Binary files /dev/null and b/images/create-layout-field.png differ diff --git a/images/create-name-field.png b/images/create-name-field.png new file mode 100644 index 0000000..b025e2d Binary files /dev/null and b/images/create-name-field.png differ diff --git a/images/create-persistent-data.png b/images/create-persistent-data.png new file mode 100644 index 0000000..4e9670e Binary files /dev/null and b/images/create-persistent-data.png differ diff --git a/images/create-state-field.png b/images/create-state-field.png new file mode 100644 index 0000000..3424995 Binary files /dev/null and b/images/create-state-field.png differ diff --git a/images/open-context-menu.png b/images/open-context-menu.png new file mode 100644 index 0000000..89e03ca Binary files /dev/null and b/images/open-context-menu.png differ diff --git a/images/vcl-dashboard-layout-database-sample-app.png b/images/vcl-dashboard-layout-database-sample-app.png new file mode 100644 index 0000000..e115f90 Binary files /dev/null and b/images/vcl-dashboard-layout-database-sample-app.png differ diff --git a/Images/vcl-dashboards-store-layout-template-database.gif b/images/vcl-dashboards-store-layout-template-database.gif similarity index 100% rename from Images/vcl-dashboards-store-layout-template-database.gif rename to images/vcl-dashboards-store-layout-template-database.gif