├── .gitattributes
├── sample
├── prints
│ ├── Bars.png
│ ├── Pie.png
│ ├── Donnut.png
│ └── Lines.png
└── char4delphi-sample
│ ├── ChartForDelphiDemo.res
│ ├── ChartForDelphiDemo.dpr
│ ├── uPrincipal.pas
│ ├── uPrincipal.fmx
│ ├── Chart4Delphi.pas
│ └── ChartForDelphiDemo.dproj
├── README.md
├── .gitignore
├── src
└── Chart4Delphi.pas
└── LICENSE
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/sample/prints/Bars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leofernandesbh/chart4delphi/HEAD/sample/prints/Bars.png
--------------------------------------------------------------------------------
/sample/prints/Pie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leofernandesbh/chart4delphi/HEAD/sample/prints/Pie.png
--------------------------------------------------------------------------------
/sample/prints/Donnut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leofernandesbh/chart4delphi/HEAD/sample/prints/Donnut.png
--------------------------------------------------------------------------------
/sample/prints/Lines.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leofernandesbh/chart4delphi/HEAD/sample/prints/Lines.png
--------------------------------------------------------------------------------
/sample/char4delphi-sample/ChartForDelphiDemo.res:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leofernandesbh/chart4delphi/HEAD/sample/char4delphi-sample/ChartForDelphiDemo.res
--------------------------------------------------------------------------------
/sample/char4delphi-sample/ChartForDelphiDemo.dpr:
--------------------------------------------------------------------------------
1 | program ChartForDelphiDemo;
2 |
3 | uses
4 | System.StartUpCopy,
5 | FMX.Forms,
6 | uPrincipal in 'uPrincipal.pas' {FrmGraph},
7 | Chart4Delphi in 'Chart4Delphi.pas';
8 |
9 | {$R *.res}
10 |
11 | begin
12 | Application.Initialize;
13 | Application.CreateForm(TFrmGraph, FrmGraph);
14 | Application.Run;
15 | end.
16 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Chart4Delphi
2 |
3 | Unit developed in Delphi 10.4 with Firemonkey to create pie, donnut, bar and line charts without the use of third-party components.
4 |
5 | Bar graph: remix from https://github.com/DelphiCreative/DashBoards
6 | Line graph: remix from https://www.youtube.com/watch?v=0-k6HT07g88&t=1
7 | Other graphics: own development.
8 |
9 | Graphics are fully customizable. The values to be displayed must be passed in JSON-Array format.
10 |
11 | ##
12 |
13 | ### Tip: For database integration I recommend using the "DataSetSerialize" module which makes it much easier to convert queries to JSON format: https://github.com/viniciussanchez/dataset-serialize
14 |
15 | ##
16 |
17 | ### Graph Samples
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/.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 | # Delphi compiler-generated binaries (safe to delete)
30 | *.exe
31 | *.dll
32 | *.bpl
33 | *.bpi
34 | *.dcp
35 | *.so
36 | *.apk
37 | *.drc
38 | *.map
39 | *.dres
40 | *.rsm
41 | *.tds
42 | *.dcu
43 | *.lib
44 | *.a
45 | *.o
46 | *.ocx
47 |
48 | # Delphi autogenerated files (duplicated info)
49 | *.cfg
50 | *.hpp
51 | *Resource.rc
52 |
53 | # Delphi local files (user-specific info)
54 | *.local
55 | *.identcache
56 | *.projdata
57 | *.tvsconfig
58 | *.dsk
59 |
60 | # Delphi history and backups
61 | __history/
62 | __recovery/
63 | *.~*
64 |
65 | # Castalia statistics file (since XE7 Castalia is distributed with Delphi)
66 | *.stat
67 |
68 | # Boss dependency manager vendor folder https://github.com/HashLoad/boss
69 | modules/
70 |
--------------------------------------------------------------------------------
/sample/char4delphi-sample/uPrincipal.pas:
--------------------------------------------------------------------------------
1 | unit uPrincipal;
2 |
3 | interface
4 |
5 | uses
6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
8 | FMX.Controls.Presentation, FMX.Edit, FMX.Layouts,
9 | System.Generics.Collections, FMX.Objects, FMX.Ani, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.ListBox;
10 |
11 | type
12 | TFrmGraph = class(TForm)
13 | btnShowGraph: TButton;
14 | lyChart: TLayout;
15 | Label1: TLabel;
16 | Memo1: TMemo;
17 | cbStyle: TComboBox;
18 | Label2: TLabel;
19 | edtDNR: TEdit;
20 | Label3: TLabel;
21 | edtTO: TEdit;
22 | Label4: TLabel;
23 | swPercent: TSwitch;
24 | Label5: TLabel;
25 | swValues: TSwitch;
26 | Label6: TLabel;
27 | swHint: TSwitch;
28 | Label7: TLabel;
29 | Label8: TLabel;
30 | swFullHint: TSwitch;
31 | Label9: TLabel;
32 | swAnimate: TSwitch;
33 | Label10: TLabel;
34 | edtFontSize: TEdit;
35 | Label11: TLabel;
36 | Label12: TLabel;
37 | swBold: TSwitch;
38 | Label13: TLabel;
39 | swBarTitle: TSwitch;
40 | Label14: TLabel;
41 | swBarLegend: TSwitch;
42 | edtBarTitle: TEdit;
43 | Label15: TLabel;
44 | Label16: TLabel;
45 | edtDuration: TEdit;
46 | procedure btnShowGraphClick(Sender: TObject);
47 | procedure cbStyleChange(Sender: TObject);
48 | private
49 | procedure ShowGraph;
50 | { Private declarations }
51 | public
52 | { Public declarations }
53 | end;
54 |
55 | var
56 | FrmGraph: TFrmGraph;
57 |
58 | implementation
59 |
60 | {$R *.fmx}
61 |
62 | uses Chart4Delphi;
63 |
64 | procedure TFrmGraph.btnShowGraphClick(Sender: TObject);
65 | begin
66 | TThread.CreateAnonymousThread(procedure
67 | begin
68 | TThread.Synchronize(nil, ShowGraph);
69 | end).Start;
70 | end;
71 |
72 | procedure TFrmGraph.ShowGraph;
73 | var
74 | errorMsg: string;
75 | pieChart: TChart4Delphi;
76 | begin
77 | pieChart := nil;
78 |
79 | case cbStyle.ItemIndex of
80 | 0: pieChart := TChart4Delphi.Create(lyChart, TChartLayoutType.ctlPie);
81 | 1: pieChart := TChart4Delphi.Create(lyChart, TChartLayoutType.ctlDonuts);
82 | 2: pieChart := TChart4Delphi.Create(lyChart, TChartLayoutType.ctlBars);
83 | 3: pieChart := TChart4Delphi.Create(lyChart, TChartLayoutType.ctlLines);
84 | end;
85 |
86 | if (swBold.IsChecked) then
87 | pieChart.TextStyle := [TFontStyle.fsBold]
88 | else
89 | pieChart.TextStyle := [];
90 |
91 | edtFontSize.Text := IntToStr(StrToIntDef(edtFontSize.Text,12));
92 | edtTO.Text := FloatToStr(StrToFloatDef(edtTO.Text,0.1));
93 | edtDuration.Text := FloatToStr(StrToFloatDef(edtDuration.Text,0.8));
94 |
95 | pieChart.TextFontSize := StrToInt(edtFontSize.Text);
96 | pieChart.TextOffset := StrToFloat(edtTO.Text);
97 | pieChart.FormatValues := '##,#0';
98 | pieChart.ShowPercent := swPercent.IsChecked;
99 | pieChart.ShowValues := swValues.IsChecked;
100 | pieChart.ShowHint := swHint.IsChecked;
101 | pieChart.FullHint := swFullHint.IsChecked;
102 | pieChart.Animate := swAnimate.IsChecked;
103 | pieChart.AnimationDuration := StrToFloat(edtDuration.Text);
104 |
105 | if (cbStyle.ItemIndex in [0,1]) then
106 | begin
107 | if (cbStyle.ItemIndex = 1) then
108 | begin
109 | pieChart.DonutsCenterRadius := StrToIntDef(edtDNR.Text,180);
110 | end;
111 |
112 | pieChart.SetColors(
113 | [
114 | TAlphaColors.Green,
115 | TAlphaColors.Yellow,
116 | TAlphaColors.Orange,
117 | TAlphaColors.Lightgreen,
118 | TAlphaColors.Red,
119 | TAlphaColors.Black
120 | ],
121 | [
122 | TAlphaColors.White,
123 | TAlphaColors.Black,
124 | TAlphaColors.White,
125 | TAlphaColors.Black,
126 | TAlphaColors.White,
127 | TAlphaColors.White
128 | ]
129 | );
130 | end
131 | else if (cbStyle.ItemIndex = 2) then
132 | begin
133 | pieChart.SetColors([TAlphaColors.Green],[TAlphaColors.Black]);
134 | pieChart.BarTitle := edtBarTitle.Text;
135 | pieChart.ShowBarTitle := swBarTitle.IsChecked;
136 | pieChart.ShowBarLegend := swBarLegend.IsChecked;
137 | end
138 | else if (cbStyle.ItemIndex = 3) then
139 | begin
140 | pieChart.SetColors([TAlphaColors.Green],[TAlphaColors.Black]);
141 | pieChart.ColorLinePoint := TAlphaColors.Black;
142 | pieChart.LineTickness := 3;
143 | pieChart.LinePointDiameter := 8;
144 | end;
145 |
146 | pieChart.DrawGraph(Memo1.Text, errorMsg);
147 |
148 | if (errorMsg <> EmptyStr) then
149 | ShowMessage(errorMsg);
150 | end;
151 |
152 | procedure TFrmGraph.cbStyleChange(Sender: TObject);
153 | begin
154 | edtBarTitle.Enabled := False;
155 | edtBarTitle.Text := EmptyStr;
156 | if (cbStyle.ItemIndex = 1) then
157 | begin
158 | edtDNR.Enabled := True;
159 | edtDNR.Text := '180';
160 | edtTO.Text := '0,17';
161 | end
162 | else
163 | begin
164 | edtDNR.Enabled := False;
165 | edtDNR.Text := EmptyStr;
166 | if (cbStyle.ItemIndex = 3) then
167 | edtTO.Text := '0,15'
168 | else
169 | begin
170 | edtBarTitle.Enabled := True;
171 | edtBarTitle.Text := 'Bar Graphic';
172 | edtTO.Text := '0,1';
173 | end;
174 | end;
175 | end;
176 |
177 | end.
178 |
--------------------------------------------------------------------------------
/sample/char4delphi-sample/uPrincipal.fmx:
--------------------------------------------------------------------------------
1 | object FrmGraph: TFrmGraph
2 | Left = 0
3 | Top = 0
4 | Caption = 'Chart4Delphi by L'#233'o Fernandes'
5 | ClientHeight = 708
6 | ClientWidth = 430
7 | Fill.Kind = Solid
8 | Position = DesktopCenter
9 | FormFactor.Width = 320
10 | FormFactor.Height = 480
11 | FormFactor.Devices = [Desktop]
12 | DesignerMasterStyle = 0
13 | object btnShowGraph: TButton
14 | Cursor = crHandPoint
15 | StyledSettings = [Family, Size, FontColor]
16 | Position.X = 19.000000000000000000
17 | Position.Y = 323.000000000000000000
18 | Size.Width = 391.000000000000000000
19 | Size.Height = 28.000000000000000000
20 | Size.PlatformDefault = False
21 | TabOrder = 12
22 | Text = 'Show Gaph'
23 | TextSettings.Font.StyleExt = {00070000000000000004000000}
24 | OnClick = btnShowGraphClick
25 | end
26 | object lyChart: TLayout
27 | Position.X = 65.000000000000000000
28 | Position.Y = 366.000000000000000000
29 | Size.Width = 300.000000000000000000
30 | Size.Height = 300.000000000000000000
31 | Size.PlatformDefault = False
32 | TabOrder = 15
33 | end
34 | object Label1: TLabel
35 | AutoSize = True
36 | Position.X = 8.000000000000000000
37 | Position.Y = 16.000000000000000000
38 | Size.Width = 120.000000000000000000
39 | Size.Height = 16.000000000000000000
40 | Size.PlatformDefault = False
41 | Text = 'Values - JSON Array'
42 | TabOrder = 30
43 | end
44 | object Memo1: TMemo
45 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
46 | DataDetectorTypes = []
47 | Lines.Strings = (
48 |
49 | '[{"field":"Jan", "value":520}, {"field":"Fev", "value":400}, {"f' +
50 | 'ield":"Mar", "value":840}, {"field":"Abr", "value":200}, {"field' +
51 | '":"Mai", "value":997}, {"field":"Jun", "value":1270}]')
52 | ShowScrollBars = False
53 | TextSettings.WordWrap = True
54 | Position.X = 8.000000000000000000
55 | Position.Y = 36.000000000000000000
56 | Size.Width = 417.000000000000000000
57 | Size.Height = 77.000000000000000000
58 | Size.PlatformDefault = False
59 | TabOrder = 31
60 | Viewport.Width = 413.000000000000000000
61 | Viewport.Height = 73.000000000000000000
62 | end
63 | object cbStyle: TComboBox
64 | Items.Strings = (
65 | 'Pizza'
66 | 'Donnuts'
67 | 'Barra'
68 | 'Linha')
69 | ItemIndex = 0
70 | Position.X = 61.000000000000000000
71 | Position.Y = 128.000000000000000000
72 | Size.Width = 360.000000000000000000
73 | Size.Height = 22.000000000000000000
74 | Size.PlatformDefault = False
75 | TabOrder = 0
76 | OnChange = cbStyleChange
77 | end
78 | object Label2: TLabel
79 | AutoSize = True
80 | Position.X = 32.000000000000000000
81 | Position.Y = 130.000000000000000000
82 | Size.Width = 30.000000000000000000
83 | Size.Height = 16.000000000000000000
84 | Size.PlatformDefault = False
85 | Text = 'Style'
86 | TabOrder = 29
87 | end
88 | object edtDNR: TEdit
89 | Touch.InteractiveGestures = [LongTap, DoubleTap]
90 | TabOrder = 5
91 | TextSettings.HorzAlign = Center
92 | Position.X = 372.000000000000000000
93 | Position.Y = 164.000000000000000000
94 | Enabled = False
95 | Size.Width = 49.000000000000000000
96 | Size.Height = 22.000000000000000000
97 | Size.PlatformDefault = False
98 | end
99 | object Label3: TLabel
100 | AutoSize = True
101 | Position.X = 247.000000000000000000
102 | Position.Y = 166.000000000000000000
103 | Size.Width = 122.000000000000000000
104 | Size.Height = 16.000000000000000000
105 | Size.PlatformDefault = False
106 | TextSettings.WordWrap = False
107 | Text = 'Donnuts Center Radius'
108 | TabOrder = 19
109 | end
110 | object edtTO: TEdit
111 | Touch.InteractiveGestures = [LongTap, DoubleTap]
112 | TabOrder = 3
113 | Text = '0,1'
114 | TextSettings.HorzAlign = Center
115 | Position.X = 185.000000000000000000
116 | Position.Y = 164.000000000000000000
117 | Size.Width = 49.000000000000000000
118 | Size.Height = 22.000000000000000000
119 | Size.PlatformDefault = False
120 | end
121 | object Label4: TLabel
122 | AutoSize = True
123 | Position.X = 124.000000000000000000
124 | Position.Y = 166.000000000000000000
125 | Size.Width = 57.000000000000000000
126 | Size.Height = 16.000000000000000000
127 | Size.PlatformDefault = False
128 | TextSettings.WordWrap = False
129 | Text = 'Text Offset'
130 | TabOrder = 18
131 | end
132 | object swPercent: TSwitch
133 | IsChecked = True
134 | Position.X = 87.000000000000000000
135 | Position.Y = 227.000000000000000000
136 | Size.Width = 57.000000000000000000
137 | Size.Height = 22.000000000000000000
138 | Size.PlatformDefault = False
139 | TabOrder = 6
140 | end
141 | object Label5: TLabel
142 | AutoSize = True
143 | Position.X = 10.000000000000000000
144 | Position.Y = 229.000000000000000000
145 | Size.Width = 72.000000000000000000
146 | Size.Height = 16.000000000000000000
147 | Size.PlatformDefault = False
148 | TextSettings.HorzAlign = Trailing
149 | TextSettings.WordWrap = False
150 | Text = 'Show Percent'
151 | TabOrder = 28
152 | end
153 | object swValues: TSwitch
154 | IsChecked = True
155 | Position.X = 246.000000000000000000
156 | Position.Y = 227.000000000000000000
157 | Size.Width = 57.000000000000000000
158 | Size.Height = 22.000000000000000000
159 | Size.PlatformDefault = False
160 | TabOrder = 7
161 | end
162 | object Label6: TLabel
163 | AutoSize = True
164 | Position.X = 176.000000000000000000
165 | Position.Y = 229.000000000000000000
166 | Size.Width = 66.000000000000000000
167 | Size.Height = 16.000000000000000000
168 | Size.PlatformDefault = False
169 | TextSettings.HorzAlign = Trailing
170 | TextSettings.WordWrap = False
171 | Text = 'Show Values'
172 | TabOrder = 27
173 | end
174 | object swHint: TSwitch
175 | IsChecked = True
176 | Position.X = 88.000000000000000000
177 | Position.Y = 256.000000000000000000
178 | Size.Width = 57.000000000000000000
179 | Size.Height = 22.000000000000000000
180 | Size.PlatformDefault = False
181 | TabOrder = 9
182 | end
183 | object Label7: TLabel
184 | AutoSize = True
185 | Position.X = 27.000000000000000000
186 | Position.Y = 258.000000000000000000
187 | Size.Width = 55.000000000000000000
188 | Size.Height = 16.000000000000000000
189 | Size.PlatformDefault = False
190 | TextSettings.HorzAlign = Trailing
191 | TextSettings.WordWrap = False
192 | Text = 'Show Hint'
193 | TabOrder = 25
194 | end
195 | object Label8: TLabel
196 | AutoSize = True
197 | Position.X = 197.000000000000000000
198 | Position.Y = 258.000000000000000000
199 | Size.Width = 45.000000000000000000
200 | Size.Height = 16.000000000000000000
201 | Size.PlatformDefault = False
202 | TextSettings.HorzAlign = Trailing
203 | TextSettings.WordWrap = False
204 | Text = 'Full Hint'
205 | TabOrder = 22
206 | end
207 | object swFullHint: TSwitch
208 | IsChecked = True
209 | Position.X = 247.000000000000000000
210 | Position.Y = 256.000000000000000000
211 | Size.Width = 57.000000000000000000
212 | Size.Height = 22.000000000000000000
213 | Size.PlatformDefault = False
214 | TabOrder = 10
215 | end
216 | object Label9: TLabel
217 | AutoSize = True
218 | Position.X = 314.000000000000000000
219 | Position.Y = 229.000000000000000000
220 | Size.Width = 45.000000000000000000
221 | Size.Height = 16.000000000000000000
222 | Size.PlatformDefault = False
223 | TextSettings.HorzAlign = Trailing
224 | TextSettings.WordWrap = False
225 | Text = 'Animate'
226 | TabOrder = 26
227 | end
228 | object swAnimate: TSwitch
229 | IsChecked = True
230 | Position.X = 363.000000000000000000
231 | Position.Y = 227.000000000000000000
232 | Size.Width = 57.000000000000000000
233 | Size.Height = 22.000000000000000000
234 | Size.PlatformDefault = False
235 | TabOrder = 8
236 | end
237 | object Label10: TLabel
238 | Align = Bottom
239 | AutoSize = True
240 | StyledSettings = [Family]
241 | Margins.Bottom = 15.000000000000000000
242 | Position.Y = 674.000000000000000000
243 | Size.Width = 430.000000000000000000
244 | Size.Height = 19.000000000000000000
245 | Size.PlatformDefault = False
246 | TextSettings.Font.Size = 14.000000000000000000
247 | TextSettings.FontColor = claCrimson
248 | TextSettings.HorzAlign = Center
249 | Text = 'To see all available parameters, see the source code.'
250 | TabOrder = 32
251 | end
252 | object edtFontSize: TEdit
253 | Touch.InteractiveGestures = [LongTap, DoubleTap]
254 | TabOrder = 1
255 | Text = '12'
256 | TextSettings.HorzAlign = Center
257 | Position.X = 61.000000000000000000
258 | Position.Y = 164.000000000000000000
259 | Size.Width = 49.000000000000000000
260 | Size.Height = 22.000000000000000000
261 | Size.PlatformDefault = False
262 | end
263 | object Label11: TLabel
264 | AutoSize = True
265 | Position.X = 9.000000000000000000
266 | Position.Y = 166.000000000000000000
267 | Size.Width = 49.000000000000000000
268 | Size.Height = 16.000000000000000000
269 | Size.PlatformDefault = False
270 | TextSettings.WordWrap = False
271 | Text = 'Font Size'
272 | TabOrder = 16
273 | end
274 | object Label12: TLabel
275 | AutoSize = True
276 | Position.X = 311.000000000000000000
277 | Position.Y = 258.000000000000000000
278 | Size.Width = 49.000000000000000000
279 | Size.Height = 16.000000000000000000
280 | Size.PlatformDefault = False
281 | TextSettings.HorzAlign = Trailing
282 | TextSettings.WordWrap = False
283 | Text = 'Text Bold'
284 | TabOrder = 21
285 | end
286 | object swBold: TSwitch
287 | IsChecked = True
288 | Position.X = 364.000000000000000000
289 | Position.Y = 256.000000000000000000
290 | Size.Width = 57.000000000000000000
291 | Size.Height = 22.000000000000000000
292 | Size.PlatformDefault = False
293 | TabOrder = 11
294 | end
295 | object Label13: TLabel
296 | AutoSize = True
297 | Position.X = 6.000000000000000000
298 | Position.Y = 286.000000000000000000
299 | Size.Width = 76.000000000000000000
300 | Size.Height = 16.000000000000000000
301 | Size.PlatformDefault = False
302 | TextSettings.HorzAlign = Trailing
303 | TextSettings.WordWrap = False
304 | Text = 'Show Bar Title'
305 | TabOrder = 24
306 | end
307 | object swBarTitle: TSwitch
308 | IsChecked = True
309 | Position.X = 88.000000000000000000
310 | Position.Y = 284.000000000000000000
311 | Size.Width = 57.000000000000000000
312 | Size.Height = 22.000000000000000000
313 | Size.PlatformDefault = False
314 | TabOrder = 13
315 | end
316 | object Label14: TLabel
317 | AutoSize = True
318 | Position.X = 151.000000000000000000
319 | Position.Y = 286.000000000000000000
320 | Size.Width = 92.000000000000000000
321 | Size.Height = 16.000000000000000000
322 | Size.PlatformDefault = False
323 | TextSettings.HorzAlign = Trailing
324 | TextSettings.WordWrap = False
325 | Text = 'Show Bar Legend'
326 | TabOrder = 20
327 | end
328 | object swBarLegend: TSwitch
329 | IsChecked = True
330 | Position.X = 247.000000000000000000
331 | Position.Y = 284.000000000000000000
332 | Size.Width = 57.000000000000000000
333 | Size.Height = 22.000000000000000000
334 | Size.PlatformDefault = False
335 | TabOrder = 14
336 | end
337 | object edtBarTitle: TEdit
338 | Touch.InteractiveGestures = [LongTap, DoubleTap]
339 | TabOrder = 4
340 | Position.X = 61.000000000000000000
341 | Position.Y = 194.000000000000000000
342 | Enabled = False
343 | Size.Width = 173.000000000000000000
344 | Size.Height = 22.000000000000000000
345 | Size.PlatformDefault = False
346 | end
347 | object Label15: TLabel
348 | AutoSize = True
349 | Position.X = 13.000000000000000000
350 | Position.Y = 195.000000000000000000
351 | Size.Width = 43.000000000000000000
352 | Size.Height = 16.000000000000000000
353 | Size.PlatformDefault = False
354 | TextSettings.HorzAlign = Trailing
355 | TextSettings.WordWrap = False
356 | Text = 'Bar Title'
357 | TabOrder = 23
358 | end
359 | object Label16: TLabel
360 | AutoSize = True
361 | Position.X = 263.000000000000000000
362 | Position.Y = 196.000000000000000000
363 | Size.Width = 105.000000000000000000
364 | Size.Height = 16.000000000000000000
365 | Size.PlatformDefault = False
366 | TextSettings.WordWrap = False
367 | Text = 'Animation Duration'
368 | TabOrder = 17
369 | end
370 | object edtDuration: TEdit
371 | Touch.InteractiveGestures = [LongTap, DoubleTap]
372 | TabOrder = 2
373 | Text = '0,8'
374 | TextSettings.HorzAlign = Center
375 | Position.X = 372.000000000000000000
376 | Position.Y = 194.000000000000000000
377 | Size.Width = 49.000000000000000000
378 | Size.Height = 22.000000000000000000
379 | Size.PlatformDefault = False
380 | end
381 | end
382 |
--------------------------------------------------------------------------------
/src/Chart4Delphi.pas:
--------------------------------------------------------------------------------
1 | unit Chart4Delphi;
2 |
3 | interface
4 |
5 | uses
6 | FMX.Layouts,
7 | FMX.Objects,
8 | FMX.Types,
9 | FMX.Controls,
10 | FMX.Styles.Objects,
11 | FMX.Graphics,
12 | FMX.Forms,
13 | FMX.Ani,
14 | System.UITypes,
15 | System.JSON,
16 | System.SysUtils,
17 | System.Types,
18 | System.Generics.Collections,
19 | System.Classes,
20 | Winapi.Windows,
21 | RegularExpressions;
22 |
23 | type
24 | {$SCOPEDENUMS ON}
25 | TChartLayoutType = (ctlPie, ctlDonuts, ctlLines, ctlBars);
26 | {$SCOPEDENUMS OFF}
27 |
28 | type
29 | TChart4Delphi = class
30 | procedure AnimationFinish(Sender: TObject);
31 | private
32 | Animation: TFloatAnimation;
33 | StyleObj : TStyleObject;
34 |
35 | FLayout : TLayout;
36 | FChartType : TChartLayoutType;
37 | FArrValues : TJSONArray;
38 | FColorsGraph : TArray;
39 | FColorsText : TArray;
40 | FTextFontSize : Integer;
41 | FTextStyle : TFontStyles;
42 | FDonutsCenterRadius: Integer;
43 | FLinePointDiameter : Integer;
44 | FLineTickness : Integer;
45 | FTextOffset : Real;
46 | FAnimationDuration : Single;
47 | FFormatValues : string;
48 | FBarTitle : string;
49 | FAnimate : Boolean;
50 | FShowHint : Boolean;
51 | FFullHint : Boolean;
52 | FHintFieldName : Boolean;
53 | FShowValues : Boolean;
54 | FShowPercent : Boolean;
55 | FShowBarTitle : Boolean;
56 | FShowBarLegend : Boolean;
57 | FColorLinePoint : TAlphaColor;
58 |
59 | procedure SetTextOffset(Value: Real);
60 | procedure SetDonutsTickness(Value: Integer);
61 | procedure SetLinePointDiameter(Value: Integer);
62 | procedure SetLineTickness(Value: Integer);
63 | function DrawCircularGraph: String;
64 | function DrawLineGraph: String;
65 | function DrawBarGraph: String;
66 | public
67 | constructor Create(Layout: TLayout; ChartType: TChartLayoutType);
68 |
69 | procedure Clear;
70 | procedure SetColors(ColorsGraph, ColorsText: Array of TAlphaColor);
71 | procedure DrawGraph(JsonString: string; var ErrorMsg: string);
72 |
73 | property ShowPercent : Boolean read FShowPercent write FShowPercent;
74 | property ShowValues : Boolean read FShowValues write FShowValues;
75 | property ShowHint : Boolean read FShowHint write FShowHint;
76 | property HintFieldName : Boolean read FHintFieldName write FHintFieldName;
77 | property ShowBarTitle : Boolean read FShowBarTitle write FShowBarTitle;
78 | property ShowBarLegend : Boolean read FShowBarLegend write FShowBarLegend;
79 | property FullHint : Boolean read FFullHint write FFullHint;
80 | property Animate : Boolean read FAnimate write FAnimate;
81 | property TextOffset : Real read FTextOffset write SetTextOffset;
82 | property AnimationDuration : Single read FAnimationDuration write FAnimationDuration;
83 | property DonutsCenterRadius: Integer read FDonutsCenterRadius write SetDonutsTickness;
84 | property TextFontSize : Integer read FTextFontSize write FTextFontSize;
85 | property LinePointDiameter : Integer read FLinePointDiameter write SetLinePointDiameter;
86 | property LineTickness : Integer read FLineTickness write SetLineTickness;
87 | property FormatValues : string read FFormatValues write FFormatValues;
88 | property BarTitle : string read FBarTitle write FBarTitle;
89 | property TextStyle : TFontStyles read FTextStyle write FTextStyle;
90 | property ColorLinePoint : TAlphaColor read FColorLinePoint write FColorLinePoint;
91 | end;
92 |
93 | implementation
94 |
95 | uses
96 | FMX.Dialogs;
97 |
98 | { TChart4Delphi }
99 |
100 | constructor TChart4Delphi.Create(Layout: TLayout; ChartType: TChartLayoutType);
101 | begin
102 | FLayout := Layout;
103 | FChartType := ChartType;
104 | ShowPercent := True;
105 | ShowValues := True;
106 | ShowHint := True;
107 | FHintFieldName := True;
108 | FShowBarTitle := True;
109 | FShowBarLegend := True;
110 | FFullHint := True;
111 | FAnimate := True;
112 | FDonutsCenterRadius := 200;
113 | FTextStyle := [TFontStyle.fsBold];
114 | FTextFontSize := 12;
115 | FFormatValues := '';
116 | FColorLinePoint := TAlphaColors.Black;
117 | FLinePointDiameter := 8;
118 | FLineTickness := 2;
119 | FAnimationDuration := 0.8;
120 | FBarTitle := 'Bar Graphic';
121 |
122 | if (ChartType in [TChartLayoutType.ctlPie, TChartLayoutType.ctlDonuts]) then
123 | FTextOffset := 0.2
124 | else
125 | FTextOffset := 0.15;
126 |
127 | FColorsGraph := TArray.Create(
128 | TAlphaColors.Green,
129 | TAlphaColors.Orange,
130 | TAlphaColors.Beige,
131 | TAlphaColors.Red,
132 | TAlphaColors.Blue,
133 | TAlphaColors.Magenta,
134 | TAlphaColors.Brown,
135 | TAlphaColors.Gold,
136 | TAlphaColors.Grey,
137 | TAlphaColors.Lightgreen,
138 | TAlphaColors.Black,
139 | TAlphaColors.Pink);
140 |
141 | FColorsText := TArray.Create(
142 | TAlphaColors.White,
143 | TAlphaColors.White,
144 | TAlphaColors.White,
145 | TAlphaColors.White,
146 | TAlphaColors.White,
147 | TAlphaColors.White,
148 | TAlphaColors.White,
149 | TAlphaColors.White,
150 | TAlphaColors.White,
151 | TAlphaColors.White,
152 | TAlphaColors.White,
153 | TAlphaColors.White);
154 | end;
155 |
156 | procedure TChart4Delphi.AnimationFinish(Sender: TObject);
157 | begin
158 | TAnimator.AnimateFloat(StyleObj, 'Opacity', 1, 0.2, TAnimationType.In, TInterpolationType.Linear);
159 | end;
160 |
161 | procedure TChart4Delphi.Clear;
162 | var
163 | fmxObj: TFmxObject;
164 | begin
165 | while FLayout.ChildrenCount > 0 do
166 | for fmxObj in FLayout.Children do
167 | begin
168 | FLayout.RemoveObject(fmxObj);
169 | fmxObj.Free;
170 | end;
171 |
172 | FLayout.Padding.Rect := TRect.Create(0,0,0,0);
173 | end;
174 |
175 | procedure TChart4Delphi.DrawGraph(JsonString: string; var ErrorMsg: string);
176 | begin
177 | ErrorMsg := EmptyStr;
178 | Clear;
179 |
180 | try
181 | FArrValues := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(jsonString), 0) as TJSONArray;
182 | except
183 | ErrorMsg := 'Invalid JSON array';
184 | Exit;
185 | end;
186 |
187 | if FArrValues = nil then
188 | begin
189 | ErrorMsg := 'Invalid JSON array';
190 | Exit;
191 | end;
192 |
193 | case FChartType of
194 | TChartLayoutType.ctlPie : ErrorMsg := DrawCircularGraph;
195 | TChartLayoutType.ctlDonuts: ErrorMsg := DrawCircularGraph;
196 | TChartLayoutType.ctlLines : ErrorMsg := DrawLineGraph;
197 | TChartLayoutType.ctlBars : ErrorMsg := DrawBarGraph;
198 | end;
199 | end;
200 |
201 | function TChart4Delphi.DrawCircularGraph: String;
202 | var
203 | PieColor, PieMask: TPie;
204 | Circle: TCircle;
205 | LayoutText: TLayout;
206 | textoGraph: TText;
207 | I, idColorG, idColorT: Integer;
208 | serieValue, jsonV, totValue: Real;
209 | startAng, endAng, midPoint: Single;
210 | Leg, txtHint: string;
211 | ArrAngs: Array of Single;
212 | begin
213 | Result := EmptyStr;
214 | try
215 | FLayout.Padding.Rect := TRect.Create(5,5,5,5);
216 |
217 | PieMask := TPie.Create(FLayout.Owner);
218 | PieMask.Parent := FLayout;
219 | PieMask.StartAngle := -90;
220 | PieMask.EndAngle := 270;
221 | PieMask.Stroke.Kind := TBrushKind.None;
222 | PieMask.Align := TAlignLayout.Contents;
223 | PieMask.Fill.Assign((FLayout.Owner as TForm).Fill);
224 | PieMask.Stroke.Color := PieMask.Fill.Color;
225 |
226 | if (FChartType = TChartLayoutType.ctlDonuts) then
227 | begin
228 | Circle := TCircle.Create(FLayout.Owner);
229 | Circle.Parent := PieMask;
230 | Circle.Size.Width := FDonutsCenterRadius;
231 | Circle.Size.Height := FDonutsCenterRadius;
232 | Circle.Align := TAlignLayout.Center;
233 | Circle.Fill.Assign((FLayout.Owner as TForm).Fill);
234 | Circle.Stroke.Kind := TBrushKind.None;
235 | end;
236 |
237 | Animation := TFloatAnimation.Create(FLayout.Owner);
238 | Animation.Parent := PieMask;
239 | Animation.Duration := FAnimationDuration;
240 | Animation.Interpolation := TInterpolationType.Quartic;
241 | Animation.PropertyName := 'StartAngle';
242 | Animation.StartValue := -90;
243 | Animation.StopValue := PieMask.EndAngle;
244 | Animation.OnFinish := AnimationFinish;
245 |
246 | StyleObj := TStyleObject.Create(FLayout.Owner);
247 | StyleObj.Parent := FLayout;
248 | StyleObj.Size.Width := 180;
249 | StyleObj.Size.Height := 180;
250 | StyleObj.Opacity := 0;
251 |
252 | FLayout.RemoveObject(PieMask);
253 | FLayout.RemoveObject(StyleObj);
254 |
255 | SetLength(ArrAngs,FArrValues.Count);
256 |
257 | totValue := 0;
258 | for I := 0 to Pred(FArrValues.Count) do
259 | totValue := totValue + FArrValues.Items[I].GetValue('value');
260 |
261 | startAng := -90;
262 | idColorG := 0;
263 | idColorT := 0;
264 | for I := 0 to Pred(FArrValues.Count) do
265 | begin
266 | jsonV := FArrValues.Items[I].GetValue('value');
267 | serieValue := (jsonV / totValue) * 360;
268 |
269 | PieColor := TPie.Create(nil);
270 | PieColor.StartAngle := startAng;
271 | PieColor.EndAngle := startAng + serieValue;
272 |
273 | midPoint := startAng + serieValue * 0.5;
274 | startAng := PieColor.EndAngle;
275 |
276 | PieColor.Fill.Color := FColorsGraph[idColorG];
277 | PieColor.Stroke.Kind := TBrushKind.None;
278 | FLayout.AddObject(PieColor);
279 | PieColor.Align := TAlignLayout.Client;
280 |
281 | Leg := EmptyStr;
282 | if (ShowPercent) then
283 | Leg := IntToStr(Round((jsonV / totValue) * 100)) + '%';
284 |
285 | if (ShowValues) then
286 | begin
287 | if (FFormatValues <> '') then
288 | if (Leg <> EmptyStr) then
289 | Leg := Leg + LineFeed + FormatFloat(FFormatValues,FArrValues.Items[I].GetValue('value'))
290 | else
291 | Leg := FormatFloat(FFormatValues,FArrValues.Items[I].GetValue('value'))
292 | else
293 | if (Leg <> EmptyStr) then
294 | Leg := Leg + LineFeed + FArrValues.Items[I].GetValue('value')
295 | else
296 | Leg := FArrValues.Items[I].GetValue('value');
297 | end;
298 |
299 | if (FShowHint) and (TOSVersion.Platform = TOSVersion.TPlatform.pfWindows) then
300 | begin
301 | if (FHintFieldName) then
302 | txtHint := FArrValues.Items[I].GetValue('field')
303 | else if not(FFullHint) then
304 | txtHint := Leg
305 | else
306 | begin
307 | if (FFormatValues <> '') then
308 | txtHint := IntToStr(Round((jsonV / totValue) * 100)) + '%' + LineFeed + FormatFloat(FFormatValues,FArrValues.Items[I].GetValue('value'))
309 | else
310 | txtHint := IntToStr(Round((jsonV / totValue) * 100)) + '%' + LineFeed + FArrValues.Items[I].GetValue('value');
311 | end;
312 | PieColor.Hint := txtHint;
313 | PieColor.ShowHint := True;
314 | end;
315 |
316 | if (idColorG < Pred(Length(FColorsGraph))) then
317 | Inc(idColorG)
318 | else
319 | idColorG := 0;
320 |
321 | if (Leg <> EmptyStr) then
322 | begin
323 | textoGraph := TText.Create(nil);
324 | textoGraph.HitTest := False;
325 | textoGraph.Locked := True;
326 |
327 | textoGraph.TextSettings.Font.Size := FTextFontSize;
328 | textoGraph.TextSettings.Font.Style := TextStyle;
329 | textoGraph.TextSettings.FontColor := FColorsText[idColorT];
330 |
331 | LayoutText := TLayout.Create(nil);
332 | LayoutText.RotationCenter.Point := TPointF.Zero;
333 | StyleObj.AddObject(LayoutText);
334 |
335 | with FLayout.LocalRect.CenterPoint do
336 | LayoutText.SetBounds(X,Y,0,0);
337 |
338 | LayoutText.RotationAngle := midPoint;
339 | textoGraph.Align := TAlignLayout.None;
340 | textoGraph.Width := 80;
341 | textoGraph.Text := Leg;
342 | LayoutText.Width := ((FLayout.LocalRect.BottomRight.Length * FTextOffset) + (textoGraph.LocalRect.BottomRight.Length * 0.5));
343 | StyleObj.AddObject(textoGraph);
344 | textoGraph.Position.Point := StyleObj.AbsoluteToLocal(LayoutText.AbsoluteRect.BottomRight) - textoGraph.LocalRect.CenterPoint;
345 |
346 | if (idColorT < Pred(Length(FColorsText))) then
347 | Inc(idColorT)
348 | else
349 | idColorT := 0;
350 | end;
351 | end;
352 |
353 | PieMask.StartAngle := -90;
354 | PieMask.EndAngle := 270;
355 | FLayout.AddObject(PieMask);
356 | FLayout.AddObject(StyleObj);
357 |
358 | if (FAnimate) then
359 | Animation.Start
360 | else
361 | PieMask.StartAngle := PieMask.EndAngle;
362 | except on Ex: Exception do
363 | Result := Ex.Message;
364 | end;
365 | end;
366 |
367 | function TChart4Delphi.DrawLineGraph: String;
368 | var
369 | I: Integer;
370 | SpacePoints: Integer;
371 | BarCount: Integer;
372 | CountComp: Integer;
373 | MaxValue: Double;
374 | Line: TLine;
375 | procedure DrawLineBetweenPoints(L: TLine; p1, p2: TPointF);
376 | begin
377 | L.LineType := TLineType.Diagonal;
378 | L.RotationCenter.X := 0.0;
379 | L.RotationCenter.Y := 0.0;
380 |
381 | if (p2.X >= p1.X) then
382 | begin
383 | if (p2.Y > p1.Y) then begin
384 | L.RotationAngle := 0;
385 | L.Position.X := p1.X;
386 | L.Width := p2.X - p1.X;
387 | L.Position.Y := p1.Y;
388 | L.Height := p2.Y - p1.Y;
389 | end
390 | else
391 | begin
392 | L.RotationAngle := -90;
393 | L.Position.X := p1.X;
394 | L.Width := p1.Y - p2.Y;
395 | L.Position.Y := p1.Y;
396 | L.Height := p2.X - p1.X;
397 | end;
398 | end
399 | else
400 | begin
401 | if (p1.Y > p2.Y) then
402 | begin
403 | L.RotationAngle := 0;
404 | L.Position.X := p2.X;
405 | L.Width := p1.X - p2.X;
406 | L.Position.Y := p2.Y;
407 | L.Height := p1.Y - p2.Y;
408 | end
409 | else
410 | begin
411 | L.RotationAngle := -90;
412 | L.Position.X := p2.X;
413 | L.Width := p2.Y - p1.Y;
414 | L.Position.Y := p2.Y;
415 | L.Height := p1.X - p2.X;
416 | end;
417 | end;
418 |
419 | if (L.Height < 0.01) then
420 | L.Height := 0.1;
421 | if (L.Width < 0.01) then
422 | L.Width := 0.1;
423 | end;
424 | procedure AddLine(vlFrom, vlTo: Double);
425 | var
426 | ptFrom, ptTo: TPointF;
427 | begin
428 | ptFrom.Y := (1 - (vlFrom / MaxValue)) * FLayout.Height;
429 | ptFrom.X := CountComp * SpacePoints;
430 |
431 | ptTo.Y := (1 - (vlTo / MaxValue)) * FLayout.Height;
432 | ptTo.X := (CountComp + 1) * SpacePoints;
433 |
434 | Line := TLine.Create(FLayout);
435 | Line.Parent := FLayout;
436 | Line.Stroke.Kind := TBrushKind.Solid;
437 | Line.Stroke.Color := FColorsGraph[0];
438 | Line.Stroke.Thickness := FLineTickness;
439 |
440 | if (FAnimate) then
441 | begin
442 | Line.Opacity := 0;
443 | TAnimator.AnimateFloatDelay(Line, 'Opacity', 1, 0.2, (CountComp * 0.1) + FAnimationDuration,
444 | TAnimationType.InOut, TInterpolationType.Circular);
445 | end;
446 |
447 | DrawLineBetweenPoints(Line, ptFrom, ptTo);
448 | Inc(CountComp);
449 | end;
450 | procedure AddLinePoint(vl: double; field: string);
451 | var
452 | porc : Double;
453 | Leg : string;
454 | LineCircle: TCircle;
455 | textoGraph: TText;
456 | begin
457 | porc := (1 - (vl / MaxValue)) * FLayout.Height;
458 |
459 | LineCircle := TCircle.Create(FLayout);
460 | LineCircle.Parent := FLayout;
461 | LineCircle.Stroke.Kind := TBrushKind.None;
462 | LineCircle.Fill.Kind := TBrushKind.Solid;
463 | LineCircle.Fill.Color := FColorLinePoint;
464 | LineCircle.Width := FLinePointDiameter;
465 | LineCircle.Height := FLinePointDiameter;
466 |
467 | LineCircle.Position.X := CountComp * SpacePoints - Trunc(LineCircle.Width / 2);
468 | LineCircle.Position.Y := FLayout.Height - 35;
469 |
470 | if (FAnimate) then
471 | begin
472 | TAnimator.AnimateFloat(LineCircle, 'Position.Y', porc - Trunc(LineCircle.Width / 2), FAnimationDuration,
473 | TAnimationType.InOut, TInterpolationType.Circular);
474 | end
475 | else
476 | LineCircle.Position.Y := porc - Trunc(LineCircle.Width / 2);
477 |
478 | Leg := EmptyStr;
479 | if (FShowValues) then
480 | begin
481 | if (FFormatValues <> '') then
482 | if (Leg <> EmptyStr) then
483 | Leg := Leg + LineFeed + FormatFloat(FFormatValues,vl)
484 | else
485 | Leg := FormatFloat(FFormatValues,vl)
486 | else
487 | if (Leg <> EmptyStr) then
488 | Leg := Leg + LineFeed + vl.ToString
489 | else
490 | Leg := vl.ToString;
491 | end;
492 |
493 | if (FShowHint) and (TOSVersion.Platform = TOSVersion.TPlatform.pfWindows) then
494 | begin
495 | if (FHintFieldName) then
496 | LineCircle.Hint := field
497 | else
498 | LineCircle.Hint := Leg;
499 | LineCircle.ShowHint := True;
500 | end;
501 |
502 | if (Leg <> EmptyStr) then
503 | begin
504 | textoGraph := TText.Create(LineCircle);
505 | textoGraph.Parent := LineCircle;
506 |
507 | if (FFormatValues <> '') then
508 | textoGraph.Text := FormatFloat(FFormatValues, vl)
509 | else
510 | textoGraph.Text := vl.ToString;
511 |
512 | textoGraph.Opacity := 0;
513 | textoGraph.Align := TAlignLayout.Center;
514 | textoGraph.Margins.Bottom := 200 * FTextOffset;
515 | textoGraph.TextSettings.HorzAlign := TTextAlign.Center;
516 |
517 | textoGraph.TextSettings.Font.Style := FTextStyle;
518 | textoGraph.TextSettings.Font.Size := FTextFontSize;
519 | textoGraph.TextSettings.FontColor := FColorsText[0];
520 |
521 | TAnimator.AnimateFloatDelay(textoGraph, 'Opacity', 1, 0.2, FAnimationDuration,
522 | TAnimationType.In, TInterpolationType.Linear)
523 | end;
524 |
525 | Inc(CountComp);
526 | end;
527 | begin
528 | Result := EmptyStr;
529 | try
530 | BarCount := FArrValues.Count;
531 | MaxValue := 0;
532 |
533 | for I := FArrValues.Count - 1 downto 0 do
534 | if MaxValue < FArrValues.Items[I].GetValue('value') then
535 | MaxValue := FArrValues.Items[I].GetValue('value');
536 |
537 | MaxValue := MaxValue * 1.1;
538 |
539 | SpacePoints := Trunc(FLayout.Width / (BarCount - 1));
540 |
541 | CountComp := 0;
542 | for I := 0 to FArrValues.Count - 2 do
543 | AddLine(FArrValues.Items[I].GetValue('value'), FArrValues.Items[I+1].GetValue('value'));
544 |
545 | CountComp := 0;
546 | for I := 0 to FArrValues.Count - 1 do
547 | AddLinePoint(FArrValues.Items[I].GetValue('value'), FArrValues.Items[I].GetValue('field'));
548 | except on Ex: Exception do
549 | Result := Ex.Message;
550 | end;
551 | end;
552 |
553 | function TChart4Delphi.DrawBarGraph: String;
554 | var
555 | LayoutTopo: TLayout;
556 | LineBase: TLine;
557 | TextTitulo: TText;
558 | HrScroll: THorzScrollBox;
559 | rFundo, rBar: TRectangle;
560 | I, J : Integer;
561 | maxValue, percSerie: Real;
562 | txtHint: string;
563 | procedure Serie(SerieValue: Real; Texto: String);
564 | var
565 | textoGraph, textBottom: TText;
566 | Leg: string;
567 | begin
568 | Leg := EmptyStr;
569 | if (ShowPercent) then
570 | Leg := IntToStr(Round((SerieValue / maxValue) * 100)) + '%';
571 |
572 | if (ShowValues) then
573 | begin
574 | if (FFormatValues <> '') then
575 | if (Leg <> EmptyStr) then
576 | Leg := Leg + LineFeed + FormatFloat(FFormatValues,SerieValue)
577 | else
578 | Leg := FormatFloat(FFormatValues,SerieValue)
579 | else
580 | if (Leg <> EmptyStr) then
581 | Leg := Leg + LineFeed + FloatToStr(SerieValue)
582 | else
583 | Leg := FloatToStr(SerieValue);
584 | end;
585 |
586 | rFundo := TRectangle.Create(HrScroll);
587 | rFundo.Parent := HrScroll;
588 | rFundo.Align := TAlignLayout.Left;
589 | rFundo.Margins.Left := 5;
590 | rFundo.Margins.Right := 5;
591 | rFundo.Height := HrScroll.Height;
592 | rFundo.Width := HrScroll.Width / FArrValues.Count - 10;
593 | rFundo.Stroke.Kind := TBrushKind.None;
594 |
595 | rBar := TRectangle.Create(rFundo);
596 | rBar.Align := TAlignLayout.Bottom;
597 | rBar.Fill.Color := FColorsGraph[0];
598 | rBar.Size.Height := 0;
599 | rBar.ClipChildren := True;
600 | rBar.Parent := rFundo;
601 | rBar.Stroke.Kind := TBrushKind.None;
602 |
603 | percSerie := ((SerieValue * 100) / maxValue);
604 | percSerie := (percSerie * rFundo.Height) / 100;
605 |
606 | if (FShowHint) and (TOSVersion.Platform = TOSVersion.TPlatform.pfWindows) then
607 | begin
608 | if (FHintFieldName) then
609 | txtHint := Texto
610 | else if not(FFullHint) then
611 | txtHint := Leg
612 | else
613 | begin
614 | if (FFormatValues <> '') then
615 | txtHint := FormatFloat(FFormatValues,SerieValue)
616 | else
617 | txtHint := FloatToStr(SerieValue);
618 | end;
619 | rBar.Hint := txtHint;
620 | rBar.ShowHint := True;
621 | end;
622 |
623 | if (Leg <> EmptyStr) then
624 | begin
625 | textoGraph := TText.Create(rFundo);
626 | textoGraph.Parent := rFundo;
627 |
628 | textoGraph.Opacity := 0;
629 | textoGraph.Text := Leg;
630 | textoGraph.Height := 30;
631 | textoGraph.Width := rBar.Width;
632 | textoGraph.Position.X := 0;
633 | textoGraph.Position.Y := (rFundo.Height - percSerie - textoGraph.Height) - (30 * FTextOffset);
634 | textoGraph.TextSettings.HorzAlign := TTextAlign.Center;
635 | textoGraph.TextSettings.VertAlign := TTextAlign.Trailing;
636 |
637 | textoGraph.TextSettings.Font.Style := FTextStyle;
638 | textoGraph.TextSettings.Font.Size := FTextFontSize;
639 | textoGraph.TextSettings.FontColor := FColorsText[0];
640 |
641 | if (textoGraph.Position.Y < -textoGraph.Height) then
642 | textoGraph.Position.Y := (30 * FTextOffset)
643 | else if (textoGraph.Position.Y < 0) then
644 | textoGraph.Position.Y := 5;
645 |
646 | TAnimator.AnimateFloatDelay(textoGraph, 'Opacity', 1, 0.2, FAnimationDuration,
647 | TAnimationType.In, TInterpolationType.Linear);
648 | end;
649 |
650 | if (FShowBarLegend) then
651 | begin
652 | textBottom := TText.Create(FLayout);
653 | textBottom.Parent := FLayout;
654 |
655 | textBottom.Text := Texto;
656 | textBottom.Height := 20;
657 | textBottom.Width := rBar.Width;
658 | textBottom.Position.X := (J * rBar.Width) + (10 * (J + 1));
659 | textBottom.Position.Y := FLayout.Height - LineBase.Size.Height;
660 | textBottom.TextSettings.HorzAlign := TTextAlign.Center;
661 | textBottom.TextSettings.VertAlign := TTextAlign.Leading;
662 | textBottom.Anchors := [TAnchorKind.akBottom];
663 |
664 | textBottom.TextSettings.Font.Style := FTextStyle;
665 | textBottom.TextSettings.Font.Size := FTextFontSize;
666 | textBottom.TextSettings.FontColor := FColorsText[0];
667 | end;
668 |
669 | TAnimator.AnimateFloat(rBar, 'Height', percSerie, FAnimationDuration,
670 | TAnimationType.In,TInterpolationType.Cubic);
671 | end;
672 | begin
673 | if (FShowBarTitle) then
674 | begin
675 | LayoutTopo := TLayout.Create(FLayout);
676 | LayoutTopo.Align := TAlignLayout.Top;
677 | LayoutTopo.Size.Height := 30;
678 | LayoutTopo.Parent := FLayout;
679 |
680 | TextTitulo := TText.Create(LayoutTopo);
681 | TextTitulo.Align := TAlignLayout.Client;
682 | TextTitulo.Parent := LayoutTopo;
683 | TextTitulo.Text := FBarTitle;
684 | end;
685 |
686 | LineBase := TLine.Create(FLayout);
687 | LineBase.LineType := TLineType.Top;
688 | LineBase.Size.Height := 30;
689 | LineBase.Align := TAlignLayout.Bottom;
690 | LineBase.Parent := FLayout;
691 |
692 | HrScroll := THorzScrollBox.Create(FLayout);
693 | HrScroll.Parent := FLayout;
694 | HrScroll.Align := TAlignLayout.Client;
695 | HrScroll.Margins.Top := 5;
696 | HrScroll.Margins.Left := 5;
697 | HrScroll.Margins.Right := 5;
698 | HrScroll.Margins.Bottom := 0;
699 |
700 | maxValue := 0;
701 | for I := 0 to Pred(FArrValues.Count) do
702 | if (FArrValues.Items[I].GetValue('value') > maxValue) then
703 | maxValue := FArrValues.Items[I].GetValue('value');
704 |
705 | J := 0;
706 | for I := 0 to FArrValues.Count - 1 do
707 | begin
708 | Serie(FArrValues.Items[I].GetValue('value'),FArrValues.Items[I].GetValue('field'));
709 | Inc(J);
710 | end;
711 | end;
712 |
713 | procedure TChart4Delphi.SetColors(ColorsGraph, ColorsText: Array of TAlphaColor);
714 | var
715 | I: Integer;
716 | begin
717 | if (Length(ColorsGraph) > 0) then
718 | begin
719 | SetLength(FColorsGraph,0);
720 | for I := 0 to Pred(Length(ColorsGraph)) do
721 | begin
722 | SetLength(FColorsGraph,Length(FColorsGraph)+1);
723 | FColorsGraph[I] := ColorsGraph[I];
724 | end;
725 | end;
726 | if (Length(ColorsText) > 0) then
727 | begin
728 | SetLength(FColorsText,0);
729 | for I := 0 to Pred(Length(ColorsText)) do
730 | begin
731 | SetLength(FColorsText,Length(FColorsText)+1);
732 | FColorsText[I] := ColorsText[I];
733 | end;
734 | end;
735 | end;
736 |
737 | procedure TChart4Delphi.SetTextOffset(Value: Real);
738 | begin
739 | if (Value <= 0) then
740 | FTextOffset := 0
741 | else if (Value > 0.5) then
742 | FTextOffset := 0.5
743 | else
744 | FTextOffset := Value;
745 | end;
746 |
747 | procedure TChart4Delphi.SetDonutsTickness(Value: Integer);
748 | begin
749 | if (Value < 10) then
750 | FDonutsCenterRadius := 10
751 | else if (Value > (FLayout.Size.Width - 15)) then
752 | FDonutsCenterRadius := Trunc(FLayout.Size.Width - 15)
753 | else
754 | FDonutsCenterRadius := Value;
755 |
756 | if (FDonutsCenterRadius <= 0) then
757 | FDonutsCenterRadius := 10;
758 | end;
759 |
760 | procedure TChart4Delphi.SetLinePointDiameter(Value: Integer);
761 | begin
762 | if (Value <= 0) then
763 | FLinePointDiameter := 0
764 | else if (Value >= 50) then
765 | FLinePointDiameter := 50
766 | else
767 | FLinePointDiameter := Value;
768 | end;
769 |
770 | procedure TChart4Delphi.SetLineTickness(Value: Integer);
771 | begin
772 | if (Value <= 1) then
773 | FLineTickness := 1
774 | else if (Value >= 30) then
775 | FLineTickness := 30
776 | else
777 | FLineTickness := Value;
778 | end;
779 |
780 | end.
781 |
--------------------------------------------------------------------------------
/sample/char4delphi-sample/Chart4Delphi.pas:
--------------------------------------------------------------------------------
1 | unit Chart4Delphi;
2 |
3 | interface
4 |
5 | uses
6 | FMX.Layouts,
7 | FMX.Objects,
8 | FMX.Types,
9 | FMX.Controls,
10 | FMX.Styles.Objects,
11 | FMX.Graphics,
12 | FMX.Forms,
13 | FMX.Ani,
14 | System.UITypes,
15 | System.JSON,
16 | System.SysUtils,
17 | System.Types,
18 | System.Generics.Collections,
19 | System.Classes,
20 | Winapi.Windows,
21 | RegularExpressions;
22 |
23 | type
24 | {$SCOPEDENUMS ON}
25 | TChartLayoutType = (ctlPie, ctlDonuts, ctlLines, ctlBars);
26 | {$SCOPEDENUMS OFF}
27 |
28 | type
29 | TChart4Delphi = class
30 | procedure AnimationFinish(Sender: TObject);
31 | private
32 | Animation: TFloatAnimation;
33 | StyleObj : TStyleObject;
34 |
35 | FLayout : TLayout;
36 | FChartType : TChartLayoutType;
37 | FArrValues : TJSONArray;
38 | FColorsGraph : TArray;
39 | FColorsText : TArray;
40 | FTextFontSize : Integer;
41 | FTextStyle : TFontStyles;
42 | FDonutsCenterRadius: Integer;
43 | FLinePointDiameter : Integer;
44 | FLineTickness : Integer;
45 | FTextOffset : Real;
46 | FAnimationDuration : Single;
47 | FFormatValues : string;
48 | FBarTitle : string;
49 | FAnimate : Boolean;
50 | FShowHint : Boolean;
51 | FFullHint : Boolean;
52 | FHintFieldName : Boolean;
53 | FShowValues : Boolean;
54 | FShowPercent : Boolean;
55 | FShowBarTitle : Boolean;
56 | FShowBarLegend : Boolean;
57 | FColorLinePoint : TAlphaColor;
58 |
59 | procedure SetTextOffset(Value: Real);
60 | procedure SetDonutsTickness(Value: Integer);
61 | procedure SetLinePointDiameter(Value: Integer);
62 | procedure SetLineTickness(Value: Integer);
63 | function DrawCircularGraph: String;
64 | function DrawLineGraph: String;
65 | function DrawBarGraph: String;
66 | public
67 | constructor Create(Layout: TLayout; ChartType: TChartLayoutType);
68 |
69 | procedure Clear;
70 | procedure SetColors(ColorsGraph, ColorsText: Array of TAlphaColor);
71 | procedure DrawGraph(JsonString: string; var ErrorMsg: string);
72 |
73 | property ShowPercent : Boolean read FShowPercent write FShowPercent;
74 | property ShowValues : Boolean read FShowValues write FShowValues;
75 | property ShowHint : Boolean read FShowHint write FShowHint;
76 | property HintFieldName : Boolean read FHintFieldName write FHintFieldName;
77 | property ShowBarTitle : Boolean read FShowBarTitle write FShowBarTitle;
78 | property ShowBarLegend : Boolean read FShowBarLegend write FShowBarLegend;
79 | property FullHint : Boolean read FFullHint write FFullHint;
80 | property Animate : Boolean read FAnimate write FAnimate;
81 | property TextOffset : Real read FTextOffset write SetTextOffset;
82 | property AnimationDuration : Single read FAnimationDuration write FAnimationDuration;
83 | property DonutsCenterRadius: Integer read FDonutsCenterRadius write SetDonutsTickness;
84 | property TextFontSize : Integer read FTextFontSize write FTextFontSize;
85 | property LinePointDiameter : Integer read FLinePointDiameter write SetLinePointDiameter;
86 | property LineTickness : Integer read FLineTickness write SetLineTickness;
87 | property FormatValues : string read FFormatValues write FFormatValues;
88 | property BarTitle : string read FBarTitle write FBarTitle;
89 | property TextStyle : TFontStyles read FTextStyle write FTextStyle;
90 | property ColorLinePoint : TAlphaColor read FColorLinePoint write FColorLinePoint;
91 | end;
92 |
93 | implementation
94 |
95 | uses
96 | FMX.Dialogs;
97 |
98 | { TChart4Delphi }
99 |
100 | constructor TChart4Delphi.Create(Layout: TLayout; ChartType: TChartLayoutType);
101 | begin
102 | FLayout := Layout;
103 | FChartType := ChartType;
104 | ShowPercent := True;
105 | ShowValues := True;
106 | ShowHint := True;
107 | FHintFieldName := True;
108 | FShowBarTitle := True;
109 | FShowBarLegend := True;
110 | FFullHint := True;
111 | FAnimate := True;
112 | FDonutsCenterRadius := 200;
113 | FTextStyle := [TFontStyle.fsBold];
114 | FTextFontSize := 12;
115 | FFormatValues := '';
116 | FColorLinePoint := TAlphaColors.Black;
117 | FLinePointDiameter := 8;
118 | FLineTickness := 2;
119 | FAnimationDuration := 0.8;
120 | FBarTitle := 'Bar Graphic';
121 |
122 | if (ChartType in [TChartLayoutType.ctlPie, TChartLayoutType.ctlDonuts]) then
123 | FTextOffset := 0.2
124 | else
125 | FTextOffset := 0.15;
126 |
127 | FColorsGraph := TArray.Create(
128 | TAlphaColors.Green,
129 | TAlphaColors.Orange,
130 | TAlphaColors.Beige,
131 | TAlphaColors.Red,
132 | TAlphaColors.Blue,
133 | TAlphaColors.Magenta,
134 | TAlphaColors.Brown,
135 | TAlphaColors.Gold,
136 | TAlphaColors.Grey,
137 | TAlphaColors.Lightgreen,
138 | TAlphaColors.Black,
139 | TAlphaColors.Pink);
140 |
141 | FColorsText := TArray.Create(
142 | TAlphaColors.White,
143 | TAlphaColors.White,
144 | TAlphaColors.White,
145 | TAlphaColors.White,
146 | TAlphaColors.White,
147 | TAlphaColors.White,
148 | TAlphaColors.White,
149 | TAlphaColors.White,
150 | TAlphaColors.White,
151 | TAlphaColors.White,
152 | TAlphaColors.White,
153 | TAlphaColors.White);
154 | end;
155 |
156 | procedure TChart4Delphi.AnimationFinish(Sender: TObject);
157 | begin
158 | TAnimator.AnimateFloat(StyleObj, 'Opacity', 1, 0.2, TAnimationType.In, TInterpolationType.Linear);
159 | end;
160 |
161 | procedure TChart4Delphi.Clear;
162 | var
163 | fmxObj: TFmxObject;
164 | begin
165 | while FLayout.ChildrenCount > 0 do
166 | for fmxObj in FLayout.Children do
167 | begin
168 | FLayout.RemoveObject(fmxObj);
169 | fmxObj.Free;
170 | end;
171 |
172 | FLayout.Padding.Rect := TRect.Create(0,0,0,0);
173 | end;
174 |
175 | procedure TChart4Delphi.DrawGraph(JsonString: string; var ErrorMsg: string);
176 | begin
177 | ErrorMsg := EmptyStr;
178 | Clear;
179 |
180 | try
181 | FArrValues := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(jsonString), 0) as TJSONArray;
182 | except
183 | ErrorMsg := 'Invalid JSON array';
184 | Exit;
185 | end;
186 |
187 | if FArrValues = nil then
188 | begin
189 | ErrorMsg := 'Invalid JSON array';
190 | Exit;
191 | end;
192 |
193 | case FChartType of
194 | TChartLayoutType.ctlPie : ErrorMsg := DrawCircularGraph;
195 | TChartLayoutType.ctlDonuts: ErrorMsg := DrawCircularGraph;
196 | TChartLayoutType.ctlLines : ErrorMsg := DrawLineGraph;
197 | TChartLayoutType.ctlBars : ErrorMsg := DrawBarGraph;
198 | end;
199 | end;
200 |
201 | function TChart4Delphi.DrawCircularGraph: String;
202 | var
203 | PieColor, PieMask: TPie;
204 | Circle: TCircle;
205 | LayoutText: TLayout;
206 | textoGraph: TText;
207 | I, idColorG, idColorT: Integer;
208 | serieValue, jsonV, totValue: Real;
209 | startAng, endAng, midPoint: Single;
210 | Leg, txtHint: string;
211 | ArrAngs: Array of Single;
212 | begin
213 | Result := EmptyStr;
214 | try
215 | FLayout.Padding.Rect := TRect.Create(5,5,5,5);
216 |
217 | PieMask := TPie.Create(FLayout.Owner);
218 | PieMask.Parent := FLayout;
219 | PieMask.StartAngle := -90;
220 | PieMask.EndAngle := 270;
221 | PieMask.Stroke.Kind := TBrushKind.None;
222 | PieMask.Align := TAlignLayout.Contents;
223 | PieMask.Fill.Assign((FLayout.Owner as TForm).Fill);
224 | PieMask.Stroke.Color := PieMask.Fill.Color;
225 |
226 | if (FChartType = TChartLayoutType.ctlDonuts) then
227 | begin
228 | Circle := TCircle.Create(FLayout.Owner);
229 | Circle.Parent := PieMask;
230 | Circle.Size.Width := FDonutsCenterRadius;
231 | Circle.Size.Height := FDonutsCenterRadius;
232 | Circle.Align := TAlignLayout.Center;
233 | Circle.Fill.Assign((FLayout.Owner as TForm).Fill);
234 | Circle.Stroke.Kind := TBrushKind.None;
235 | end;
236 |
237 | Animation := TFloatAnimation.Create(FLayout.Owner);
238 | Animation.Parent := PieMask;
239 | Animation.Duration := FAnimationDuration;
240 | Animation.Interpolation := TInterpolationType.Quartic;
241 | Animation.PropertyName := 'StartAngle';
242 | Animation.StartValue := -90;
243 | Animation.StopValue := PieMask.EndAngle;
244 | Animation.OnFinish := AnimationFinish;
245 |
246 | StyleObj := TStyleObject.Create(FLayout.Owner);
247 | StyleObj.Parent := FLayout;
248 | StyleObj.Size.Width := 180;
249 | StyleObj.Size.Height := 180;
250 | StyleObj.Opacity := 0;
251 |
252 | FLayout.RemoveObject(PieMask);
253 | FLayout.RemoveObject(StyleObj);
254 |
255 | SetLength(ArrAngs,FArrValues.Count);
256 |
257 | totValue := 0;
258 | for I := 0 to Pred(FArrValues.Count) do
259 | totValue := totValue + FArrValues.Items[I].GetValue('value');
260 |
261 | startAng := -90;
262 | idColorG := 0;
263 | idColorT := 0;
264 | for I := 0 to Pred(FArrValues.Count) do
265 | begin
266 | jsonV := FArrValues.Items[I].GetValue('value');
267 | serieValue := (jsonV / totValue) * 360;
268 |
269 | PieColor := TPie.Create(nil);
270 | PieColor.StartAngle := startAng;
271 | PieColor.EndAngle := startAng + serieValue;
272 |
273 | midPoint := startAng + serieValue * 0.5;
274 | startAng := PieColor.EndAngle;
275 |
276 | PieColor.Fill.Color := FColorsGraph[idColorG];
277 | PieColor.Stroke.Kind := TBrushKind.None;
278 | FLayout.AddObject(PieColor);
279 | PieColor.Align := TAlignLayout.Client;
280 |
281 | Leg := EmptyStr;
282 | if (ShowPercent) then
283 | Leg := IntToStr(Round((jsonV / totValue) * 100)) + '%';
284 |
285 | if (ShowValues) then
286 | begin
287 | if (FFormatValues <> '') then
288 | if (Leg <> EmptyStr) then
289 | Leg := Leg + LineFeed + FormatFloat(FFormatValues,FArrValues.Items[I].GetValue('value'))
290 | else
291 | Leg := FormatFloat(FFormatValues,FArrValues.Items[I].GetValue('value'))
292 | else
293 | if (Leg <> EmptyStr) then
294 | Leg := Leg + LineFeed + FArrValues.Items[I].GetValue('value')
295 | else
296 | Leg := FArrValues.Items[I].GetValue('value');
297 | end;
298 |
299 | if (FShowHint) and (TOSVersion.Platform = TOSVersion.TPlatform.pfWindows) then
300 | begin
301 | if (FHintFieldName) then
302 | txtHint := FArrValues.Items[I].GetValue('field')
303 | else if not(FFullHint) then
304 | txtHint := Leg
305 | else
306 | begin
307 | if (FFormatValues <> '') then
308 | txtHint := IntToStr(Round((jsonV / totValue) * 100)) + '%' + LineFeed + FormatFloat(FFormatValues,FArrValues.Items[I].GetValue('value'))
309 | else
310 | txtHint := IntToStr(Round((jsonV / totValue) * 100)) + '%' + LineFeed + FArrValues.Items[I].GetValue('value');
311 | end;
312 | PieColor.Hint := txtHint;
313 | PieColor.ShowHint := True;
314 | end;
315 |
316 | if (idColorG < Pred(Length(FColorsGraph))) then
317 | Inc(idColorG)
318 | else
319 | idColorG := 0;
320 |
321 | if (Leg <> EmptyStr) then
322 | begin
323 | textoGraph := TText.Create(nil);
324 | textoGraph.HitTest := False;
325 | textoGraph.Locked := True;
326 |
327 | textoGraph.TextSettings.Font.Size := FTextFontSize;
328 | textoGraph.TextSettings.Font.Style := TextStyle;
329 | textoGraph.TextSettings.FontColor := FColorsText[idColorT];
330 |
331 | LayoutText := TLayout.Create(nil);
332 | LayoutText.RotationCenter.Point := TPointF.Zero;
333 | StyleObj.AddObject(LayoutText);
334 |
335 | with FLayout.LocalRect.CenterPoint do
336 | LayoutText.SetBounds(X,Y,0,0);
337 |
338 | LayoutText.RotationAngle := midPoint;
339 | textoGraph.Align := TAlignLayout.None;
340 | textoGraph.Width := 80;
341 | textoGraph.Text := Leg;
342 | LayoutText.Width := ((FLayout.LocalRect.BottomRight.Length * FTextOffset) + (textoGraph.LocalRect.BottomRight.Length * 0.5));
343 | StyleObj.AddObject(textoGraph);
344 | textoGraph.Position.Point := StyleObj.AbsoluteToLocal(LayoutText.AbsoluteRect.BottomRight) - textoGraph.LocalRect.CenterPoint;
345 |
346 | if (idColorT < Pred(Length(FColorsText))) then
347 | Inc(idColorT)
348 | else
349 | idColorT := 0;
350 | end;
351 | end;
352 |
353 | PieMask.StartAngle := -90;
354 | PieMask.EndAngle := 270;
355 | FLayout.AddObject(PieMask);
356 | FLayout.AddObject(StyleObj);
357 |
358 | if (FAnimate) then
359 | Animation.Start
360 | else
361 | PieMask.StartAngle := PieMask.EndAngle;
362 | except on Ex: Exception do
363 | Result := Ex.Message;
364 | end;
365 | end;
366 |
367 | function TChart4Delphi.DrawLineGraph: String;
368 | var
369 | I: Integer;
370 | SpacePoints: Integer;
371 | BarCount: Integer;
372 | CountComp: Integer;
373 | MaxValue: Double;
374 | Line: TLine;
375 | procedure DrawLineBetweenPoints(L: TLine; p1, p2: TPointF);
376 | begin
377 | L.LineType := TLineType.Diagonal;
378 | L.RotationCenter.X := 0.0;
379 | L.RotationCenter.Y := 0.0;
380 |
381 | if (p2.X >= p1.X) then
382 | begin
383 | if (p2.Y > p1.Y) then begin
384 | L.RotationAngle := 0;
385 | L.Position.X := p1.X;
386 | L.Width := p2.X - p1.X;
387 | L.Position.Y := p1.Y;
388 | L.Height := p2.Y - p1.Y;
389 | end
390 | else
391 | begin
392 | L.RotationAngle := -90;
393 | L.Position.X := p1.X;
394 | L.Width := p1.Y - p2.Y;
395 | L.Position.Y := p1.Y;
396 | L.Height := p2.X - p1.X;
397 | end;
398 | end
399 | else
400 | begin
401 | if (p1.Y > p2.Y) then
402 | begin
403 | L.RotationAngle := 0;
404 | L.Position.X := p2.X;
405 | L.Width := p1.X - p2.X;
406 | L.Position.Y := p2.Y;
407 | L.Height := p1.Y - p2.Y;
408 | end
409 | else
410 | begin
411 | L.RotationAngle := -90;
412 | L.Position.X := p2.X;
413 | L.Width := p2.Y - p1.Y;
414 | L.Position.Y := p2.Y;
415 | L.Height := p1.X - p2.X;
416 | end;
417 | end;
418 |
419 | if (L.Height < 0.01) then
420 | L.Height := 0.1;
421 | if (L.Width < 0.01) then
422 | L.Width := 0.1;
423 | end;
424 | procedure AddLine(vlFrom, vlTo: Double);
425 | var
426 | ptFrom, ptTo: TPointF;
427 | begin
428 | ptFrom.Y := (1 - (vlFrom / MaxValue)) * FLayout.Height;
429 | ptFrom.X := CountComp * SpacePoints;
430 |
431 | ptTo.Y := (1 - (vlTo / MaxValue)) * FLayout.Height;
432 | ptTo.X := (CountComp + 1) * SpacePoints;
433 |
434 | Line := TLine.Create(FLayout);
435 | Line.Parent := FLayout;
436 | Line.Stroke.Kind := TBrushKind.Solid;
437 | Line.Stroke.Color := FColorsGraph[0];
438 | Line.Stroke.Thickness := FLineTickness;
439 |
440 | if (FAnimate) then
441 | begin
442 | Line.Opacity := 0;
443 | TAnimator.AnimateFloatDelay(Line, 'Opacity', 1, 0.2, (CountComp * 0.1) + FAnimationDuration,
444 | TAnimationType.InOut, TInterpolationType.Circular);
445 | end;
446 |
447 | DrawLineBetweenPoints(Line, ptFrom, ptTo);
448 | Inc(CountComp);
449 | end;
450 | procedure AddLinePoint(vl: double; field: string);
451 | var
452 | porc : Double;
453 | Leg : string;
454 | LineCircle: TCircle;
455 | textoGraph: TText;
456 | begin
457 | porc := (1 - (vl / MaxValue)) * FLayout.Height;
458 |
459 | LineCircle := TCircle.Create(FLayout);
460 | LineCircle.Parent := FLayout;
461 | LineCircle.Stroke.Kind := TBrushKind.None;
462 | LineCircle.Fill.Kind := TBrushKind.Solid;
463 | LineCircle.Fill.Color := FColorLinePoint;
464 | LineCircle.Width := FLinePointDiameter;
465 | LineCircle.Height := FLinePointDiameter;
466 |
467 | LineCircle.Position.X := CountComp * SpacePoints - Trunc(LineCircle.Width / 2);
468 | LineCircle.Position.Y := FLayout.Height - 35;
469 |
470 | if (FAnimate) then
471 | begin
472 | TAnimator.AnimateFloat(LineCircle, 'Position.Y', porc - Trunc(LineCircle.Width / 2), FAnimationDuration,
473 | TAnimationType.InOut, TInterpolationType.Circular);
474 | end
475 | else
476 | LineCircle.Position.Y := porc - Trunc(LineCircle.Width / 2);
477 |
478 | Leg := EmptyStr;
479 | if (FShowValues) then
480 | begin
481 | if (FFormatValues <> '') then
482 | if (Leg <> EmptyStr) then
483 | Leg := Leg + LineFeed + FormatFloat(FFormatValues,vl)
484 | else
485 | Leg := FormatFloat(FFormatValues,vl)
486 | else
487 | if (Leg <> EmptyStr) then
488 | Leg := Leg + LineFeed + vl.ToString
489 | else
490 | Leg := vl.ToString;
491 | end;
492 |
493 | if (FShowHint) and (TOSVersion.Platform = TOSVersion.TPlatform.pfWindows) then
494 | begin
495 | if (FHintFieldName) then
496 | LineCircle.Hint := field
497 | else
498 | LineCircle.Hint := Leg;
499 | LineCircle.ShowHint := True;
500 | end;
501 |
502 | if (Leg <> EmptyStr) then
503 | begin
504 | textoGraph := TText.Create(LineCircle);
505 | textoGraph.Parent := LineCircle;
506 |
507 | if (FFormatValues <> '') then
508 | textoGraph.Text := FormatFloat(FFormatValues, vl)
509 | else
510 | textoGraph.Text := vl.ToString;
511 |
512 | textoGraph.Opacity := 0;
513 | textoGraph.Align := TAlignLayout.Center;
514 | textoGraph.Margins.Bottom := 200 * FTextOffset;
515 | textoGraph.TextSettings.HorzAlign := TTextAlign.Center;
516 |
517 | textoGraph.TextSettings.Font.Style := FTextStyle;
518 | textoGraph.TextSettings.Font.Size := FTextFontSize;
519 | textoGraph.TextSettings.FontColor := FColorsText[0];
520 |
521 | TAnimator.AnimateFloatDelay(textoGraph, 'Opacity', 1, 0.2, FAnimationDuration,
522 | TAnimationType.In, TInterpolationType.Linear)
523 | end;
524 |
525 | Inc(CountComp);
526 | end;
527 | begin
528 | Result := EmptyStr;
529 | try
530 | BarCount := FArrValues.Count;
531 | MaxValue := 0;
532 |
533 | for I := FArrValues.Count - 1 downto 0 do
534 | if MaxValue < FArrValues.Items[I].GetValue('value') then
535 | MaxValue := FArrValues.Items[I].GetValue('value');
536 |
537 | MaxValue := MaxValue * 1.1;
538 |
539 | SpacePoints := Trunc(FLayout.Width / (BarCount - 1));
540 |
541 | CountComp := 0;
542 | for I := 0 to FArrValues.Count - 2 do
543 | AddLine(FArrValues.Items[I].GetValue('value'), FArrValues.Items[I+1].GetValue('value'));
544 |
545 | CountComp := 0;
546 | for I := 0 to FArrValues.Count - 1 do
547 | AddLinePoint(FArrValues.Items[I].GetValue('value'), FArrValues.Items[I].GetValue('field'));
548 | except on Ex: Exception do
549 | Result := Ex.Message;
550 | end;
551 | end;
552 |
553 | function TChart4Delphi.DrawBarGraph: String;
554 | var
555 | LayoutTopo: TLayout;
556 | LineBase: TLine;
557 | TextTitulo: TText;
558 | HrScroll: THorzScrollBox;
559 | rFundo, rBar: TRectangle;
560 | I, J : Integer;
561 | maxValue, percSerie: Real;
562 | txtHint: string;
563 | procedure Serie(SerieValue: Real; Texto: String);
564 | var
565 | textoGraph, textBottom: TText;
566 | Leg: string;
567 | begin
568 | Leg := EmptyStr;
569 | if (ShowPercent) then
570 | Leg := IntToStr(Round((SerieValue / maxValue) * 100)) + '%';
571 |
572 | if (ShowValues) then
573 | begin
574 | if (FFormatValues <> '') then
575 | if (Leg <> EmptyStr) then
576 | Leg := Leg + LineFeed + FormatFloat(FFormatValues,SerieValue)
577 | else
578 | Leg := FormatFloat(FFormatValues,SerieValue)
579 | else
580 | if (Leg <> EmptyStr) then
581 | Leg := Leg + LineFeed + FloatToStr(SerieValue)
582 | else
583 | Leg := FloatToStr(SerieValue);
584 | end;
585 |
586 | rFundo := TRectangle.Create(HrScroll);
587 | rFundo.Parent := HrScroll;
588 | rFundo.Align := TAlignLayout.Left;
589 | rFundo.Margins.Left := 5;
590 | rFundo.Margins.Right := 5;
591 | rFundo.Height := HrScroll.Height;
592 | rFundo.Width := HrScroll.Width / FArrValues.Count - 10;
593 | rFundo.Stroke.Kind := TBrushKind.None;
594 |
595 | rBar := TRectangle.Create(rFundo);
596 | rBar.Align := TAlignLayout.Bottom;
597 | rBar.Fill.Color := FColorsGraph[0];
598 | rBar.Size.Height := 0;
599 | rBar.ClipChildren := True;
600 | rBar.Parent := rFundo;
601 | rBar.Stroke.Kind := TBrushKind.None;
602 |
603 | percSerie := ((SerieValue * 100) / maxValue);
604 | percSerie := (percSerie * rFundo.Height) / 100;
605 |
606 | if (FShowHint) and (TOSVersion.Platform = TOSVersion.TPlatform.pfWindows) then
607 | begin
608 | if (FHintFieldName) then
609 | txtHint := Texto
610 | else if not(FFullHint) then
611 | txtHint := Leg
612 | else
613 | begin
614 | if (FFormatValues <> '') then
615 | txtHint := FormatFloat(FFormatValues,SerieValue)
616 | else
617 | txtHint := FloatToStr(SerieValue);
618 | end;
619 | rBar.Hint := txtHint;
620 | rBar.ShowHint := True;
621 | end;
622 |
623 | if (Leg <> EmptyStr) then
624 | begin
625 | textoGraph := TText.Create(rFundo);
626 | textoGraph.Parent := rFundo;
627 |
628 | textoGraph.Opacity := 0;
629 | textoGraph.Text := Leg;
630 | textoGraph.Height := 30;
631 | textoGraph.Width := rBar.Width;
632 | textoGraph.Position.X := 0;
633 | textoGraph.Position.Y := (rFundo.Height - percSerie - textoGraph.Height) - (30 * FTextOffset);
634 | textoGraph.TextSettings.HorzAlign := TTextAlign.Center;
635 | textoGraph.TextSettings.VertAlign := TTextAlign.Trailing;
636 |
637 | textoGraph.TextSettings.Font.Style := FTextStyle;
638 | textoGraph.TextSettings.Font.Size := FTextFontSize;
639 | textoGraph.TextSettings.FontColor := FColorsText[0];
640 |
641 | if (textoGraph.Position.Y < -textoGraph.Height) then
642 | textoGraph.Position.Y := (30 * FTextOffset)
643 | else if (textoGraph.Position.Y < 0) then
644 | textoGraph.Position.Y := 5;
645 |
646 | TAnimator.AnimateFloatDelay(textoGraph, 'Opacity', 1, 0.2, FAnimationDuration,
647 | TAnimationType.In, TInterpolationType.Linear);
648 | end;
649 |
650 | if (FShowBarLegend) then
651 | begin
652 | textBottom := TText.Create(FLayout);
653 | textBottom.Parent := FLayout;
654 |
655 | textBottom.Text := Texto;
656 | textBottom.Height := 20;
657 | textBottom.Width := rBar.Width;
658 | textBottom.Position.X := (J * rBar.Width) + (10 * (J + 1));
659 | textBottom.Position.Y := FLayout.Height - LineBase.Size.Height;
660 | textBottom.TextSettings.HorzAlign := TTextAlign.Center;
661 | textBottom.TextSettings.VertAlign := TTextAlign.Leading;
662 | textBottom.Anchors := [TAnchorKind.akBottom];
663 |
664 | textBottom.TextSettings.Font.Style := FTextStyle;
665 | textBottom.TextSettings.Font.Size := FTextFontSize;
666 | textBottom.TextSettings.FontColor := FColorsText[0];
667 | end;
668 |
669 | TAnimator.AnimateFloat(rBar, 'Height', percSerie, FAnimationDuration,
670 | TAnimationType.In,TInterpolationType.Cubic);
671 | end;
672 | begin
673 | if (FShowBarTitle) then
674 | begin
675 | LayoutTopo := TLayout.Create(FLayout);
676 | LayoutTopo.Align := TAlignLayout.Top;
677 | LayoutTopo.Size.Height := 30;
678 | LayoutTopo.Parent := FLayout;
679 |
680 | TextTitulo := TText.Create(LayoutTopo);
681 | TextTitulo.Align := TAlignLayout.Client;
682 | TextTitulo.Parent := LayoutTopo;
683 | TextTitulo.Text := FBarTitle;
684 | end;
685 |
686 | LineBase := TLine.Create(FLayout);
687 | LineBase.LineType := TLineType.Top;
688 | LineBase.Size.Height := 30;
689 | LineBase.Align := TAlignLayout.Bottom;
690 | LineBase.Parent := FLayout;
691 |
692 | HrScroll := THorzScrollBox.Create(FLayout);
693 | HrScroll.Parent := FLayout;
694 | HrScroll.Align := TAlignLayout.Client;
695 | HrScroll.Margins.Top := 5;
696 | HrScroll.Margins.Left := 5;
697 | HrScroll.Margins.Right := 5;
698 | HrScroll.Margins.Bottom := 0;
699 |
700 | maxValue := 0;
701 | for I := 0 to Pred(FArrValues.Count) do
702 | if (FArrValues.Items[I].GetValue('value') > maxValue) then
703 | maxValue := FArrValues.Items[I].GetValue('value');
704 |
705 | J := 0;
706 | for I := 0 to FArrValues.Count - 1 do
707 | begin
708 | Serie(FArrValues.Items[I].GetValue('value'),FArrValues.Items[I].GetValue('field'));
709 | Inc(J);
710 | end;
711 | end;
712 |
713 | procedure TChart4Delphi.SetColors(ColorsGraph, ColorsText: Array of TAlphaColor);
714 | var
715 | I: Integer;
716 | begin
717 | if (Length(ColorsGraph) > 0) then
718 | begin
719 | SetLength(FColorsGraph,0);
720 | for I := 0 to Pred(Length(ColorsGraph)) do
721 | begin
722 | SetLength(FColorsGraph,Length(FColorsGraph)+1);
723 | FColorsGraph[I] := ColorsGraph[I];
724 | end;
725 | end;
726 | if (Length(ColorsText) > 0) then
727 | begin
728 | SetLength(FColorsText,0);
729 | for I := 0 to Pred(Length(ColorsText)) do
730 | begin
731 | SetLength(FColorsText,Length(FColorsText)+1);
732 | FColorsText[I] := ColorsText[I];
733 | end;
734 | end;
735 | end;
736 |
737 | procedure TChart4Delphi.SetTextOffset(Value: Real);
738 | begin
739 | if (Value <= 0) then
740 | FTextOffset := 0
741 | else if (Value > 0.5) then
742 | FTextOffset := 0.5
743 | else
744 | FTextOffset := Value;
745 | end;
746 |
747 | procedure TChart4Delphi.SetDonutsTickness(Value: Integer);
748 | begin
749 | if (Value < 10) then
750 | FDonutsCenterRadius := 10
751 | else if (Value > (FLayout.Size.Width - 15)) then
752 | FDonutsCenterRadius := Trunc(FLayout.Size.Width - 15)
753 | else
754 | FDonutsCenterRadius := Value;
755 |
756 | if (FDonutsCenterRadius <= 0) then
757 | FDonutsCenterRadius := 10;
758 | end;
759 |
760 | procedure TChart4Delphi.SetLinePointDiameter(Value: Integer);
761 | begin
762 | if (Value <= 0) then
763 | FLinePointDiameter := 0
764 | else if (Value >= 50) then
765 | FLinePointDiameter := 50
766 | else
767 | FLinePointDiameter := Value;
768 | end;
769 |
770 | procedure TChart4Delphi.SetLineTickness(Value: Integer);
771 | begin
772 | if (Value <= 1) then
773 | FLineTickness := 1
774 | else if (Value >= 30) then
775 | FLineTickness := 30
776 | else
777 | FLineTickness := Value;
778 | end;
779 |
780 | end.
781 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/sample/char4delphi-sample/ChartForDelphiDemo.dproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | {532FE513-C53A-4A5C-AB09-1470C75F8076}
4 | 19.2
5 | FMX
6 | True
7 | Debug
8 | Win32
9 | 33819
10 | Application
11 | ChartForDelphiDemo.dpr
12 |
13 |
14 | true
15 |
16 |
17 | true
18 | Base
19 | true
20 |
21 |
22 | true
23 | Base
24 | true
25 |
26 |
27 | true
28 | Base
29 | true
30 |
31 |
32 | true
33 | Base
34 | true
35 |
36 |
37 | true
38 | Base
39 | true
40 |
41 |
42 | true
43 | Base
44 | true
45 |
46 |
47 | true
48 | Base
49 | true
50 |
51 |
52 | true
53 | Cfg_1
54 | true
55 | true
56 |
57 |
58 | true
59 | Cfg_1
60 | true
61 | true
62 |
63 |
64 | true
65 | Base
66 | true
67 |
68 |
69 | true
70 | Cfg_2
71 | true
72 | true
73 |
74 |
75 | true
76 | Cfg_2
77 | true
78 | true
79 |
80 |
81 | .\$(Platform)\$(Config)
82 | .\$(Platform)\$(Config)
83 | false
84 | false
85 | false
86 | false
87 | false
88 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)
89 | true
90 | true
91 | true
92 | true
93 | true
94 | true
95 | true
96 | true
97 | $(BDS)\bin\delphi_PROJECTICON.ico
98 | $(BDS)\bin\delphi_PROJECTICNS.icns
99 | ChartForDelphiDemo
100 | modules\.dcp;modules\.dcu;modules;modules\dataset-serialize\src;$(DCC_UnitSearchPath)
101 |
102 |
103 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;ibxpress;fmx;FireDACIBDriver;xmlrtl;soapmidas;ibxbindings;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage)
104 | 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=
105 | Debug
106 | true
107 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
108 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
109 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
110 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
111 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
112 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
113 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
114 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
115 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
116 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
117 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
118 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
119 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
120 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
121 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
122 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
123 |
124 |
125 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;ibxpress;fmx;FireDACIBDriver;xmlrtl;soapmidas;ibxbindings;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;$(DCC_UsePackage)
126 | 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=
127 | Debug
128 | true
129 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png
130 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png
131 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png
132 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png
133 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png
134 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png
135 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png
136 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png
137 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png
138 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png
139 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png
140 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png
141 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png
142 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png
143 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png
144 | android-support-v4.dex.jar;cloud-messaging.dex.jar;com-google-android-gms.play-services-ads-base.17.2.0.dex.jar;com-google-android-gms.play-services-ads-identifier.16.0.0.dex.jar;com-google-android-gms.play-services-ads-lite.17.2.0.dex.jar;com-google-android-gms.play-services-ads.17.2.0.dex.jar;com-google-android-gms.play-services-analytics-impl.16.0.8.dex.jar;com-google-android-gms.play-services-analytics.16.0.8.dex.jar;com-google-android-gms.play-services-base.16.0.1.dex.jar;com-google-android-gms.play-services-basement.16.2.0.dex.jar;com-google-android-gms.play-services-gass.17.2.0.dex.jar;com-google-android-gms.play-services-identity.16.0.0.dex.jar;com-google-android-gms.play-services-maps.16.1.0.dex.jar;com-google-android-gms.play-services-measurement-base.16.4.0.dex.jar;com-google-android-gms.play-services-measurement-sdk-api.16.4.0.dex.jar;com-google-android-gms.play-services-stats.16.0.1.dex.jar;com-google-android-gms.play-services-tagmanager-v4-impl.16.0.8.dex.jar;com-google-android-gms.play-services-tasks.16.0.1.dex.jar;com-google-android-gms.play-services-wallet.16.0.1.dex.jar;com-google-firebase.firebase-analytics.16.4.0.dex.jar;com-google-firebase.firebase-common.16.1.0.dex.jar;com-google-firebase.firebase-iid-interop.16.0.1.dex.jar;com-google-firebase.firebase-iid.17.1.1.dex.jar;com-google-firebase.firebase-measurement-connector.17.0.1.dex.jar;com-google-firebase.firebase-messaging.17.5.0.dex.jar;fmx.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar
145 |
146 |
147 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;ibxpress;fmx;FireDACIBDriver;xmlrtl;soapmidas;ibxbindings;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)
148 | 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
149 | iPhoneAndiPad
150 | true
151 | Debug
152 | $(MSBuildProjectName)
153 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png
154 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png
155 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png
156 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png
157 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png
158 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png
159 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png
160 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png
161 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png
162 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png
163 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png
164 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png
165 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png
166 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png
167 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png
168 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png
169 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png
170 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png
171 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png
172 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png
173 |
174 |
175 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;IndyIPServer;IndySystem;tethering;fmxFireDAC;FireDAC;bindcompfmx;FireDACSqliteDriver;ibmonitor;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;ibxpress;fmx;FireDACIBDriver;xmlrtl;soapmidas;ibxbindings;rtl;DbxClientDriver;CustomIPTransport;dbexpress;IndyCore;bindcomp;dsnap;FireDACCommon;IndyIPClient;RESTBackendComponents;soapserver;dbxcds;bindengine;CloudService;dsnapxml;dbrtl;IndyProtocols;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)
176 | 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
177 | iPhoneAndiPad
178 | true
179 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png
180 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png
181 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png
182 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png
183 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png
184 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png
185 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png
186 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png
187 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png
188 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png
189 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png
190 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png
191 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png
192 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png
193 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png
194 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png
195 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png
196 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png
197 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png
198 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png
199 | 10.0
200 |
201 |
202 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;bindcompvclsmp;tethering;svnui;bindcompvclwinx;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;TeeDB;FireDAC;vcltouch;vcldb;bindcompfmx;svn;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;inetdb;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;ibxpress;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;vcledge;fmxobj;vclwinx;ibxbindings;rtl;vclib;DbxClientDriver;Tee;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)
203 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)
204 | Debug
205 | true
206 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
207 | 1033
208 | $(BDS)\bin\default_app.manifest
209 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
210 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
211 |
212 |
213 | DBXSqliteDriver;IndyIPCommon;RESTComponents;bindcompdbx;DBXInterBaseDriver;vcl;IndyIPServer;vclactnband;vclFireDAC;IndySystem;bindcompvclsmp;tethering;bindcompvclwinx;dsnapcon;FireDACADSDriver;FireDACMSAccDriver;fmxFireDAC;vclimg;TeeDB;FireDAC;vcltouch;vcldb;bindcompfmx;FireDACSqliteDriver;FireDACPgDriver;ibmonitor;inetdb;FMXTee;soaprtl;DbxCommonDriver;FmxTeeUI;ibxpress;fmx;FireDACIBDriver;fmxdae;xmlrtl;soapmidas;vcledge;fmxobj;vclwinx;ibxbindings;rtl;vclib;DbxClientDriver;Tee;CustomIPTransport;vcldsnap;dbexpress;IndyCore;vclx;bindcomp;appanalytics;dsnap;FireDACCommon;IndyIPClient;bindcompvcl;RESTBackendComponents;TeeUI;VCLRESTComponents;soapserver;dbxcds;VclSmp;adortl;vclie;bindengine;DBXMySQLDriver;CloudService;dsnapxml;FireDACMySQLDriver;dbrtl;IndyProtocols;inetdbxpress;FireDACCommonODBC;FireDACCommonDriver;inet;fmxase;$(DCC_UsePackage)
214 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)
215 | Debug
216 | true
217 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=
218 | 1033
219 | $(BDS)\bin\default_app.manifest
220 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png
221 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png
222 |
223 |
224 | DEBUG;$(DCC_Define)
225 | true
226 | false
227 | true
228 | true
229 | true
230 |
231 |
232 | false
233 | true
234 | PerMonitorV2
235 | true
236 | 1033
237 |
238 |
239 | true
240 | PerMonitorV2
241 |
242 |
243 | false
244 | RELEASE;$(DCC_Define)
245 | 0
246 | 0
247 |
248 |
249 | true
250 | PerMonitorV2
251 |
252 |
253 | true
254 | PerMonitorV2
255 |
256 |
257 |
258 | MainSource
259 |
260 |
261 |
262 | fmx
263 |
264 |
265 |
266 | Cfg_2
267 | Base
268 |
269 |
270 | Base
271 |
272 |
273 | Cfg_1
274 | Base
275 |
276 |
277 |
278 | Delphi.Personality.12
279 | Application
280 |
281 |
282 |
283 | ChartForDelphiDemo.dpr
284 |
285 |
286 | Microsoft Office 2000 Sample Automation Server Wrapper Components
287 | Microsoft Office XP Sample Automation Server Wrapper Components
288 |
289 |
290 |
291 |
292 |
293 | true
294 |
295 |
296 |
297 |
298 | true
299 |
300 |
301 |
302 |
303 | true
304 |
305 |
306 |
307 |
308 | ChartForDelphiDemo.exe
309 | true
310 |
311 |
312 |
313 |
314 | 1
315 |
316 |
317 | Contents\MacOS
318 | 1
319 |
320 |
321 | 0
322 |
323 |
324 |
325 |
326 | classes
327 | 1
328 |
329 |
330 | classes
331 | 1
332 |
333 |
334 |
335 |
336 | res\xml
337 | 1
338 |
339 |
340 | res\xml
341 | 1
342 |
343 |
344 |
345 |
346 | library\lib\armeabi-v7a
347 | 1
348 |
349 |
350 |
351 |
352 | library\lib\armeabi
353 | 1
354 |
355 |
356 | library\lib\armeabi
357 | 1
358 |
359 |
360 |
361 |
362 | library\lib\armeabi-v7a
363 | 1
364 |
365 |
366 |
367 |
368 | library\lib\mips
369 | 1
370 |
371 |
372 | library\lib\mips
373 | 1
374 |
375 |
376 |
377 |
378 | library\lib\armeabi-v7a
379 | 1
380 |
381 |
382 | library\lib\arm64-v8a
383 | 1
384 |
385 |
386 |
387 |
388 | library\lib\armeabi-v7a
389 | 1
390 |
391 |
392 |
393 |
394 | res\drawable
395 | 1
396 |
397 |
398 | res\drawable
399 | 1
400 |
401 |
402 |
403 |
404 | res\values
405 | 1
406 |
407 |
408 | res\values
409 | 1
410 |
411 |
412 |
413 |
414 | res\values-v21
415 | 1
416 |
417 |
418 | res\values-v21
419 | 1
420 |
421 |
422 |
423 |
424 | res\values
425 | 1
426 |
427 |
428 | res\values
429 | 1
430 |
431 |
432 |
433 |
434 | res\drawable
435 | 1
436 |
437 |
438 | res\drawable
439 | 1
440 |
441 |
442 |
443 |
444 | res\drawable-xxhdpi
445 | 1
446 |
447 |
448 | res\drawable-xxhdpi
449 | 1
450 |
451 |
452 |
453 |
454 | res\drawable-xxxhdpi
455 | 1
456 |
457 |
458 | res\drawable-xxxhdpi
459 | 1
460 |
461 |
462 |
463 |
464 | res\drawable-ldpi
465 | 1
466 |
467 |
468 | res\drawable-ldpi
469 | 1
470 |
471 |
472 |
473 |
474 | res\drawable-mdpi
475 | 1
476 |
477 |
478 | res\drawable-mdpi
479 | 1
480 |
481 |
482 |
483 |
484 | res\drawable-hdpi
485 | 1
486 |
487 |
488 | res\drawable-hdpi
489 | 1
490 |
491 |
492 |
493 |
494 | res\drawable-xhdpi
495 | 1
496 |
497 |
498 | res\drawable-xhdpi
499 | 1
500 |
501 |
502 |
503 |
504 | res\drawable-mdpi
505 | 1
506 |
507 |
508 | res\drawable-mdpi
509 | 1
510 |
511 |
512 |
513 |
514 | res\drawable-hdpi
515 | 1
516 |
517 |
518 | res\drawable-hdpi
519 | 1
520 |
521 |
522 |
523 |
524 | res\drawable-xhdpi
525 | 1
526 |
527 |
528 | res\drawable-xhdpi
529 | 1
530 |
531 |
532 |
533 |
534 | res\drawable-xxhdpi
535 | 1
536 |
537 |
538 | res\drawable-xxhdpi
539 | 1
540 |
541 |
542 |
543 |
544 | res\drawable-xxxhdpi
545 | 1
546 |
547 |
548 | res\drawable-xxxhdpi
549 | 1
550 |
551 |
552 |
553 |
554 | res\drawable-small
555 | 1
556 |
557 |
558 | res\drawable-small
559 | 1
560 |
561 |
562 |
563 |
564 | res\drawable-normal
565 | 1
566 |
567 |
568 | res\drawable-normal
569 | 1
570 |
571 |
572 |
573 |
574 | res\drawable-large
575 | 1
576 |
577 |
578 | res\drawable-large
579 | 1
580 |
581 |
582 |
583 |
584 | res\drawable-xlarge
585 | 1
586 |
587 |
588 | res\drawable-xlarge
589 | 1
590 |
591 |
592 |
593 |
594 | res\values
595 | 1
596 |
597 |
598 | res\values
599 | 1
600 |
601 |
602 |
603 |
604 | 1
605 |
606 |
607 | Contents\MacOS
608 | 1
609 |
610 |
611 | 0
612 |
613 |
614 |
615 |
616 | Contents\MacOS
617 | 1
618 | .framework
619 |
620 |
621 | Contents\MacOS
622 | 1
623 | .framework
624 |
625 |
626 | 0
627 |
628 |
629 |
630 |
631 | 1
632 | .dylib
633 |
634 |
635 | 1
636 | .dylib
637 |
638 |
639 | 1
640 | .dylib
641 |
642 |
643 | Contents\MacOS
644 | 1
645 | .dylib
646 |
647 |
648 | Contents\MacOS
649 | 1
650 | .dylib
651 |
652 |
653 | 0
654 | .dll;.bpl
655 |
656 |
657 |
658 |
659 | 1
660 | .dylib
661 |
662 |
663 | 1
664 | .dylib
665 |
666 |
667 | 1
668 | .dylib
669 |
670 |
671 | Contents\MacOS
672 | 1
673 | .dylib
674 |
675 |
676 | Contents\MacOS
677 | 1
678 | .dylib
679 |
680 |
681 | 0
682 | .bpl
683 |
684 |
685 |
686 |
687 | 0
688 |
689 |
690 | 0
691 |
692 |
693 | 0
694 |
695 |
696 | 0
697 |
698 |
699 | 0
700 |
701 |
702 | Contents\Resources\StartUp\
703 | 0
704 |
705 |
706 | Contents\Resources\StartUp\
707 | 0
708 |
709 |
710 | 0
711 |
712 |
713 |
714 |
715 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
716 | 1
717 |
718 |
719 |
720 |
721 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
722 | 1
723 |
724 |
725 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
726 | 1
727 |
728 |
729 |
730 |
731 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
732 | 1
733 |
734 |
735 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
736 | 1
737 |
738 |
739 |
740 |
741 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
742 | 1
743 |
744 |
745 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
746 | 1
747 |
748 |
749 |
750 |
751 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
752 | 1
753 |
754 |
755 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
756 | 1
757 |
758 |
759 |
760 |
761 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
762 | 1
763 |
764 |
765 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
766 | 1
767 |
768 |
769 |
770 |
771 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
772 | 1
773 |
774 |
775 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
776 | 1
777 |
778 |
779 |
780 |
781 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
782 | 1
783 |
784 |
785 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
786 | 1
787 |
788 |
789 |
790 |
791 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
792 | 1
793 |
794 |
795 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
796 | 1
797 |
798 |
799 |
800 |
801 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
802 | 1
803 |
804 |
805 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
806 | 1
807 |
808 |
809 |
810 |
811 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
812 | 1
813 |
814 |
815 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
816 | 1
817 |
818 |
819 |
820 |
821 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
822 | 1
823 |
824 |
825 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
826 | 1
827 |
828 |
829 |
830 |
831 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
832 | 1
833 |
834 |
835 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
836 | 1
837 |
838 |
839 |
840 |
841 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
842 | 1
843 |
844 |
845 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset
846 | 1
847 |
848 |
849 |
850 |
851 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
852 | 1
853 |
854 |
855 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
856 | 1
857 |
858 |
859 |
860 |
861 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
862 | 1
863 |
864 |
865 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
866 | 1
867 |
868 |
869 |
870 |
871 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
872 | 1
873 |
874 |
875 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
876 | 1
877 |
878 |
879 |
880 |
881 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
882 | 1
883 |
884 |
885 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
886 | 1
887 |
888 |
889 |
890 |
891 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
892 | 1
893 |
894 |
895 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
896 | 1
897 |
898 |
899 |
900 |
901 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
902 | 1
903 |
904 |
905 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset
906 | 1
907 |
908 |
909 |
910 |
911 | 1
912 |
913 |
914 | 1
915 |
916 |
917 |
918 |
919 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
920 | 1
921 |
922 |
923 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
924 | 1
925 |
926 |
927 |
928 |
929 | ..\
930 | 1
931 |
932 |
933 | ..\
934 | 1
935 |
936 |
937 |
938 |
939 | 1
940 |
941 |
942 | 1
943 |
944 |
945 | 1
946 |
947 |
948 |
949 |
950 | ..\$(PROJECTNAME).launchscreen
951 | 64
952 |
953 |
954 | ..\$(PROJECTNAME).launchscreen
955 | 64
956 |
957 |
958 |
959 |
960 | 1
961 |
962 |
963 | 1
964 |
965 |
966 | 1
967 |
968 |
969 |
970 |
971 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF
972 | 1
973 |
974 |
975 |
976 |
977 | ..\
978 | 1
979 |
980 |
981 | ..\
982 | 1
983 |
984 |
985 |
986 |
987 | Contents
988 | 1
989 |
990 |
991 | Contents
992 | 1
993 |
994 |
995 |
996 |
997 | Contents\Resources
998 | 1
999 |
1000 |
1001 | Contents\Resources
1002 | 1
1003 |
1004 |
1005 |
1006 |
1007 | library\lib\armeabi-v7a
1008 | 1
1009 |
1010 |
1011 | library\lib\arm64-v8a
1012 | 1
1013 |
1014 |
1015 | 1
1016 |
1017 |
1018 | 1
1019 |
1020 |
1021 | 1
1022 |
1023 |
1024 | 1
1025 |
1026 |
1027 | Contents\MacOS
1028 | 1
1029 |
1030 |
1031 | Contents\MacOS
1032 | 1
1033 |
1034 |
1035 | 0
1036 |
1037 |
1038 |
1039 |
1040 | library\lib\armeabi-v7a
1041 | 1
1042 |
1043 |
1044 |
1045 |
1046 | 1
1047 |
1048 |
1049 | 1
1050 |
1051 |
1052 |
1053 |
1054 | Assets
1055 | 1
1056 |
1057 |
1058 | Assets
1059 | 1
1060 |
1061 |
1062 |
1063 |
1064 | Assets
1065 | 1
1066 |
1067 |
1068 | Assets
1069 | 1
1070 |
1071 |
1072 |
1073 |
1074 |
1075 |
1076 |
1077 |
1078 |
1079 |
1080 |
1081 |
1082 |
1083 |
1084 | True
1085 | True
1086 | True
1087 | True
1088 | True
1089 | True
1090 |
1091 |
1092 | 12
1093 |
1094 |
1095 |
1096 |
1097 |
1098 |
--------------------------------------------------------------------------------