├── GridSystem.res ├── README.md ├── boss-lock.json ├── boss.json ├── sample ├── Project1.dpr ├── Unit3.pas ├── Unit3.fmx └── Project1.dproj ├── src ├── GridSystem.Register.pas ├── GridSystem.Types.pas ├── GridSystem.ColumnEditor.pas ├── GridSystem.ColumnDlg.fmx ├── GridSystem.ColumnDlg.pas └── GridSystem.pas ├── GridSystem.dpk ├── .gitignore └── GridSystem.dproj /GridSystem.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CarlosHe/DelphiGridSystem/HEAD/GridSystem.res -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Delphi Grid System (Only Firemonkey) 2 | Delphi Grid System like Boostrap Grid System 3 | -------------------------------------------------------------------------------- /boss-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "hash": "d41d8cd98f00b204e9800998ecf8427e", 3 | "updated": "2019-07-12T13:20:46.8868472-03:00", 4 | "installedModules": {} 5 | } -------------------------------------------------------------------------------- /boss.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DelphiGridSystem", 3 | "description": "", 4 | "version": "1.0.0", 5 | "homepage": "", 6 | "mainsrc": "src/", 7 | "projects": [ 8 | "GridSystem.dproj" 9 | ], 10 | "dependencies": {} 11 | } -------------------------------------------------------------------------------- /sample/Project1.dpr: -------------------------------------------------------------------------------- 1 | program Project1; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | Unit3 in 'Unit3.pas' {Form3}; 7 | 8 | {$R *.res} 9 | 10 | begin 11 | Application.Initialize; 12 | Application.CreateForm(TForm3, Form3); 13 | Application.Run; 14 | end. 15 | -------------------------------------------------------------------------------- /src/GridSystem.Register.pas: -------------------------------------------------------------------------------- 1 | unit GridSystem.Register; 2 | 3 | interface 4 | 5 | uses System.Classes, DesignIntf, GridSystem, GridSystem.Types, GridSystem.ColumnEditor; 6 | 7 | 8 | procedure Register; 9 | 10 | implementation 11 | 12 | procedure Register; 13 | begin 14 | RegisterComponents('Grid System', [TGSContainer]); 15 | RegisterComponents('Grid System', [TGSRow]); 16 | RegisterComponents('Grid System', [TGSCol]); 17 | RegisterComponentEditor(TGSCol, TGridSystemColumnComponentEditor); 18 | RegisterPropertyEditor(TypeInfo(TGSColumnsDictionary), TGSCol, 'Columns', TGridSystemColumnPropertyEditor); 19 | end; 20 | 21 | end. 22 | -------------------------------------------------------------------------------- /sample/Unit3.pas: -------------------------------------------------------------------------------- 1 | unit Unit3; 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.Objects, FMX.Controls.Presentation, FMX.Edit, System.Generics.Collections, 8 | GridSystem, FMX.Layouts; 9 | 10 | type 11 | TForm3 = class(TForm) 12 | Text10: TText; 13 | VertScrollBox1: TVertScrollBox; 14 | GSContainer1: TGSContainer; 15 | GSRow1: TGSRow; 16 | GSCol1: TGSCol; 17 | GSCol2: TGSCol; 18 | GSCol3: TGSCol; 19 | GSCol4: TGSCol; 20 | GSCol5: TGSCol; 21 | GSCol6: TGSCol; 22 | GSCol7: TGSCol; 23 | GSCol8: TGSCol; 24 | GSCol9: TGSCol; 25 | GSCol10: TGSCol; 26 | GSCol11: TGSCol; 27 | private 28 | { Private declarations } 29 | public 30 | { Public declarations } 31 | end; 32 | 33 | var 34 | Form3: TForm3; 35 | 36 | implementation 37 | 38 | {$R *.fmx} 39 | 40 | end. 41 | -------------------------------------------------------------------------------- /GridSystem.dpk: -------------------------------------------------------------------------------- 1 | package GridSystem; 2 | 3 | {$R *.res} 4 | {$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} 5 | {$ALIGN 8} 6 | {$ASSERTIONS ON} 7 | {$BOOLEVAL OFF} 8 | {$DEBUGINFO OFF} 9 | {$EXTENDEDSYNTAX ON} 10 | {$IMPORTEDDATA ON} 11 | {$IOCHECKS ON} 12 | {$LOCALSYMBOLS ON} 13 | {$LONGSTRINGS ON} 14 | {$OPENSTRINGS ON} 15 | {$OPTIMIZATION OFF} 16 | {$OVERFLOWCHECKS OFF} 17 | {$RANGECHECKS OFF} 18 | {$REFERENCEINFO ON} 19 | {$SAFEDIVIDE OFF} 20 | {$STACKFRAMES ON} 21 | {$TYPEDADDRESS OFF} 22 | {$VARSTRINGCHECKS ON} 23 | {$WRITEABLECONST OFF} 24 | {$MINENUMSIZE 1} 25 | {$IMAGEBASE $400000} 26 | {$DEFINE DEBUG} 27 | {$ENDIF IMPLICITBUILDING} 28 | {$IMPLICITBUILD ON} 29 | 30 | requires 31 | rtl, 32 | fmx, 33 | designide; 34 | 35 | contains 36 | GridSystem in 'src\GridSystem.pas', 37 | GridSystem.Types in 'src\GridSystem.Types.pas', 38 | GridSystem.ColumnDlg in 'src\GridSystem.ColumnDlg.pas' {GridSystemColumnDlg}, 39 | GridSystem.ColumnEditor in 'src\GridSystem.ColumnEditor.pas', 40 | GridSystem.Register in 'src\GridSystem.Register.pas'; 41 | 42 | end. 43 | -------------------------------------------------------------------------------- /src/GridSystem.Types.pas: -------------------------------------------------------------------------------- 1 | unit GridSystem.Types; 2 | 3 | interface 4 | 5 | uses 6 | System.Classes, FMX.Types, System.Generics.Collections; 7 | 8 | type 9 | 10 | TScreenType = (ScreenExtraSmall, ScreenSmall, ScreenMedium, ScreenLarge, ScreenExtraLarge); 11 | 12 | GSColumnWidth = 1 .. 12; 13 | 14 | TGSColumnsDictionary = TDictionary; 15 | 16 | IGSContainer = interface(IControl) 17 | ['{6BB2E0E3-9146-40BB-8C6B-E0788D586E20}'] 18 | function GetScreenType: TScreenType; 19 | procedure SetMinHeight(const Value: Single); 20 | function GetMinHeight: Single; 21 | 22 | property ScreenType: TScreenType read GetScreenType; 23 | property MinHeight: Single read GetMinHeight write SetMinHeight; 24 | end; 25 | 26 | IGSRow = interface(IControl) 27 | ['{6CF1989D-75C3-4744-8B9B-5DC9CF8D1B9B}'] 28 | procedure SetMinHeight(const Value: Single); 29 | function GetMinHeight: Single; 30 | property MinHeight: Single read GetMinHeight write SetMinHeight; 31 | end; 32 | 33 | IGSCol = interface 34 | ['{31E963D8-9305-452A-AED3-9C0408AEEFCF}'] 35 | procedure SetColumns(const Value: TGSColumnsDictionary); 36 | function GetColumns: TGSColumnsDictionary; 37 | property Columns: TGSColumnsDictionary read GetColumns write SetColumns; 38 | end; 39 | 40 | implementation 41 | 42 | end. 43 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /src/GridSystem.ColumnEditor.pas: -------------------------------------------------------------------------------- 1 | unit GridSystem.ColumnEditor; 2 | 3 | interface 4 | 5 | uses 6 | FMX.Dialogs, System.SysUtils, System.Classes, System.UITypes, DesignEditors, DesignIntf, GridSystem.ColumnDlg, GridSystem.Types; 7 | 8 | type 9 | TGridSystemColumnComponentEditor = class(TComponentEditor) 10 | private 11 | procedure ShowDesigner; 12 | public 13 | function GetVerbCount: Integer; override; 14 | function GetVerb(Index: Integer): string; override; 15 | procedure ExecuteVerb(Index: Integer); override; 16 | end; 17 | 18 | TGridSystemColumnPropertyEditor = class(TClassProperty) 19 | private 20 | procedure ShowDesigner; 21 | public 22 | function GetAttributes: TPropertyAttributes; override; 23 | procedure Edit; override; 24 | end; 25 | 26 | implementation 27 | 28 | { TGridSystemColumnComponentEditor } 29 | 30 | procedure TGridSystemColumnComponentEditor.ExecuteVerb(Index: Integer); 31 | begin 32 | inherited; 33 | case Index of 34 | 0: 35 | ShowDesigner; 36 | else 37 | raise ENotImplemented.Create('TClockLabelEditor has only one verb (index = 0) supported.'); 38 | end; 39 | end; 40 | 41 | function TGridSystemColumnComponentEditor.GetVerb(Index: Integer): string; 42 | begin 43 | inherited; 44 | case Index of 45 | 0: 46 | Result := '&Edit columns'; 47 | else 48 | raise ENotImplemented.Create('TGridSystemColumnComponentEditor has only one verb (index = 0) supported.'); 49 | end; 50 | end; 51 | 52 | function TGridSystemColumnComponentEditor.GetVerbCount: Integer; 53 | begin 54 | inherited; 55 | Result := 1; 56 | end; 57 | 58 | procedure TGridSystemColumnComponentEditor.ShowDesigner; 59 | var 60 | DesignerForm: TGridSystemColumnDlg; 61 | Key: TScreenType; 62 | begin 63 | DesignerForm := TGridSystemColumnDlg.Create(nil); 64 | try 65 | if Supports(Component, IGSCol) then 66 | begin 67 | for Key in (Component as IGSCol).Columns.Keys do 68 | begin 69 | DesignerForm.Columns.Add(Key, (Component as IGSCol).Columns.Items[Key]); 70 | end; 71 | end; 72 | 73 | if DesignerForm.ShowModal = mrOk then 74 | begin 75 | (Component as IGSCol).Columns.Clear; 76 | for Key in DesignerForm.Columns.Keys do 77 | begin 78 | (Component as IGSCol).Columns.Add(Key, DesignerForm.Columns.Items[Key]); 79 | end; 80 | end; 81 | 82 | Designer.Modified; 83 | finally 84 | DesignerForm.Free; 85 | end; 86 | end; 87 | 88 | { TGridSystemColumnPropertyEditor } 89 | 90 | procedure TGridSystemColumnPropertyEditor.Edit; 91 | begin 92 | inherited; 93 | ShowDesigner; 94 | end; 95 | 96 | function TGridSystemColumnPropertyEditor.GetAttributes: TPropertyAttributes; 97 | begin 98 | Result := inherited GetAttributes + [paDialog, paReadOnly]; 99 | end; 100 | 101 | procedure TGridSystemColumnPropertyEditor.ShowDesigner; 102 | var 103 | DesignerForm: TGridSystemColumnDlg; 104 | ColumnsDictionary: TGSColumnsDictionary; 105 | Key: TScreenType; 106 | begin 107 | DesignerForm := TGridSystemColumnDlg.Create(nil); 108 | try 109 | ColumnsDictionary:=TGSColumnsDictionary(Self.GetOrdValue); 110 | 111 | for Key in TGSColumnsDictionary(Self.GetOrdValue).Keys do 112 | begin 113 | DesignerForm.Columns.Add(Key, ColumnsDictionary.Items[Key]); 114 | end; 115 | 116 | if DesignerForm.ShowModal = mrOk then 117 | begin 118 | ColumnsDictionary.Clear; 119 | for Key in DesignerForm.Columns.Keys do 120 | begin 121 | ColumnsDictionary.Add(Key, DesignerForm.Columns.Items[Key]); 122 | end; 123 | end; 124 | Designer.Modified; 125 | finally 126 | DesignerForm.Free; 127 | end; 128 | end; 129 | 130 | end. 131 | -------------------------------------------------------------------------------- /src/GridSystem.ColumnDlg.fmx: -------------------------------------------------------------------------------- 1 | object GridSystemColumnDlg: TGridSystemColumnDlg 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [] 5 | BorderStyle = Single 6 | Caption = 'Editor' 7 | ClientHeight = 240 8 | ClientWidth = 320 9 | Position = ScreenCenter 10 | FormFactor.Width = 320 11 | FormFactor.Height = 480 12 | FormFactor.Devices = [Desktop] 13 | OnCreate = FormCreate 14 | OnDestroy = FormDestroy 15 | OnShow = FormShow 16 | DesignerMasterStyle = 0 17 | object Button1: TButton 18 | ModalResult = 1 19 | Position.X = 144.000000000000000000 20 | Position.Y = 200.000000000000000000 21 | Size.Width = 80.000000000000000000 22 | Size.Height = 33.000000000000000000 23 | Size.PlatformDefault = False 24 | TabOrder = 3 25 | Text = 'Ok' 26 | end 27 | object Button2: TButton 28 | ModalResult = 2 29 | Position.X = 232.000000000000000000 30 | Position.Y = 199.000000000000000000 31 | Size.Width = 80.000000000000000000 32 | Size.Height = 33.000000000000000000 33 | Size.PlatformDefault = False 34 | TabOrder = 0 35 | Text = 'Cancel' 36 | end 37 | object cboxScreenType: TComboBox 38 | Position.X = 8.000000000000000000 39 | Position.Y = 24.000000000000000000 40 | Size.Width = 113.000000000000000000 41 | Size.Height = 22.000000000000000000 42 | Size.PlatformDefault = False 43 | TabOrder = 4 44 | OnChange = cboxScreenTypeChange 45 | end 46 | object sboxColumnCount: TSpinBox 47 | Touch.InteractiveGestures = [LongTap, DoubleTap] 48 | TabOrder = 5 49 | Cursor = crIBeam 50 | Min = 1.000000000000000000 51 | Max = 12.000000000000000000 52 | Value = 1.000000000000000000 53 | Position.X = 128.000000000000000000 54 | Position.Y = 24.000000000000000000 55 | end 56 | object Button3: TButton 57 | Position.X = 233.000000000000000000 58 | Position.Y = 15.000000000000000000 59 | Size.Width = 80.000000000000000000 60 | Size.Height = 33.000000000000000000 61 | Size.PlatformDefault = False 62 | TabOrder = 1 63 | Text = 'Add' 64 | OnClick = Button3Click 65 | end 66 | object Label1: TLabel 67 | Position.X = 8.000000000000000000 68 | Position.Y = 8.000000000000000000 69 | Size.Width = 113.000000000000000000 70 | Size.Height = 17.000000000000000000 71 | Size.PlatformDefault = False 72 | Text = 'Screen Type' 73 | TabOrder = 6 74 | end 75 | object Label2: TLabel 76 | Position.X = 128.000000000000000000 77 | Position.Y = 8.000000000000000000 78 | Size.Width = 100.000000000000000000 79 | Size.Height = 17.000000000000000000 80 | Size.PlatformDefault = False 81 | Text = 'Column Count' 82 | TabOrder = 7 83 | end 84 | object Button4: TButton 85 | Position.X = 8.000000000000000000 86 | Position.Y = 199.000000000000000000 87 | Size.Width = 128.000000000000000000 88 | Size.Height = 33.000000000000000000 89 | Size.PlatformDefault = False 90 | TabOrder = 2 91 | Text = 'Remove' 92 | OnClick = Button4Click 93 | end 94 | object strgridColumns: TStringGrid 95 | CanFocus = True 96 | ClipChildren = True 97 | Position.X = 8.000000000000000000 98 | Position.Y = 56.000000000000000000 99 | Size.Width = 305.000000000000000000 100 | Size.Height = 137.000000000000000000 101 | Size.PlatformDefault = False 102 | TabOrder = 8 103 | RowCount = 0 104 | Options = [AlternatingRowBackground, ColumnMove, ColLines, RowLines, RowSelect, Tabs, Header, AutoDisplacement] 105 | Viewport.Width = 301.000000000000000000 106 | Viewport.Height = 112.000000000000000000 107 | object StringColumn1: TStringColumn 108 | Header = 'Screen Type' 109 | Size.Width = 153.000000000000000000 110 | end 111 | object StringColumn2: TStringColumn 112 | Header = 'Column Count' 113 | Size.Width = 127.000000000000000000 114 | end 115 | end 116 | end 117 | -------------------------------------------------------------------------------- /src/GridSystem.ColumnDlg.pas: -------------------------------------------------------------------------------- 1 | unit GridSystem.ColumnDlg; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.TypInfo, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti, FMX.Grid.Style, FMX.StdCtrls, FMX.Edit, FMX.EditBox, FMX.SpinBox, 8 | FMX.ListBox, FMX.Grid, FMX.Controls.Presentation, FMX.ScrollBox, GridSystem.Types; 9 | 10 | type 11 | 12 | TGridSystemColumnDlg = class(TForm) 13 | Button1: TButton; 14 | Button2: TButton; 15 | cboxScreenType: TComboBox; 16 | sboxColumnCount: TSpinBox; 17 | Button3: TButton; 18 | Label1: TLabel; 19 | Label2: TLabel; 20 | Button4: TButton; 21 | strgridColumns: TStringGrid; 22 | StringColumn1: TStringColumn; 23 | StringColumn2: TStringColumn; 24 | procedure FormCreate(Sender: TObject); 25 | procedure Button3Click(Sender: TObject); 26 | procedure Button4Click(Sender: TObject); 27 | procedure FormDestroy(Sender: TObject); 28 | procedure FormShow(Sender: TObject); 29 | procedure cboxScreenTypeChange(Sender: TObject); 30 | private 31 | FColumns: TGSColumnsDictionary; 32 | { Private declarations } 33 | procedure AddScreenTypeToComboBox; 34 | procedure SetColumnWidthToSpinBox; 35 | procedure BuildStrGrid; 36 | procedure SetColumns(const Value: TGSColumnsDictionary); 37 | public 38 | { Public declarations } 39 | property Columns: TGSColumnsDictionary read FColumns write SetColumns; 40 | end; 41 | 42 | var 43 | GridSystemColumnDlg: TGridSystemColumnDlg; 44 | 45 | implementation 46 | 47 | {$R *.fmx} 48 | 49 | procedure TGridSystemColumnDlg.AddScreenTypeToComboBox; 50 | var 51 | I: Integer; 52 | begin 53 | cboxScreenType.Clear; 54 | for I := Integer(Low(TScreenType)) to Integer(High(TScreenType)) do 55 | cboxScreenType.Items.Add(GetEnumName(TypeInfo(TScreenType), I)); 56 | cboxScreenType.ItemIndex := 0; 57 | end; 58 | 59 | procedure TGridSystemColumnDlg.BuildStrGrid; 60 | var 61 | Key: TScreenType; 62 | FRow: Integer; 63 | I: Integer; 64 | begin 65 | FRow := 0; 66 | strgridColumns.RowCount := FColumns.Count; 67 | 68 | for Key in FColumns.Keys do 69 | begin 70 | strgridColumns.Cells[0, FRow] := GetEnumName(TypeInfo(TScreenType), Integer(Key)); 71 | strgridColumns.Cells[1, FRow] := IntToStr(FColumns.Items[Key]); 72 | Inc(FRow); 73 | end; 74 | cboxScreenTypeChange(nil); 75 | end; 76 | 77 | procedure TGridSystemColumnDlg.Button3Click(Sender: TObject); 78 | var Id:Integer; 79 | begin 80 | if not FColumns.ContainsKey(TScreenType(GetEnumValue(TypeInfo(TScreenType), cboxScreenType.Items[cboxScreenType.ItemIndex]))) then 81 | begin 82 | FColumns.Add(TScreenType(GetEnumValue(TypeInfo(TScreenType), cboxScreenType.Items[cboxScreenType.ItemIndex])), Round(sboxColumnCount.Value)); 83 | strgridColumns.RowCount := strgridColumns.RowCount + 1; 84 | strgridColumns.Cells[0, strgridColumns.RowCount - 1] := cboxScreenType.Items[cboxScreenType.ItemIndex]; 85 | strgridColumns.Cells[1, strgridColumns.RowCount - 1] := Round(sboxColumnCount.Value).ToString; 86 | end 87 | else 88 | begin 89 | FColumns.Items[TScreenType(GetEnumValue(TypeInfo(TScreenType), cboxScreenType.Items[cboxScreenType.ItemIndex]))] := Round(sboxColumnCount.Value); 90 | BuildStrGrid;//TODO: change just specific row, for performance reasons (or not...) 91 | end; 92 | cboxScreenTypeChange(nil); 93 | end; 94 | 95 | procedure TGridSystemColumnDlg.Button4Click(Sender: TObject); 96 | begin 97 | if (strgridColumns.Selected >= 0) and (strgridColumns.Selected <= FColumns.Count) then 98 | begin 99 | FColumns.Remove(TScreenType(GetEnumValue(TypeInfo(TScreenType), strgridColumns.Cells[0, strgridColumns.Selected]))); 100 | BuildStrGrid; 101 | end; 102 | end; 103 | 104 | procedure TGridSystemColumnDlg.cboxScreenTypeChange(Sender: TObject); 105 | begin 106 | Button3.Text := 'Add'; 107 | if FColumns.ContainsKey(TScreenType(GetEnumValue(TypeInfo(TScreenType), cboxScreenType.Items[cboxScreenType.ItemIndex]))) then 108 | begin 109 | Button3.Text := 'Alter'; 110 | sboxColumnCount.Value := FColumns.Items[TScreenType(GetEnumValue(TypeInfo(TScreenType), cboxScreenType.Items[cboxScreenType.ItemIndex]))]; 111 | end; 112 | 113 | end; 114 | 115 | procedure TGridSystemColumnDlg.FormCreate(Sender: TObject); 116 | begin 117 | FColumns := TGSColumnsDictionary.Create; 118 | AddScreenTypeToComboBox; 119 | SetColumnWidthToSpinBox; 120 | cboxScreenTypeChange(nil); 121 | end; 122 | 123 | procedure TGridSystemColumnDlg.FormDestroy(Sender: TObject); 124 | begin 125 | FreeAndNil(FColumns); 126 | end; 127 | 128 | procedure TGridSystemColumnDlg.FormShow(Sender: TObject); 129 | begin 130 | BuildStrGrid; 131 | end; 132 | 133 | procedure TGridSystemColumnDlg.SetColumns(const Value: TGSColumnsDictionary); 134 | begin 135 | FColumns := Value; 136 | end; 137 | 138 | procedure TGridSystemColumnDlg.SetColumnWidthToSpinBox; 139 | begin 140 | sboxColumnCount.Min := Low(GSColumnWidth); 141 | sboxColumnCount.Max := High(GSColumnWidth); 142 | end; 143 | 144 | end. 145 | -------------------------------------------------------------------------------- /sample/Unit3.fmx: -------------------------------------------------------------------------------- 1 | object Form3: TForm3 2 | Left = 0 3 | Top = 0 4 | Caption = 'Form3' 5 | ClientHeight = 768 6 | ClientWidth = 1058 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object Text10: TText 12 | Align = Top 13 | Size.Width = 1058.000000000000000000 14 | Size.Height = 50.000000000000000000 15 | Size.PlatformDefault = False 16 | Text = 'Grid System' 17 | TextSettings.Font.Size = 20.000000000000000000 18 | TextSettings.Font.StyleExt = {00070000000000000004000000} 19 | TextSettings.FontColor = xFF616161 20 | end 21 | object VertScrollBox1: TVertScrollBox 22 | Align = Client 23 | Size.Width = 1058.000000000000000000 24 | Size.Height = 718.000000000000000000 25 | Size.PlatformDefault = False 26 | TabOrder = 2 27 | Viewport.Width = 1058.000000000000000000 28 | Viewport.Height = 718.000000000000000000 29 | object GSContainer1: TGSContainer 30 | Align = Top 31 | Size.Width = 1058.000000000000000000 32 | Size.Height = 152.000000000000000000 33 | Size.PlatformDefault = False 34 | TabOrder = 22 35 | MinHeight = 64.000000000000000000 36 | AutoHeight = True 37 | Sides = [] 38 | Corners = [] 39 | object GSRow1: TGSRow 40 | Align = Top 41 | HitTest = False 42 | Size.Width = 1058.000000000000000000 43 | Size.Height = 150.000000000000000000 44 | Size.PlatformDefault = False 45 | TabOrder = 0 46 | Justify = Left 47 | JustifyLastLine = Center 48 | FlowDirection = LeftToRight 49 | MinHeight = 50.000000000000000000 50 | AutoHeight = True 51 | Sides = [] 52 | Corners = [] 53 | object GSCol1: TGSCol 54 | Size.Width = 264.498992919921900000 55 | Size.Height = 50.000000000000000000 56 | Size.PlatformDefault = False 57 | TabOrder = 10 58 | MinHeight = 50.000000000000000000 59 | AutoHeight = False 60 | Fill.Color = xFFFFEBEE 61 | Fill.Kind = Solid 62 | Sides = [] 63 | Corners = [] 64 | DataColumns = { 65 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 66 | 4C617267653D330D0A} 67 | end 68 | object GSCol2: TGSCol 69 | Position.X = 264.498992919921900000 70 | Size.Width = 264.498992919921900000 71 | Size.Height = 50.000000000000000000 72 | Size.PlatformDefault = False 73 | TabOrder = 9 74 | MinHeight = 50.000000000000000000 75 | AutoHeight = False 76 | Fill.Color = xFFFFCDD2 77 | Fill.Kind = Solid 78 | Sides = [] 79 | Corners = [] 80 | DataColumns = { 81 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 82 | 4C617267653D330D0A} 83 | end 84 | object GSCol3: TGSCol 85 | Position.X = 528.997985839843800000 86 | Size.Width = 264.498992919921900000 87 | Size.Height = 50.000000000000000000 88 | Size.PlatformDefault = False 89 | TabOrder = 8 90 | MinHeight = 50.000000000000000000 91 | AutoHeight = False 92 | Fill.Color = xFFEF9A9A 93 | Fill.Kind = Solid 94 | Sides = [] 95 | Corners = [] 96 | DataColumns = { 97 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 98 | 4C617267653D330D0A} 99 | end 100 | object GSCol4: TGSCol 101 | Position.X = 793.496948242187500000 102 | Size.Width = 264.498992919921900000 103 | Size.Height = 50.000000000000000000 104 | Size.PlatformDefault = False 105 | TabOrder = 7 106 | MinHeight = 50.000000000000000000 107 | AutoHeight = False 108 | Fill.Color = xFFE57373 109 | Fill.Kind = Solid 110 | Sides = [] 111 | Corners = [] 112 | DataColumns = { 113 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 114 | 4C617267653D330D0A} 115 | end 116 | object GSCol5: TGSCol 117 | Position.Y = 50.000000000000000000 118 | Size.Width = 264.498992919921900000 119 | Size.Height = 50.000000000000000000 120 | Size.PlatformDefault = False 121 | TabOrder = 6 122 | MinHeight = 50.000000000000000000 123 | AutoHeight = False 124 | Fill.Color = xFFEF5350 125 | Fill.Kind = Solid 126 | Sides = [] 127 | Corners = [] 128 | DataColumns = { 129 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 130 | 4C617267653D330D0A} 131 | end 132 | object GSCol6: TGSCol 133 | Position.X = 264.498992919921900000 134 | Position.Y = 50.000000000000000000 135 | Size.Width = 264.498992919921900000 136 | Size.Height = 50.000000000000000000 137 | Size.PlatformDefault = False 138 | TabOrder = 5 139 | MinHeight = 50.000000000000000000 140 | AutoHeight = False 141 | Fill.Color = xFFF44336 142 | Fill.Kind = Solid 143 | Sides = [] 144 | Corners = [] 145 | DataColumns = { 146 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 147 | 4C617267653D330D0A} 148 | end 149 | object GSCol7: TGSCol 150 | Position.X = 528.997985839843800000 151 | Position.Y = 50.000000000000000000 152 | Size.Width = 264.498992919921900000 153 | Size.Height = 50.000000000000000000 154 | Size.PlatformDefault = False 155 | TabOrder = 4 156 | MinHeight = 50.000000000000000000 157 | AutoHeight = False 158 | Fill.Color = xFFD32F2F 159 | Fill.Kind = Solid 160 | Sides = [] 161 | Corners = [] 162 | DataColumns = { 163 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 164 | 4C617267653D330D0A} 165 | end 166 | object GSCol8: TGSCol 167 | Position.X = 793.496948242187500000 168 | Position.Y = 50.000000000000000000 169 | Size.Width = 264.498992919921900000 170 | Size.Height = 50.000000000000000000 171 | Size.PlatformDefault = False 172 | TabOrder = 3 173 | MinHeight = 50.000000000000000000 174 | AutoHeight = False 175 | Fill.Color = xFFC62828 176 | Fill.Kind = Solid 177 | Sides = [] 178 | Corners = [] 179 | DataColumns = { 180 | 53637265656E4578747261536D616C6C3D31320D0A53637265656E4578747261 181 | 4C617267653D330D0A} 182 | end 183 | object GSCol9: TGSCol 184 | Position.X = 132.251525878906300000 185 | Position.Y = 100.000000000000000000 186 | Size.Width = 264.498992919921900000 187 | Size.Height = 50.000000000000000000 188 | Size.PlatformDefault = False 189 | TabOrder = 2 190 | MinHeight = 50.000000000000000000 191 | AutoHeight = False 192 | Fill.Color = xFFFFC107 193 | Fill.Kind = Solid 194 | Sides = [] 195 | Corners = [] 196 | DataColumns = {53637265656E4578747261536D616C6C3D330D0A} 197 | end 198 | object GSCol10: TGSCol 199 | Position.X = 396.750518798828100000 200 | Position.Y = 100.000000000000000000 201 | Size.Width = 264.498992919921900000 202 | Size.Height = 50.000000000000000000 203 | Size.PlatformDefault = False 204 | TabOrder = 1 205 | MinHeight = 50.000000000000000000 206 | AutoHeight = False 207 | Fill.Color = xFF2196F3 208 | Fill.Kind = Solid 209 | Sides = [] 210 | Corners = [] 211 | DataColumns = {53637265656E4578747261536D616C6C3D330D0A} 212 | end 213 | object GSCol11: TGSCol 214 | Position.X = 661.249511718750000000 215 | Position.Y = 100.000000000000000000 216 | Size.Width = 264.498992919921900000 217 | Size.Height = 50.000000000000000000 218 | Size.PlatformDefault = False 219 | TabOrder = 0 220 | MinHeight = 50.000000000000000000 221 | AutoHeight = False 222 | Fill.Color = xFF009688 223 | Fill.Kind = Solid 224 | Sides = [] 225 | Corners = [] 226 | DataColumns = {53637265656E4578747261536D616C6C3D330D0A} 227 | end 228 | end 229 | end 230 | end 231 | end 232 | -------------------------------------------------------------------------------- /src/GridSystem.pas: -------------------------------------------------------------------------------- 1 | unit GridSystem; 2 | 3 | interface 4 | 5 | uses 6 | FMX.Dialogs, System.SysUtils, System.Types, FMX.Graphics, System.Classes, System.Generics.Collections, FMX.Types, FMX.Controls, FMX.Layouts, 7 | GridSystem.Types, 8 | System.TypInfo; 9 | 10 | type 11 | 12 | TGSLayout = class(TLayout) 13 | private 14 | { private declarations } 15 | FMinHeight: Single; 16 | FAutoHeight: Boolean; 17 | FFill: TBrush; 18 | FSides: TSides; 19 | FXRadius: Single; 20 | FYRadius: Single; 21 | FCorners: TCorners; 22 | FCornerType: TCornerType; 23 | function IsSidesStored: Boolean; 24 | procedure SetMinHeight(const Value: Single); 25 | function GetMinHeight: Single; 26 | procedure SetAutoHeight(const Value: Boolean); 27 | procedure SetFill(const Value: TBrush); 28 | procedure SetSides(const Value: TSides); 29 | procedure SetXRadius(const Value: Single); 30 | procedure SetYRadius(const Value: Single); 31 | procedure SetCorners(const Value: TCorners); 32 | procedure SetCornerType(const Value: TCornerType); 33 | protected 34 | { protected declarations } 35 | procedure DoFillChange(Sender: TObject); 36 | procedure Paint; override; 37 | function CalcNewHeight: Single; 38 | procedure DoRealign; override; 39 | procedure Resize; override; 40 | public 41 | { public declarations } 42 | constructor Create(AOwner: TComponent); override; 43 | destructor Destroy; override; 44 | published 45 | { published declarations } 46 | property MinHeight: Single read GetMinHeight write FMinHeight; 47 | property AutoHeight: Boolean read FAutoHeight write SetAutoHeight; 48 | property Fill: TBrush read FFill write SetFill; 49 | property Sides: TSides read FSides write SetSides stored IsSidesStored; 50 | property XRadius: Single read FXRadius write SetXRadius; 51 | property YRadius: Single read FYRadius write SetYRadius; 52 | property Corners: TCorners read FCorners write SetCorners; 53 | property CornerType: TCornerType read FCornerType write SetCornerType default TCornerType.Round; 54 | end; 55 | 56 | TGSFlowLayout = class(TFlowLayout) 57 | private 58 | { private declarations } 59 | FMinHeight: Single; 60 | FAutoHeight: Boolean; 61 | FFill: TBrush; 62 | FCornerType: TCornerType; 63 | FCorners: TCorners; 64 | FSides: TSides; 65 | FXRadius: Single; 66 | FYRadius: Single; 67 | function IsSidesStored: Boolean; 68 | procedure SetMinHeight(const Value: Single); 69 | function GetMinHeight: Single; 70 | procedure SetAutoHeight(const Value: Boolean); 71 | procedure SetFill(const Value: TBrush); 72 | procedure SetCorners(const Value: TCorners); 73 | procedure SetCornerType(const Value: TCornerType); 74 | procedure SetSides(const Value: TSides); 75 | procedure SetXRadius(const Value: Single); 76 | procedure SetYRadius(const Value: Single); 77 | protected 78 | { protected declarations } 79 | procedure Paint; override; 80 | function CalcNewHeight: Single; 81 | procedure DoRealign; override; 82 | procedure Resize; override; 83 | public 84 | { public declarations } 85 | constructor Create(AOwner: TComponent); override; 86 | destructor Destroy; override; 87 | published 88 | { published declarations } 89 | property MinHeight: Single read GetMinHeight write FMinHeight; 90 | property AutoHeight: Boolean read FAutoHeight write SetAutoHeight; 91 | property Fill: TBrush read FFill write SetFill; 92 | property Sides: TSides read FSides write SetSides stored IsSidesStored; 93 | property XRadius: Single read FXRadius write SetXRadius; 94 | property YRadius: Single read FYRadius write SetYRadius; 95 | property Corners: TCorners read FCorners write SetCorners; 96 | property CornerType: TCornerType read FCornerType write SetCornerType default TCornerType.Round; 97 | end; 98 | 99 | TGSContainer = class(TGSLayout, IGSContainer) 100 | private 101 | { private declarations } 102 | protected 103 | { protected declarations } 104 | function GetScreenType: TScreenType; 105 | public 106 | { public declarations } 107 | constructor Create(AOwner: TComponent); override; 108 | destructor Destroy; override; 109 | published 110 | { published declarations } 111 | property ScreenType: TScreenType read GetScreenType; 112 | end; 113 | 114 | TGSRow = class(TGSFlowLayout, IGSRow) 115 | private 116 | { private declarations } 117 | protected 118 | { protected declarations } 119 | public 120 | { public declarations } 121 | published 122 | { published declarations } 123 | end; 124 | 125 | TGSCol = class(TGSLayout, IGSCol) 126 | private 127 | { private declarations } 128 | FColumns: TGSColumnsDictionary; 129 | procedure SetColumns(const Value: TGSColumnsDictionary); 130 | function GetColumns: TGSColumnsDictionary; 131 | procedure DoValueNotify(Sender: TObject; const Item: GSColumnWidth; Action: TCollectionNotification); 132 | protected 133 | { protected declarations } 134 | procedure DoRealign; override; 135 | procedure SetWidthByColumn; 136 | procedure LoadCompProperty(Stream: TStream); 137 | procedure StoreCompProperty(Stream: TStream); 138 | procedure DefineProperties(Filer: TFiler); override; 139 | public 140 | { public declarations } 141 | constructor Create(AOwner: TComponent); override; 142 | destructor Destroy; override; 143 | published 144 | { published declarations } 145 | property Columns: TGSColumnsDictionary read GetColumns write SetColumns; 146 | end; 147 | 148 | implementation 149 | 150 | { TGSContainer } 151 | 152 | constructor TGSContainer.Create(AOwner: TComponent); 153 | begin 154 | inherited; 155 | 156 | end; 157 | 158 | destructor TGSContainer.Destroy; 159 | begin 160 | 161 | inherited; 162 | end; 163 | 164 | function TGSContainer.GetScreenType: TScreenType; 165 | begin 166 | Result := TScreenType.ScreenExtraSmall; 167 | 168 | if Width >= 576 then 169 | Result := TScreenType.ScreenSmall; 170 | 171 | if Width >= 768 then 172 | Result := TScreenType.ScreenMedium; 173 | 174 | if Width >= 992 then 175 | Result := TScreenType.ScreenLarge; 176 | 177 | if Width >= 1200 then 178 | Result := TScreenType.ScreenExtraLarge; 179 | end; 180 | 181 | { TGSCol } 182 | 183 | constructor TGSCol.Create(AOwner: TComponent); 184 | begin 185 | inherited; 186 | FColumns := TGSColumnsDictionary.Create; 187 | FColumns.OnValueNotify := DoValueNotify; 188 | end; 189 | 190 | procedure TGSCol.DefineProperties(Filer: TFiler); 191 | function DoWrite: Boolean; 192 | begin 193 | if Filer.Ancestor <> nil then 194 | begin 195 | Result := True; 196 | if Filer.Ancestor is TGSCol then 197 | begin 198 | Result := True; // not Equals(TGSCol(Filer.Ancestor)); 199 | end 200 | end 201 | else 202 | Result := Columns.Count > 0; 203 | end; 204 | 205 | begin 206 | inherited; 207 | Filer.DefineBinaryProperty('DataColumns', LoadCompProperty, StoreCompProperty, DoWrite); 208 | end; 209 | 210 | destructor TGSCol.Destroy; 211 | begin 212 | FColumns.Clear; 213 | FColumns.Free; 214 | inherited; 215 | end; 216 | 217 | procedure TGSCol.DoRealign; 218 | begin 219 | inherited; 220 | SetWidthByColumn; 221 | end; 222 | 223 | procedure TGSCol.DoValueNotify(Sender: TObject; const Item: GSColumnWidth; Action: TCollectionNotification); 224 | begin 225 | SetWidthByColumn; 226 | Realign; 227 | end; 228 | 229 | function TGSCol.GetColumns: TGSColumnsDictionary; 230 | begin 231 | Result := FColumns; 232 | end; 233 | 234 | procedure TGSCol.LoadCompProperty(Stream: TStream); 235 | var 236 | LStringList: TStringList; 237 | LStrCount: Integer; 238 | begin 239 | LStringList := TStringList.Create; 240 | try 241 | LStringList.LoadFromStream(Stream); 242 | Columns.Clear; 243 | for LStrCount := 0 to LStringList.Count - 1 do 244 | begin 245 | Columns.Add(TScreenType(GetEnumValue(TypeInfo(TScreenType), LStringList.Names[LStrCount])), 246 | LStringList.Values[LStringList.Names[LStrCount]].ToInteger); 247 | end; 248 | SetWidthByColumn; 249 | Realign; 250 | finally 251 | FreeAndNil(LStringList); 252 | end; 253 | end; 254 | 255 | procedure TGSCol.SetColumns(const Value: TGSColumnsDictionary); 256 | begin 257 | FColumns := Value; 258 | end; 259 | 260 | procedure TGSCol.SetWidthByColumn; 261 | var 262 | LGSRow: TGSRow; 263 | LGSContainer: TGSContainer; 264 | LColumnsCount: Integer; 265 | LNewWidth: Single; 266 | LColumnWidth: GSColumnWidth; 267 | begin 268 | if Supports(Parent, IGSRow) then 269 | begin 270 | LGSRow := Parent as TGSRow; 271 | if Supports(LGSRow.Parent, IGSContainer) then 272 | begin 273 | LGSContainer := LGSRow.Parent as TGSContainer; 274 | LNewWidth := TControl(LGSContainer).Width - Margins.Left - Margins.Right - 0.001; 275 | if Columns.ContainsKey(LGSContainer.ScreenType) then 276 | begin 277 | LNewWidth := TControl(LGSContainer).Width * Columns.Items[LGSContainer.ScreenType] / High(GSColumnWidth) - Margins.Left - 278 | Margins.Right - 0.001; 279 | end 280 | else 281 | begin 282 | for LColumnsCount := 0 to Integer(High(TScreenType)) do 283 | begin 284 | if Columns.TryGetValue(TScreenType(LColumnsCount), LColumnWidth) then 285 | begin 286 | LNewWidth := TControl(LGSContainer).Width * LColumnWidth / High(GSColumnWidth) - Margins.Left - Margins.Right - 0.001; 287 | end; 288 | if LGSContainer.ScreenType < TScreenType(LColumnsCount) then 289 | Break; 290 | end; 291 | end; 292 | Width := LNewWidth; 293 | end; 294 | end; 295 | end; 296 | 297 | procedure TGSCol.StoreCompProperty(Stream: TStream); 298 | var 299 | LKey: TScreenType; 300 | LStrList: TStringList; 301 | begin 302 | if Columns <> nil then 303 | begin 304 | LStrList := TStringList.Create; 305 | try 306 | for LKey in FColumns.Keys do 307 | begin 308 | LStrList.AddPair(GetEnumName(TypeInfo(TScreenType), Integer(LKey)), IntToStr(Columns.Items[LKey])); 309 | end; 310 | finally 311 | LStrList.SaveToStream(Stream); 312 | FreeAndNil(LStrList); 313 | SetWidthByColumn; 314 | Realign; 315 | end; 316 | end; 317 | end; 318 | 319 | { TGSLayout } 320 | 321 | function TGSLayout.CalcNewHeight: Single; 322 | function MaxBottomControl(Control: TControl): Single; 323 | begin 324 | if Control.Visible then 325 | Result := Control.Position.Y + Control.Height + Control.Margins.Bottom + TControl(Control.Parent).Padding.Bottom 326 | else 327 | Result := 0; 328 | end; 329 | 330 | var 331 | LControlsCount: Integer; 332 | LNewHeight: Single; 333 | begin 334 | LNewHeight := FMinHeight; 335 | for LControlsCount := 0 to ControlsCount - 1 do 336 | begin 337 | if MaxBottomControl(Controls[LControlsCount]) > LNewHeight then 338 | LNewHeight := MaxBottomControl(Controls[LControlsCount]); 339 | end; 340 | Result := LNewHeight; 341 | end; 342 | 343 | constructor TGSLayout.Create(AOwner: TComponent); 344 | begin 345 | inherited; 346 | CanParentFocus := True; 347 | HitTest := False; 348 | FMinHeight := 50; 349 | FFill := TBrush.Create(TBrushKind.None, $FFFFFFFF); 350 | FFill.OnChanged:= DoFillChange; 351 | end; 352 | 353 | destructor TGSLayout.Destroy; 354 | begin 355 | FreeAndNil(FFill); 356 | inherited; 357 | end; 358 | 359 | procedure TGSLayout.DoFillChange(Sender: TObject); 360 | begin 361 | Repaint; 362 | end; 363 | 364 | procedure TGSLayout.DoRealign; 365 | begin 366 | inherited; 367 | if FAutoHeight then 368 | Self.Height := CalcNewHeight; 369 | end; 370 | 371 | function TGSLayout.GetMinHeight: Single; 372 | begin 373 | Result := FMinHeight; 374 | end; 375 | 376 | function TGSLayout.IsSidesStored: Boolean; 377 | begin 378 | Result := FSides * AllSides <> AllSides 379 | end; 380 | 381 | procedure TGSLayout.Paint; 382 | var 383 | LShapeRect: TRectF; 384 | LOff: Single; 385 | begin 386 | inherited; 387 | try 388 | LShapeRect := TRectF.Create(0, 0, Width, Height); 389 | if Sides <> AllSides then 390 | begin 391 | LOff := LShapeRect.Left; 392 | if not(TSide.Top in FSides) then 393 | LShapeRect.Top := LShapeRect.Top - LOff; 394 | if not(TSide.Left in FSides) then 395 | LShapeRect.Left := LShapeRect.Left - LOff; 396 | if not(TSide.Bottom in FSides) then 397 | LShapeRect.Bottom := LShapeRect.Bottom + LOff; 398 | if not(TSide.Right in FSides) then 399 | LShapeRect.Right := LShapeRect.Right + LOff; 400 | Canvas.FillRect(LShapeRect, XRadius, YRadius, FCorners, AbsoluteOpacity, FFill, CornerType); 401 | end 402 | else 403 | begin 404 | Canvas.FillRect(LShapeRect, XRadius, YRadius, FCorners, AbsoluteOpacity, FFill, CornerType); 405 | end; 406 | finally 407 | 408 | end; 409 | end; 410 | 411 | procedure TGSLayout.Resize; 412 | begin 413 | inherited; 414 | Realign; 415 | end; 416 | 417 | procedure TGSLayout.SetAutoHeight(const Value: Boolean); 418 | begin 419 | FAutoHeight := Value; 420 | end; 421 | 422 | procedure TGSLayout.SetCorners(const Value: TCorners); 423 | begin 424 | FCorners := Value; 425 | end; 426 | 427 | procedure TGSLayout.SetCornerType(const Value: TCornerType); 428 | begin 429 | FCornerType := Value; 430 | end; 431 | 432 | procedure TGSLayout.SetFill(const Value: TBrush); 433 | begin 434 | FFill := Value; 435 | end; 436 | 437 | procedure TGSLayout.SetMinHeight(const Value: Single); 438 | begin 439 | FMinHeight := Value; 440 | end; 441 | 442 | procedure TGSLayout.SetSides(const Value: TSides); 443 | begin 444 | FSides := Value; 445 | end; 446 | 447 | procedure TGSLayout.SetXRadius(const Value: Single); 448 | begin 449 | FXRadius := Value; 450 | end; 451 | 452 | procedure TGSLayout.SetYRadius(const Value: Single); 453 | begin 454 | FYRadius := Value; 455 | end; 456 | 457 | { TGSFlowLayout } 458 | 459 | function TGSFlowLayout.CalcNewHeight: Single; 460 | function MaxBottomControl(Control: TControl): Single; 461 | begin 462 | if Control.Visible then 463 | Result := Control.Position.Y + Control.Height + Control.Margins.Bottom + TControl(Control.Parent).Padding.Bottom 464 | else 465 | Result := 0; 466 | end; 467 | 468 | var 469 | LControlsCount: Integer; 470 | LNewHeight: Single; 471 | begin 472 | LNewHeight := FMinHeight; 473 | 474 | for LControlsCount := 0 to ControlsCount - 1 do 475 | begin 476 | if MaxBottomControl(Controls[LControlsCount]) > LNewHeight then 477 | LNewHeight := MaxBottomControl(Controls[LControlsCount]); 478 | end; 479 | Result := LNewHeight; 480 | end; 481 | 482 | constructor TGSFlowLayout.Create(AOwner: TComponent); 483 | begin 484 | inherited; 485 | CanParentFocus := True; 486 | HitTest := False; 487 | FMinHeight := 50; 488 | FFill := TBrush.Create(TBrushKind.None, $FFFFFFFF); 489 | end; 490 | 491 | destructor TGSFlowLayout.Destroy; 492 | begin 493 | FreeAndNil(FFill); 494 | inherited; 495 | end; 496 | 497 | procedure TGSFlowLayout.DoRealign; 498 | begin 499 | inherited; 500 | if FAutoHeight then 501 | Height := CalcNewHeight; 502 | end; 503 | 504 | function TGSFlowLayout.GetMinHeight: Single; 505 | begin 506 | Result := FMinHeight 507 | end; 508 | 509 | function TGSFlowLayout.IsSidesStored: Boolean; 510 | begin 511 | Result := FSides * AllSides <> AllSides 512 | end; 513 | 514 | procedure TGSFlowLayout.Paint; 515 | var 516 | LShapeRect: TRectF; 517 | LOff: Single; 518 | begin 519 | inherited; 520 | try 521 | LShapeRect := TRectF.Create(0, 0, Width, Height); 522 | if Sides <> AllSides then 523 | begin 524 | LOff := LShapeRect.Left; 525 | if not(TSide.Top in FSides) then 526 | LShapeRect.Top := LShapeRect.Top - LOff; 527 | if not(TSide.Left in FSides) then 528 | LShapeRect.Left := LShapeRect.Left - LOff; 529 | if not(TSide.Bottom in FSides) then 530 | LShapeRect.Bottom := LShapeRect.Bottom + LOff; 531 | if not(TSide.Right in FSides) then 532 | LShapeRect.Right := LShapeRect.Right + LOff; 533 | Canvas.FillRect(LShapeRect, XRadius, YRadius, FCorners, AbsoluteOpacity, FFill, CornerType); 534 | end 535 | else 536 | begin 537 | Canvas.FillRect(LShapeRect, XRadius, YRadius, FCorners, AbsoluteOpacity, FFill, CornerType); 538 | end; 539 | finally 540 | 541 | end; 542 | end; 543 | 544 | procedure TGSFlowLayout.Resize; 545 | var 546 | LControlsCount: Integer; 547 | begin 548 | inherited; 549 | for LControlsCount := 0 to ControlsCount - 1 do 550 | begin 551 | if Supports(Controls[LControlsCount], IGSCol) then 552 | begin 553 | TGSCol(Controls[LControlsCount]).Realign; 554 | end; 555 | end; 556 | Realign; 557 | end; 558 | 559 | procedure TGSFlowLayout.SetAutoHeight(const Value: Boolean); 560 | begin 561 | FAutoHeight := Value; 562 | end; 563 | 564 | procedure TGSFlowLayout.SetCorners(const Value: TCorners); 565 | begin 566 | FCorners := Value; 567 | end; 568 | 569 | procedure TGSFlowLayout.SetCornerType(const Value: TCornerType); 570 | begin 571 | FCornerType := Value; 572 | end; 573 | 574 | procedure TGSFlowLayout.SetFill(const Value: TBrush); 575 | begin 576 | FFill := Value; 577 | end; 578 | 579 | procedure TGSFlowLayout.SetMinHeight(const Value: Single); 580 | begin 581 | FMinHeight := Value; 582 | end; 583 | 584 | procedure TGSFlowLayout.SetSides(const Value: TSides); 585 | begin 586 | FSides := Value; 587 | end; 588 | 589 | procedure TGSFlowLayout.SetXRadius(const Value: Single); 590 | begin 591 | FXRadius := Value; 592 | end; 593 | 594 | procedure TGSFlowLayout.SetYRadius(const Value: Single); 595 | begin 596 | FYRadius := Value; 597 | end; 598 | 599 | end. 600 | -------------------------------------------------------------------------------- /GridSystem.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {D47FBF31-1FA0-4BEC-8774-2A515E7F8A50} 4 | GridSystem.dpk 5 | 18.3 6 | FMX 7 | True 8 | Debug 9 | Win32 10 | 1111 11 | Package 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 | Base 54 | true 55 | 56 | 57 | true 58 | Base 59 | true 60 | 61 | 62 | true 63 | Cfg_1 64 | true 65 | true 66 | 67 | 68 | true 69 | Base 70 | true 71 | 72 | 73 | .\$(Platform)\$(Config) 74 | .\$(Platform)\$(Config) 75 | false 76 | false 77 | false 78 | false 79 | false 80 | true 81 | true 82 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 83 | All 84 | GridSystem 85 | 86 | 87 | None 88 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services.dex.jar 89 | rtl;fmx;$(DCC_UsePackage) 90 | 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= 91 | Debug 92 | 93 | 94 | None 95 | rtl;fmx;$(DCC_UsePackage) 96 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera 97 | iPhoneAndiPad 98 | true 99 | Debug 100 | $(MSBuildProjectName) 101 | 102 | 103 | None 104 | rtl;fmx;$(DCC_UsePackage) 105 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera 106 | iPhoneAndiPad 107 | true 108 | Debug 109 | $(MSBuildProjectName) 110 | 111 | 112 | None 113 | rtl;fmx;$(DCC_UsePackage) 114 | 115 | 116 | rtl;$(DCC_UsePackage) 117 | 118 | 119 | rtl;fmx;$(DCC_UsePackage) 120 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts 121 | Debug 122 | 123 | 124 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 125 | Debug 126 | true 127 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 128 | 1033 129 | rtl;fmx;$(DCC_UsePackage) 130 | 131 | 132 | rtl;fmx;$(DCC_UsePackage) 133 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 134 | Debug 135 | true 136 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 137 | 1033 138 | 139 | 140 | DEBUG;$(DCC_Define) 141 | true 142 | false 143 | true 144 | true 145 | true 146 | 147 | 148 | false 149 | 150 | 151 | false 152 | RELEASE;$(DCC_Define) 153 | 0 154 | 0 155 | 156 | 157 | 158 | MainSource 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 |
GridSystemColumnDlg
167 | fmx 168 |
169 | 170 | 171 | 172 | Cfg_2 173 | Base 174 | 175 | 176 | Base 177 | 178 | 179 | Cfg_1 180 | Base 181 | 182 |
183 | 184 | Delphi.Personality.12 185 | Package 186 | 187 | 188 | 189 | GridSystem.dpk 190 | 191 | 192 | 193 | 194 | 195 | true 196 | 197 | 198 | 199 | 200 | true 201 | 202 | 203 | 204 | 205 | true 206 | 207 | 208 | 209 | 210 | true 211 | 212 | 213 | 214 | 215 | GridSystem.bpl 216 | true 217 | 218 | 219 | 220 | 221 | 1 222 | 223 | 224 | Contents\MacOS 225 | 0 226 | 227 | 228 | 229 | 230 | classes 231 | 1 232 | 233 | 234 | 235 | 236 | library\lib\armeabi-v7a 237 | 1 238 | 239 | 240 | 241 | 242 | library\lib\armeabi 243 | 1 244 | 245 | 246 | 247 | 248 | library\lib\mips 249 | 1 250 | 251 | 252 | 253 | 254 | library\lib\armeabi-v7a 255 | 1 256 | 257 | 258 | 259 | 260 | res\drawable 261 | 1 262 | 263 | 264 | 265 | 266 | res\values 267 | 1 268 | 269 | 270 | 271 | 272 | res\drawable 273 | 1 274 | 275 | 276 | 277 | 278 | res\drawable-xxhdpi 279 | 1 280 | 281 | 282 | 283 | 284 | res\drawable-ldpi 285 | 1 286 | 287 | 288 | 289 | 290 | res\drawable-mdpi 291 | 1 292 | 293 | 294 | 295 | 296 | res\drawable-hdpi 297 | 1 298 | 299 | 300 | 301 | 302 | res\drawable-xhdpi 303 | 1 304 | 305 | 306 | 307 | 308 | res\drawable-small 309 | 1 310 | 311 | 312 | 313 | 314 | res\drawable-normal 315 | 1 316 | 317 | 318 | 319 | 320 | res\drawable-large 321 | 1 322 | 323 | 324 | 325 | 326 | res\drawable-xlarge 327 | 1 328 | 329 | 330 | 331 | 332 | 1 333 | 334 | 335 | 1 336 | 337 | 338 | 0 339 | 340 | 341 | 342 | 343 | 1 344 | .framework 345 | 346 | 347 | 0 348 | 349 | 350 | 351 | 352 | 1 353 | .dylib 354 | 355 | 356 | 0 357 | .dll;.bpl 358 | 359 | 360 | 361 | 362 | 1 363 | .dylib 364 | 365 | 366 | 1 367 | .dylib 368 | 369 | 370 | 1 371 | .dylib 372 | 373 | 374 | 1 375 | .dylib 376 | 377 | 378 | 0 379 | .bpl 380 | 381 | 382 | 383 | 384 | 0 385 | 386 | 387 | 0 388 | 389 | 390 | 0 391 | 392 | 393 | 0 394 | 395 | 396 | 0 397 | 398 | 399 | 0 400 | 401 | 402 | 403 | 404 | 1 405 | 406 | 407 | 1 408 | 409 | 410 | 1 411 | 412 | 413 | 414 | 415 | 1 416 | 417 | 418 | 1 419 | 420 | 421 | 1 422 | 423 | 424 | 425 | 426 | 1 427 | 428 | 429 | 1 430 | 431 | 432 | 1 433 | 434 | 435 | 436 | 437 | 1 438 | 439 | 440 | 1 441 | 442 | 443 | 1 444 | 445 | 446 | 447 | 448 | 1 449 | 450 | 451 | 1 452 | 453 | 454 | 1 455 | 456 | 457 | 458 | 459 | 1 460 | 461 | 462 | 1 463 | 464 | 465 | 1 466 | 467 | 468 | 469 | 470 | 1 471 | 472 | 473 | 1 474 | 475 | 476 | 1 477 | 478 | 479 | 480 | 481 | 1 482 | 483 | 484 | 485 | 486 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 487 | 1 488 | 489 | 490 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 491 | 1 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 1 500 | 501 | 502 | 1 503 | 504 | 505 | 1 506 | 507 | 508 | 509 | 510 | 511 | 512 | Contents\Resources 513 | 1 514 | 515 | 516 | 517 | 518 | library\lib\armeabi-v7a 519 | 1 520 | 521 | 522 | 1 523 | 524 | 525 | 1 526 | 527 | 528 | 1 529 | 530 | 531 | 1 532 | 533 | 534 | 1 535 | 536 | 537 | 0 538 | 539 | 540 | 541 | 542 | 1 543 | 544 | 545 | 1 546 | 547 | 548 | 549 | 550 | Assets 551 | 1 552 | 553 | 554 | Assets 555 | 1 556 | 557 | 558 | 559 | 560 | Assets 561 | 1 562 | 563 | 564 | Assets 565 | 1 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | True 579 | True 580 | True 581 | False 582 | False 583 | True 584 | True 585 | True 586 | 587 | 588 | 12 589 | 590 | 591 | 592 | 593 |
594 | -------------------------------------------------------------------------------- /sample/Project1.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {1680EB06-92F3-4E44-BE4D-4C948E2CC32C} 4 | 18.4 5 | FMX 6 | Project1.dpr 7 | True 8 | Debug 9 | Win32 10 | 1 11 | Application 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 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Cfg_1 65 | true 66 | true 67 | 68 | 69 | true 70 | Base 71 | true 72 | 73 | 74 | true 75 | Cfg_2 76 | true 77 | true 78 | 79 | 80 | true 81 | Cfg_2 82 | true 83 | true 84 | 85 | 86 | .\$(Platform)\$(Config) 87 | .\$(Platform)\$(Config) 88 | false 89 | false 90 | false 91 | false 92 | false 93 | RESTComponents;emsclientfiredac;DataSnapFireDAC;FireDACIBDriver;emsclient;FireDACCommon;RESTBackendComponents;soapserver;CloudService;FireDACCommonDriver;inet;FireDAC;FireDACSqliteDriver;soaprtl;soapmidas;$(DCC_UsePackage) 94 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 95 | true 96 | true 97 | true 98 | true 99 | true 100 | true 101 | true 102 | true 103 | true 104 | true 105 | $(BDS)\bin\delphi_PROJECTICON.ico 106 | $(BDS)\bin\delphi_PROJECTICNS.icns 107 | Project1 108 | 109 | 110 | DBXSqliteDriver;DBXInterBaseDriver;tethering;bindcompfmx;FmxTeeUI;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;bindengine;DataSnapClient;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;ibmonitor;FMXTee;DbxCommonDriver;ibxpress;xmlrtl;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;StartsRating;bindcomp;fgx;IndyIPClient;GridSystem;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;WindowsToast;$(DCC_UsePackage) 111 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 112 | Debug 113 | true 114 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 115 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 116 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 117 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 118 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 119 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 120 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 121 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 122 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 123 | android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-gcm-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar 124 | 125 | 126 | DBXSqliteDriver;DBXInterBaseDriver;tethering;bindcompfmx;FmxTeeUI;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;bindengine;DataSnapClient;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;ibmonitor;FMXTee;DbxCommonDriver;ibxpress;xmlrtl;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;StartsRating;bindcomp;fgx;IndyIPClient;GridSystem;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;WindowsToast;fmxase;$(DCC_UsePackage) 127 | 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;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera 128 | iPhoneAndiPad 129 | true 130 | Debug 131 | $(MSBuildProjectName) 132 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png 133 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 134 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png 135 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png 136 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 137 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 138 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png 139 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png 140 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png 141 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png 142 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png 143 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png 144 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1125x2436.png 145 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2436x1125.png 146 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png 147 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 148 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png 149 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 150 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png 151 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 152 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png 153 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 154 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png 155 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 156 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png 157 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 158 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png 159 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 160 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png 161 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 162 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 163 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png 164 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 165 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png 166 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png 167 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 168 | 169 | 170 | DBXSqliteDriver;DBXInterBaseDriver;tethering;bindcompfmx;FmxTeeUI;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;bindengine;DataSnapClient;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;ibmonitor;FMXTee;DbxCommonDriver;ibxpress;xmlrtl;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;StartsRating;bindcomp;IndyIPClient;GridSystem;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;WindowsToast;fmxase;$(DCC_UsePackage) 171 | 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;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera 172 | iPhoneAndiPad 173 | true 174 | Debug 175 | $(MSBuildProjectName) 176 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png 177 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 178 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png 179 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.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_320x480.png 183 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png 184 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png 185 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png 186 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png 187 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png 188 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1125x2436.png 189 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2436x1125.png 190 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png 191 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 192 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png 193 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 194 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png 195 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 196 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png 197 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 198 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png 199 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 200 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png 201 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 202 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png 203 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 204 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png 205 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 206 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 207 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png 208 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 209 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png 210 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png 211 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 212 | 213 | 214 | DBXSqliteDriver;DBXInterBaseDriver;tethering;bindcompfmx;FmxTeeUI;fmx;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;bindengine;DataSnapClient;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;ibmonitor;FMXTee;DbxCommonDriver;ibxpress;xmlrtl;DataSnapNativeClient;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;CustomIPTransport;StartsRating;bindcomp;fgx;IndyIPClient;dbxcds;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;WindowsToast;fmxase;$(DCC_UsePackage) 215 | 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;CFBundleResourceSpecification=ResourceRules.plist;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;FMLocalNotificationPermission=false;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSCameraUsageDescription=The reason for accessing the camera 216 | iPhoneAndiPad 217 | true 218 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_57x57.png 219 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_60x60.png 220 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png 221 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_114x114.png 222 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 223 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 224 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_320x480.png 225 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x960.png 226 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_640x1136.png 227 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png 228 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png 229 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png 230 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_1125x2436.png 231 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2436x1125.png 232 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_29x29.png 233 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png 234 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_58x58.png 235 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 236 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_72x72.png 237 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_76x76.png 238 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_144x144.png 239 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 240 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1004.png 241 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_768x1024.png 242 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x748.png 243 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_1024x768.png 244 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2008.png 245 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png 246 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1496.png 247 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageLandscape_2048x1536.png 248 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_40x40.png 249 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_50x50.png 250 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 251 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_100x100.png 252 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_29x29.png 253 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 254 | 255 | 256 | DBXSqliteDriver;DataSnapServerMidas;DBXInterBaseDriver;tethering;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;IndyIPServer;IndySystem;fmxFireDAC;emshosting;FireDACPgDriver;ibmonitor;FireDACASADriver;FireDACTDataDriver;FMXTee;DbxCommonDriver;ibxpress;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;StartsRating;bindcomp;fgx;DBXInformixDriver;IndyIPClient;GridSystem;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;ArcProgress;WindowsToast;fmxase;$(DCC_UsePackage) 257 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts 258 | Debug 259 | true 260 | 261 | 262 | DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;svnui;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;emshosting;MaterialDesign;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;DbxCommonDriver;pkgJPD;ibxpress;Tee;SchedPkg;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;StartsRating;bindcomp;appanalytics;fgx;DBXInformixDriver;pkgOdonto;IndyIPClient;bindcompvcl;GridSystem;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;ArcProgress;WindowsToast;fmxase;$(DCC_UsePackage) 263 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 264 | Debug 265 | true 266 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 267 | 1033 268 | $(BDS)\bin\default_app.manifest 269 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 270 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 271 | 272 | 273 | DBXSqliteDriver;DataSnapServerMidas;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;tethering;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;Intraweb;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;fmxdae;vclib;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;DataSnapCommon;DataSnapConnectors;VCLRESTComponents;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;bindcompdbx;IndyIPCommon;vcl;DBXSybaseASEDriver;IndyIPServer;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;emshosting;MaterialDesign;FireDACPgDriver;ibmonitor;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;DbxCommonDriver;ibxpress;Tee;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;ibxbindings;rtl;FireDACDSDriver;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;StartsRating;bindcomp;appanalytics;fgx;DBXInformixDriver;IndyIPClient;bindcompvcl;GridSystem;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;inetdbxpress;FireDACMongoDBDriver;IndyProtocols;ArcProgress;WindowsToast;fmxase;$(DCC_UsePackage) 274 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 275 | Debug 276 | true 277 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 278 | 1033 279 | $(BDS)\bin\default_app.manifest 280 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 281 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 282 | 283 | 284 | DEBUG;$(DCC_Define) 285 | true 286 | false 287 | true 288 | true 289 | true 290 | 291 | 292 | false 293 | true 294 | true 295 | 296 | 297 | true 298 | true 299 | 300 | 301 | false 302 | RELEASE;$(DCC_Define) 303 | 0 304 | 0 305 | 306 | 307 | true 308 | true 309 | 310 | 311 | true 312 | true 313 | 314 | 315 | 316 | MainSource 317 | 318 | 319 |
Form3
320 | fmx 321 |
322 | 323 | Cfg_2 324 | Base 325 | 326 | 327 | Base 328 | 329 | 330 | Cfg_1 331 | Base 332 | 333 |
334 | 335 | Delphi.Personality.12 336 | Application 337 | 338 | 339 | 340 | Project1.dpr 341 | 342 | 343 | 344 | 345 | 346 | true 347 | 348 | 349 | 350 | 351 | true 352 | 353 | 354 | 355 | 356 | true 357 | 358 | 359 | 360 | 361 | true 362 | 363 | 364 | 365 | 366 | Project1.exe 367 | true 368 | 369 | 370 | 371 | 372 | 1 373 | 374 | 375 | Contents\MacOS 376 | 1 377 | 378 | 379 | Contents\MacOS 380 | 0 381 | 382 | 383 | 384 | 385 | classes 386 | 1 387 | 388 | 389 | 390 | 391 | library\lib\armeabi-v7a 392 | 1 393 | 394 | 395 | 396 | 397 | library\lib\armeabi 398 | 1 399 | 400 | 401 | 402 | 403 | library\lib\mips 404 | 1 405 | 406 | 407 | 408 | 409 | library\lib\armeabi-v7a 410 | 1 411 | 412 | 413 | 414 | 415 | res\drawable 416 | 1 417 | 418 | 419 | 420 | 421 | res\values 422 | 1 423 | 424 | 425 | 426 | 427 | res\drawable 428 | 1 429 | 430 | 431 | 432 | 433 | res\drawable-xxhdpi 434 | 1 435 | 436 | 437 | 438 | 439 | res\drawable-ldpi 440 | 1 441 | 442 | 443 | 444 | 445 | res\drawable-mdpi 446 | 1 447 | 448 | 449 | 450 | 451 | res\drawable-hdpi 452 | 1 453 | 454 | 455 | 456 | 457 | res\drawable-xhdpi 458 | 1 459 | 460 | 461 | 462 | 463 | res\drawable-small 464 | 1 465 | 466 | 467 | 468 | 469 | res\drawable-normal 470 | 1 471 | 472 | 473 | 474 | 475 | res\drawable-large 476 | 1 477 | 478 | 479 | 480 | 481 | res\drawable-xlarge 482 | 1 483 | 484 | 485 | 486 | 487 | 1 488 | 489 | 490 | Contents\MacOS 491 | 1 492 | 493 | 494 | 0 495 | 496 | 497 | 498 | 499 | Contents\MacOS 500 | 1 501 | .framework 502 | 503 | 504 | 0 505 | 506 | 507 | 508 | 509 | 1 510 | .dylib 511 | 512 | 513 | 1 514 | .dylib 515 | 516 | 517 | 1 518 | .dylib 519 | 520 | 521 | Contents\MacOS 522 | 1 523 | .dylib 524 | 525 | 526 | 0 527 | .dll;.bpl 528 | 529 | 530 | 531 | 532 | 1 533 | .dylib 534 | 535 | 536 | 1 537 | .dylib 538 | 539 | 540 | 1 541 | .dylib 542 | 543 | 544 | Contents\MacOS 545 | 1 546 | .dylib 547 | 548 | 549 | 0 550 | .bpl 551 | 552 | 553 | 554 | 555 | 0 556 | 557 | 558 | 0 559 | 560 | 561 | 0 562 | 563 | 564 | 0 565 | 566 | 567 | Contents\Resources\StartUp\ 568 | 0 569 | 570 | 571 | 0 572 | 573 | 574 | 575 | 576 | 1 577 | 578 | 579 | 1 580 | 581 | 582 | 1 583 | 584 | 585 | 586 | 587 | 1 588 | 589 | 590 | 1 591 | 592 | 593 | 1 594 | 595 | 596 | 597 | 598 | 1 599 | 600 | 601 | 1 602 | 603 | 604 | 1 605 | 606 | 607 | 608 | 609 | 1 610 | 611 | 612 | 1 613 | 614 | 615 | 1 616 | 617 | 618 | 619 | 620 | 1 621 | 622 | 623 | 1 624 | 625 | 626 | 1 627 | 628 | 629 | 630 | 631 | 1 632 | 633 | 634 | 1 635 | 636 | 637 | 1 638 | 639 | 640 | 641 | 642 | 1 643 | 644 | 645 | 1 646 | 647 | 648 | 1 649 | 650 | 651 | 652 | 653 | 1 654 | 655 | 656 | 657 | 658 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 659 | 1 660 | 661 | 662 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 663 | 1 664 | 665 | 666 | 667 | 668 | 1 669 | 670 | 671 | 1 672 | 673 | 674 | 675 | 676 | ..\ 677 | 1 678 | 679 | 680 | ..\ 681 | 1 682 | 683 | 684 | 685 | 686 | 1 687 | 688 | 689 | 1 690 | 691 | 692 | 1 693 | 694 | 695 | 696 | 697 | 1 698 | 699 | 700 | 1 701 | 702 | 703 | 1 704 | 705 | 706 | 707 | 708 | ..\ 709 | 1 710 | 711 | 712 | 713 | 714 | Contents 715 | 1 716 | 717 | 718 | 719 | 720 | Contents\Resources 721 | 1 722 | 723 | 724 | 725 | 726 | library\lib\armeabi-v7a 727 | 1 728 | 729 | 730 | 1 731 | 732 | 733 | 1 734 | 735 | 736 | 1 737 | 738 | 739 | 1 740 | 741 | 742 | Contents\MacOS 743 | 1 744 | 745 | 746 | 0 747 | 748 | 749 | 750 | 751 | 1 752 | 753 | 754 | 1 755 | 756 | 757 | 758 | 759 | Assets 760 | 1 761 | 762 | 763 | Assets 764 | 1 765 | 766 | 767 | 768 | 769 | Assets 770 | 1 771 | 772 | 773 | Assets 774 | 1 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | 783 | 784 | 785 | 786 | 787 | False 788 | False 789 | False 790 | False 791 | False 792 | True 793 | False 794 | 795 | 796 | 12 797 | 798 | 799 | 800 | 801 |
802 | --------------------------------------------------------------------------------