├── .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 | 
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 |
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 |
295 | fmx
296 |
297 |
298 |
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 |
--------------------------------------------------------------------------------