├── .gitignore ├── FormMain.fmx ├── FormMain.pas ├── LICENSE ├── README.md ├── SkiaChart.dpr ├── SkiaChart.dproj └── View ├── SkiaChart.View.Pie.fmx └── SkiaChart.View.Pie.pas /.gitignore: -------------------------------------------------------------------------------- 1 | # Uncomment these types if you want even more clean repository. But be careful. 2 | # It can make harm to an existing project source. Read explanations below. 3 | # 4 | # Resource files are binaries containing manifest, project icon and version info. 5 | # They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files. 6 | #*.res 7 | # 8 | # Type library file (binary). In old Delphi versions it should be stored. 9 | # Since Delphi 2009 it is produced from .ridl file and can safely be ignored. 10 | #*.tlb 11 | # 12 | # Diagram Portfolio file. Used by the diagram editor up to Delphi 7. 13 | # Uncomment this if you are not using diagrams or use newer Delphi version. 14 | #*.ddp 15 | # 16 | # Visual LiveBindings file. Added in Delphi XE2. 17 | # Uncomment this if you are not using LiveBindings Designer. 18 | #*.vlb 19 | # 20 | # Deployment Manager configuration file for your project. Added in Delphi XE2. 21 | # Uncomment this if it is not mobile development and you do not use remote debug feature. 22 | #*.deployproj 23 | # 24 | # C++ object files produced when C/C++ Output file generation is configured. 25 | # Uncomment this if you are not using external objects (zlib library for example). 26 | #*.obj 27 | # 28 | 29 | # Default Delphi compiler directories 30 | # Content of this directories are generated with each Compile/Construct of a project. 31 | # Most of the time, files here have not there place in a code repository. 32 | #Win32/ 33 | #Win64/ 34 | #OSX64/ 35 | #OSXARM64/ 36 | #Android/ 37 | #Android64/ 38 | #iOSDevice64/ 39 | #Linux64/ 40 | 41 | # Delphi compiler-generated binaries (safe to delete) 42 | *.exe 43 | *.dll 44 | *.bpl 45 | *.bpi 46 | *.dcp 47 | *.so 48 | *.apk 49 | *.drc 50 | *.map 51 | *.dres 52 | *.rsm 53 | *.tds 54 | *.dcu 55 | *.lib 56 | *.a 57 | *.o 58 | *.ocx 59 | 60 | # Delphi autogenerated files (duplicated info) 61 | *.cfg 62 | *.hpp 63 | *Resource.rc 64 | 65 | # Delphi local files (user-specific info) 66 | *.local 67 | *.identcache 68 | *.projdata 69 | *.tvsconfig 70 | *.dsk 71 | 72 | # Delphi history and backups 73 | __history/ 74 | __recovery/ 75 | *.~* 76 | 77 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi) 78 | *.stat 79 | 80 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss 81 | modules/ 82 | Android/Debug/styles.xml 83 | Android/Debug/styles-v35.xml 84 | Android/Debug/styles-v31.xml 85 | Android/Debug/styles-v21.xml 86 | Android/Debug/strings.xml 87 | Android/Debug/splash_image_def.xml 88 | Android/Debug/splash_image_def-v21.xml 89 | Android/Debug/ResourcePackagePropertyList.txt 90 | Android/Debug/ResourceCompilePropertyList.txt 91 | Android/Debug/Project1/res/values/styles.xml 92 | Android/Debug/Project1/res/values/strings.xml 93 | Android/Debug/Project1/res/values/colors.xml 94 | Android/Debug/Project1/res/values-v35/styles.xml 95 | Android/Debug/Project1/res/values-v31/styles.xml 96 | Android/Debug/Project1/res/values-v21/styles.xml 97 | Android/Debug/Project1/res/values-night-v21/colors.xml 98 | Android/Debug/Project1/res/drawable/splash_vector.xml 99 | Android/Debug/Project1/res/drawable/splash_image_def.xml 100 | Android/Debug/Project1/res/drawable/ic_launcher_monochrome.xml 101 | Android/Debug/Project1/res/drawable/ic_launcher_foreground.xml 102 | Android/Debug/Project1/res/drawable/ic_launcher_background.xml 103 | Android/Debug/Project1/res/drawable-xxxhdpi/ic_notification.png 104 | Android/Debug/Project1/res/drawable-xxxhdpi/ic_launcher.png 105 | Android/Debug/Project1/res/drawable-xxhdpi/ic_notification.png 106 | Android/Debug/Project1/res/drawable-xxhdpi/ic_launcher.png 107 | Android/Debug/Project1/res/drawable-xlarge/splash_image.png 108 | Android/Debug/Project1/res/drawable-xhdpi/ic_notification.png 109 | Android/Debug/Project1/res/drawable-xhdpi/ic_launcher.png 110 | Android/Debug/Project1/res/drawable-small/splash_image.png 111 | Android/Debug/Project1/res/drawable-normal/splash_image.png 112 | Android/Debug/Project1/res/drawable-night-anydpi-v31/splash_vector.xml 113 | Android/Debug/Project1/res/drawable-night-anydpi-v21/splash_vector.xml 114 | Android/Debug/Project1/res/drawable-mdpi/ic_notification.png 115 | Android/Debug/Project1/res/drawable-mdpi/ic_launcher.png 116 | Android/Debug/Project1/res/drawable-ldpi/ic_launcher.png 117 | Android/Debug/Project1/res/drawable-large/splash_image.png 118 | Android/Debug/Project1/res/drawable-hdpi/ic_notification.png 119 | Android/Debug/Project1/res/drawable-hdpi/ic_launcher.png 120 | Android/Debug/Project1/res/drawable-anydpi-v33/ic_launcher.xml 121 | Android/Debug/Project1/res/drawable-anydpi-v31/splash_vector.xml 122 | Android/Debug/Project1/res/drawable-anydpi-v26/ic_launcher.xml 123 | Android/Debug/Project1/res/drawable-anydpi-v24/ic_notification.xml 124 | Android/Debug/Project1/res/drawable-anydpi-v21/splash_image_def.xml 125 | Android/Debug/Project1/bin/Project1.apk.idsig 126 | Android/Debug/Project1/AndroidManifest.xml 127 | Android/Debug/Project1.classes/classes2.dex 128 | Android/Debug/Project1.classes/classes.dex 129 | Android/Debug/PackagedResources.zip 130 | Android/Debug/ManifestMergePropertyList.txt 131 | Android/Debug/ManifestGenerationPropertyList.txt 132 | Android/Debug/ic_launcher.xml 133 | Android/Debug/ic_launcher-v33.xml 134 | Android/Debug/DexPropertyList.txt 135 | Android/Debug/DexList.txt 136 | Android/Debug/CompiledResourcesList.txt 137 | Android/Debug/CompiledResources/values_styles.arsc.flat 138 | Android/Debug/CompiledResources/values_strings.arsc.flat 139 | Android/Debug/CompiledResources/values_colors.arsc.flat 140 | Android/Debug/CompiledResources/values-v35_styles.arsc.flat 141 | Android/Debug/CompiledResources/values-v31_styles.arsc.flat 142 | Android/Debug/CompiledResources/values-v21_styles.arsc.flat 143 | Android/Debug/CompiledResources/values-night-v21_colors.arsc.flat 144 | Android/Debug/CompiledResources/drawable_splash_vector.xml.flat 145 | Android/Debug/CompiledResources/drawable_splash_image_def.xml.flat 146 | Android/Debug/CompiledResources/drawable_ic_launcher_monochrome.xml.flat 147 | Android/Debug/CompiledResources/drawable_ic_launcher_foreground.xml.flat 148 | Android/Debug/CompiledResources/drawable_ic_launcher_background.xml.flat 149 | Android/Debug/CompiledResources/drawable-xxxhdpi_ic_notification.png.flat 150 | Android/Debug/CompiledResources/drawable-xxxhdpi_ic_launcher.png.flat 151 | Android/Debug/CompiledResources/drawable-xxhdpi_ic_notification.png.flat 152 | Android/Debug/CompiledResources/drawable-xxhdpi_ic_launcher.png.flat 153 | Android/Debug/CompiledResources/drawable-xlarge_splash_image.png.flat 154 | Android/Debug/CompiledResources/drawable-xhdpi_ic_notification.png.flat 155 | Android/Debug/CompiledResources/drawable-xhdpi_ic_launcher.png.flat 156 | Android/Debug/CompiledResources/drawable-small_splash_image.png.flat 157 | Android/Debug/CompiledResources/drawable-normal_splash_image.png.flat 158 | Android/Debug/CompiledResources/drawable-night-anydpi-v31_splash_vector.xml.flat 159 | Android/Debug/CompiledResources/drawable-night-anydpi-v21_splash_vector.xml.flat 160 | Android/Debug/CompiledResources/drawable-mdpi_ic_notification.png.flat 161 | Android/Debug/CompiledResources/drawable-mdpi_ic_launcher.png.flat 162 | Android/Debug/CompiledResources/drawable-ldpi_ic_launcher.png.flat 163 | Android/Debug/CompiledResources/drawable-large_splash_image.png.flat 164 | Android/Debug/CompiledResources/drawable-hdpi_ic_notification.png.flat 165 | Android/Debug/CompiledResources/drawable-hdpi_ic_launcher.png.flat 166 | Android/Debug/CompiledResources/drawable-anydpi-v33_ic_launcher.xml.flat 167 | Android/Debug/CompiledResources/drawable-anydpi-v31_splash_vector.xml.flat 168 | Android/Debug/CompiledResources/drawable-anydpi-v26_ic_launcher.xml.flat 169 | Android/Debug/CompiledResources/drawable-anydpi-v24_ic_notification.xml.flat 170 | Android/Debug/CompiledResources/drawable-anydpi-v21_splash_image_def.xml.flat 171 | Android/Debug/colors.xml 172 | Android/Debug/colors-night-v21.xml 173 | Android/Debug/BuildClassesDex.stamp 174 | Android/Debug/AndroidManifest.xml 175 | Android/Debug/AndroidManifest-merged.xml 176 | Android/Debug/AndroidLibraryManifestList.txt 177 | AndroidManifest.template.xml 178 | Entitlement.TemplateiOS.xml 179 | info.plist.TemplateiOS.xml 180 | iOSDevice64/Debug/SkiaChart 181 | iOSDevice64/Debug/SkiaChart.dSYM 182 | iOSDevice64/Debug/SkiaChart.entitlements 183 | iOSDevice64/Debug/SkiaChart.info.plist 184 | iOSDevice64/Debug/SkiaChart.launchscreen/Assets/AppIcon.appiconset/Contents.json 185 | iOSDevice64/Debug/SkiaChart.launchscreen/Assets/Contents.json 186 | iOSDevice64/Debug/SkiaChart.launchscreen/Assets/LaunchScreenBackgroundColor.colorset/Contents.json 187 | iOSDevice64/Debug/SkiaChart.launchscreen/Assets/LaunchScreenImage.imageset/Contents.json 188 | iOSDevice64/Debug/SkiaChart.launchscreen/LaunchScreen.storyboard 189 | LaunchScreen.TemplateiOS/Assets/AppIcon.appiconset/Contents.json 190 | LaunchScreen.TemplateiOS/Assets/Contents.json 191 | LaunchScreen.TemplateiOS/Assets/LaunchScreenBackgroundColor.colorset/Contents.json 192 | LaunchScreen.TemplateiOS/Assets/LaunchScreenImage.imageset/Contents.json 193 | LaunchScreen.TemplateiOS/LaunchScreen.storyboard 194 | SkiaChart.deployproj 195 | SkiaChart.res 196 | -------------------------------------------------------------------------------- /FormMain.fmx: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form1' 5 | ClientHeight = 480 6 | ClientWidth = 640 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object Layout1: TLayout 12 | Align = Top 13 | Size.Width = 640.000000000000000000 14 | Size.Height = 50.000000000000000000 15 | Size.PlatformDefault = False 16 | TabOrder = 0 17 | TabStop = False 18 | object Button1: TButton 19 | Align = Center 20 | CanFocus = False 21 | TabOrder = 0 22 | TabStop = False 23 | Text = 'Re-Draw' 24 | TextSettings.Trimming = None 25 | OnClick = Button1Click 26 | end 27 | object lytChartType: TLayout 28 | Align = Left 29 | Size.Width = 177.000000000000000000 30 | Size.Height = 50.000000000000000000 31 | Size.PlatformDefault = False 32 | TabOrder = 1 33 | TabStop = False 34 | object chkPie: TCheckBox 35 | IsChecked = True 36 | Position.X = 16.000000000000000000 37 | Position.Y = 8.000000000000000000 38 | TabOrder = 1 39 | Text = 'Pie' 40 | end 41 | end 42 | object lytOptions: TLayout 43 | Align = Left 44 | Position.X = 177.000000000000000000 45 | Size.Width = 168.000000000000000000 46 | Size.Height = 50.000000000000000000 47 | Size.PlatformDefault = False 48 | TabOrder = 2 49 | TabStop = False 50 | object tbarLegendSize: TTrackBar 51 | CanParentFocus = True 52 | Max = 200.000000000000000000 53 | Min = 1.000000000000000000 54 | Orientation = Horizontal 55 | Position.X = 16.000000000000000000 56 | Position.Y = 23.000000000000000000 57 | Size.Width = 129.000000000000000000 58 | Size.Height = 19.000000000000000000 59 | Size.PlatformDefault = False 60 | TabOrder = 0 61 | Value = 100.000000000000000000 62 | OnChange = tbarLegendSizeChange 63 | end 64 | object lblLegendSize: TLabel 65 | Position.X = 16.000000000000000000 66 | Position.Y = 8.000000000000000000 67 | Text = 'Legend size:' 68 | TabOrder = 1 69 | end 70 | end 71 | end 72 | end 73 | -------------------------------------------------------------------------------- /FormMain.pas: -------------------------------------------------------------------------------- 1 | unit FormMain; 2 | 3 | interface 4 | 5 | uses 6 | System.Generics.Collections, 7 | 8 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 9 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Skia, 10 | FMX.Skia, FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.Objects, 11 | FMX.Ani; 12 | 13 | type 14 | TForm1 = class(TForm) 15 | Button1: TButton; 16 | Layout1: TLayout; 17 | chkPie: TCheckBox; 18 | tbarLegendSize: TTrackBar; 19 | lytChartType: TLayout; 20 | lytOptions: TLayout; 21 | lblLegendSize: TLabel; 22 | procedure Button1Click(Sender: TObject); 23 | procedure tbarLegendSizeChange(Sender: TObject); 24 | private 25 | FFrmChart: TFrame; 26 | { Private declarations } 27 | public 28 | { Public declarations } 29 | end; 30 | 31 | var 32 | Form1: TForm1; 33 | 34 | implementation 35 | 36 | uses 37 | SkiaChart.View.Pie; 38 | 39 | {$R *.fmx} 40 | 41 | procedure TForm1.Button1Click(Sender: TObject); 42 | begin 43 | if not Assigned(FFrmChart) then 44 | begin 45 | if chkPie.IsChecked then 46 | begin 47 | FFrmChart := TFrmSkiaChartPie.Create(Self); 48 | FFrmChart.Parent := Self; 49 | FFrmChart.Align := TAlignLayout.Client; 50 | TFrmSkiaChartPie(FFrmChart).SliceAdd(32415, 'Category 1'); 51 | TFrmSkiaChartPie(FFrmChart).SliceAdd(10000, 'Category 2'); 52 | TFrmSkiaChartPie(FFrmChart).SliceAdd(5000, 'Category 3'); 53 | TFrmSkiaChartPie(FFrmChart).SliceAdd(10661.88, 'Category 4'); 54 | TFrmSkiaChartPie(FFrmChart).SliceAdd(5000, 'Category 5'); 55 | TFrmSkiaChartPie(FFrmChart).SliceAdd(1518, 'Category 6'); 56 | TFrmSkiaChartPie(FFrmChart).SliceAdd(14206.67, 'Category 7'); 57 | end 58 | else 59 | begin 60 | // yet to come 61 | end; 62 | end; 63 | if Assigned(FFrmChart) then 64 | TFrmSkiaChartPie(FFrmChart).StartAnimation; 65 | end; 66 | 67 | procedure TForm1.tbarLegendSizeChange(Sender: TObject); 68 | begin 69 | TFrmSkiaChartPie(FFrmChart).LegendSize := tbarLegendSize.Value / 100; 70 | lblLegendSize.Text := 'Legend size: ' + tbarLegendSize.Value.ToString; 71 | end; 72 | 73 | end. 74 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Igor de Bastos 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # skia4delphi-chart 2 | Repo for skia4delphi charts implementation 3 | 4 | ## Tests on: 5 | The solution was tested with the following verions 6 | | Delphi | Platform | 7 | | ---- | ---- | 8 | | 12.3 | Win64
Android 10, 14
iOS 15.7 (SDK18.2)| 9 | 10 | # Demonstration 11 | In this GIF demonstration you will see the draw animation, enabling and disabling view, selection, etc: 12 | ![Screenrecorder-2025-05-23-16-47-29-850-ezgif com-resize](https://github.com/user-attachments/assets/fe5b228a-21d7-44fe-ae79-db7aa1e40f91) 13 | 14 | # About the author 15 | Check my other links: https://linktr.ee/igorbastosib 16 | 17 | ## Donation: 18 | Help me keep my almost great work! 19 | 20 | image 21 | -------------------------------------------------------------------------------- /SkiaChart.dpr: -------------------------------------------------------------------------------- 1 | program SkiaChart; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | FMX.Skia, 7 | FormMain in 'FormMain.pas' {Form1}, 8 | SkiaChart.View.Pie in 'View\SkiaChart.View.Pie.pas' {FrmSkiaChartPie: TFrame}; 9 | 10 | {$R *.res} 11 | 12 | begin 13 | GlobalUseSkia := True; 14 | ReportMemoryLeaksOnShutdown := True; 15 | Application.Initialize; 16 | Application.CreateForm(TForm1, Form1); 17 | Application.Run; 18 | end. 19 | -------------------------------------------------------------------------------- /SkiaChart.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {7CEE0E12-686B-447E-9CD8-D59F65EBDBC3} 4 | 20.3 5 | FMX 6 | True 7 | Debug 8 | Win64 9 | 33810 10 | Application 11 | SkiaChart.dpr 12 | SkiaChart 13 | 14 | 15 | true 16 | 17 | 18 | true 19 | Base 20 | true 21 | 22 | 23 | true 24 | Base 25 | true 26 | 27 | 28 | true 29 | Base 30 | true 31 | 32 | 33 | true 34 | Base 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | true 44 | Base 45 | true 46 | 47 | 48 | true 49 | Base 50 | true 51 | 52 | 53 | true 54 | Cfg_1 55 | true 56 | true 57 | 58 | 59 | true 60 | Cfg_1 61 | true 62 | true 63 | 64 | 65 | true 66 | Cfg_1 67 | true 68 | true 69 | 70 | 71 | true 72 | Base 73 | true 74 | 75 | 76 | true 77 | Cfg_2 78 | true 79 | true 80 | 81 | 82 | true 83 | Cfg_2 84 | true 85 | true 86 | 87 | 88 | .\$(Platform)\$(Config) 89 | .\$(Platform)\$(Config) 90 | false 91 | false 92 | false 93 | false 94 | false 95 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 96 | true 97 | true 98 | true 99 | true 100 | true 101 | true 102 | true 103 | true 104 | $(BDS)\bin\delphi_PROJECTICON.ico 105 | $(BDS)\bin\delphi_PROJECTICNS.icns 106 | SkiaChart 107 | SKIA;$(DCC_Define) 108 | 109 | 110 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 111 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=35 112 | Debug 113 | true 114 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 115 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 116 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 117 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 118 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 119 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 120 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 121 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 122 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 123 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 124 | true 125 | true 126 | $(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Monochrome.xml 127 | $(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Foreground.xml 128 | $(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Background.xml 129 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplash.xml 130 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplashDark.xml 131 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31.xml 132 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31Dark.xml 133 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 134 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 135 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 136 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 137 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 138 | false 139 | true 140 | $(BDS)\bin\Artwork\Android\FM_VectorizedNotificationIcon.xml 141 | activity-1.7.2.dex.jar;annotation-experimental-1.4.1.dex.jar;annotation-jvm-1.8.1.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-7.1.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-jvm-1.4.2.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.15.0.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.15.0.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.2.dex.jar;lifecycle-livedata-2.6.2.dex.jar;lifecycle-livedata-core-2.6.2.dex.jar;lifecycle-runtime-2.6.2.dex.jar;lifecycle-service-2.6.2.dex.jar;lifecycle-viewmodel-2.6.2.dex.jar;lifecycle-viewmodel-savedstate-2.6.2.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.5.0.dex.jar;play-services-basement-18.4.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.2.0.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.2.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar 142 | 143 | 144 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 145 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey=;minSdkVersion=23;targetSdkVersion=35 146 | Debug 147 | true 148 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 149 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 150 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 151 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 152 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 153 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 154 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 155 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 156 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 157 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 158 | true 159 | true 160 | $(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Monochrome.xml 161 | $(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Foreground.xml 162 | $(BDS)\bin\Artwork\Android\FM_AdaptiveIcon_Background.xml 163 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplash.xml 164 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplashDark.xml 165 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31.xml 166 | $(BDS)\bin\Artwork\Android\FM_VectorizedSplashV31Dark.xml 167 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 168 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 169 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 170 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 171 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 172 | false 173 | true 174 | $(BDS)\bin\Artwork\Android\FM_VectorizedNotificationIcon.xml 175 | activity-1.7.2.dex.jar;annotation-experimental-1.4.1.dex.jar;annotation-jvm-1.8.1.dex.jar;annotations-13.0.dex.jar;appcompat-1.2.0.dex.jar;appcompat-resources-1.2.0.dex.jar;billing-7.1.1.dex.jar;biometric-1.1.0.dex.jar;browser-1.4.0.dex.jar;cloud-messaging.dex.jar;collection-jvm-1.4.2.dex.jar;concurrent-futures-1.1.0.dex.jar;core-1.15.0.dex.jar;core-common-2.2.0.dex.jar;core-ktx-1.15.0.dex.jar;core-runtime-2.2.0.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;error_prone_annotations-2.9.0.dex.jar;exifinterface-1.3.6.dex.jar;firebase-annotations-16.2.0.dex.jar;firebase-common-20.3.1.dex.jar;firebase-components-17.1.0.dex.jar;firebase-datatransport-18.1.7.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-encoders-proto-16.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.1.3.dex.jar;firebase-installations-interop-17.1.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-23.1.2.dex.jar;fmx.dex.jar;fragment-1.2.5.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;kotlin-stdlib-1.8.22.dex.jar;kotlin-stdlib-common-1.8.22.dex.jar;kotlin-stdlib-jdk7-1.8.22.dex.jar;kotlin-stdlib-jdk8-1.8.22.dex.jar;kotlinx-coroutines-android-1.6.4.dex.jar;kotlinx-coroutines-core-jvm-1.6.4.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.6.2.dex.jar;lifecycle-livedata-2.6.2.dex.jar;lifecycle-livedata-core-2.6.2.dex.jar;lifecycle-runtime-2.6.2.dex.jar;lifecycle-service-2.6.2.dex.jar;lifecycle-viewmodel-2.6.2.dex.jar;lifecycle-viewmodel-savedstate-2.6.2.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;okio-jvm-3.4.0.dex.jar;play-services-ads-22.2.0.dex.jar;play-services-ads-base-22.2.0.dex.jar;play-services-ads-identifier-18.0.0.dex.jar;play-services-ads-lite-22.2.0.dex.jar;play-services-appset-16.0.1.dex.jar;play-services-base-18.5.0.dex.jar;play-services-basement-18.4.0.dex.jar;play-services-cloud-messaging-17.0.1.dex.jar;play-services-location-21.0.1.dex.jar;play-services-maps-18.1.0.dex.jar;play-services-measurement-base-20.1.2.dex.jar;play-services-measurement-sdk-api-20.1.2.dex.jar;play-services-stats-17.0.2.dex.jar;play-services-tasks-18.2.0.dex.jar;print-1.0.0.dex.jar;profileinstaller-1.3.0.dex.jar;room-common-2.2.5.dex.jar;room-runtime-2.2.5.dex.jar;savedstate-1.2.1.dex.jar;sqlite-2.1.0.dex.jar;sqlite-framework-2.1.0.dex.jar;startup-runtime-1.1.1.dex.jar;tracing-1.2.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.1.8.dex.jar;transport-runtime-3.1.8.dex.jar;user-messaging-platform-2.0.0.dex.jar;vectordrawable-1.1.0.dex.jar;vectordrawable-animated-1.1.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.7.0.dex.jar 176 | 177 | 178 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 179 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 180 | iPhoneAndiPad 181 | true 182 | Debug 183 | $(MSBuildProjectName) 184 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png 185 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 186 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 187 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png 188 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png 189 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png 190 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png 191 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 192 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png 193 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png 194 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png 195 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png 196 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png 197 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 198 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png 199 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png 200 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png 201 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 202 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 203 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png 204 | 205 | 206 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;FmxTeeUI;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;FMXTee;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 207 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 208 | iPhoneAndiPad 209 | true 210 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png 211 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 212 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 213 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png 214 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png 215 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png 216 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png 217 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 218 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png 219 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png 220 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png 221 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png 222 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png 223 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 224 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png 225 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png 226 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png 227 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 228 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 229 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png 230 | 231 | 232 | vclwinx;DataSnapServer;SyndataFMX;fmx;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;Skia.Package.RTL;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;Skia.Package.FMX;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 233 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 234 | Debug 235 | true 236 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 237 | 1033 238 | $(BDS)\bin\default_app.manifest 239 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 240 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 241 | 242 | 243 | vclwinx;DataSnapServer;SyndataFMX;fmx;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;FmxTeeUI;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;Tee;soapmidas;vclactnband;TeeUI;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;TeeDB;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;Skia.Package.VCL;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;inetstn;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;FMXTee;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 244 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 245 | Debug 246 | true 247 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 248 | 1033 249 | $(BDS)\bin\default_app.manifest 250 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 251 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 252 | 253 | 254 | DEBUG;$(DCC_Define) 255 | true 256 | false 257 | true 258 | true 259 | true 260 | true 261 | true 262 | 263 | 264 | true 265 | iPhoneAndiPad 266 | $(MSBuildProjectName) 267 | 268 | 269 | false 270 | PerMonitorV2 271 | 272 | 273 | PerMonitorV2 274 | true 275 | 1033 276 | 277 | 278 | false 279 | RELEASE;$(DCC_Define) 280 | 0 281 | 0 282 | 283 | 284 | PerMonitorV2 285 | 286 | 287 | PerMonitorV2 288 | 289 | 290 | 291 | MainSource 292 | 293 | 294 |
Form1
295 | fmx 296 |
297 | 298 |
FrmSkiaChartPie
299 | fmx 300 | TFrame 301 |
302 | 303 | Base 304 | 305 | 306 | Cfg_1 307 | Base 308 | 309 | 310 | Cfg_2 311 | Base 312 | 313 |
314 | 315 | Delphi.Personality.12 316 | Application 317 | 318 | 319 | 320 | SkiaChart.dpr 321 | 322 | 323 | Embarcadero RAD Server Edge Components 324 | Microsoft Office 2000 Sample Automation Server Wrapper Components 325 | Microsoft Office XP Sample Automation Server Wrapper Components 326 | 327 | 328 | 329 | 330 | 331 | true 332 | 333 | 334 | 335 | 336 | true 337 | 338 | 339 | 340 | 341 | true 342 | 343 | 344 | 345 | 346 | ic_launcher_background.xml 347 | true 348 | 349 | 350 | 351 | 352 | ic_launcher_foreground.xml 353 | true 354 | 355 | 356 | 357 | 358 | ic_launcher_monochrome.xml 359 | true 360 | 361 | 362 | 363 | 364 | ic_launcher.png 365 | true 366 | 367 | 368 | 369 | 370 | ic_launcher.png 371 | true 372 | 373 | 374 | 375 | 376 | ic_launcher.png 377 | true 378 | 379 | 380 | 381 | 382 | ic_launcher.png 383 | true 384 | 385 | 386 | 387 | 388 | ic_launcher.png 389 | true 390 | 391 | 392 | 393 | 394 | ic_launcher.png 395 | true 396 | 397 | 398 | 399 | 400 | ic_notification.png 401 | true 402 | 403 | 404 | 405 | 406 | ic_notification.png 407 | true 408 | 409 | 410 | 411 | 412 | ic_notification.png 413 | true 414 | 415 | 416 | 417 | 418 | ic_notification.png 419 | true 420 | 421 | 422 | 423 | 424 | ic_notification.png 425 | true 426 | 427 | 428 | 429 | 430 | splash_image.png 431 | true 432 | 433 | 434 | 435 | 436 | splash_image.png 437 | true 438 | 439 | 440 | 441 | 442 | splash_image.png 443 | true 444 | 445 | 446 | 447 | 448 | splash_image.png 449 | true 450 | 451 | 452 | 453 | 454 | ic_notification.xml 455 | true 456 | 457 | 458 | 459 | 460 | splash_vector.xml 461 | true 462 | 463 | 464 | 465 | 466 | splash_vector.xml 467 | true 468 | 469 | 470 | 471 | 472 | splash_vector.xml 473 | true 474 | 475 | 476 | 477 | 478 | splash_vector.xml 479 | true 480 | 481 | 482 | 483 | 484 | true 485 | 486 | 487 | 488 | 489 | true 490 | 491 | 492 | 493 | 494 | FM_LaunchScreenImage_iPadDark@2x.png 495 | true 496 | 497 | 498 | 499 | 500 | FM_LaunchScreenImage_iPad@2x.png 501 | true 502 | 503 | 504 | 505 | 506 | true 507 | 508 | 509 | 510 | 511 | true 512 | 513 | 514 | 515 | 516 | true 517 | 518 | 519 | 520 | 521 | true 522 | 523 | 524 | 525 | 526 | true 527 | 528 | 529 | 530 | 531 | true 532 | 533 | 534 | 535 | 536 | FM_LaunchScreenImage_iPhoneDark@2x.png 537 | true 538 | 539 | 540 | 541 | 542 | FM_LaunchScreenImage_iPhoneDark@3x.png 543 | true 544 | 545 | 546 | 547 | 548 | FM_LaunchScreenImage_iPhone@2x.png 549 | true 550 | 551 | 552 | 553 | 554 | FM_LaunchScreenImage_iPhone@3x.png 555 | true 556 | 557 | 558 | 559 | 560 | true 561 | 562 | 563 | 564 | 565 | true 566 | 567 | 568 | 569 | 570 | true 571 | 572 | 573 | 574 | 575 | true 576 | 577 | 578 | 579 | 580 | true 581 | 582 | 583 | 584 | 585 | true 586 | 587 | 588 | 589 | 590 | libProject1.so 591 | true 592 | 593 | 594 | 595 | 596 | libProject1.so 597 | true 598 | 599 | 600 | 601 | 602 | true 603 | 604 | 605 | 606 | 607 | colors.xml 608 | true 609 | 610 | 611 | 612 | 613 | true 614 | 615 | 616 | 617 | 618 | ic_launcher.xml 619 | true 620 | 621 | 622 | 623 | 624 | true 625 | 626 | 627 | 628 | 629 | libSkiaChart.so 630 | true 631 | 632 | 633 | 634 | 635 | splash_image_def.xml 636 | true 637 | 638 | 639 | 640 | 641 | true 642 | 643 | 644 | 645 | 646 | true 647 | 648 | 649 | 650 | 651 | styles.xml 652 | true 653 | 654 | 655 | 656 | 657 | styles.xml 658 | true 659 | 660 | 661 | 662 | 663 | styles.xml 664 | true 665 | 666 | 667 | 668 | 669 | true 670 | 671 | 672 | 673 | 674 | SkiaChart.exe 675 | true 676 | 677 | 678 | 679 | 680 | SkiaChart.exe 681 | true 682 | 683 | 684 | 685 | 686 | SkiaChart 687 | true 688 | 689 | 690 | 691 | 692 | true 693 | 694 | 695 | 696 | 697 | Info.plist 698 | true 699 | 700 | 701 | 702 | 703 | 64 704 | true 705 | 706 | 707 | 708 | 709 | SkiaChart 710 | true 711 | 712 | 713 | 714 | 715 | 1 716 | 717 | 718 | Contents\MacOS 719 | 1 720 | 721 | 722 | 0 723 | 724 | 725 | 726 | 727 | res\xml 728 | 1 729 | 730 | 731 | res\xml 732 | 1 733 | 734 | 735 | 736 | 737 | library\lib\armeabi 738 | 1 739 | 740 | 741 | library\lib\armeabi 742 | 1 743 | 744 | 745 | 746 | 747 | library\lib\armeabi-v7a 748 | 1 749 | 750 | 751 | 752 | 753 | library\lib\mips 754 | 1 755 | 756 | 757 | library\lib\mips 758 | 1 759 | 760 | 761 | 762 | 763 | library\lib\armeabi-v7a 764 | 1 765 | 766 | 767 | library\lib\arm64-v8a 768 | 1 769 | 770 | 771 | 772 | 773 | library\lib\armeabi-v7a 774 | 1 775 | 776 | 777 | 778 | 779 | res\drawable 780 | 1 781 | 782 | 783 | res\drawable 784 | 1 785 | 786 | 787 | 788 | 789 | res\drawable-anydpi-v21 790 | 1 791 | 792 | 793 | res\drawable-anydpi-v21 794 | 1 795 | 796 | 797 | 798 | 799 | res\values 800 | 1 801 | 802 | 803 | res\values 804 | 1 805 | 806 | 807 | 808 | 809 | res\values-v21 810 | 1 811 | 812 | 813 | res\values-v21 814 | 1 815 | 816 | 817 | 818 | 819 | res\values-v31 820 | 1 821 | 822 | 823 | res\values-v31 824 | 1 825 | 826 | 827 | 828 | 829 | res\values-v35 830 | 1 831 | 832 | 833 | res\values-v35 834 | 1 835 | 836 | 837 | 838 | 839 | res\drawable-anydpi-v26 840 | 1 841 | 842 | 843 | res\drawable-anydpi-v26 844 | 1 845 | 846 | 847 | 848 | 849 | res\drawable 850 | 1 851 | 852 | 853 | res\drawable 854 | 1 855 | 856 | 857 | 858 | 859 | res\drawable 860 | 1 861 | 862 | 863 | res\drawable 864 | 1 865 | 866 | 867 | 868 | 869 | res\drawable 870 | 1 871 | 872 | 873 | res\drawable 874 | 1 875 | 876 | 877 | 878 | 879 | res\drawable-anydpi-v33 880 | 1 881 | 882 | 883 | res\drawable-anydpi-v33 884 | 1 885 | 886 | 887 | 888 | 889 | res\values 890 | 1 891 | 892 | 893 | res\values 894 | 1 895 | 896 | 897 | 898 | 899 | res\values-night-v21 900 | 1 901 | 902 | 903 | res\values-night-v21 904 | 1 905 | 906 | 907 | 908 | 909 | res\drawable 910 | 1 911 | 912 | 913 | res\drawable 914 | 1 915 | 916 | 917 | 918 | 919 | res\drawable-xxhdpi 920 | 1 921 | 922 | 923 | res\drawable-xxhdpi 924 | 1 925 | 926 | 927 | 928 | 929 | res\drawable-xxxhdpi 930 | 1 931 | 932 | 933 | res\drawable-xxxhdpi 934 | 1 935 | 936 | 937 | 938 | 939 | res\drawable-ldpi 940 | 1 941 | 942 | 943 | res\drawable-ldpi 944 | 1 945 | 946 | 947 | 948 | 949 | res\drawable-mdpi 950 | 1 951 | 952 | 953 | res\drawable-mdpi 954 | 1 955 | 956 | 957 | 958 | 959 | res\drawable-hdpi 960 | 1 961 | 962 | 963 | res\drawable-hdpi 964 | 1 965 | 966 | 967 | 968 | 969 | res\drawable-xhdpi 970 | 1 971 | 972 | 973 | res\drawable-xhdpi 974 | 1 975 | 976 | 977 | 978 | 979 | res\drawable-mdpi 980 | 1 981 | 982 | 983 | res\drawable-mdpi 984 | 1 985 | 986 | 987 | 988 | 989 | res\drawable-hdpi 990 | 1 991 | 992 | 993 | res\drawable-hdpi 994 | 1 995 | 996 | 997 | 998 | 999 | res\drawable-xhdpi 1000 | 1 1001 | 1002 | 1003 | res\drawable-xhdpi 1004 | 1 1005 | 1006 | 1007 | 1008 | 1009 | res\drawable-xxhdpi 1010 | 1 1011 | 1012 | 1013 | res\drawable-xxhdpi 1014 | 1 1015 | 1016 | 1017 | 1018 | 1019 | res\drawable-xxxhdpi 1020 | 1 1021 | 1022 | 1023 | res\drawable-xxxhdpi 1024 | 1 1025 | 1026 | 1027 | 1028 | 1029 | res\drawable-small 1030 | 1 1031 | 1032 | 1033 | res\drawable-small 1034 | 1 1035 | 1036 | 1037 | 1038 | 1039 | res\drawable-normal 1040 | 1 1041 | 1042 | 1043 | res\drawable-normal 1044 | 1 1045 | 1046 | 1047 | 1048 | 1049 | res\drawable-large 1050 | 1 1051 | 1052 | 1053 | res\drawable-large 1054 | 1 1055 | 1056 | 1057 | 1058 | 1059 | res\drawable-xlarge 1060 | 1 1061 | 1062 | 1063 | res\drawable-xlarge 1064 | 1 1065 | 1066 | 1067 | 1068 | 1069 | res\values 1070 | 1 1071 | 1072 | 1073 | res\values 1074 | 1 1075 | 1076 | 1077 | 1078 | 1079 | res\drawable-anydpi-v24 1080 | 1 1081 | 1082 | 1083 | res\drawable-anydpi-v24 1084 | 1 1085 | 1086 | 1087 | 1088 | 1089 | res\drawable 1090 | 1 1091 | 1092 | 1093 | res\drawable 1094 | 1 1095 | 1096 | 1097 | 1098 | 1099 | res\drawable-night-anydpi-v21 1100 | 1 1101 | 1102 | 1103 | res\drawable-night-anydpi-v21 1104 | 1 1105 | 1106 | 1107 | 1108 | 1109 | res\drawable-anydpi-v31 1110 | 1 1111 | 1112 | 1113 | res\drawable-anydpi-v31 1114 | 1 1115 | 1116 | 1117 | 1118 | 1119 | res\drawable-night-anydpi-v31 1120 | 1 1121 | 1122 | 1123 | res\drawable-night-anydpi-v31 1124 | 1 1125 | 1126 | 1127 | 1128 | 1129 | 1 1130 | 1131 | 1132 | Contents\MacOS 1133 | 1 1134 | 1135 | 1136 | 0 1137 | 1138 | 1139 | 1140 | 1141 | Contents\MacOS 1142 | 1 1143 | .framework 1144 | 1145 | 1146 | Contents\MacOS 1147 | 1 1148 | .framework 1149 | 1150 | 1151 | Contents\MacOS 1152 | 1 1153 | .framework 1154 | 1155 | 1156 | 0 1157 | 1158 | 1159 | 1160 | 1161 | 1 1162 | .dylib 1163 | 1164 | 1165 | 1 1166 | .dylib 1167 | 1168 | 1169 | 1 1170 | .dylib 1171 | 1172 | 1173 | Contents\MacOS 1174 | 1 1175 | .dylib 1176 | 1177 | 1178 | Contents\MacOS 1179 | 1 1180 | .dylib 1181 | 1182 | 1183 | Contents\MacOS 1184 | 1 1185 | .dylib 1186 | 1187 | 1188 | 0 1189 | .dll;.bpl 1190 | 1191 | 1192 | 1193 | 1194 | 1 1195 | .dylib 1196 | 1197 | 1198 | 1 1199 | .dylib 1200 | 1201 | 1202 | 1 1203 | .dylib 1204 | 1205 | 1206 | Contents\MacOS 1207 | 1 1208 | .dylib 1209 | 1210 | 1211 | Contents\MacOS 1212 | 1 1213 | .dylib 1214 | 1215 | 1216 | Contents\MacOS 1217 | 1 1218 | .dylib 1219 | 1220 | 1221 | 0 1222 | .bpl 1223 | 1224 | 1225 | 1226 | 1227 | 0 1228 | 1229 | 1230 | 0 1231 | 1232 | 1233 | 0 1234 | 1235 | 1236 | 0 1237 | 1238 | 1239 | 0 1240 | 1241 | 1242 | Contents\Resources\StartUp\ 1243 | 0 1244 | 1245 | 1246 | Contents\Resources\StartUp\ 1247 | 0 1248 | 1249 | 1250 | Contents\Resources\StartUp\ 1251 | 0 1252 | 1253 | 1254 | 0 1255 | 1256 | 1257 | 1258 | 1259 | 1 1260 | 1261 | 1262 | 1 1263 | 1264 | 1265 | 1266 | 1267 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1268 | 1 1269 | 1270 | 1271 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1272 | 1 1273 | 1274 | 1275 | 1276 | 1277 | ..\ 1278 | 1 1279 | 1280 | 1281 | ..\ 1282 | 1 1283 | 1284 | 1285 | ..\ 1286 | 1 1287 | 1288 | 1289 | 1290 | 1291 | Contents 1292 | 1 1293 | 1294 | 1295 | Contents 1296 | 1 1297 | 1298 | 1299 | Contents 1300 | 1 1301 | 1302 | 1303 | 1304 | 1305 | Contents\Resources 1306 | 1 1307 | 1308 | 1309 | Contents\Resources 1310 | 1 1311 | 1312 | 1313 | Contents\Resources 1314 | 1 1315 | 1316 | 1317 | 1318 | 1319 | library\lib\armeabi-v7a 1320 | 1 1321 | 1322 | 1323 | library\lib\arm64-v8a 1324 | 1 1325 | 1326 | 1327 | 1 1328 | 1329 | 1330 | 1 1331 | 1332 | 1333 | 1 1334 | 1335 | 1336 | 1 1337 | 1338 | 1339 | Contents\MacOS 1340 | 1 1341 | 1342 | 1343 | Contents\MacOS 1344 | 1 1345 | 1346 | 1347 | Contents\MacOS 1348 | 1 1349 | 1350 | 1351 | 0 1352 | 1353 | 1354 | 1355 | 1356 | library\lib\armeabi-v7a 1357 | 1 1358 | 1359 | 1360 | 1361 | 1362 | 1 1363 | 1364 | 1365 | 1 1366 | 1367 | 1368 | 1 1369 | 1370 | 1371 | 1372 | 1373 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1374 | 1 1375 | 1376 | 1377 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1378 | 1 1379 | 1380 | 1381 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1382 | 1 1383 | 1384 | 1385 | 1386 | 1387 | ..\ 1388 | 1 1389 | 1390 | 1391 | ..\ 1392 | 1 1393 | 1394 | 1395 | ..\ 1396 | 1 1397 | 1398 | 1399 | 1400 | 1401 | 1 1402 | 1403 | 1404 | 1 1405 | 1406 | 1407 | 1 1408 | 1409 | 1410 | 1411 | 1412 | ..\$(PROJECTNAME).launchscreen 1413 | 64 1414 | 1415 | 1416 | ..\$(PROJECTNAME).launchscreen 1417 | 64 1418 | 1419 | 1420 | 1421 | 1422 | 1 1423 | 1424 | 1425 | 1 1426 | 1427 | 1428 | 1 1429 | 1430 | 1431 | 1432 | 1433 | Assets 1434 | 1 1435 | 1436 | 1437 | Assets 1438 | 1 1439 | 1440 | 1441 | 1442 | 1443 | Assets 1444 | 1 1445 | 1446 | 1447 | Assets 1448 | 1 1449 | 1450 | 1451 | 1452 | 1453 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1454 | 1 1455 | 1456 | 1457 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1458 | 1 1459 | 1460 | 1461 | 1462 | 1463 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1464 | 1 1465 | 1466 | 1467 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1468 | 1 1469 | 1470 | 1471 | 1472 | 1473 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1474 | 1 1475 | 1476 | 1477 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1478 | 1 1479 | 1480 | 1481 | 1482 | 1483 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1484 | 1 1485 | 1486 | 1487 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1488 | 1 1489 | 1490 | 1491 | 1492 | 1493 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1494 | 1 1495 | 1496 | 1497 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1498 | 1 1499 | 1500 | 1501 | 1502 | 1503 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1504 | 1 1505 | 1506 | 1507 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1508 | 1 1509 | 1510 | 1511 | 1512 | 1513 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1514 | 1 1515 | 1516 | 1517 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1518 | 1 1519 | 1520 | 1521 | 1522 | 1523 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1524 | 1 1525 | 1526 | 1527 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1528 | 1 1529 | 1530 | 1531 | 1532 | 1533 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1534 | 1 1535 | 1536 | 1537 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1538 | 1 1539 | 1540 | 1541 | 1542 | 1543 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1544 | 1 1545 | 1546 | 1547 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1548 | 1 1549 | 1550 | 1551 | 1552 | 1553 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1554 | 1 1555 | 1556 | 1557 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1558 | 1 1559 | 1560 | 1561 | 1562 | 1563 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1564 | 1 1565 | 1566 | 1567 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1568 | 1 1569 | 1570 | 1571 | 1572 | 1573 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1574 | 1 1575 | 1576 | 1577 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1578 | 1 1579 | 1580 | 1581 | 1582 | 1583 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1584 | 1 1585 | 1586 | 1587 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1588 | 1 1589 | 1590 | 1591 | 1592 | 1593 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1594 | 1 1595 | 1596 | 1597 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1598 | 1 1599 | 1600 | 1601 | 1602 | 1603 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1604 | 1 1605 | 1606 | 1607 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1608 | 1 1609 | 1610 | 1611 | 1612 | 1613 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1614 | 1 1615 | 1616 | 1617 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1618 | 1 1619 | 1620 | 1621 | 1622 | 1623 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1624 | 1 1625 | 1626 | 1627 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1628 | 1 1629 | 1630 | 1631 | 1632 | 1633 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1634 | 1 1635 | 1636 | 1637 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1638 | 1 1639 | 1640 | 1641 | 1642 | 1643 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1644 | 1 1645 | 1646 | 1647 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1648 | 1 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | 1663 | 1664 | 1665 | True 1666 | True 1667 | True 1668 | False 1669 | False 1670 | True 1671 | 1672 | 1673 | 12 1674 | 1675 | 1676 | 1677 | 1678 |
1679 | -------------------------------------------------------------------------------- /View/SkiaChart.View.Pie.fmx: -------------------------------------------------------------------------------- 1 | object FrmSkiaChartPie: TFrmSkiaChartPie 2 | Size.Width = 618.000000000000000000 3 | Size.Height = 577.000000000000000000 4 | Size.PlatformDefault = False 5 | object lytLegend: TLayout 6 | Align = Top 7 | Margins.Bottom = 10.000000000000000000 8 | Size.Width = 618.000000000000000000 9 | Size.Height = 25.000000000000000000 10 | Size.PlatformDefault = False 11 | TabOrder = 7 12 | TabStop = False 13 | OnPainting = lytLegendPainting 14 | end 15 | object skChart: TSkPaintBox 16 | Align = Client 17 | HitTest = True 18 | Size.Width = 618.000000000000000000 19 | Size.Height = 542.000000000000000000 20 | Size.PlatformDefault = False 21 | OnMouseDown = skChartMouseDown 22 | OnDraw = skChartDraw 23 | object lytSelectedSlice: TLayout 24 | Position.X = 368.000000000000000000 25 | Position.Y = 48.000000000000000000 26 | Size.Width = 105.000000000000000000 27 | Size.Height = 41.000000000000000000 28 | Size.PlatformDefault = False 29 | TabOrder = 0 30 | TabStop = False 31 | object rctSelectedSliceBackground: TRectangle 32 | OnTap = rctSelectedSliceBackgroundTap 33 | Align = Contents 34 | Fill.Color = claBlack 35 | Opacity = 0.699999988079071000 36 | Size.Width = 105.000000000000000000 37 | Size.Height = 41.000000000000000000 38 | Size.PlatformDefault = False 39 | Stroke.Kind = None 40 | XRadius = 5.000000000000000000 41 | YRadius = 5.000000000000000000 42 | OnClick = rctSelectedSliceBackgroundClick 43 | end 44 | object lytSelectedSliceBackground: TLayout 45 | Align = Contents 46 | Padding.Left = 5.000000000000000000 47 | Padding.Top = 5.000000000000000000 48 | Padding.Right = 5.000000000000000000 49 | Padding.Bottom = 5.000000000000000000 50 | Size.Width = 105.000000000000000000 51 | Size.Height = 41.000000000000000000 52 | Size.PlatformDefault = False 53 | TabOrder = 1 54 | object lblSelectedSliceText: TLabel 55 | Align = Top 56 | AutoSize = True 57 | StyledSettings = [] 58 | Position.X = 5.000000000000000000 59 | Position.Y = 5.000000000000000000 60 | Size.Width = 95.000000000000000000 61 | Size.Height = 14.000000000000000000 62 | Size.PlatformDefault = False 63 | TextSettings.Font.Family = 'Arial' 64 | TextSettings.Font.StyleExt = {00070000000000000004000000} 65 | TextSettings.FontColor = claWhite 66 | Text = 'test' 67 | TabOrder = 0 68 | TabStop = False 69 | end 70 | object lytSelectedSliceBottom: TLayout 71 | Align = Top 72 | Position.X = 5.000000000000000000 73 | Position.Y = 19.000000000000000000 74 | Size.Width = 95.000000000000000000 75 | Size.Height = 20.000000000000000000 76 | Size.PlatformDefault = False 77 | TabOrder = 1 78 | OnPainting = lytSelectedSliceBottomPainting 79 | object lblSelectedSliceValue: TLabel 80 | Align = Client 81 | StyledSettings = [] 82 | Size.Width = 76.000000000000000000 83 | Size.Height = 20.000000000000000000 84 | Size.PlatformDefault = False 85 | TextSettings.Font.Family = 'Arial' 86 | TextSettings.Font.Size = 11.000000000000000000 87 | TextSettings.FontColor = claWhite 88 | Text = 'Label1' 89 | TabOrder = 0 90 | TabStop = False 91 | end 92 | object lytSelectedSliceColor: TLayout 93 | Align = Left 94 | Margins.Right = 5.000000000000000000 95 | Size.Width = 14.000000000000000000 96 | Size.Height = 20.000000000000000000 97 | Size.PlatformDefault = False 98 | TabOrder = 1 99 | object rctSelectedSliceColor: TRectangle 100 | Align = Center 101 | Padding.Right = 5.000000000000000000 102 | Size.Width = 12.000000000000000000 103 | Size.Height = 12.000000000000000000 104 | Size.PlatformDefault = False 105 | Stroke.Color = claWhite 106 | object caniSelectedSlice: TColorAnimation 107 | Duration = 0.200000002980232200 108 | PropertyName = 'Fill.Color' 109 | StartValue = claWhite 110 | StopValue = claWhite 111 | end 112 | end 113 | end 114 | end 115 | end 116 | object tmrLabel: TTimer 117 | Enabled = False 118 | Interval = 500 119 | OnTimer = tmrLabelTimer 120 | Left = 256 121 | Top = 130 122 | end 123 | object faniSelectedSliceX: TFloatAnimation 124 | Duration = 0.200000002980232200 125 | PropertyName = 'Position.X' 126 | StartValue = 0.000000000000000000 127 | StopValue = 0.000000000000000000 128 | end 129 | object faniSelectedSliceY: TFloatAnimation 130 | Duration = 0.200000002980232200 131 | PropertyName = 'Position.Y' 132 | StartValue = 0.000000000000000000 133 | StopValue = 0.000000000000000000 134 | end 135 | end 136 | end 137 | object tmrAnimation: TTimer 138 | Enabled = False 139 | OnTimer = tmrAnimationTimer 140 | Left = 312 141 | Top = 74 142 | end 143 | end 144 | -------------------------------------------------------------------------------- /View/SkiaChart.View.Pie.pas: -------------------------------------------------------------------------------- 1 | unit SkiaChart.View.Pie; 2 | 3 | interface 4 | 5 | uses 6 | System.Generics.Collections, 7 | System.Messaging, 8 | 9 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 10 | FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, 11 | System.Skia, FMX.Ani, FMX.Controls.Presentation, FMX.Objects, FMX.Skia, 12 | FMX.Layouts; 13 | 14 | type 15 | TMessagingSliceEnabled = class(System.Messaging.TMessage) 16 | private 17 | FIndex: Integer; 18 | FEnabled: Boolean; 19 | 20 | { private declarations } 21 | protected 22 | { protected declarations } 23 | public 24 | constructor Create(AIndex: Integer; AEnabled: Boolean); overload; virtual; 25 | 26 | property &Index: Integer read FIndex write FIndex; 27 | property Enabled: Boolean read FEnabled write FEnabled; 28 | { public declarations } 29 | end; 30 | 31 | TPieSlice = record 32 | Value: Double; 33 | Color: TAlphaColor; 34 | Text: string; // Text for the legend 35 | Enabled: Boolean; 36 | 37 | constructor Create(AValue: Double; AColor: TAlphaColor; AText: string; AEnabled: Boolean = True); 38 | end; 39 | 40 | TLayoutLegend = class(TLayout) 41 | private 42 | const 43 | FRectColorWidth = 35; 44 | FRectColorHeight = 20; 45 | var 46 | FRectColor: TRectangle; 47 | FLbl: TLabel; 48 | FIndex: Integer; 49 | FLegendSize: Single; 50 | 51 | function GetColor: TAlphaColor; 52 | procedure SetColor(const Value: TAlphaColor); 53 | { Private declarations } 54 | protected 55 | procedure Painting; override; 56 | procedure Click; override; 57 | procedure MessageListener(const Sender: TObject; const M: TMessage); 58 | { Protected declarations } 59 | public 60 | constructor Create(AOwner: TComponent); override; 61 | destructor Destroy; override; 62 | 63 | property Color: TAlphaColor read GetColor write SetColor; 64 | property Text: TLabel read FLbl; 65 | property &Index: Integer read FIndex write FIndex; 66 | 67 | { Public declarations } 68 | end; 69 | 70 | TFrmSkiaChartPie = class(TFrame) 71 | lytLegend: TLayout; 72 | skChart: TSkPaintBox; 73 | lytSelectedSlice: TLayout; 74 | rctSelectedSliceBackground: TRectangle; 75 | lytSelectedSliceBackground: TLayout; 76 | lblSelectedSliceText: TLabel; 77 | lytSelectedSliceBottom: TLayout; 78 | lblSelectedSliceValue: TLabel; 79 | lytSelectedSliceColor: TLayout; 80 | rctSelectedSliceColor: TRectangle; 81 | caniSelectedSlice: TColorAnimation; 82 | tmrLabel: TTimer; 83 | faniSelectedSliceX: TFloatAnimation; 84 | faniSelectedSliceY: TFloatAnimation; 85 | tmrAnimation: TTimer; 86 | procedure tmrAnimationTimer(Sender: TObject); 87 | procedure skChartDraw(ASender: TObject; const ACanvas: ISkCanvas; const ADest: TRectF; const AOpacity: Single); 88 | procedure skChartMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); 89 | procedure rctSelectedSliceBackgroundClick(Sender: TObject); 90 | procedure rctSelectedSliceBackgroundTap(Sender: TObject; const Point: TPointF); 91 | procedure tmrLabelTimer(Sender: TObject); 92 | procedure lytSelectedSliceBottomPainting(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); 93 | procedure lytLegendPainting(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); 94 | private 95 | const 96 | CStartAngle = 270; // Start from 270 (12 hours) 97 | CAryColors: array [0 .. 10] of LongWord = ( 98 | $FF36A2EB, // 0 99 | $FFFE6383, 100 | $FFFE9F3E, 101 | $FFFFCB55, 102 | $FF4AC0C0, 103 | $FF9966FF, 104 | $FFCACACA, 105 | $FF4CAF50, 106 | $FFFFF59D, 107 | $FFE1F5FE, 108 | $FFFF4081 // Hot pink 109 | ); 110 | 111 | procedure SetLegendSize(const Value: Single); 112 | 113 | var 114 | FSlices: TArray; 115 | FAnimationAngle: Single; // Current animation angle 116 | FAnimationSpeed: Single; // Animation speed (radius per tick) 117 | FSelectedSlice: Integer; // selected slice index (-1 = none) 118 | FObjLstLegend: TObjectList; 119 | FLegendSize: Single; 120 | 121 | procedure UpdateLegend(AIndex: Integer; ACenter: TPointF; ARadius: Single; ATotal: Single); 122 | procedure OnLegendTap(Sender: TObject; const APoint: TPointF); 123 | { Private declarations } 124 | public 125 | constructor Create(AOwner: TComponent); override; 126 | destructor Destroy; override; 127 | 128 | procedure StartAnimation; 129 | 130 | /// Add a slice with default color 131 | /// 132 | procedure SliceAdd(AValue: Double; AText: string); overload; 133 | /// Add a slice with custom color 134 | /// 135 | procedure SliceAdd(AValue: Double; AColor: TAlphaColor; AText: string); overload; 136 | 137 | /// 1=100% 138 | /// 139 | property LegendSize: Single read FLegendSize write SetLegendSize; 140 | { Public declarations } 141 | end; 142 | 143 | implementation 144 | 145 | uses 146 | System.Math; 147 | 148 | {$R *.fmx} 149 | 150 | { TPieSlice } 151 | 152 | constructor TPieSlice.Create(AValue: Double; AColor: TAlphaColor; AText: string; 153 | AEnabled: Boolean); 154 | begin 155 | Value := AValue; 156 | Color := AColor; 157 | Text := AText; 158 | Enabled := AEnabled; 159 | end; 160 | 161 | { TLayoutLegend } 162 | 163 | procedure TLayoutLegend.Click; 164 | begin 165 | {$IFDEF MSWINDOWS} 166 | Tap(TPointF.Create(0, 0)); 167 | {$ELSE} 168 | inherited; 169 | {$ENDIF} 170 | end; 171 | 172 | constructor TLayoutLegend.Create(AOwner: TComponent); 173 | begin 174 | inherited; 175 | HitTest := True; 176 | Height := 25; 177 | var 178 | LLytColor := TLayout.Create(Self); 179 | LLytColor.Parent := Self; 180 | LLytColor.Align := TAlignLayout.MostLeft; 181 | LLytColor.Width := FRectColorWidth; 182 | LLytColor.TabStop := False; 183 | LLytColor.HitTest := False; 184 | LLytColor.Margins.Left := 10; 185 | 186 | FRectColor := TRectangle.Create(Self); 187 | FRectColor.Parent := LLytColor; 188 | FRectColor.Align := TAlignLayout.VertCenter; 189 | FRectColor.Stroke.Kind := TBrushKind.None; 190 | FRectColor.Height := FRectColorHeight; 191 | FRectColor.Margins.Left := 5; 192 | FRectColor.Margins.Right := 5; 193 | FRectColor.HitTest := False; 194 | 195 | FLbl := TLabel.Create(Self); 196 | FLbl.Parent := Self; 197 | FLbl.Align := TAlignLayout.Left; 198 | FLbl.AutoSize := True; 199 | FLbl.WordWrap := False; 200 | FLbl.Margins.Left := 5; 201 | FLbl.HitTest := False; 202 | FLbl.StyledSettings := FLbl.StyledSettings - [TStyledSetting.Size, TStyledSetting.Style]; 203 | 204 | TMessageManager.DefaultManager.SubscribeToMessage(TMessagingSliceEnabled, MessageListener); 205 | end; 206 | 207 | destructor TLayoutLegend.Destroy; 208 | begin 209 | TMessageManager.DefaultManager.Unsubscribe(TMessagingSliceEnabled, MessageListener); 210 | inherited; 211 | end; 212 | 213 | function TLayoutLegend.GetColor: TAlphaColor; 214 | begin 215 | Result := FRectColor.Fill.Color; 216 | end; 217 | 218 | procedure TLayoutLegend.MessageListener(const Sender: TObject; 219 | const M: TMessage); 220 | begin 221 | if (M.InheritsFrom(TMessagingSliceEnabled)) then 222 | begin 223 | var 224 | LMSE := M as TMessagingSliceEnabled; 225 | if LMSE.Index = &Index then 226 | begin 227 | if (TFontStyle.fsStrikeOut in FLbl.TextSettings.Font.Style) then 228 | FLbl.TextSettings.Font.Style := FLbl.TextSettings.Font.Style - [TFontStyle.fsStrikeOut] 229 | else 230 | FLbl.TextSettings.Font.Style := FLbl.TextSettings.Font.Style + [TFontStyle.fsStrikeOut]; 231 | end; 232 | end; 233 | end; 234 | 235 | procedure TLayoutLegend.Painting; 236 | begin 237 | inherited; 238 | TControl(FRectColor.Parent).Width := FRectColorWidth * FLegendSize; 239 | FRectColor.Height := FRectColorHeight * FLegendSize; 240 | FLbl.TextSettings.Font.Size := 12 * FLegendSize; 241 | Width := FLbl.Position.X + FLbl.Width + 10; 242 | end; 243 | 244 | procedure TLayoutLegend.SetColor(const Value: TAlphaColor); 245 | begin 246 | FRectColor.Fill.Color := Value; 247 | end; 248 | 249 | { TFrmSkiaChartPie } 250 | 251 | constructor TFrmSkiaChartPie.Create(AOwner: TComponent); 252 | begin 253 | inherited; 254 | SetLength(FSlices, 0); 255 | FLegendSize := 1; 256 | FObjLstLegend := TObjectList.Create; 257 | end; 258 | 259 | destructor TFrmSkiaChartPie.Destroy; 260 | begin 261 | if Assigned(FObjLstLegend) then 262 | begin 263 | try 264 | while FObjLstLegend.Count > 0 do 265 | FObjLstLegend.ExtractAt(0); 266 | FreeAndNil(FObjLstLegend); 267 | except 268 | 269 | end; 270 | end; 271 | inherited; 272 | end; 273 | 274 | procedure TFrmSkiaChartPie.lytLegendPainting(Sender: TObject; Canvas: TCanvas; 275 | const ARect: TRectF); 276 | begin 277 | // Legend button position 278 | lytLegend.OnPainting := nil; 279 | try 280 | var 281 | LHeightBase := (25 * (FLegendSize)); 282 | var 283 | LHeight := LHeightBase; 284 | var 285 | LPos : Single := 0; 286 | for var i := 0 to Pred(FObjLstLegend.Count) do 287 | begin 288 | var 289 | LLyt := FObjLstLegend[i]; 290 | LLyt.FLegendSize := FLegendSize; 291 | lytLegend.Height := LHeightBase; 292 | var 293 | LPosNew := LPos + LLyt.Width; 294 | if LPosNew > (lytLegend.Width - 5) then 295 | begin // Add new line 296 | LHeight := LHeight + LHeightBase; 297 | LPos := 0; 298 | end; 299 | LLyt.Position.Y := LHeight - LHeightBase; 300 | LLyt.Position.X := LPos; 301 | LPos := LLyt.Position.X + LLyt.Width; 302 | end; 303 | lytLegend.Height := LHeight + 5; 304 | finally 305 | lytLegend.OnPainting := lytLegendPainting; 306 | end; 307 | end; 308 | 309 | procedure TFrmSkiaChartPie.lytSelectedSliceBottomPainting(Sender: TObject; 310 | Canvas: TCanvas; const ARect: TRectF); 311 | begin 312 | lytSelectedSlice.Height := lytSelectedSliceBottom.Position.Y + lytSelectedSliceBottom.Height + 5; 313 | end; 314 | 315 | procedure TFrmSkiaChartPie.OnLegendTap(Sender: TObject; const APoint: TPointF); 316 | begin 317 | var 318 | LEnabledCount := 2; 319 | if FSlices[TLayoutLegend(Sender).&Index].Enabled then 320 | begin // Checks if the current lenged is the last one TRUE, can't disable last one 321 | LEnabledCount := 0; 322 | for var i := Low(FSlices) to High(FSlices) do 323 | begin 324 | if FSlices[i].Enabled then 325 | Inc(LEnabledCount); 326 | if LEnabledCount > 1 then 327 | Break; 328 | end; 329 | end; 330 | if LEnabledCount > 1 then 331 | begin 332 | FSlices[TLayoutLegend(Sender).&Index].Enabled := not FSlices[TLayoutLegend(Sender).&Index].Enabled; 333 | TMessageManager.DefaultManager.SendMessage(Sender, TMessagingSliceEnabled.Create(TLayoutLegend(Sender).&Index, FSlices[TLayoutLegend(Sender).&Index].Enabled)); 334 | skChart.Redraw; 335 | end; 336 | end; 337 | 338 | procedure TFrmSkiaChartPie.rctSelectedSliceBackgroundClick(Sender: TObject); 339 | begin 340 | {$IFDEF MSWINDOWS} 341 | if (Sender.InheritsFrom(TControl)) and (Assigned(TControl(Sender).OnTap)) then 342 | TControl(Sender).OnTap(Sender, TPointF.Create(0, 0)); 343 | {$ENDIF} 344 | end; 345 | 346 | procedure TFrmSkiaChartPie.rctSelectedSliceBackgroundTap(Sender: TObject; 347 | const Point: TPointF); 348 | begin 349 | if tmrLabel.Enabled then 350 | Exit; 351 | FSelectedSlice := -1; 352 | UpdateLegend(FSelectedSlice, TPointF.Create(0, 0), 0, 0); 353 | end; 354 | 355 | procedure TFrmSkiaChartPie.SetLegendSize(const Value: Single); 356 | begin 357 | FLegendSize := Value; 358 | end; 359 | 360 | procedure TFrmSkiaChartPie.skChartDraw(ASender: TObject; 361 | const ACanvas: ISkCanvas; const ADest: TRectF; const AOpacity: Single); 362 | var 363 | LCenter: TPointF; 364 | LRadius: Single; 365 | LStartAngle, LSweepAngle, LTotal, LCurrentAngle: Single; 366 | LSlice: TPieSlice; 367 | LPaint: ISkPaint; 368 | LPathBuilder: ISkPathBuilder; 369 | LPath: ISkPath; 370 | LRect: TRectF; 371 | LFont: ISkFont; 372 | i: Integer; 373 | begin 374 | // Center and radius of chart 375 | LCenter := TPointF.Create(ADest.Width / 2, ADest.Height / 2); 376 | LRadius := Min(ADest.Width, ADest.Height) / 2 * 0.8; // 80% of current size 377 | 378 | // Sum of enabled values 379 | LTotal := 0; 380 | for LSlice in FSlices do 381 | if LSlice.Enabled then 382 | begin 383 | LTotal := LTotal + LSlice.Value 384 | end; 385 | 386 | // Initialize 387 | LPaint := TSkPaint.Create; 388 | LPaint.AntiAlias := True; 389 | LPaint.Style := TSkPaintStyle.Fill; 390 | 391 | // Paint the slices based on the animation angle 392 | LStartAngle := CStartAngle; 393 | LCurrentAngle := 0; 394 | for i := 0 to High(FSlices) do 395 | begin 396 | if not FSlices[i].Enabled then 397 | Continue; 398 | // Check the Slice's angle 399 | LSweepAngle := (FSlices[i].Value / LTotal) * 360; 400 | 401 | // Check if paint the Slice (artially or complete) 402 | if (LCurrentAngle < FAnimationAngle) then 403 | begin 404 | var 405 | LDrawAngle := Min(LSweepAngle, FAnimationAngle - LCurrentAngle); // Angle to draw 406 | if LDrawAngle > 0 then 407 | begin 408 | // Slice color 409 | LPaint.Color := FSlices[i].Color; 410 | 411 | // draw the path 412 | LPathBuilder := TSkPathBuilder.Create; 413 | try 414 | LRect := TRectF.Create(LCenter.X - LRadius, LCenter.Y - LRadius, LCenter.X + LRadius, LCenter.Y + LRadius); 415 | LPathBuilder.MoveTo(LCenter); // Start from center 416 | if LDrawAngle >= 360 then 417 | LPathBuilder.AddCircle(LCenter.X, LCenter.Y, LRadius) 418 | else 419 | begin 420 | LPathBuilder.ArcTo(LRect, LStartAngle, LDrawAngle, False); // Add arc 421 | LPathBuilder.LineTo(LCenter); // Back to center 422 | LPathBuilder.Close; // close path 423 | end; 424 | LPath := LPathBuilder.Detach; 425 | ACanvas.DrawPath(LPath, LPaint); 426 | finally 427 | LPathBuilder := nil; 428 | end; 429 | end; 430 | end; 431 | 432 | // Update angles 433 | LStartAngle := LStartAngle + LSweepAngle; 434 | LCurrentAngle := LCurrentAngle + LSweepAngle; 435 | end; 436 | 437 | UpdateLegend(FSelectedSlice, LCenter, LRadius, LTotal); 438 | end; 439 | 440 | procedure TFrmSkiaChartPie.skChartMouseDown(Sender: TObject; 441 | Button: TMouseButton; Shift: TShiftState; X, Y: Single); 442 | var 443 | LCenter: TPointF; 444 | LRadius: Single; 445 | LTotal, LCurrentAngle, LSweepAngle: Single; 446 | LAngle: Single; 447 | LDistance: Single; 448 | LSlice: TPieSlice; 449 | i: Integer; 450 | begin 451 | // Check the center and radius 452 | LCenter := TPointF.Create(skChart.Width / 2, skChart.Height / 2); 453 | LRadius := Min(skChart.Width, skChart.Height) / 2 * 0.8; 454 | 455 | // Calculate the Clicked angle based on the center 456 | LAngle := ArcTan2(Y - LCenter.Y, X - LCenter.X) * 180 / Pi; 457 | if LAngle < 0 then 458 | LAngle := LAngle + 360; // Normalizar para 0-360 graus 459 | 460 | // Fix the angle based on stating angle 270 461 | LAngle := LAngle - 270; 462 | if LAngle < 0 then 463 | LAngle := LAngle + 360; 464 | 465 | // Check if the click is in the chart radius 466 | LDistance := Sqrt(Sqr(X - LCenter.X) + Sqr(Y - LCenter.Y)); 467 | if LDistance <= LRadius then 468 | begin 469 | // Sum of enabled values 470 | LTotal := 0; 471 | for LSlice in FSlices do 472 | if LSlice.Enabled then 473 | LTotal := LTotal + LSlice.Value; 474 | 475 | // Find the clicked slice 476 | LCurrentAngle := 0; 477 | for i := 0 to High(FSlices) do 478 | begin 479 | if not FSlices[i].Enabled then 480 | Continue; 481 | LSweepAngle := (FSlices[i].Value / LTotal) * 360; 482 | if (LAngle >= LCurrentAngle) and (LAngle < LCurrentAngle + LSweepAngle) then 483 | begin 484 | if i = FSelectedSlice then 485 | FSelectedSlice := -1 // Deselect if second click 486 | else 487 | FSelectedSlice := i; // Select the slice 488 | Break; 489 | end; 490 | LCurrentAngle := LCurrentAngle + LSweepAngle; 491 | end; 492 | UpdateLegend(FSelectedSlice, LCenter, LRadius, LTotal); 493 | skChart.Redraw; 494 | end 495 | else 496 | begin 497 | FSelectedSlice := -1; // Deselect 498 | UpdateLegend(FSelectedSlice, LCenter, LRadius, LTotal); 499 | end; 500 | end; 501 | 502 | procedure TFrmSkiaChartPie.StartAnimation; 503 | begin 504 | // Config animation 505 | FAnimationAngle := 0; 506 | FAnimationSpeed := 5; 507 | tmrAnimation.Interval := 3; 508 | FSelectedSlice := -1; 509 | lytSelectedSlice.Visible := False; 510 | tmrAnimation.Enabled := True; 511 | skChart.Redraw; 512 | end; 513 | 514 | procedure TFrmSkiaChartPie.tmrAnimationTimer(Sender: TObject); 515 | begin 516 | FAnimationAngle := FAnimationAngle + FAnimationSpeed; 517 | if FAnimationAngle >= 360 then 518 | begin 519 | tmrAnimation.Enabled := False; // Stop animation 520 | FAnimationAngle := 360; // Full circle 521 | end; 522 | FAnimationSpeed := FAnimationSpeed * 1.05; 523 | skChart.Redraw; 524 | end; 525 | 526 | procedure TFrmSkiaChartPie.tmrLabelTimer(Sender: TObject); 527 | begin 528 | tmrLabel.Enabled := False; 529 | end; 530 | 531 | procedure TFrmSkiaChartPie.UpdateLegend(AIndex: Integer; ACenter: TPointF; 532 | ARadius, ATotal: Single); 533 | var 534 | LStartAngle, LSweepAngle, LAngle: Single; 535 | LCurrentAngle: Single; 536 | LLabelPos: TPointF; 537 | i: Integer; 538 | begin 539 | if (AIndex < 0) or (not FSlices[AIndex].Enabled) then 540 | begin 541 | lytSelectedSlice.Visible := False; 542 | tmrLabel.Enabled := False; 543 | Exit; 544 | end; 545 | 546 | // Calculate the Legend position based on selected Slice 547 | LStartAngle := CStartAngle; 548 | LCurrentAngle := 0; 549 | for i := 0 to High(FSlices) do 550 | begin 551 | if not FSlices[i].Enabled then 552 | Continue; 553 | LSweepAngle := (FSlices[i].Value / ATotal) * 360; 554 | if i = AIndex then 555 | begin 556 | LAngle := DegToRad(LStartAngle + LSweepAngle / 2); 557 | LLabelPos := TPointF.Create( 558 | ACenter.X + Cos(LAngle) * ARadius * 0.7, 559 | ACenter.Y + Sin(LAngle) * ARadius * 0.7 560 | ); 561 | lblSelectedSliceText.Text := FSlices[i].Text; 562 | lblSelectedSliceValue.Text := 'R$ ' + FormatFloat('##0.,00', FSlices[i].Value); 563 | var 564 | LPosX := LLabelPos.X - lytSelectedSlice.Width / 2; // Horizontal center 565 | var 566 | LPosY := LLabelPos.Y - lytSelectedSlice.Height / 2; // Vertical center 567 | var 568 | LColor := FSlices[i].Color; 569 | tmrLabel.Enabled := False; 570 | if lytSelectedSlice.Visible then 571 | begin 572 | faniSelectedSliceX.StartValue := lytSelectedSlice.Position.X; 573 | faniSelectedSliceY.StartValue := lytSelectedSlice.Position.Y; 574 | caniSelectedSlice.StartValue := rctSelectedSliceColor.Fill.Color; 575 | faniSelectedSliceX.StopValue := LPosX; 576 | faniSelectedSliceY.StopValue := LPosY; 577 | caniSelectedSlice.StopValue := LColor; 578 | faniSelectedSliceX.Start; 579 | faniSelectedSliceY.Start; 580 | caniSelectedSlice.Start; 581 | end 582 | else 583 | begin 584 | rctSelectedSliceColor.Fill.Color := LColor; 585 | lytSelectedSlice.Position.X := LPosX; 586 | lytSelectedSlice.Position.Y := LPosY; 587 | lytSelectedSlice.Visible := True; 588 | end; 589 | tmrLabel.Enabled := True; 590 | Break; 591 | end; 592 | LStartAngle := LStartAngle + LSweepAngle; 593 | LCurrentAngle := LCurrentAngle + LSweepAngle; 594 | end; 595 | end; 596 | 597 | procedure TFrmSkiaChartPie.SliceAdd(AValue: Double; AText: string); 598 | begin 599 | var 600 | LIndex := Length(FSlices); 601 | if LIndex > Length(CAryColors) then 602 | LIndex := LIndex - Length(CAryColors); 603 | SliceAdd(AValue, CAryColors[LIndex], AText); 604 | end; 605 | 606 | procedure TFrmSkiaChartPie.SliceAdd(AValue: Double; AColor: TAlphaColor; 607 | AText: string); 608 | begin 609 | var 610 | LIndex := -1; 611 | 612 | // Find slice with same Text 613 | for var i := Low(FSlices) to High(FSlices) do 614 | begin 615 | if FSlices[i].Text = AText then 616 | begin 617 | LIndex := i; 618 | Break; 619 | end; 620 | end; 621 | if LIndex = -1 then 622 | begin 623 | LIndex := Length(FSlices); 624 | SetLength(FSlices, Succ(LIndex)); 625 | FSlices[LIndex] := TPieSlice.Create(AValue, AColor, AText); 626 | 627 | var 628 | LLyt := TLayoutLegend.Create(Self); 629 | LLyt.Parent := lytLegend; 630 | LLyt.OnTap := OnLegendTap; 631 | LLyt.Text.Text := FSlices[LIndex].Text; 632 | LLyt.Color := FSlices[LIndex].Color; 633 | LLyt.&Index := LIndex; 634 | FObjLstLegend.Add(LLyt) 635 | end 636 | else 637 | begin 638 | FSlices[LIndex].Value := AValue; 639 | FSlices[LIndex].Color := AColor; 640 | end; 641 | end; 642 | 643 | { TMessagingSliceEnabled } 644 | 645 | constructor TMessagingSliceEnabled.Create(AIndex: Integer; AEnabled: Boolean); 646 | begin 647 | FIndex := AIndex; 648 | FEnabled := AEnabled; 649 | end; 650 | 651 | end. 652 | --------------------------------------------------------------------------------