├── .gitignore ├── ARGeneratorController.pas ├── EditField.dfm ├── EditField.pas ├── EditTable.dfm ├── EditTable.pas ├── LICENSE ├── MVCAREntitiesGenerator.dpr ├── MVCAREntitiesGenerator.dproj ├── MainForm.dfm ├── MainForm.pas ├── README.md ├── UtilsU.pas └── db ├── chinook.db └── northwind.db /.gitignore: -------------------------------------------------------------------------------- 1 | *.local 2 | /*.stat 3 | *.dcu 4 | /*.identcache 5 | /bin/NORTHWIND.FDB 6 | /bin/Northwind.ini 7 | /scStub.dsk 8 | /Northwind/bin/dunitx-results.xml 9 | /Tests/ORMTests/Win32/Debug/dunitx-results.xml 10 | /senCilleGroup_prjgroup.tvsconfig 11 | /bin/dunitx-results.xml 12 | /*.dsk 13 | /Tests/ORMTests/Win32/Debug/TestInsightSettings.ini 14 | /Tests/Northwind/bin/dunitx-results.xml 15 | /ORMGenerator/*.identcache 16 | *.stat 17 | *.identcache 18 | *.dsk 19 | /bin/*.exe 20 | /senCilleMVC/*.res 21 | /*.res 22 | /*.tvsconfig 23 | __history 24 | /bin/Win32 25 | /bin/Win64 26 | /Tests/ExampleEncodeUnit/EncryptForm.exe 27 | /Tests/ExampleEncodeUnit/EncryptForm.rsm 28 | /*.dsv 29 | /*.orm 30 | /bin/*.entgen 31 | /bin/*.log 32 | /db/chinook.zip 33 | -------------------------------------------------------------------------------- /ARGeneratorController.pas: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juanccilleruelo/MVC_AR_EntityGenerator/920a65e836151ccaa381bb218fe45e68545077b3/ARGeneratorController.pas -------------------------------------------------------------------------------- /EditField.dfm: -------------------------------------------------------------------------------- 1 | object EditFieldForm: TEditFieldForm 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'Edit Field' 6 | ClientHeight = 164 7 | ClientWidth = 364 8 | Color = clBtnFace 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -12 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | FormStyle = fsStayOnTop 15 | Position = poMainFormCenter 16 | OnShow = FormShow 17 | TextHeight = 15 18 | object Label1: TLabel 19 | Left = 56 20 | Top = 48 21 | Width = 71 22 | Height = 15 23 | Caption = 'Table Name : ' 24 | end 25 | object LabelTableName: TLabel 26 | Left = 133 27 | Top = 48 28 | Width = 87 29 | Height = 15 30 | Caption = 'LabelTableName' 31 | end 32 | object Label3: TLabel 33 | Left = 56 34 | Top = 93 35 | Width = 77 36 | Height = 15 37 | Caption = 'Custom Name' 38 | end 39 | object Label2: TLabel 40 | Left = 56 41 | Top = 69 42 | Width = 69 43 | Height = 15 44 | Caption = 'Field Name : ' 45 | end 46 | object LabelFieldName: TLabel 47 | Left = 133 48 | Top = 69 49 | Width = 87 50 | Height = 15 51 | Caption = 'LabelTableName' 52 | end 53 | object EditCustomName: TEdit 54 | Left = 167 55 | Top = 90 56 | Width = 121 57 | Height = 23 58 | TabOrder = 0 59 | Text = 'EditCustomName' 60 | end 61 | object BtnCancel: TBitBtn 62 | Left = 154 63 | Top = 131 64 | Width = 75 65 | Height = 25 66 | Cancel = True 67 | Caption = 'Cancel' 68 | ModalResult = 2 69 | TabOrder = 1 70 | end 71 | object BtnOK: TBitBtn 72 | Left = 235 73 | Top = 131 74 | Width = 75 75 | Height = 25 76 | Caption = 'OK' 77 | Default = True 78 | ModalResult = 1 79 | TabOrder = 2 80 | end 81 | end 82 | -------------------------------------------------------------------------------- /EditField.pas: -------------------------------------------------------------------------------- 1 | unit EditField; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons; 8 | 9 | type 10 | TEditFieldForm = class(TForm) 11 | Label1: TLabel; 12 | LabelTableName: TLabel; 13 | Label3: TLabel; 14 | EditCustomName: TEdit; 15 | BtnCancel: TBitBtn; 16 | BtnOK: TBitBtn; 17 | Label2: TLabel; 18 | LabelFieldName: TLabel; 19 | procedure FormShow(Sender: TObject); 20 | private 21 | procedure SetTableName(Value :string); 22 | procedure SetFieldName(Value :string); 23 | procedure SetCustomName(Value :string); 24 | function GetCustomName:string; 25 | public 26 | property TableName :string write SetTableName; 27 | property FieldName :string write SetFieldName; 28 | property CustomName :string read GetCustomName write SetCustomName; 29 | end; 30 | 31 | var 32 | EditFieldForm: TEditFieldForm; 33 | 34 | implementation 35 | 36 | {$R *.dfm} 37 | 38 | procedure TEditFieldForm.FormShow(Sender: TObject); 39 | begin 40 | EditCustomName.SetFocus; 41 | end; 42 | 43 | procedure TEditFieldForm.SetTableName(Value: string); 44 | begin 45 | LabelTableName.Caption := Value; 46 | end; 47 | 48 | procedure TEditFieldForm.SetFieldName(Value: string); 49 | begin 50 | LabelFieldName.Caption := Value; 51 | end; 52 | 53 | procedure TEditFieldForm.SetCustomName(Value: string); 54 | begin 55 | EditCustomName.Text := Value; 56 | end; 57 | 58 | function TEditFieldForm.GetCustomName: string; 59 | begin 60 | Result := EditCustomName.Text; 61 | end; 62 | 63 | end. 64 | -------------------------------------------------------------------------------- /EditTable.dfm: -------------------------------------------------------------------------------- 1 | object EditTableForm: TEditTableForm 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'Edit Table' 6 | ClientHeight = 205 7 | ClientWidth = 549 8 | Color = clBtnFace 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -12 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | Position = poMainFormCenter 15 | OnShow = FormShow 16 | TextHeight = 15 17 | object Label1: TLabel 18 | Left = 48 19 | Top = 8 20 | Width = 71 21 | Height = 15 22 | Caption = 'Table Name : ' 23 | end 24 | object LabelTableName: TLabel 25 | Left = 125 26 | Top = 8 27 | Width = 87 28 | Height = 15 29 | Caption = 'LabelTableName' 30 | end 31 | object Label3: TLabel 32 | Left = 48 33 | Top = 32 34 | Width = 62 35 | Height = 15 36 | Caption = 'Class Name' 37 | end 38 | object Label2: TLabel 39 | Left = 48 40 | Top = 61 41 | Width = 64 42 | Height = 15 43 | Caption = 'Deploy Path' 44 | end 45 | object EditClassName: TEdit 46 | Left = 125 47 | Top = 29 48 | Width = 276 49 | Height = 23 50 | TabOrder = 0 51 | end 52 | object BtnCancel: TBitBtn 53 | Left = 385 54 | Top = 172 55 | Width = 75 56 | Height = 25 57 | Cancel = True 58 | Caption = 'Cancel' 59 | ModalResult = 2 60 | TabOrder = 1 61 | end 62 | object BtnOK: TBitBtn 63 | Left = 466 64 | Top = 172 65 | Width = 75 66 | Height = 25 67 | Caption = 'OK' 68 | Default = True 69 | ModalResult = 1 70 | TabOrder = 2 71 | end 72 | object EditDeployPath: TEdit 73 | Left = 125 74 | Top = 58 75 | Width = 276 76 | Height = 23 77 | TabOrder = 3 78 | end 79 | object BtnSelectDeployPath: TButton 80 | Left = 407 81 | Top = 57 82 | Width = 134 83 | Height = 25 84 | Caption = 'Select Deploy Path' 85 | TabOrder = 4 86 | OnClick = BtnSelectDeployPathClick 87 | end 88 | object CheckBoxDeclareAsAbstract: TCheckBox 89 | Left = 48 90 | Top = 88 91 | Width = 464 92 | Height = 17 93 | Caption = 94 | 'Declare the class as abstract (MVCTable must be redeclared on de' + 95 | 'scendant classes)' 96 | TabOrder = 5 97 | end 98 | object CheckBoxRegisterEntity: TCheckBox 99 | AlignWithMargins = True 100 | Left = 47 101 | Top = 111 102 | Width = 458 103 | Height = 32 104 | Margins.Left = 10 105 | Caption = 106 | 'Register the entity in ActiveRecordMappingRegistry (needed by TM' + 107 | 'VCActiveRecordController)' 108 | Checked = True 109 | State = cbChecked 110 | TabOrder = 6 111 | WordWrap = True 112 | end 113 | object SelectFolder: TFileOpenDialog 114 | FavoriteLinks = <> 115 | FileTypes = < 116 | item 117 | DisplayName = 'DMVC Entities Generator Project' 118 | FileMask = '*.entgen' 119 | end> 120 | Options = [fdoPickFolders, fdoPathMustExist] 121 | Left = 22 122 | Top = 153 123 | end 124 | end 125 | -------------------------------------------------------------------------------- /EditTable.pas: -------------------------------------------------------------------------------- 1 | unit EditTable; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons; 8 | 9 | type 10 | TEditTableForm = class(TForm) 11 | Label1: TLabel; 12 | LabelTableName: TLabel; 13 | Label3: TLabel; 14 | EditClassName: TEdit; 15 | BtnCancel: TBitBtn; 16 | BtnOK: TBitBtn; 17 | Label2: TLabel; 18 | EditDeployPath: TEdit; 19 | SelectFolder: TFileOpenDialog; 20 | BtnSelectDeployPath: TButton; 21 | CheckBoxDeclareAsAbstract: TCheckBox; 22 | CheckBoxRegisterEntity: TCheckBox; 23 | procedure FormShow(Sender: TObject); 24 | procedure BtnSelectDeployPathClick(Sender: TObject); 25 | private 26 | function GetClassName:string; 27 | procedure SetTableName(Value :string); 28 | procedure SetClassName(Value :string); 29 | function GetDeployPath:string; 30 | procedure SetDeployPath(Value :string); 31 | 32 | function GetDeclareAsAbstract:string; 33 | procedure SetDeclareAsAbstract(Value :string); 34 | function GetRegisterEntity:string; 35 | procedure SetRegisterEntity(Value :string); 36 | 37 | public 38 | property TableName :string write SetTableName; 39 | property ClassName :string read GetClassName write SetClassName; 40 | property DeployPath :string read GetDeployPath write SetDeployPath; 41 | property DeclareAsAbstract :string read GetDeclareAsAbstract write SetDeclareAsAbstract; 42 | property RegisterEntity :string read GetRegisterEntity write SetRegisterEntity; 43 | end; 44 | 45 | var 46 | EditTableForm: TEditTableForm; 47 | 48 | implementation 49 | 50 | {$R *.dfm} 51 | 52 | procedure TEditTableForm.BtnSelectDeployPathClick(Sender: TObject); 53 | begin 54 | if SelectFolder.Execute then begin 55 | DeployPath := SelectFolder.FileName; 56 | end; 57 | end; 58 | 59 | procedure TEditTableForm.FormShow(Sender: TObject); 60 | begin 61 | EditClassName.SetFocus; 62 | end; 63 | 64 | function TEditTableForm.GetClassName:string; 65 | begin 66 | Result := EditClassName.Text; 67 | end; 68 | 69 | procedure TEditTableForm.SetClassName(Value: string); 70 | begin 71 | EditClassName.Text := Value; 72 | end; 73 | 74 | procedure TEditTableForm.SetTableName(Value: string); 75 | begin 76 | LabelTableName.Caption := Value; 77 | end; 78 | 79 | function TEditTableForm.GetDeployPath:string; 80 | begin 81 | Result := EditDeployPath.Text; 82 | end; 83 | 84 | procedure TEditTableForm.SetDeployPath(Value :string); 85 | begin 86 | EditDeployPath.Text := Value; 87 | end; 88 | 89 | function TEditTableForm.GetDeclareAsAbstract:string; 90 | begin 91 | if CheckBoxDeclareAsAbstract.Checked then Result := 'Y' 92 | else Result := 'N'; 93 | end; 94 | 95 | procedure TEditTableForm.SetDeclareAsAbstract(Value :string); 96 | begin 97 | CheckBoxDeclareAsAbstract.Checked := Value = 'Y'; 98 | end; 99 | 100 | function TEditTableForm.GetRegisterEntity:string; 101 | begin 102 | if CheckBoxRegisterEntity.Checked then Result := 'Y' 103 | else Result := 'N'; 104 | end; 105 | 106 | procedure TEditTableForm.SetRegisterEntity(Value :string); 107 | begin 108 | CheckBoxRegisterEntity.Checked := Value = 'Y'; 109 | end; 110 | 111 | end. 112 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /MVCAREntitiesGenerator.dpr: -------------------------------------------------------------------------------- 1 | program MVCAREntitiesGenerator; 2 | 3 | uses 4 | Vcl.Forms, 5 | MainForm in 'MainForm.pas' {Main}, 6 | UtilsU in 'UtilsU.pas', 7 | ARGeneratorController in 'ARGeneratorController.pas', 8 | EditTable in 'EditTable.pas' {EditTableForm}, 9 | EditField in 'EditField.pas' {EditFieldForm}; 10 | 11 | {$R *.res} 12 | 13 | begin 14 | Application.Initialize; 15 | Application.MainFormOnTaskbar := True; 16 | Application.CreateForm(TMain, Main); 17 | Application.CreateForm(TEditTableForm, EditTableForm); 18 | Application.CreateForm(TEditFieldForm, EditFieldForm); 19 | Application.Run; 20 | end. 21 | -------------------------------------------------------------------------------- /MVCAREntitiesGenerator.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {ABDCF3F4-55C9-4C93-9DA7-7E7D35B0FE68} 4 | 20.1 5 | VCL 6 | MVCAREntitiesGenerator.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 | Cfg_1 34 | true 35 | true 36 | 37 | 38 | true 39 | Base 40 | true 41 | 42 | 43 | MVCAREntitiesGenerator 44 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 45 | $(BDS)\bin\delphi_PROJECTICON.ico 46 | .\$(Platform)\$(Config) 47 | .\$(Platform)\$(Config) 48 | false 49 | false 50 | false 51 | false 52 | false 53 | 54 | 55 | true 56 | 1033 57 | $(BDS)\bin\default_app.manifest 58 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 59 | FireDACSqliteDriver;TsiLang_XE5r;GraphControls;DBXSqliteDriver;FireDACPgDriver;fmx;TreeViewPresenter;IndySystem;i18n;TeeDB;DTButtons;frx19;UpDownLiveBindingPackage;ITDevCon2012AdapterPackage;vclib;inetdbbde;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;frxADO19;SystemSensorComponents;DataSnapProviderClient;DPFAndroidPackagesXE5;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;MetropolisUILiveTile;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;i18nDB;fmxase;vcl;IndyCore;IndyIPCommon;CloudService;DBXMSSQLDriver;FmxTeeUI;FireDACIBDriver;CodeSiteExpressPkg;DataSnapFireDAC;FireDACDBXDriver;inetdbxpress;frxe19;FireDACDb2Driver;adortl;CustomAdaptersMDPackage;SimpleGraphPackage;frxDB19;DataBindingsVCL;FireDACASADriver;fs19;bindcompfmx;vcldbx;FireDACODBCDriver;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DataBindings;DBXOdbcDriver;vclFireDAC;CPortLibDXE;xmlrtl;svnui;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindengine;vclactnband;soaprtl;bindcompdbx;FMXTee;TeeUI;bindcompvcl;fsDB19;frxFD19;vclie;FireDACADSDriver;vcltouch;fmxinfopower;VclSmp;FireDACMSSQLDriver;FireDAC;VCLRESTComponents;Intraweb;DBXInformixDriver;DataSnapConnectors;FireDACDataSnapDriver;dsnapcon;DBXFirebirdDriver;BitEditSample;inet;SampleGenerator1Package;fmxobj;FireDACMySQLDriver;vclx;svn;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;bdertl;VirtualTreesR;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dbexpress;IndyIPClient;$(DCC_UsePackage) 60 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 61 | true 62 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 63 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 64 | ..\bin 65 | 66 | 67 | FireDACSqliteDriver;DBXSqliteDriver;FireDACPgDriver;fmx;TreeViewPresenter;IndySystem;TeeDB;vclib;DBXInterBaseDriver;DataSnapClient;DataSnapCommon;DataSnapServer;DataSnapProviderClient;DBXSybaseASEDriver;DbxCommonDriver;vclimg;dbxcds;DatasnapConnectorsFreePascal;MetropolisUILiveTile;vcldb;vcldsnap;fmxFireDAC;DBXDb2Driver;DBXOracleDriver;CustomIPTransport;vclribbon;dsnap;IndyIPServer;fmxase;vcl;IndyCore;IndyIPCommon;CloudService;DBXMSSQLDriver;FmxTeeUI;FireDACIBDriver;DataSnapFireDAC;FireDACDBXDriver;inetdbxpress;FireDACDb2Driver;adortl;DataBindingsVCL;FireDACASADriver;bindcompfmx;FireDACODBCDriver;rtl;dbrtl;DbxClientDriver;FireDACCommon;bindcomp;inetdb;Tee;DataBindings;DBXOdbcDriver;vclFireDAC;xmlrtl;ibxpress;IndyProtocols;DBXMySQLDriver;FireDACCommonDriver;bindengine;vclactnband;soaprtl;bindcompdbx;FMXTee;TeeUI;bindcompvcl;vclie;FireDACADSDriver;vcltouch;fmxinfopower;VclSmp;FireDACMSSQLDriver;FireDAC;VCLRESTComponents;Intraweb;DBXInformixDriver;DataSnapConnectors;FireDACDataSnapDriver;dsnapcon;DBXFirebirdDriver;inet;fmxobj;FireDACMySQLDriver;vclx;DBXSybaseASADriver;FireDACOracleDriver;fmxdae;RESTComponents;VirtualTreesR;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dbexpress;IndyIPClient;$(DCC_UsePackage) 68 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 69 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 70 | 71 | 72 | DEBUG;$(DCC_Define) 73 | true 74 | false 75 | true 76 | true 77 | true 78 | 79 | 80 | false 81 | Debug 82 | true 83 | 1033 84 | error 85 | false 86 | false 87 | none 88 | C:\Program Files\Embarcadero\Studio\23.0\source\Property Editors;$(DCC_UnitSearchPath) 89 | .\bin 90 | 91 | 92 | false 93 | RELEASE;$(DCC_Define) 94 | 0 95 | 0 96 | 97 | 98 | 99 | MainSource 100 | 101 | 102 |
Main
103 | dfm 104 |
105 | 106 | 107 | 108 |
EditTableForm
109 | dfm 110 |
111 | 112 |
EditFieldForm
113 | dfm 114 |
115 | 116 | Base 117 | 118 | 119 | Cfg_1 120 | Base 121 | 122 | 123 | Cfg_2 124 | Base 125 | 126 |
127 | 128 | Delphi.Personality.12 129 | 130 | 131 | 132 | 133 | False 134 | False 135 | 1 136 | 0 137 | 0 138 | 0 139 | False 140 | False 141 | False 142 | False 143 | False 144 | 1040 145 | 1252 146 | 147 | 148 | 149 | 150 | 1.0.0.0 151 | 152 | 153 | 154 | 155 | 156 | 1.0.0.0 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | MVCAREntitiesGenerator.dpr 184 | 185 | 186 | Microsoft Office 2000 Sample Automation Server Wrapper Components 187 | Microsoft Office XP Sample Automation Server Wrapper Components 188 | File C:\Views\senCilleWebMVC\bin\Win32\senCilleWebMVCDsgTime.bpl not found 189 | 190 | 191 | 192 | 193 | 194 | 195 | MVCAREntitiesGenerator.exe 196 | true 197 | 198 | 199 | 200 | 201 | 1 202 | 203 | 204 | Contents\MacOS 205 | 1 206 | 207 | 208 | 0 209 | 210 | 211 | 212 | 213 | classes 214 | 64 215 | 216 | 217 | classes 218 | 64 219 | 220 | 221 | 222 | 223 | res\xml 224 | 1 225 | 226 | 227 | res\xml 228 | 1 229 | 230 | 231 | 232 | 233 | library\lib\armeabi-v7a 234 | 1 235 | 236 | 237 | 238 | 239 | library\lib\armeabi 240 | 1 241 | 242 | 243 | library\lib\armeabi 244 | 1 245 | 246 | 247 | 248 | 249 | library\lib\armeabi-v7a 250 | 1 251 | 252 | 253 | 254 | 255 | library\lib\mips 256 | 1 257 | 258 | 259 | library\lib\mips 260 | 1 261 | 262 | 263 | 264 | 265 | library\lib\armeabi-v7a 266 | 1 267 | 268 | 269 | library\lib\arm64-v8a 270 | 1 271 | 272 | 273 | 274 | 275 | library\lib\armeabi-v7a 276 | 1 277 | 278 | 279 | 280 | 281 | res\drawable 282 | 1 283 | 284 | 285 | res\drawable 286 | 1 287 | 288 | 289 | 290 | 291 | res\drawable-anydpi-v21 292 | 1 293 | 294 | 295 | res\drawable-anydpi-v21 296 | 1 297 | 298 | 299 | 300 | 301 | res\values 302 | 1 303 | 304 | 305 | res\values 306 | 1 307 | 308 | 309 | 310 | 311 | res\values-v21 312 | 1 313 | 314 | 315 | res\values-v21 316 | 1 317 | 318 | 319 | 320 | 321 | res\values-v31 322 | 1 323 | 324 | 325 | res\values-v31 326 | 1 327 | 328 | 329 | 330 | 331 | res\drawable-anydpi-v26 332 | 1 333 | 334 | 335 | res\drawable-anydpi-v26 336 | 1 337 | 338 | 339 | 340 | 341 | res\drawable 342 | 1 343 | 344 | 345 | res\drawable 346 | 1 347 | 348 | 349 | 350 | 351 | res\drawable 352 | 1 353 | 354 | 355 | res\drawable 356 | 1 357 | 358 | 359 | 360 | 361 | res\drawable 362 | 1 363 | 364 | 365 | res\drawable 366 | 1 367 | 368 | 369 | 370 | 371 | res\drawable-anydpi-v33 372 | 1 373 | 374 | 375 | res\drawable-anydpi-v33 376 | 1 377 | 378 | 379 | 380 | 381 | res\values 382 | 1 383 | 384 | 385 | res\values 386 | 1 387 | 388 | 389 | 390 | 391 | res\values-night-v21 392 | 1 393 | 394 | 395 | res\values-night-v21 396 | 1 397 | 398 | 399 | 400 | 401 | res\drawable 402 | 1 403 | 404 | 405 | res\drawable 406 | 1 407 | 408 | 409 | 410 | 411 | res\drawable-xxhdpi 412 | 1 413 | 414 | 415 | res\drawable-xxhdpi 416 | 1 417 | 418 | 419 | 420 | 421 | res\drawable-xxxhdpi 422 | 1 423 | 424 | 425 | res\drawable-xxxhdpi 426 | 1 427 | 428 | 429 | 430 | 431 | res\drawable-ldpi 432 | 1 433 | 434 | 435 | res\drawable-ldpi 436 | 1 437 | 438 | 439 | 440 | 441 | res\drawable-mdpi 442 | 1 443 | 444 | 445 | res\drawable-mdpi 446 | 1 447 | 448 | 449 | 450 | 451 | res\drawable-hdpi 452 | 1 453 | 454 | 455 | res\drawable-hdpi 456 | 1 457 | 458 | 459 | 460 | 461 | res\drawable-xhdpi 462 | 1 463 | 464 | 465 | res\drawable-xhdpi 466 | 1 467 | 468 | 469 | 470 | 471 | res\drawable-mdpi 472 | 1 473 | 474 | 475 | res\drawable-mdpi 476 | 1 477 | 478 | 479 | 480 | 481 | res\drawable-hdpi 482 | 1 483 | 484 | 485 | res\drawable-hdpi 486 | 1 487 | 488 | 489 | 490 | 491 | res\drawable-xhdpi 492 | 1 493 | 494 | 495 | res\drawable-xhdpi 496 | 1 497 | 498 | 499 | 500 | 501 | res\drawable-xxhdpi 502 | 1 503 | 504 | 505 | res\drawable-xxhdpi 506 | 1 507 | 508 | 509 | 510 | 511 | res\drawable-xxxhdpi 512 | 1 513 | 514 | 515 | res\drawable-xxxhdpi 516 | 1 517 | 518 | 519 | 520 | 521 | res\drawable-small 522 | 1 523 | 524 | 525 | res\drawable-small 526 | 1 527 | 528 | 529 | 530 | 531 | res\drawable-normal 532 | 1 533 | 534 | 535 | res\drawable-normal 536 | 1 537 | 538 | 539 | 540 | 541 | res\drawable-large 542 | 1 543 | 544 | 545 | res\drawable-large 546 | 1 547 | 548 | 549 | 550 | 551 | res\drawable-xlarge 552 | 1 553 | 554 | 555 | res\drawable-xlarge 556 | 1 557 | 558 | 559 | 560 | 561 | res\values 562 | 1 563 | 564 | 565 | res\values 566 | 1 567 | 568 | 569 | 570 | 571 | res\drawable-anydpi-v24 572 | 1 573 | 574 | 575 | res\drawable-anydpi-v24 576 | 1 577 | 578 | 579 | 580 | 581 | res\drawable 582 | 1 583 | 584 | 585 | res\drawable 586 | 1 587 | 588 | 589 | 590 | 591 | res\drawable-night-anydpi-v21 592 | 1 593 | 594 | 595 | res\drawable-night-anydpi-v21 596 | 1 597 | 598 | 599 | 600 | 601 | res\drawable-anydpi-v31 602 | 1 603 | 604 | 605 | res\drawable-anydpi-v31 606 | 1 607 | 608 | 609 | 610 | 611 | res\drawable-night-anydpi-v31 612 | 1 613 | 614 | 615 | res\drawable-night-anydpi-v31 616 | 1 617 | 618 | 619 | 620 | 621 | 1 622 | 623 | 624 | Contents\MacOS 625 | 1 626 | 627 | 628 | 0 629 | 630 | 631 | 632 | 633 | Contents\MacOS 634 | 1 635 | .framework 636 | 637 | 638 | Contents\MacOS 639 | 1 640 | .framework 641 | 642 | 643 | Contents\MacOS 644 | 1 645 | .framework 646 | 647 | 648 | 0 649 | 650 | 651 | 652 | 653 | 1 654 | .dylib 655 | 656 | 657 | 1 658 | .dylib 659 | 660 | 661 | 1 662 | .dylib 663 | 664 | 665 | Contents\MacOS 666 | 1 667 | .dylib 668 | 669 | 670 | Contents\MacOS 671 | 1 672 | .dylib 673 | 674 | 675 | Contents\MacOS 676 | 1 677 | .dylib 678 | 679 | 680 | 0 681 | .dll;.bpl 682 | 683 | 684 | 685 | 686 | 1 687 | .dylib 688 | 689 | 690 | 1 691 | .dylib 692 | 693 | 694 | 1 695 | .dylib 696 | 697 | 698 | Contents\MacOS 699 | 1 700 | .dylib 701 | 702 | 703 | Contents\MacOS 704 | 1 705 | .dylib 706 | 707 | 708 | Contents\MacOS 709 | 1 710 | .dylib 711 | 712 | 713 | 0 714 | .bpl 715 | 716 | 717 | 718 | 719 | 0 720 | 721 | 722 | 0 723 | 724 | 725 | 0 726 | 727 | 728 | 0 729 | 730 | 731 | 0 732 | 733 | 734 | Contents\Resources\StartUp\ 735 | 0 736 | 737 | 738 | Contents\Resources\StartUp\ 739 | 0 740 | 741 | 742 | Contents\Resources\StartUp\ 743 | 0 744 | 745 | 746 | 0 747 | 748 | 749 | 750 | 751 | 1 752 | 753 | 754 | 1 755 | 756 | 757 | 758 | 759 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 760 | 1 761 | 762 | 763 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 764 | 1 765 | 766 | 767 | 768 | 769 | ..\ 770 | 1 771 | 772 | 773 | ..\ 774 | 1 775 | 776 | 777 | ..\ 778 | 1 779 | 780 | 781 | 782 | 783 | Contents 784 | 1 785 | 786 | 787 | Contents 788 | 1 789 | 790 | 791 | Contents 792 | 1 793 | 794 | 795 | 796 | 797 | Contents\Resources 798 | 1 799 | 800 | 801 | Contents\Resources 802 | 1 803 | 804 | 805 | Contents\Resources 806 | 1 807 | 808 | 809 | 810 | 811 | library\lib\armeabi-v7a 812 | 1 813 | 814 | 815 | library\lib\arm64-v8a 816 | 1 817 | 818 | 819 | 1 820 | 821 | 822 | 1 823 | 824 | 825 | 1 826 | 827 | 828 | 1 829 | 830 | 831 | Contents\MacOS 832 | 1 833 | 834 | 835 | Contents\MacOS 836 | 1 837 | 838 | 839 | Contents\MacOS 840 | 1 841 | 842 | 843 | 0 844 | 845 | 846 | 847 | 848 | library\lib\armeabi-v7a 849 | 1 850 | 851 | 852 | 853 | 854 | 1 855 | 856 | 857 | 1 858 | 859 | 860 | 861 | 862 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 863 | 1 864 | 865 | 866 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 867 | 1 868 | 869 | 870 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 871 | 1 872 | 873 | 874 | 875 | 876 | ..\ 877 | 1 878 | 879 | 880 | ..\ 881 | 1 882 | 883 | 884 | ..\ 885 | 1 886 | 887 | 888 | 889 | 890 | 1 891 | 892 | 893 | 1 894 | 895 | 896 | 1 897 | 898 | 899 | 900 | 901 | ..\$(PROJECTNAME).launchscreen 902 | 64 903 | 904 | 905 | ..\$(PROJECTNAME).launchscreen 906 | 64 907 | 908 | 909 | 910 | 911 | 1 912 | 913 | 914 | 1 915 | 916 | 917 | 1 918 | 919 | 920 | 921 | 922 | Assets 923 | 1 924 | 925 | 926 | Assets 927 | 1 928 | 929 | 930 | 931 | 932 | Assets 933 | 1 934 | 935 | 936 | Assets 937 | 1 938 | 939 | 940 | 941 | 942 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 943 | 1 944 | 945 | 946 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 947 | 1 948 | 949 | 950 | 951 | 952 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 953 | 1 954 | 955 | 956 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 957 | 1 958 | 959 | 960 | 961 | 962 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 963 | 1 964 | 965 | 966 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 967 | 1 968 | 969 | 970 | 971 | 972 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 973 | 1 974 | 975 | 976 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 977 | 1 978 | 979 | 980 | 981 | 982 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 983 | 1 984 | 985 | 986 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 987 | 1 988 | 989 | 990 | 991 | 992 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 993 | 1 994 | 995 | 996 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 997 | 1 998 | 999 | 1000 | 1001 | 1002 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1003 | 1 1004 | 1005 | 1006 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1007 | 1 1008 | 1009 | 1010 | 1011 | 1012 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1013 | 1 1014 | 1015 | 1016 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1017 | 1 1018 | 1019 | 1020 | 1021 | 1022 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1023 | 1 1024 | 1025 | 1026 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1027 | 1 1028 | 1029 | 1030 | 1031 | 1032 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1033 | 1 1034 | 1035 | 1036 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1037 | 1 1038 | 1039 | 1040 | 1041 | 1042 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1043 | 1 1044 | 1045 | 1046 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1047 | 1 1048 | 1049 | 1050 | 1051 | 1052 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1053 | 1 1054 | 1055 | 1056 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1057 | 1 1058 | 1059 | 1060 | 1061 | 1062 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1063 | 1 1064 | 1065 | 1066 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1067 | 1 1068 | 1069 | 1070 | 1071 | 1072 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1073 | 1 1074 | 1075 | 1076 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 1077 | 1 1078 | 1079 | 1080 | 1081 | 1082 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1083 | 1 1084 | 1085 | 1086 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1087 | 1 1088 | 1089 | 1090 | 1091 | 1092 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1093 | 1 1094 | 1095 | 1096 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1097 | 1 1098 | 1099 | 1100 | 1101 | 1102 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1103 | 1 1104 | 1105 | 1106 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1107 | 1 1108 | 1109 | 1110 | 1111 | 1112 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1113 | 1 1114 | 1115 | 1116 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1117 | 1 1118 | 1119 | 1120 | 1121 | 1122 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1123 | 1 1124 | 1125 | 1126 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1127 | 1 1128 | 1129 | 1130 | 1131 | 1132 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1133 | 1 1134 | 1135 | 1136 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 1137 | 1 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | True 1155 | False 1156 | 1157 | 1158 | 12 1159 | 1160 | 1161 | 1162 | 1163 |
1164 | -------------------------------------------------------------------------------- /MainForm.dfm: -------------------------------------------------------------------------------- 1 | object Main: TMain 2 | Left = 0 3 | Top = 0 4 | Caption = '[DMVCFramework] MVCActiveRecord Entity Generator' 5 | ClientHeight = 826 6 | ClientWidth = 1212 7 | Color = clBtnFace 8 | Font.Charset = DEFAULT_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -12 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | Menu = MainMenu 14 | Position = poDesktopCenter 15 | Scaled = False 16 | OnClose = FormClose 17 | OnCreate = FormCreate 18 | TextHeight = 15 19 | object Splitter1: TSplitter 20 | Left = 0 21 | Top = 681 22 | Width = 1212 23 | Height = 3 24 | Cursor = crVSplit 25 | Align = alBottom 26 | ExplicitTop = 543 27 | ExplicitWidth = 1196 28 | end 29 | object Panel8: TPanel 30 | Left = 0 31 | Top = 771 32 | Width = 1212 33 | Height = 55 34 | Margins.Right = 6 35 | Align = alBottom 36 | BevelOuter = bvNone 37 | TabOrder = 0 38 | object BtnSaveProject: TButton 39 | AlignWithMargins = True 40 | Left = 1028 41 | Top = 8 42 | Width = 174 43 | Height = 32 44 | Action = ActionSaveProject 45 | TabOrder = 0 46 | end 47 | object Panel5: TPanel 48 | AlignWithMargins = True 49 | Left = 3 50 | Top = 3 51 | Width = 622 52 | Height = 49 53 | Align = alLeft 54 | BevelKind = bkTile 55 | BevelOuter = bvNone 56 | Caption = 'Panel5' 57 | ShowCaption = False 58 | TabOrder = 1 59 | object BtnGenerateCurrent: TButton 60 | AlignWithMargins = True 61 | Left = 9 62 | Top = 5 63 | Width = 215 64 | Height = 32 65 | Action = ActionGenerateCurrent 66 | TabOrder = 0 67 | end 68 | object BtnGenerateAll: TButton 69 | AlignWithMargins = True 70 | Left = 230 71 | Top = 5 72 | Width = 192 73 | Height = 32 74 | Action = ActionGenerateAll 75 | TabOrder = 1 76 | end 77 | end 78 | end 79 | object Panel12: TPanel 80 | Left = 0 81 | Top = 684 82 | Width = 1212 83 | Height = 87 84 | Align = alBottom 85 | BevelOuter = bvNone 86 | Caption = 'Panel12' 87 | TabOrder = 1 88 | object lbLog: TListBox 89 | Left = 0 90 | Top = 0 91 | Width = 1212 92 | Height = 87 93 | Align = alClient 94 | BevelInner = bvNone 95 | BevelOuter = bvNone 96 | Font.Charset = ANSI_CHARSET 97 | Font.Color = clWindowText 98 | Font.Height = -16 99 | Font.Name = 'Consolas' 100 | Font.Style = [] 101 | ItemHeight = 19 102 | ParentFont = False 103 | ScrollWidth = 5000 104 | TabOrder = 0 105 | end 106 | end 107 | object Panel3: TPanel 108 | Left = 0 109 | Top = 0 110 | Width = 1212 111 | Height = 681 112 | Align = alClient 113 | Caption = 'Panel3' 114 | ShowCaption = False 115 | TabOrder = 2 116 | object Panel4: TPanel 117 | Left = 1 118 | Top = 1 119 | Width = 1210 120 | Height = 82 121 | Align = alTop 122 | BevelOuter = bvNone 123 | Caption = 'Panel4' 124 | ShowCaption = False 125 | TabOrder = 0 126 | DesignSize = ( 127 | 1210 128 | 82) 129 | object btnGenEntities: TButton 130 | AlignWithMargins = True 131 | Left = 1238 132 | Top = -69 133 | Width = 161 134 | Height = 35 135 | Anchors = [akRight, akBottom] 136 | Caption = 'Generate Entities' 137 | TabOrder = 0 138 | end 139 | object RadioGroupNameCase: TRadioGroup 140 | Left = 0 141 | Top = 0 142 | Width = 354 143 | Height = 82 144 | Align = alLeft 145 | Caption = ' Class MVCNameCase ' 146 | Columns = 3 147 | ItemIndex = 0 148 | Items.Strings = ( 149 | 'LowerCase' 150 | 'UpperCase' 151 | 'CamelCase' 152 | 'PascalCase' 153 | 'SnakeCase' 154 | 'AsIs') 155 | TabOrder = 1 156 | OnClick = RadioGroupNameCaseClick 157 | end 158 | object RadioGroupFieldNameFormatting: TRadioGroup 159 | Left = 354 160 | Top = 0 161 | Width = 355 162 | Height = 82 163 | Align = alLeft 164 | Caption = 'Property Names Formatting' 165 | ItemIndex = 1 166 | Items.Strings = ( 167 | 'Leave names as is in database table' 168 | 'Convert names to Pascal Case (eg FirstName)') 169 | TabOrder = 2 170 | OnClick = RadioGroupFieldNameFormattingClick 171 | end 172 | end 173 | object Panel10: TPanel 174 | Left = 1 175 | Top = 83 176 | Width = 1210 177 | Height = 51 178 | Align = alTop 179 | Caption = 'Panel10' 180 | ShowCaption = False 181 | TabOrder = 1 182 | object btnGetTables: TButton 183 | AlignWithMargins = True 184 | Left = 172 185 | Top = 8 186 | Width = 160 187 | Height = 25 188 | Margins.Left = 5 189 | Margins.Top = 5 190 | Margins.Right = 5 191 | Margins.Bottom = 5 192 | Action = ActionRefreshMetadata 193 | Constraints.MinWidth = 160 194 | TabOrder = 0 195 | end 196 | object BtnConnectDatabase: TButton 197 | AlignWithMargins = True 198 | Left = 2 199 | Top = 8 200 | Width = 160 201 | Height = 25 202 | Margins.Left = 5 203 | Margins.Top = 5 204 | Margins.Right = 5 205 | Margins.Bottom = 5 206 | Action = ActionConnectDatabase 207 | Constraints.MinWidth = 160 208 | TabOrder = 1 209 | end 210 | end 211 | object PageControl: TPageControl 212 | AlignWithMargins = True 213 | Left = 4 214 | Top = 137 215 | Width = 1204 216 | Height = 540 217 | ActivePage = TabSheetTables 218 | Align = alClient 219 | TabOrder = 2 220 | object TabSheetTables: TTabSheet 221 | Caption = 'Tables' 222 | object Splitter2: TSplitter 223 | Left = 849 224 | Top = 0 225 | Height = 469 226 | ExplicitLeft = 384 227 | ExplicitTop = 16 228 | ExplicitHeight = 358 229 | end 230 | object Panel7: TPanel 231 | Left = 0 232 | Top = 469 233 | Width = 1196 234 | Height = 41 235 | Align = alBottom 236 | BevelOuter = bvNone 237 | TabOrder = 0 238 | end 239 | object GridTables: TDBGrid 240 | Left = 0 241 | Top = 0 242 | Width = 849 243 | Height = 469 244 | Align = alLeft 245 | DataSource = srcTables 246 | FixedColor = clBtnShadow 247 | Options = [dgTitles, dgColumnResize, dgColLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit, dgTitleClick] 248 | PopupMenu = PopupMenuGridTables 249 | TabOrder = 1 250 | TitleFont.Charset = DEFAULT_CHARSET 251 | TitleFont.Color = clWindowText 252 | TitleFont.Height = -12 253 | TitleFont.Name = 'Segoe UI' 254 | TitleFont.Style = [] 255 | OnDrawColumnCell = GridTablesDrawColumnCell 256 | OnDblClick = GridTablesDblClick 257 | OnTitleClick = GridTablesTitleClick 258 | Columns = < 259 | item 260 | Expanded = False 261 | FieldName = 'TABLE_NAME' 262 | ReadOnly = True 263 | Title.Caption = 'Table Name' 264 | Width = 180 265 | Visible = True 266 | end 267 | item 268 | Expanded = False 269 | FieldName = 'CLASS_NAME' 270 | Title.Caption = 'Class Name' 271 | Width = 184 272 | Visible = True 273 | end 274 | item 275 | Expanded = False 276 | FieldName = 'DEPLOY_PATH' 277 | Title.Caption = 'Deploy Path' 278 | Width = 300 279 | Visible = True 280 | end 281 | item 282 | Expanded = False 283 | FieldName = 'DECLARE_AS_ABSTRACT' 284 | Title.Caption = 'As Abst.' 285 | Visible = True 286 | end 287 | item 288 | Expanded = False 289 | FieldName = 'REGISTER_ENTITY' 290 | Title.Caption = 'Regs.' 291 | Visible = True 292 | end 293 | item 294 | Expanded = False 295 | FieldName = 'WITH_DETAIL' 296 | Width = 184 297 | Visible = True 298 | end 299 | item 300 | Expanded = False 301 | FieldName = 'DETAIL_CLASS_NAME' 302 | Width = 184 303 | Visible = True 304 | end 305 | item 306 | Expanded = False 307 | FieldName = 'DETAIL_PROP_NAME' 308 | Width = 184 309 | Visible = True 310 | end 311 | item 312 | Expanded = False 313 | FieldName = 'DETAIL_UNIT_NAME' 314 | Width = 184 315 | Visible = True 316 | end> 317 | end 318 | object GridFields: TDBGrid 319 | Left = 852 320 | Top = 0 321 | Width = 344 322 | Height = 469 323 | Align = alClient 324 | DataSource = srcFields 325 | Options = [dgTitles, dgColumnResize, dgColLines, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgConfirmDelete, dgCancelOnExit] 326 | PopupMenu = PopupMenuEditField 327 | TabOrder = 2 328 | TitleFont.Charset = DEFAULT_CHARSET 329 | TitleFont.Color = clWindowText 330 | TitleFont.Height = -12 331 | TitleFont.Name = 'Segoe UI' 332 | TitleFont.Style = [] 333 | OnDrawColumnCell = GridFieldsDrawColumnCell 334 | OnDblClick = GridFieldsDblClick 335 | Columns = < 336 | item 337 | Expanded = False 338 | FieldName = 'FIELD_NAME' 339 | Title.Caption = 'Field Name' 340 | Visible = True 341 | end 342 | item 343 | Expanded = False 344 | FieldName = 'CUSTOM_NAME' 345 | Title.Caption = 'Custom Name' 346 | Visible = True 347 | end> 348 | end 349 | end 350 | object TabSheetSource: TTabSheet 351 | Caption = 'Source' 352 | ImageIndex = 1 353 | object MemoOutputCode: TMemo 354 | Left = 0 355 | Top = 41 356 | Width = 1196 357 | Height = 469 358 | Align = alClient 359 | Font.Charset = DEFAULT_CHARSET 360 | Font.Color = clWindowText 361 | Font.Height = -13 362 | Font.Name = 'Courier New' 363 | Font.Style = [] 364 | ParentFont = False 365 | ReadOnly = True 366 | ScrollBars = ssBoth 367 | TabOrder = 0 368 | end 369 | object PanelSource: TPanel 370 | Left = 0 371 | Top = 0 372 | Width = 1196 373 | Height = 41 374 | Align = alTop 375 | Caption = 'PanelSource' 376 | TabOrder = 1 377 | end 378 | end 379 | end 380 | end 381 | object DBConnection: TFDConnection 382 | Params.Strings = ( 383 | 'Database=C:\Views\senCilleMVCActiveRecordAdds\db\chinook.db' 384 | 'DriverID=SQLite') 385 | ResourceOptions.AssignedValues = [rvKeepConnection] 386 | ResourceOptions.KeepConnection = False 387 | UpdateOptions.AssignedValues = [uvEDelete, uvEInsert, uvEUpdate] 388 | UpdateOptions.EnableDelete = False 389 | UpdateOptions.EnableInsert = False 390 | UpdateOptions.EnableUpdate = False 391 | ConnectedStoredUsage = [] 392 | LoginPrompt = False 393 | Left = 72 394 | Top = 296 395 | end 396 | object FDPhysFBDriverLink1: TFDPhysFBDriverLink 397 | Left = 504 398 | Top = 496 399 | end 400 | object FDGUIxWaitCursor1: TFDGUIxWaitCursor 401 | Provider = 'Forms' 402 | Left = 504 403 | Top = 344 404 | end 405 | object FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink 406 | Left = 632 407 | Top = 560 408 | end 409 | object FDPhysPgDriverLink1: TFDPhysPgDriverLink 410 | Left = 504 411 | Top = 560 412 | end 413 | object FDPhysFBDriverLink2: TFDPhysFBDriverLink 414 | Left = 632 415 | Top = 408 416 | end 417 | object FDPhysIBDriverLink1: TFDPhysIBDriverLink 418 | Left = 632 419 | Top = 496 420 | end 421 | object FDPhysMySQLDriverLink2: TFDPhysMySQLDriverLink 422 | Left = 508 423 | Top = 628 424 | end 425 | object FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink 426 | Left = 504 427 | Top = 408 428 | end 429 | object DialogOpenProject: TFileOpenDialog 430 | FavoriteLinks = <> 431 | FileName = 'C:\Views\MVC_AR_EntityGenerator' 432 | FileTypes = < 433 | item 434 | DisplayName = 'DMVC Entities Generator Project' 435 | FileMask = '*.entgen' 436 | end> 437 | Options = [] 438 | Left = 624 439 | Top = 256 440 | end 441 | object MainMenu: TMainMenu 442 | Images = ImageListMainMenu 443 | Left = 320 444 | Top = 192 445 | object MenuItemFile: TMenuItem 446 | Caption = '&File' 447 | object MenuItemNewProject: TMenuItem 448 | Action = ActionNewProject 449 | end 450 | object MenuItemLoadProject: TMenuItem 451 | Action = ActionOpenProject 452 | end 453 | object MenuItemOpenRecent: TMenuItem 454 | Caption = 'Open Recent' 455 | end 456 | object MenuItemReopenLastOneOnEnter: TMenuItem 457 | AutoCheck = True 458 | Caption = 'Reopen Last one on enter.' 459 | Checked = True 460 | end 461 | object MenuItemSaveProject: TMenuItem 462 | Action = ActionSaveProject 463 | end 464 | object MenuItemSaveProjectAs: TMenuItem 465 | Action = ActionSaveProjectAs 466 | end 467 | object N1: TMenuItem 468 | Caption = '-' 469 | end 470 | object MenuItemExit: TMenuItem 471 | Caption = 'E&xit' 472 | Hint = 'Exit|Quits the application' 473 | ImageIndex = 0 474 | end 475 | end 476 | object MenuItemEntities: TMenuItem 477 | Caption = '&Entities' 478 | object MenuItemRefreshMetaData: TMenuItem 479 | Action = ActionRefreshMetadata 480 | ImageIndex = 5 481 | end 482 | object MenuItemGenerateCodeCurrent: TMenuItem 483 | Action = ActionGenerateCurrent 484 | end 485 | end 486 | end 487 | object ActionList: TActionList 488 | Images = ImageListMainMenu 489 | Left = 428 490 | Top = 204 491 | object ActionNewProject: TAction 492 | Caption = 'New Project' 493 | ImageIndex = 0 494 | OnExecute = ActionNewProjectExecute 495 | end 496 | object ActionOpenProject: TAction 497 | Caption = 'Open Project' 498 | ImageIndex = 1 499 | OnExecute = ActionOpenProjectExecute 500 | end 501 | object ActionSaveProject: TAction 502 | Caption = 'Save Project' 503 | ImageIndex = 2 504 | OnExecute = ActionSaveProjectExecute 505 | OnUpdate = ActionSaveProjectUpdate 506 | end 507 | object ActionSaveProjectAs: TAction 508 | Caption = 'Save Project As...' 509 | ImageIndex = 3 510 | OnExecute = ActionSaveProjectAsExecute 511 | OnUpdate = ActionSaveProjectAsUpdate 512 | end 513 | object ActionGenerateCurrent: TAction 514 | Caption = 'Generate Code for Current Table' 515 | ImageIndex = 6 516 | ShortCut = 120 517 | OnExecute = ActionGenerateCurrentExecute 518 | OnUpdate = ActionGenerateCurrentUpdate 519 | end 520 | object ActionGenerateAll: TAction 521 | Caption = 'Generate Code for All the Tables' 522 | ImageIndex = 6 523 | ShortCut = 120 524 | OnExecute = ActionGenerateAllExecute 525 | OnUpdate = ActionGenerateAllUpdate 526 | end 527 | object ActionRefreshMetadata: TAction 528 | Caption = 'Refresh Metadata' 529 | ImageIndex = 6 530 | ShortCut = 116 531 | OnExecute = ActionRefreshMetadataExecute 532 | OnUpdate = ActionRefreshMetadataUpdate 533 | end 534 | object ActionConnectDatabase: TAction 535 | Caption = 'Connect Database' 536 | OnExecute = ActionConnectDatabaseExecute 537 | OnUpdate = ActionConnectDatabaseUpdate 538 | end 539 | object ActionEditTable: TAction 540 | Caption = 'Edit Table' 541 | OnExecute = ActionEditTableExecute 542 | end 543 | object ActionEditField: TAction 544 | Caption = 'Edit Field' 545 | OnExecute = ActionEditFieldExecute 546 | end 547 | object ActionMarkAllDeclareAsAbstract: TAction 548 | Caption = 'Mark All' 549 | OnExecute = ActionMarkAllDeclareAsAbstractExecute 550 | end 551 | object ActionUnmarkAllDeclareAsAbstract: TAction 552 | Caption = 'Unmark All' 553 | OnExecute = ActionUnmarkAllDeclareAsAbstractExecute 554 | end 555 | object ActionInvertMarksDeclareAsAbstract: TAction 556 | Caption = 'Invert Marks' 557 | OnExecute = ActionInvertMarksDeclareAsAbstractExecute 558 | end 559 | object ActionMarkAllRegisterEntity: TAction 560 | Caption = 'Mark All' 561 | OnExecute = ActionMarkAllRegisterEntityExecute 562 | end 563 | object ActionUnmarkAllRegisterEntity: TAction 564 | Caption = 'Unmark All' 565 | OnExecute = ActionUnmarkAllRegisterEntityExecute 566 | end 567 | object ActionInvertMarksRegisterEntity: TAction 568 | Caption = 'Invert Marks' 569 | OnExecute = ActionInvertMarksRegisterEntityExecute 570 | end 571 | end 572 | object DialogSaveProject: TFileSaveDialog 573 | FavoriteLinks = <> 574 | FileName = 'C:\Views\MVC_AR_EntityGenerator' 575 | FileTypes = < 576 | item 577 | DisplayName = 'DMVC Entities Generator' 578 | FileMask = '*.entgen' 579 | end> 580 | Options = [fdoOverWritePrompt, fdoStrictFileTypes, fdoPathMustExist] 581 | Left = 624 582 | Top = 200 583 | end 584 | object ImageListMainMenu: TImageList 585 | ColorDepth = cdDefault 586 | Height = 32 587 | Width = 32 588 | Left = 320 589 | Top = 252 590 | Bitmap = { 591 | 494C01010A001800040020002000FFFFFFFF0510FFFFFFFFFFFFFFFF424D7600 592 | 0000000000007600000028000000800000006000000001000400000000000018 593 | 0000000000000000000000000000000000000000000000008000008000000080 594 | 8000800000008000800080800000C0C0C000808080000000FF0000FF000000FF 595 | FF00FF000000FF00FF00FFFF0000FFFFFF000000000000000000000000000000 596 | 0000000000000000000000000000000000000000000000000000000000000000 597 | 0000000000000000000000000000000000000000000000000000000000000000 598 | 0000000000000000000000000000000000000000000000000000000000000000 599 | 0000000000000000000000000000000000000000000000000000000000000000 600 | 0000000000000000000000000000000000000000000000000000000000000000 601 | 0000000000000000000000000000000000000000000000000000000000000000 602 | 0000000000000000000000000000000000000000000000000000000000000000 603 | 0000000000000000000000000000000000000000000000000000000000000000 604 | 0000000000000000000000000000000000000000000000000000000000000000 605 | 0000000000000000000000000000000000000000000000000000000000000000 606 | 0000000000000000000000000000000000000000000000000000000000000000 607 | 0000000000000000000000000000000000000000000000000000000000000000 608 | 0000000000000000000000000000000000000000000000000000000000000000 609 | 0000000000000000000000000000000000000000000000000000000000000000 610 | 0000000000000000000000000000000000000000000000000000000000000000 611 | 0000000000000000000000000000000000000000000000000000000000000000 612 | 0000000000000000000000000000000000000000000000000000000000000000 613 | 0000000000000000000000000000000000000000000000000000000000000000 614 | 0000000000000000000000000000000000000000000000000000000000000000 615 | 0000000000000000000000000000000000000000000000000000000000000000 616 | 0000000000000000000000000000000000000000000000000000000000000000 617 | 0000000000000000000000000000000000000000000000000000000000000000 618 | 0000000000000000000000000000000000000000000000000000000000000000 619 | 0000000000000000000000000000000000000000000000000000000000000000 620 | 0000000000000000000000000000000000000000000000000000000000000000 621 | 0000000000000000000000000000000000000000000000000000000000000000 622 | 0000000000000000000000000000000000000000000000000000000000000000 623 | 0000000000000000000000000000000000000000000000000000000000000000 624 | 0000000000000000000000000000000000000000000000000000000000000000 625 | 0000000000000000000000000000000000000000000000000000000000000000 626 | 0000000000000000000000000000000000000000000000000000000000000000 627 | 0000000000000000000000000000000000000000000000000000000000000000 628 | 0000000000000000000000000000000000000000000000000000000000000000 629 | 0000000000000000000000000000000000000000000000000000000000000000 630 | 0000000000000000000000000000000000000000000000000000000000000000 631 | 0000000000000000000000000000000000000000000000000000000000000000 632 | 0000000000000000000000000000000000000000000000000000000000000000 633 | 0000000000000000000000000000000000000000000000000000000000000000 634 | 0000000000000000000000000000000000000000000000000000000000000000 635 | 0000000000000000000000000000000000000000000000000000000000000000 636 | 0000000000000000000000000000000000000000000000000000000000000000 637 | 0000000000000000000000000000000000000000000000000000000000000000 638 | 0000000000000000000000000000000000000000000000000000000000000000 639 | 0000000000000000000000000000000000000000000000000000000000000000 640 | 0000000000000000000000000000000000000000000000000000000000000000 641 | 0000000000000000000000000000000000000000000000000000000000000000 642 | 0000000000000000000000000000000000000000000000000000000000000000 643 | 0000000000000000000000000000000000000000000000000000000000000000 644 | 0000000000000000000000000000000000000000000000000000000000000000 645 | 0000000000000000000000000000000000000000000000000000000000000000 646 | 0000000000000000000000000000000000000000000000000000000000000000 647 | 0000000000000000000000000000000000000000000000000000000000000000 648 | 0000000000000000000000000000000000000000000000000000000000000000 649 | 0000000000000000000000000000000000000000000000000000000000000000 650 | 0000000000000000000000000000000000000000000000000000000000000000 651 | 0000000000000000000000000000000000000000000000000000000000000000 652 | 0000000000000000000000000000000000000000000000000000000000000000 653 | 0000000000000000000000000000000000000000000000000000000000000000 654 | 0000000000000000000000000000000000000000000000000000000000000000 655 | 0000000000000000000000000000000000000000000000000000000000000000 656 | 0000000000000000000000000000000000000000000000000000000000000000 657 | 0000000000000000000000000000000000000000000000000000000000000000 658 | 0000000000000000000000000000000000000000000000000000000000000000 659 | 0000000000000000000000000000000000000000000000000000000000000000 660 | 0000000000000000000000000000000000000000000000000000000000000000 661 | 0000000000000000000000000000000000000000000000000000000000000000 662 | 0000000000000000000000000000000000000000000000000000000000000000 663 | 0000000000000000000000000000000000000000000000000000000000000000 664 | 0000000000000000000000000000000000000000000000000000000000000000 665 | 0000000000000000000000000000000000000000000000000000000000000000 666 | 0000000000000000000000000000000000000000000000000000000000000000 667 | 0000000000000000000000000000000000000000000000000000000000000000 668 | 0000000000000000000000000000000000000000000000000000000000000000 669 | 0000000000000000000000000000000000000000000000000000000000000000 670 | 0000000000000000000000000000000000000000000000000000000000000000 671 | 0000000000000000000000000000000000000000000000000000000000000000 672 | 0000000000000000000000000000000000000000000000000000000000000000 673 | 0000000000000000000000000000000000000000000000000000000000000000 674 | 0000000000000000000000000000000000000000000000000000000000000000 675 | 0000000000000000000000000000000000000000000000000000000000000000 676 | 0000000000000000000000000000000000000000000000000000000000000000 677 | 0000000000000000000000000000000000000000000000000000000000000000 678 | 0000000000000000000000000000000000000000000000000000000000000000 679 | 0000000000000000000000000000000000000000000000000000000000000000 680 | 0000000000000000000000000000000000000000000000000000000000000000 681 | 0000000000000000000000000000000000000000000000000000000000000000 682 | 0000000000000000000000000000000000000000000000000000000000000000 683 | 0000000000000000000000000000000000000000000000000000000000000000 684 | 0000000000000000000000000000000000000000000000000000000000000000 685 | 0000000000000000000000000000000000000000000000000000000000000000 686 | 0000000000000000000000000000000000000000000000000000000000000000 687 | 0000000000000000000000000000000000000000000000000000000000000000 688 | 0000000000000000000000000000000000000000000000000000000000000000 689 | 0000000000000000000000000000000000000000000000000000000000000000 690 | 0000000000000000000000000000000000000000000000000000000000000000 691 | 0000000000000000000000000000000000000000000000000000000000000000 692 | 0000000000000000000000000000000000000000000000000000000000000000 693 | 0000000000000000000000000000000000000000000000000000000000000000 694 | 0000000000000000000000000000000000000000000000000000000000000000 695 | 0000000000000000000000000000000000000000000000000000000000000000 696 | 0000000000000000000000000000000000000000000000000000000000000000 697 | 0000000000000000000000000000000000000000000000000000000000000000 698 | 0000000000000000000000000000000000000000000000000000000000000000 699 | 0000000000000000000000000000000000000000000000000000000000000000 700 | 0000000000000000000000000000000000000000000000000000000000000000 701 | 0000000000000000000000000000000000000000000000000000000000000000 702 | 0000000000000000000000000000000000000000000000000000000000000000 703 | 0000000000000000000000000000000000000000000000000000000000000000 704 | 0000000000000000000000000000000000000000000000000000000000000000 705 | 0000000000000000000000000000000000000000000000000000000000000000 706 | 0000000000000000000000000000000000000000000000000000000000000000 707 | 0000000000000000000000000000000000000000000000000000000000000000 708 | 0000000000000000000000000000000000000000000000000000000000000000 709 | 0000000000000000000000000000000000000000000000000000000000000000 710 | 0000000000000000000000000000000000000000000000000000000000000000 711 | 0000000000000000000000000000000000000000000000000000000000000000 712 | 0000000000000000000000000000000000000000000000000000000000000000 713 | 0000000000000000000000000000000000000000000000000000000000000000 714 | 0000000000000000000000000000000000000000000000000000000000000000 715 | 0000000000000000000000000000000000000000000000000000000000000000 716 | 0000000000000000000000000000000000000000000000000000000000000000 717 | 0000000000000000000000000000000000000000000000000000000000000000 718 | 0000000000000000000000000000000000000000000000000000000000000000 719 | 0000000000000000000000000000000000000000000000000000000000000000 720 | 0000000000000000000000000000000000000000000000000000000000000000 721 | 0000000000000000000000000000000000000000000000000000000000000000 722 | 0000000000000000000000000000000000000000000000000000000000000000 723 | 0000000000000000000000000000000000000000000000000000000000000000 724 | 0000000000000000000000000000000000000000000000000000000000000000 725 | 0000000000000000000000000000000000000000000000000000000000000000 726 | 0000000000000000000000000000000000000000000000000000000000000000 727 | 0000000000000000000000000000000000000000000000000000000000000000 728 | 0000000000000000000000000000000000000000000000000000000000000000 729 | 0000000000000000000000000000000000000000000000000000000000000000 730 | 0000000000000000000000000000000000000000000000000000000000000000 731 | 0000000000000000000000000000000000000000000000000000000000000000 732 | 0000000000000000000000000000000000000000000000000000000000000000 733 | 0000000000000000000000000000000000000000000000000000000000000000 734 | 0000000000000000000000000000000000000000000000000000000000000000 735 | 0000000000000000000000000000000000000000000000000000000000000000 736 | 0000000000000000000000000000000000000000000000000000000000000000 737 | 0000000000000000000000000000000000000000000000000000000000000000 738 | 0000000000000000000000000000000000000000000000000000000000000000 739 | 0000000000000000000000000000000000000000000000000000000000000000 740 | 0000000000000000000000000000000000000000000000000000000000000000 741 | 0000000000000000000000000000000000000000000000000000000000000000 742 | 0000000000000000000000000000000000000000000000000000000000000000 743 | 0000000000000000000000000000000000000000000000000000000000000000 744 | 0000000000000000000000000000000000000000000000000000000000000000 745 | 0000000000000000000000000000000000000000000000000000000000000000 746 | 0000000000000000000000000000000000000000000000000000000000000000 747 | 0000000000000000000000000000000000000000000000000000000000000000 748 | 0000000000000000000000000000000000000000000000000000000000000000 749 | 0000000000000000000000000000000000000000000000000000000000000000 750 | 0000000000000000000000000000000000000000000000000000000000000000 751 | 0000000000000000000000000000000000000000000000000000000000000000 752 | 0000000000000000000000000000000000000000000000000000000000000000 753 | 0000000000000000000000000000000000000000000000000000000000000000 754 | 0000000000000000000000000000000000000000000000000000000000000000 755 | 0000000000000000000000000000000000000000000000000000000000000000 756 | 0000000000000000000000000000000000000000000000000000000000000000 757 | 0000000000000000000000000000000000000000000000000000000000000000 758 | 0000000000000000000000000000000000000000000000000000000000000000 759 | 0000000000000000000000000000000000000000000000000000000000000000 760 | 0000000000000000000000000000000000000000000000000000000000000000 761 | 0000000000000000000000000000000000000000000000000000000000000000 762 | 0000000000000000000000000000000000000000000000000000000000000000 763 | 0000000000000000000000000000000000000000000000000000000000000000 764 | 0000000000000000000000000000000000000000000000000000000000000000 765 | 0000000000000000000000000000000000000000000000000000000000000000 766 | 0000000000000000000000000000000000000000000000000000000000000000 767 | 0000000000000000000000000000000000000000000000000000000000000000 768 | 0000000000000000000000000000000000000000000000000000000000000000 769 | 0000000000000000000000000000000000000000000000000000000000000000 770 | 0000000000000000000000000000000000000000000000000000000000000000 771 | 0000000000000000000000000000000000000000000000000000000000000000 772 | 0000000000000000000000000000000000000000000000000000000000000000 773 | 0000000000000000000000000000000000000000000000000000000000000000 774 | 0000000000000000000000000000000000000000000000000000000000000000 775 | 0000000000000000000000000000000000000000000000000000000000000000 776 | 0000000000000000000000000000000000000000000000000000000000000000 777 | 0000000000000000000000000000000000000000000000000000000000000000 778 | 0000000000000000000000000000000000000000000000000000000000000000 779 | 0000000000000000000000000000000000000000000000000000000000000000 780 | 0000000000000000000000000000000000000000000000000000000000000000 781 | 0000000000000000000000000000000000000000000000000000000000000000 782 | 0000000000000000000000000000000000000000000000000000000000000000 783 | 0000000000000000000000000000000000000000000000000000000000000000 784 | 0000000000000000000000000000000000000000000000000000000000000000 785 | 0000000000000000000000000000000000000000000000000000000000000000 786 | 0000000000000000000000000000000000000000000000000000000000000000 787 | 000000000000000000000000000000000000424D3E000000000000003E000000 788 | 2800000080000000600000000100010000000000000600000000000000000000 789 | 000000000000000000000000FFFFFF00FFFFFFFF0000007F0000000000000000 790 | 9FFFFFF90000003F00000000000000008FFFFFF11FFFF81F0000000000000000 791 | C7FFFFE33FFFFC8F0000000000000000E3FFFFC73FFFFCC70000000000000000 792 | F1FFFF8F3FFFFCE30000000000000000F8FFFF1F3FFFFCF10000000000000000 793 | FC7FFE3F3E07FCF80000000000000000FE3FFC7F3E03FC000000000000000000 794 | FF1FF8FF3E71FC000000000000000000FF8FF1FF3E78FFF80000000000000000 795 | FFC7E3FF3E7C7FFC0000000000000000FFE3C7FF3E3E3FFC0000000000000000 796 | FFF18FFF3F1F1FFC0000000000000000FFF81FFF3F8F8FFC0000000000000000 797 | FFFC3FFF3FC7C7FC0000000000000000FFFC3FFF3FE3E3FC0000000000000000 798 | FFF81FFF3FF1F1FC0000000000000000FFF18FFF3FF8F8FC0000000000000000 799 | FFE3C7FF3FFC7C7C0000000000000000FFC7E3FF3FFE3E3C0000000000000000 800 | FF8FF1FF3FFF1F1E0000000000000000FF1FF8FF3FFF8F8F0000000000000000 801 | FE3FFC7F3FFFC7C70000000000000000FC7FFE3F3FFFE3E30000000000000000 802 | F8FFFF1F3FFFF1F10000000000000000F1FFFF8F3FFFF8F80000000000000000 803 | E3FFFFC73FFFFC780000000000000000C7FFFFE31FFFFE380000000000000000 804 | 8FFFFFF18FFFFF0100000000000000009FFFFFF9800007810000000000000000 805 | FFFFFFFFE00003C70000000000000000E003FFFFE7F81FFFFFE0FFFFFFFFFFFF 806 | 8000FFFFE7C003FFFFE07FFFFFFFFFFF8FF8FFFFE70180FFFFE07FFFFFFFFFFF 807 | 1FFCFFFFE41FF83FFFF23FFFFFFFFFFF3FFCFFFFE07FFE1FFFF31FFFFFFFFFFF 808 | 3FFCFFFFE0FFFF0FFFF11FFFFFFFFFFF3FFCFFFFE1FFFFC7FFF18FFFFFFFFFFF 809 | 3FFCFFFFE00FFFC7FFF9C7FFFF07FFFF3FFCFE7FF00FFFE3FFF9C7FFFE03FFFF 810 | 3FFCFE3FFFFFFFF3FFF8E3FFFC61FFFF3FFCFF1FFFFFFFF1FFF8F1FFF8F0FFFF 811 | 3FFFFF8FFFFFFFF9FC00F1FFF1F87FFF3FFFFFC7FFFFFFF9F800F8FFE3FC3FFF 812 | 3FFFFFE3FFFFFFF8F9FFFC7FC7FE1FFF3FFFFFE1FFFFFFF8F9FFFC7F8FFF0FFF 813 | 3F800001FFFFFFFCF9FFFE3F9FFF87FF3F8000013FFFFFFFF8FFFF3FFFFFC3FF 814 | 3FFFFFE11FFFFFFFF8FFFF1FFFFFE1FF3FFFFFE31FFFFFFFFCFFFF1FFFFFF0FF 815 | 3FFFFFC79FFFFFFFFCFE003FFFFFF87F3FFFFF8F9FFFFFFFFC7E003FFFFFFC3F 816 | 3FFCFF1F8FFFFFFFFE7F3FFFFFFFFE1F3FFCFE3FCFFFFFFFFE7F1FFFFFFFFF0F 817 | 3FFCFE7FC7FFF00FFE3F1FFFFFFFFF873FFCFFFFE3FFF007FF3F9FFFFFFFFFC3 818 | 3FFCFFFFE3FFFF87FF3F8FFFFFFFFFE13FFCFFFFF0FFFF07FF1FCFFFFFFFFFF1 819 | 3FFCFFFFF87FFE07FF1FCFFFFFFFFFF91FFCFFFFFC1FF827FF9FC7FFFFFFFFFF 820 | 8FF8FFFFFF0180E7FF8FC7FFFFFFFFFF8000FFFFFFC003E7FF8003FFFFFFFFFF 821 | E003FFFFFFF81FE7FFC003FFFFFFFFFFFFFFFFFFE03FFFFFE0000007E0000007 822 | FFFFFFFF803FFFFF8000000180000001FFFFFFFF8FFFFFFF8FFFFFF18FFFFFF1 823 | FFFFFFFF1FFFFFFF1FFFFFF81FFFFFF8FFFFFFFF3FFFFFFF3FFFFFFC3FFFFFFC 824 | FFFFFFFF3FFFFFFF3FFFFFFC3FFFFFFCFFFFFFFF3FFFFFFF3FFFFFFC3FFFFFFC 825 | FFFFFFFF3FFFFFFF3FFC3FFC3FFC3FFCFFFFFE3F3FFFFE3F3FF81FFC3FF81FFC 826 | FFFFFF1F3FFFFF1F3FF00FFC3FF00FFCFFFFFF8F3FFFFF8FFFE247FFFFE247FF 827 | FFFFFFC73FFFFFC7FFC663FFFFC663FFFFFFFFE33FFFFFE3FF8E71FFFF8E71FF 828 | FFFFFFF13FFFFFF1FF9E79FFFF9E79FFFFFFFFF13FFFFFF1FFFE7FFFFFFE7FFF 829 | 000000003E000000FFFE7FFFFFFE7FFF000000003E000000FFFE7FFFFFFE7FFF 830 | FFFFFFF13FFFFFF1FFFE7FFFFFFE7FFFFFFFFFF13FFFFFF1FFFE7FFFFFFE7FFF 831 | FFFFFFE33FFFFFE3FFFE7FFFFFFE7FFFFFFFFFC73FFFFFC7FFFE7FFFFFFE7FFF 832 | FFFFFF8F3FFFFF8FFFFE7FFFFFFE7FFFFFFFFF1F3FFFFF1FFFFE7FFFFFFE7FFF 833 | FFFFFE3F3FFFFE3FFFFE7FFFFFFE7FFFFFFFFFFF3FFFFFFFFFFE7FFFFFFE7FFF 834 | FFFFFFFF3FFFFFFFFFFE7FFFFFFE7FFFFFFFFFFF3FFFFFFFFFFE7FFFFFFE7FFF 835 | FFFFFFFF3FFFFFFFFFFE7FFFFFFE7FFFFFFFFFFF1FFFFFFFFFFE7FFFFFFE7FFF 836 | FFFFFFFF8FFFFFFFFFFE7FFFFFFE7FFFFFFFFFFF803FFFFFFFFE7FFFFFFE7FFF 837 | FFFFFFFFE03FFFFFFFFE7FFFFFFE7FFF00000000000000000000000000000000 838 | 000000000000} 839 | end 840 | object FDMoniFlatFileClientLink1: TFDMoniFlatFileClientLink 841 | Left = 792 842 | Top = 400 843 | end 844 | object FDMoniCustomClientLink1: TFDMoniCustomClientLink 845 | Left = 792 846 | Top = 456 847 | end 848 | object FDMoniRemoteClientLink1: TFDMoniRemoteClientLink 849 | Left = 792 850 | Top = 512 851 | end 852 | object ARDB: TFDConnection 853 | Params.Strings = ( 854 | 'DriverID=SQLite') 855 | ResourceOptions.AssignedValues = [rvKeepConnection] 856 | ResourceOptions.KeepConnection = False 857 | UpdateOptions.AssignedValues = [uvEDelete, uvEInsert, uvEUpdate] 858 | UpdateOptions.EnableDelete = False 859 | UpdateOptions.EnableInsert = False 860 | UpdateOptions.EnableUpdate = False 861 | ConnectedStoredUsage = [] 862 | LoginPrompt = False 863 | Left = 224 864 | Top = 295 865 | end 866 | object dsTables: TFDMemTable 867 | IndexFieldNames = 'TABLE_NAME' 868 | FetchOptions.AssignedValues = [evItems] 869 | FormatOptions.AssignedValues = [fvMapRules] 870 | FormatOptions.OwnMapRules = True 871 | FormatOptions.MapRules = < 872 | item 873 | SourceDataType = dtMemo 874 | TargetDataType = dtAnsiString 875 | end> 876 | ResourceOptions.AssignedValues = [rvEscapeExpand] 877 | UpdateOptions.AssignedValues = [uvEDelete, uvEInsert, uvEUpdate] 878 | Left = 224 879 | Top = 352 880 | object dsTablesTABLE_NAME: TStringField 881 | FieldName = 'TABLE_NAME' 882 | Origin = 'TABLE_NAME' 883 | ProviderFlags = [pfInUpdate, pfInWhere, pfInKey] 884 | Size = 200 885 | end 886 | object dsTablesCLASS_NAME: TStringField 887 | FieldName = 'CLASS_NAME' 888 | Origin = 'CLASS_NAME' 889 | Size = 200 890 | end 891 | object dsTablesDEPLOY_PATH: TStringField 892 | FieldName = 'DEPLOY_PATH' 893 | Origin = 'DEPLOY_PATH' 894 | Size = 200 895 | end 896 | object dsTablesDECLARE_AS_ABSTRACT: TStringField 897 | FieldName = 'DECLARE_AS_ABSTRACT' 898 | Size = 1 899 | end 900 | object dsTablesREGISTER_ENTITY: TStringField 901 | FieldName = 'REGISTER_ENTITY' 902 | Size = 1 903 | end 904 | object dsTablesWITH_DETAIL: TStringField 905 | FieldName = 'WITH_DETAIL' 906 | Origin = 'WITH_DETAIL' 907 | Size = 200 908 | end 909 | object dsTablesDETAIL_CLASS_NAME: TStringField 910 | FieldName = 'DETAIL_CLASS_NAME' 911 | Origin = 'DETAIL_CLASS_NAME' 912 | Size = 200 913 | end 914 | object dsTablesDETAIL_PROP_NAME: TStringField 915 | FieldName = 'DETAIL_PROP_NAME' 916 | Origin = 'DETAIL_PROP_NAME' 917 | Size = 200 918 | end 919 | object dsTablesDETAIL_UNIT_NAME: TStringField 920 | FieldName = 'DETAIL_UNIT_NAME' 921 | Origin = 'DETAIL_UNIT_NAME' 922 | Size = 200 923 | end 924 | end 925 | object srcTables: TDataSource 926 | DataSet = dsTables 927 | Left = 296 928 | Top = 352 929 | end 930 | object dsFields: TFDMemTable 931 | IndexFieldNames = 'TABLE_NAME' 932 | MasterSource = srcTables 933 | MasterFields = 'TABLE_NAME' 934 | FetchOptions.AssignedValues = [evMode] 935 | FetchOptions.Mode = fmAll 936 | ResourceOptions.AssignedValues = [rvSilentMode] 937 | ResourceOptions.SilentMode = True 938 | UpdateOptions.AssignedValues = [uvCheckRequired, uvAutoCommitUpdates] 939 | UpdateOptions.CheckRequired = False 940 | UpdateOptions.AutoCommitUpdates = True 941 | Left = 224 942 | Top = 408 943 | object dsFieldsTABLE_NAME: TStringField 944 | FieldName = 'TABLE_NAME' 945 | end 946 | object dsFieldsFIELD_NAME: TStringField 947 | FieldName = 'FIELD_NAME' 948 | end 949 | object dsFieldsCUSTOM_NAME: TStringField 950 | FieldName = 'CUSTOM_NAME' 951 | end 952 | end 953 | object srcFields: TDataSource 954 | DataSet = dsFields 955 | Left = 292 956 | Top = 406 957 | end 958 | object PopupMenuGridTables: TPopupMenu 959 | Left = 384 960 | Top = 323 961 | object MenuItemEditTable: TMenuItem 962 | Action = ActionEditTable 963 | OnClick = MenuItemEditTableClick 964 | end 965 | end 966 | object PopupMenuEditField: TPopupMenu 967 | Left = 944 968 | Top = 323 969 | object MenuItemEditRow: TMenuItem 970 | Action = ActionEditField 971 | end 972 | end 973 | object PopupMenuDeclareAsAbstract: TPopupMenu 974 | Left = 784 975 | Top = 235 976 | object MenuItemMarkAllDeclareAsAbstract: TMenuItem 977 | Action = ActionMarkAllDeclareAsAbstract 978 | end 979 | object MenuItemUnmarkAllDelcareAsAbstract: TMenuItem 980 | Action = ActionUnmarkAllDeclareAsAbstract 981 | end 982 | object MenuItemInvertDeclareAsAbstract: TMenuItem 983 | Action = ActionInvertMarksDeclareAsAbstract 984 | end 985 | end 986 | object PopupMenuRegisterEntity: TPopupMenu 987 | Left = 784 988 | Top = 291 989 | object MenuItemMarkAllRegisterEntity: TMenuItem 990 | Action = ActionMarkAllRegisterEntity 991 | end 992 | object MenuItemUnmarkAllRegisterEntity: TMenuItem 993 | Action = ActionUnmarkAllRegisterEntity 994 | end 995 | object MenuItemInvertMarksRegisterEntity: TMenuItem 996 | Action = ActionInvertMarksRegisterEntity 997 | end 998 | end 999 | end 1000 | -------------------------------------------------------------------------------- /MainForm.pas: -------------------------------------------------------------------------------- 1 | unit MainForm; 2 | 3 | interface 4 | 5 | uses 6 | Data.DB, 7 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, 8 | Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.DBGrids, Vcl.Buttons, Vcl.ActnList, Vcl.Menus, Vcl.StdActns, 9 | Vcl.ExtActns, System.ImageList, Vcl.ImgList, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Grids, Vcl.ValEdit, 10 | VCL.Themes, 11 | FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, 12 | FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, 13 | FireDAC.VCLUI.Wait, FireDAC.Comp.UI, FireDAC.Phys.IBBase, FireDAC.Phys.FB, FireDAC.Comp.DataSet, FireDAC.Comp.Client, 14 | FireDAC.Phys.ODBCBase, FireDAC.Phys.FBDef, FireDAC.Phys.MySQLDef, FireDAC.Phys.MySQL, FireDAC.Phys.PGDef, 15 | FireDAC.Phys.PG, FireDAC.Phys.IBDef, FireDAC.Phys.IB, FireDAC.Stan.ExprFuncs, FireDAC.Phys.SQLiteDef, FireDAC.Phys.SQLite, 16 | FireDAC.Phys.SQLiteWrapper.Stat, FireDAC.Moni.FlatFile, FireDAC.Phys.SQLiteWrapper, 17 | JsonDataObjects, System.Actions, 18 | LoggerPro.FileAppender, 19 | LoggerPro.VCLListBoxAppender, 20 | LoggerPro, 21 | FireDAC.Moni.RemoteClient, FireDAC.Moni.Custom, FireDAC.Moni.Base, 22 | ARGeneratorController, FireDAC.Phys.MSAcc, FireDAC.Phys.MSAccDef; 23 | 24 | type 25 | TMain = class(TForm) 26 | DBConnection: TFDConnection; 27 | FDPhysFBDriverLink1: TFDPhysFBDriverLink; 28 | FDGUIxWaitCursor1: TFDGUIxWaitCursor; 29 | FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink; 30 | FDPhysPgDriverLink1: TFDPhysPgDriverLink; 31 | FDPhysFBDriverLink2: TFDPhysFBDriverLink; 32 | FDPhysIBDriverLink1: TFDPhysIBDriverLink; 33 | FDPhysMySQLDriverLink2: TFDPhysMySQLDriverLink; 34 | FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink; 35 | Panel8: TPanel; 36 | BtnSaveProject: TButton; 37 | DialogOpenProject: TFileOpenDialog; 38 | MainMenu: TMainMenu; 39 | ActionList: TActionList; 40 | ActionOpenProject: TAction; 41 | ActionSaveProject: TAction; 42 | ActionSaveProjectAs: TAction; 43 | MenuItemFile: TMenuItem; 44 | MenuItemLoadProject: TMenuItem; 45 | MenuItemSaveProject: TMenuItem; 46 | MenuItemSaveProjectAs: TMenuItem; 47 | MenuItemExit: TMenuItem; 48 | N1: TMenuItem; 49 | ActionRefreshMetadata: TAction; 50 | DialogSaveProject: TFileSaveDialog; 51 | ActionNewProject: TAction; 52 | MenuItemNewProject: TMenuItem; 53 | ImageListMainMenu: TImageList; 54 | MenuItemEntities: TMenuItem; 55 | MenuItemRefreshMetaData: TMenuItem; 56 | MenuItemGenerateCodeCurrent: TMenuItem; 57 | Panel12: TPanel; 58 | lbLog: TListBox; 59 | Splitter1: TSplitter; 60 | Panel5: TPanel; 61 | FDMoniFlatFileClientLink1: TFDMoniFlatFileClientLink; 62 | FDMoniCustomClientLink1: TFDMoniCustomClientLink; 63 | FDMoniRemoteClientLink1: TFDMoniRemoteClientLink; 64 | ARDB: TFDConnection; 65 | dsTables: TFDMemTable; 66 | dsTablesTABLE_NAME: TStringField; 67 | dsTablesCLASS_NAME: TStringField; 68 | dsTablesDEPLOY_PATH: TStringField; 69 | dsTablesWITH_DETAIL: TStringField; 70 | dsTablesDETAIL_CLASS_NAME: TStringField; 71 | dsTablesDETAIL_PROP_NAME: TStringField; 72 | dsTablesDETAIL_UNIT_NAME: TStringField; 73 | srcTables: TDataSource; 74 | dsFields: TFDMemTable; 75 | dsFieldsTABLE_NAME: TStringField; 76 | dsFieldsFIELD_NAME: TStringField; 77 | srcFields: TDataSource; 78 | dsFieldsCUSTOM_NAME: TStringField; 79 | BtnGenerateCurrent: TButton; 80 | BtnGenerateAll: TButton; 81 | ActionGenerateCurrent: TAction; 82 | ActionGenerateAll: TAction; 83 | Panel3: TPanel; 84 | Panel4: TPanel; 85 | btnGenEntities: TButton; 86 | RadioGroupNameCase: TRadioGroup; 87 | RadioGroupFieldNameFormatting: TRadioGroup; 88 | Panel10: TPanel; 89 | btnGetTables: TButton; 90 | BtnConnectDatabase: TButton; 91 | PageControl: TPageControl; 92 | TabSheetTables: TTabSheet; 93 | Splitter2: TSplitter; 94 | Panel7: TPanel; 95 | GridTables: TDBGrid; 96 | GridFields: TDBGrid; 97 | TabSheetSource: TTabSheet; 98 | MemoOutputCode: TMemo; 99 | PanelSource: TPanel; 100 | ActionConnectDatabase: TAction; 101 | dsTablesDECLARE_AS_ABSTRACT: TStringField; 102 | dsTablesREGISTER_ENTITY: TStringField; 103 | PopupMenuGridTables: TPopupMenu; 104 | MenuItemEditTable: TMenuItem; 105 | ActionEditTable: TAction; 106 | PopupMenuEditField: TPopupMenu; 107 | MenuItemEditRow: TMenuItem; 108 | ActionEditField: TAction; 109 | PopupMenuDeclareAsAbstract: TPopupMenu; 110 | MenuItemMarkAllDeclareAsAbstract: TMenuItem; 111 | MenuItemUnmarkAllDelcareAsAbstract: TMenuItem; 112 | MenuItemInvertDeclareAsAbstract: TMenuItem; 113 | PopupMenuRegisterEntity: TPopupMenu; 114 | MenuItemMarkAllRegisterEntity: TMenuItem; 115 | MenuItemUnmarkAllRegisterEntity: TMenuItem; 116 | MenuItemInvertMarksRegisterEntity: TMenuItem; 117 | ActionMarkAllDeclareAsAbstract: TAction; 118 | ActionUnmarkAllDeclareAsAbstract: TAction; 119 | ActionInvertMarksDeclareAsAbstract: TAction; 120 | ActionMarkAllRegisterEntity: TAction; 121 | ActionUnmarkAllRegisterEntity: TAction; 122 | ActionInvertMarksRegisterEntity: TAction; 123 | MenuItemOpenRecent: TMenuItem; 124 | MenuItemReopenLastOneOnEnter: TMenuItem; 125 | procedure FormCreate(Sender: TObject); 126 | procedure FormClose(Sender: TObject; var Action: TCloseAction); 127 | procedure ActionOpenProjectExecute(Sender: TObject); 128 | procedure ActionSaveProjectExecute(Sender: TObject); 129 | procedure ActionSaveProjectAsExecute(Sender: TObject); 130 | procedure ActionNewProjectExecute(Sender: TObject); 131 | procedure GridTablesDblClick(Sender: TObject); 132 | procedure GridFieldsDblClick(Sender: TObject); 133 | procedure ActionSaveProjectUpdate(Sender: TObject); 134 | procedure GridTablesDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 135 | procedure GridFieldsDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 136 | procedure ActionGenerateCurrentExecute(Sender: TObject); 137 | procedure ActionGenerateAllExecute(Sender: TObject); 138 | procedure ActionGenerateCurrentUpdate(Sender: TObject); 139 | procedure ActionGenerateAllUpdate(Sender: TObject); 140 | procedure ActionConnectDatabaseExecute(Sender: TObject); 141 | procedure ActionConnectDatabaseUpdate(Sender: TObject); 142 | procedure ActionRefreshMetadataExecute(Sender: TObject); 143 | procedure ActionRefreshMetadataUpdate(Sender: TObject); 144 | procedure RadioGroupNameCaseClick(Sender: TObject); 145 | procedure RadioGroupFieldNameFormattingClick(Sender: TObject); 146 | 147 | procedure ActionSaveProjectAsUpdate(Sender: TObject); 148 | procedure MenuItemEditTableClick(Sender: TObject); 149 | procedure ActionEditTableExecute(Sender: TObject); 150 | procedure ActionEditFieldExecute(Sender: TObject); 151 | procedure GridTablesTitleClick(Column: TColumn); 152 | procedure ActionMarkAllDeclareAsAbstractExecute(Sender: TObject); 153 | procedure ActionUnmarkAllDeclareAsAbstractExecute(Sender: TObject); 154 | procedure ActionInvertMarksDeclareAsAbstractExecute(Sender: TObject); 155 | procedure ActionMarkAllRegisterEntityExecute(Sender: TObject); 156 | procedure ActionUnmarkAllRegisterEntityExecute(Sender: TObject); 157 | procedure ActionInvertMarksRegisterEntityExecute(Sender: TObject); 158 | private 159 | RegRoot :string; {Windows Registry Root} 160 | FRecentlyOpen :TStringList; 161 | FFileName :string; {The complete path of the poject. With file name.} 162 | FModified :Boolean; {Changes not saved on disk} 163 | Log :ILogWriter; 164 | Controller :TARGeneratorController; {Controller of this project} 165 | procedure ResetAllData; 166 | procedure LoadProject; 167 | procedure SetOnViewDataFromMemory; 168 | procedure DisableVisualEvents; 169 | procedure EnableVisualEvents; 170 | procedure LoadSettings; 171 | procedure SaveSettings; 172 | procedure UpdateOpenRecentSubItems; 173 | procedure MenuItemOpenRecent_OnClick(Sender: TObject); 174 | procedure SetLastOpened(AFileName :string); 175 | function GetProjectName:string; 176 | 177 | property ProjectName :string read GetProjectName; {The name of the project. Without path.} 178 | public 179 | end; 180 | 181 | var 182 | Main: TMain; 183 | 184 | const 185 | DEFAULT_PROJECT_NAME = 'EntitiesDB.entgen'; 186 | LOG_TAG = 'generator'; 187 | NOT_SAVED_PROJECT_NAME = 'Untitled.entgen'; 188 | 189 | REG_REOPEN_LAST = 'ReopenLast'; 190 | REG_LAST_0 = 'Last Opened 0'; 191 | REG_LAST_1 = 'Last Opened 1'; 192 | REG_LAST_2 = 'Last Opened 2'; 193 | REG_LAST_3 = 'Last Opened 3'; 194 | REG_LAST_4 = 'Last Opened 4'; 195 | REG_LAST_5 = 'Last Opened 5'; 196 | REG_LAST_6 = 'Last Opened 6'; 197 | REG_LAST_7 = 'Last Opened 7'; 198 | REG_LAST_8 = 'Last Opened 8'; 199 | REG_LAST_9 = 'Last Opened 9'; 200 | 201 | implementation 202 | 203 | uses System.IOUtils, 204 | System.TypInfo, 205 | System.UITypes, 206 | System.DateUtils, 207 | System.Win.Registry, 208 | LoggerPro.GlobalLogger, 209 | System.Generics.Collections, 210 | MVCFramework.Commons, 211 | FireDAC.VCLUI.ConnEdit, {To allow executing the connection Editor} 212 | EditTable, 213 | EditField, 214 | UtilsU; 215 | 216 | {$R *.dfm} 217 | 218 | procedure TMain.FormCreate(Sender: TObject); 219 | var UILogFormat :string; 220 | i :Integer; 221 | begin 222 | FModified := False; 223 | FFileName := ExtractFilePath(ParamStr(0)) + NOT_SAVED_PROJECT_NAME; 224 | 225 | FRecentlyOpen := TStringList.Create; 226 | for i := 0 to 9 do FRecentlyOpen.Add(''); 227 | 228 | DialogOpenProject.DefaultExtension := 'entgen'; 229 | 230 | {Configures LoggerPro} 231 | UILogFormat := '%0:s [%2:-10s] %3:s'; 232 | Log := BuildLogWriter([ 233 | TLoggerProFileAppender.Create, 234 | TVCLListBoxAppender.Create(lbLog, 2000, UILogFormat) 235 | ]); 236 | 237 | ARDB.DriverName := 'SQLite'; 238 | ARDB.Params.Add('OpenMode = CreateUTF8'); 239 | ARDB.Params.Add('CharacterSet = UTF8'); 240 | 241 | Controller := TARGeneratorController.Create; 242 | Controller.Log := Log; 243 | Controller.ARDB := ARDB; 244 | 245 | {Initializes the Connection to avoid the design-time values} 246 | DBConnection.Params.Text := ''; 247 | DBConnection.DriverName := ''; 248 | DBConnection.LoginPrompt := False; 249 | 250 | Controller.Connection := DBConnection; 251 | Controller.NameCase := RadioGroupNameCase; 252 | Controller.FieldNameFormatting := RadioGroupFieldNameFormatting; 253 | Controller.CreateEntGenDB; 254 | 255 | RegRoot := '\Software\'+TPath.GetFileNameWithoutExtension(ParamStr(0)); 256 | LoadSettings; 257 | UpdateOpenRecentSubItems; 258 | 259 | 260 | 261 | { Open the last project used, if configured } 262 | if (MenuItemOpenRecent.Count > 0) and (MenuItemReopenLastOneOnEnter.Checked) then begin 263 | FFileName := FRecentlyOpen[0]; 264 | 265 | LoadProject; 266 | end; 267 | end; 268 | 269 | procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction); 270 | begin 271 | SaveSettings; 272 | FRecentlyOpen.Free; 273 | Controller.Free; 274 | end; 275 | 276 | procedure TMain.DisableVisualEvents; 277 | begin 278 | RadioGroupNameCase.OnClick := nil; 279 | RadioGroupFieldNameFormatting.OnClick := nil; 280 | end; 281 | 282 | procedure TMain.EnableVisualEvents; 283 | begin 284 | RadioGroupNameCase.OnClick := RadioGroupNameCaseClick; 285 | RadioGroupFieldNameFormatting.OnClick := RadioGroupFieldNameFormattingClick; 286 | end; 287 | 288 | procedure TMain.LoadSettings; 289 | var Reg :TRegistry; 290 | begin 291 | Reg := TRegistry.Create; 292 | Reg.RootKey := HKEY_CURRENT_USER; 293 | try 294 | if not Reg.KeyExists(RegRoot) then begin 295 | Reg.CreateKey(RegRoot); 296 | try 297 | { Second param is True, because we want to create it if it doesn't exist } 298 | Reg.OpenKey(RegRoot, True); 299 | Reg.WriteString(REG_REOPEN_LAST, 'Y'); 300 | Reg.WriteString(REG_LAST_0 , ''); 301 | Reg.WriteString(REG_LAST_1 , ''); 302 | Reg.WriteString(REG_LAST_2 , ''); 303 | Reg.WriteString(REG_LAST_3 , ''); 304 | Reg.WriteString(REG_LAST_4 , ''); 305 | Reg.WriteString(REG_LAST_5 , ''); 306 | Reg.WriteString(REG_LAST_6 , ''); 307 | Reg.WriteString(REG_LAST_7 , ''); 308 | Reg.WriteString(REG_LAST_8 , ''); 309 | Reg.WriteString(REG_LAST_9 , ''); 310 | finally 311 | Reg.CloseKey; 312 | end; 313 | end 314 | else begin 315 | Reg.OpenKey(RegRoot, False); 316 | try 317 | MenuItemReopenLastOneOnEnter.Checked := Reg.ReadString(REG_REOPEN_LAST) = 'Y'; 318 | FRecentlyOpen[0] := Reg.ReadString(REG_LAST_0); 319 | FRecentlyOpen[1] := Reg.ReadString(REG_LAST_1); 320 | FRecentlyOpen[2] := Reg.ReadString(REG_LAST_2); 321 | FRecentlyOpen[3] := Reg.ReadString(REG_LAST_3); 322 | FRecentlyOpen[4] := Reg.ReadString(REG_LAST_4); 323 | FRecentlyOpen[5] := Reg.ReadString(REG_LAST_5); 324 | FRecentlyOpen[6] := Reg.ReadString(REG_LAST_6); 325 | FRecentlyOpen[7] := Reg.ReadString(REG_LAST_7); 326 | FRecentlyOpen[8] := Reg.ReadString(REG_LAST_8); 327 | FRecentlyOpen[9] := Reg.ReadString(REG_LAST_9); 328 | finally 329 | Reg.CloseKey; 330 | end; 331 | end; 332 | finally 333 | Reg.Free; 334 | end; 335 | end; 336 | 337 | procedure TMain.SaveSettings; 338 | var Reg :TRegistry; 339 | begin 340 | Reg := TRegistry.Create; 341 | Reg.RootKey := HKEY_CURRENT_USER; 342 | try 343 | Reg.OpenKey(RegRoot, False); 344 | try 345 | if MenuItemReopenLastOneOnEnter.Checked then 346 | Reg.WriteString(REG_REOPEN_LAST, 'Y') 347 | else 348 | Reg.WriteString(REG_REOPEN_LAST, 'N'); 349 | 350 | Reg.WriteString(REG_LAST_0, FRecentlyOpen[0]); 351 | Reg.WriteString(REG_LAST_1, FRecentlyOpen[1]); 352 | Reg.WriteString(REG_LAST_2, FRecentlyOpen[2]); 353 | Reg.WriteString(REG_LAST_3, FRecentlyOpen[3]); 354 | Reg.WriteString(REG_LAST_4, FRecentlyOpen[4]); 355 | Reg.WriteString(REG_LAST_5, FRecentlyOpen[5]); 356 | Reg.WriteString(REG_LAST_6, FRecentlyOpen[6]); 357 | Reg.WriteString(REG_LAST_7, FRecentlyOpen[7]); 358 | Reg.WriteString(REG_LAST_8, FRecentlyOpen[8]); 359 | Reg.WriteString(REG_LAST_9, FRecentlyOpen[9]); 360 | finally 361 | Reg.CloseKey; 362 | end; 363 | finally 364 | Reg.Free; 365 | end; 366 | end; 367 | 368 | procedure TMain.UpdateOpenRecentSubItems; 369 | var i :Integer; 370 | FileName :string; 371 | MenuItem :TMenuItem; 372 | begin 373 | { Delete all MenuItems owned by MenuItemOpenRecent } 374 | MenuItemOpenRecent.Clear; // removes submenu items 375 | 376 | {Insert the new Menu Items} 377 | for i := 0 to 9 do begin 378 | FileName := FRecentlyOpen[i]; 379 | if not FileName.IsEmpty then begin 380 | MenuItem := TMenuItem.Create(MenuItemOpenRecent); 381 | MenuItem.Caption := Format('%d %s', [i, FileName]); 382 | MenuItem.OnClick := MenuItemOpenRecent_OnClick; 383 | MenuItemOpenRecent.Add(MenuItem); 384 | end; 385 | end; 386 | end; 387 | 388 | procedure TMain.MenuItemOpenRecent_OnClick(Sender: TObject); 389 | begin 390 | {The project has not modifications} 391 | if (FModified) or (ProjectName <> NOT_SAVED_PROJECT_NAME) or (not DBConnection.Params.IsEmpty) then begin 392 | case MessageDlg(Format('Current changes in the project will be lost. Continue?', [ProjectName]), mtConfirmation, [mbYes, mbCancel], 0) of 393 | mrCancel: Exit; 394 | end; 395 | end; 396 | FFileName := TMenuItem(Sender).Caption.SubString(3); 397 | LoadProject; 398 | end; 399 | 400 | function TMain.GetProjectName:string; 401 | begin 402 | Result := ExtractFileName(FFileName); 403 | end; 404 | 405 | procedure TMain.SetLastOpened(AFileName :string); 406 | var i :Integer; 407 | Index :Integer; 408 | begin 409 | // Set this file as the last opened by the user. 410 | 411 | { If the file is in the first position, nothing to do} 412 | if FRecentlyOpen[0] = AFileName then Exit; 413 | 414 | { if the file is in the list } 415 | Index := FRecentlyOpen.IndexOf(AFileName); 416 | if Index <> -1 then begin 417 | { Move the downpart of the list to fill the gap } 418 | for i := Index downto 1 do FRecentlyOpen[i] := FRecentlyOpen[i -1]; 419 | 420 | //Put AFileName in the first position. 421 | FRecentlyOpen[0] := AFileName; 422 | end 423 | { Move all to the next position, loosing the last and 424 | put the new in the first position } 425 | else begin 426 | { Move all to the next position } 427 | for i := 9 downto 1 do FRecentlyOpen[i] := FRecentlyOpen[i-1]; 428 | 429 | //Put AFileName in the first position. 430 | FRecentlyOpen[0] := AFileName; 431 | end; 432 | end; 433 | 434 | procedure TMain.GridTablesDblClick(Sender: TObject); 435 | begin 436 | ActionEditTable.Execute; 437 | end; 438 | 439 | procedure TMain.GridTablesDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 440 | const CtrlState :array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); 441 | var CheckBoxRectangle :TRect; 442 | begin 443 | GridTables.DrawingStyle := gdsClassic; 444 | GridTables.Columns[0].Title.Color := clBtnShadow; 445 | GridTables.Columns[1].Title.Color := clBtnShadow; 446 | 447 | GridTables.Columns[0].Color := clBtnShadow; 448 | 449 | if (Column.FieldName = 'REGISTER_ENTITY') or (Column.FieldName = 'DECLARE_AS_ABSTRACT') then begin 450 | Column.Title.Alignment := taCenter; 451 | Column.Alignment := taCenter; 452 | TDBGrid(Sender).Canvas.FillRect(Rect); 453 | 454 | CheckBoxRectangle.Left := Rect.Left + 2; 455 | CheckBoxRectangle.Right := Rect.Right - 2; 456 | CheckBoxRectangle.Top := Rect.Top + 2; 457 | CheckBoxRectangle.Bottom := Rect.Bottom - 2; 458 | if Column.Field.AsString = 'Y' then begin 459 | DrawFrameControl(TDBGrid(Sender).Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[True]); 460 | end 461 | else begin 462 | DrawFrameControl(TDBGrid(Sender).Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[False]); 463 | end; 464 | end; 465 | end; 466 | 467 | procedure TMain.GridTablesTitleClick(Column: TColumn); 468 | var Point :TPoint; 469 | begin 470 | if Column.FieldName = 'DECLARE_AS_ABSTRACT' then begin 471 | if GetCursorPos(Point) then PopupMenuDeclareAsAbstract.Popup(Point.X, Point.Y); 472 | end else 473 | if Column.FieldName = 'REGISTER_ENTITY' then begin 474 | if GetCursorPos(Point) then PopupMenuRegisterEntity.Popup(Point.X, Point.Y); 475 | end; 476 | end; 477 | 478 | procedure TMain.MenuItemEditTableClick(Sender: TObject); 479 | var EditTable :TEditTableForm; 480 | begin 481 | if ProjectName.IsEmpty then Exit; 482 | 483 | EditTable := TEditTableForm.Create(nil); 484 | try 485 | { Configure the properties of the form before show it. } 486 | EditTable.TableName := dsTablesTABLE_NAME.AsString; 487 | EditTable.ClassName := dsTablesCLASS_NAME.AsString; 488 | EditTable.DeployPath := dsTablesDEPLOY_PATH.AsString; 489 | EditTable.DeclareAsAbstract := dsTablesDECLARE_AS_ABSTRACT.AsString; 490 | EditTable.RegisterEntity := dsTablesREGISTER_ENTITY.AsString; 491 | 492 | { Show the form in Modal state } 493 | if EditTable.ShowModal = mrOK then begin 494 | { Recover the data modified after close the form. } 495 | dsTables.Edit; 496 | dsTablesCLASS_NAME.AsString := EditTable.ClassName; 497 | dsTablesDEPLOY_PATH.AsString := EditTable.DeployPath; 498 | dsTablesDECLARE_AS_ABSTRACT.AsString := EditTable.DeclareAsAbstract; 499 | dsTablesREGISTER_ENTITY.AsString := EditTable.RegisterEntity; 500 | dsTables.Post; 501 | Controller.SaveCurrentViewTableToMemory(dsTables); 502 | FModified := True; 503 | end; 504 | finally 505 | EditTable.Free; 506 | end; 507 | end; 508 | 509 | procedure TMain.ActionConnectDatabaseExecute(Sender: TObject); 510 | var FDConnEditor :TfrmFDGUIxFormsConnEdit; 511 | begin 512 | FDConnEditor := TfrmFDGUIxFormsConnEdit.Create(Self); 513 | try 514 | if FDConnEditor.Execute(DBConnection, 'Connect to Database', nil) then begin 515 | DBConnection.Open; {No exception management. The user is a programmer. Don't forget it!} 516 | ActionRefreshMetadata.Execute; 517 | FModified := True; 518 | end; 519 | finally 520 | FDConnEditor.Free; 521 | end; 522 | end; 523 | 524 | procedure TMain.ActionConnectDatabaseUpdate(Sender: TObject); 525 | begin 526 | ActionConnectDatabase.Enabled := ARDB.Connected; 527 | end; 528 | 529 | procedure TMain.ActionEditFieldExecute(Sender: TObject); 530 | var EditField :TEditFieldForm; 531 | begin 532 | if ProjectName.IsEmpty then Exit; 533 | 534 | EditField := TEditFieldForm.Create(nil); 535 | try 536 | { Configure the properties of the form before show it. } 537 | EditField.TableName := dsFieldsTABLE_NAME.AsString; 538 | EditField.FieldName := dsFieldsFIELD_NAME.AsString; 539 | EditField.CustomName := dsFieldsCUSTOM_NAME.AsString; 540 | 541 | { Show the form in Modal state } 542 | if EditField.ShowModal = mrOK then begin 543 | { Recover the data modified after close the form. } 544 | dsFields.Edit; 545 | dsFieldsCUSTOM_NAME.AsString := EditField.CustomName; 546 | dsFields.Post; 547 | Controller.SaveCurrentViewFieldToMemory(dsFields); 548 | FModified := True; 549 | end; 550 | finally 551 | EditField.Free; 552 | end; 553 | end; 554 | 555 | procedure TMain.ActionEditTableExecute(Sender: TObject); 556 | var EditTable :TEditTableForm; 557 | begin 558 | if ProjectName.IsEmpty then Exit; 559 | 560 | EditTable := TEditTableForm.Create(nil); 561 | try 562 | { Configure the properties of the form before show it. } 563 | EditTable.TableName := dsTablesTABLE_NAME.AsString; 564 | EditTable.ClassName := dsTablesCLASS_NAME.AsString; 565 | EditTable.DeployPath := dsTablesDEPLOY_PATH.AsString; 566 | EditTable.DeclareAsAbstract := dsTablesDECLARE_AS_ABSTRACT.AsString; 567 | EditTable.RegisterEntity := dsTablesREGISTER_ENTITY.AsString; 568 | 569 | { Show the form in Modal state } 570 | if EditTable.ShowModal = mrOK then begin 571 | { Recover the data modified after close the form. } 572 | dsTables.Edit; 573 | dsTablesCLASS_NAME.AsString := EditTable.ClassName; 574 | dsTablesDEPLOY_PATH.AsString := EditTable.DeployPath; 575 | dsTablesDECLARE_AS_ABSTRACT.AsString := EditTable.DeclareAsAbstract; 576 | dsTablesREGISTER_ENTITY.AsString := EditTable.RegisterEntity; 577 | dsTables.Post; 578 | Controller.SaveCurrentViewTableToMemory(dsTables); 579 | FModified := True; 580 | end; 581 | finally 582 | EditTable.Free; 583 | end; 584 | end; 585 | 586 | procedure TMain.ActionGenerateAllExecute(Sender: TObject); 587 | var FileName :string; 588 | OverwriteIt :Boolean; 589 | MarkTable :TBookmark; 590 | MarkField :TBookmark; 591 | EntityCount :Integer; 592 | begin 593 | EntityCount := 0; 594 | Log.Info('Starting entities generation and saving', LOG_TAG); 595 | { Save current positions } 596 | MarkTable := dsTables.GetBookmark; 597 | MarkField := dsFields.GetBookmark; 598 | dsTables.DisableControls; 599 | dsFields.DisableControls; 600 | try 601 | OverwriteIt := False; 602 | dsTables.First; 603 | while not dsTables.EOF do begin 604 | {Generate the code for each table in MemoOutputCode} 605 | Controller.GenerateCode(MemoOutputCode.Lines, 606 | dsTablesTABLE_NAME.AsString, 607 | dsTablesCLASS_NAME.AsString, 608 | dsFields, 609 | dsTablesDECLARE_AS_ABSTRACT.AsString = 'Y', 610 | RadioGroupNameCase.Items[RadioGroupNameCase.ItemIndex], 611 | dsTablesREGISTER_ENTITY.AsString = 'Y', 612 | RadioGroupFieldNameFormatting.ItemIndex = 1); 613 | Log.Info('Code for table '+dsTablesTABLE_NAME.AsString +' has been generated', LOG_TAG); 614 | 615 | { Generates the FileName where to save the code } 616 | FileName := dsTablesDEPLOY_PATH.AsString + PathDelim + Controller.GetUnitName(dsTABLESCLASS_NAME.AsString) + '.pas'; 617 | { Verify if the file exists previously } 618 | if FileExists(FileName) then begin 619 | if not OverwriteIt then begin 620 | case MessageDlg(Format('The file "%s" preiously exists. Overwrite it?', [FileName]), mtConfirmation, [mbYes, mbYesToAll, mbNo, mbCancel], 0) of 621 | mrYes: begin 622 | MemoOutputCode.Lines.SaveToFile(FileName); 623 | Inc(EntityCount); 624 | Log.Info('File '+FileName+' rewrited.', LOG_TAG); 625 | end; 626 | mrYesToAll: begin 627 | MemoOutputCode.Lines.SaveToFile(FileName); {Overwrite current and all the next} 628 | Inc(EntityCount); 629 | OverwriteIt := True; 630 | Log.Info('All the next file are going to be overwrite if them exists previously.', LOG_TAG); 631 | end; 632 | mrNo: begin { Do not overwrite. Continue with the next iteration } 633 | Log.Info('File '+FileName+' has not been generated.', LOG_TAG); 634 | dsTables.Next; 635 | Continue; 636 | end; 637 | mrCancel: begin { Abort the saving process } 638 | Log.Info('Operation of save file canceled by the user', LOG_TAG); 639 | Break; 640 | end; 641 | end; 642 | end 643 | else begin 644 | { Save the file because the user decided to overwrite all } 645 | MemoOutputCode.Lines.SaveToFile(FileName); 646 | Inc(EntityCount); 647 | Log.Info('File '+FileName+' has been saved', LOG_TAG); 648 | end; 649 | end 650 | else begin 651 | { Save the file without issues } 652 | MemoOutputCode.Lines.SaveToFile(FileName); 653 | Inc(EntityCount); 654 | Log.Info('File '+FileName+' has been saved', LOG_TAG); 655 | end; 656 | dsTables.Next; 657 | end; 658 | { Restore previous positons } 659 | dsTables.GotoBookmark(MarkTable); 660 | dsFields.GotoBookmark(MarkField); 661 | finally 662 | dsTables.EnableControls; 663 | dsFields.EnableControls; 664 | dsTables.FreeBookmark(MarkTable); 665 | dsFields.FreeBookmark(MarkField); 666 | Log.Info('Generated %d entities', [EntityCount], LOG_TAG); 667 | end; 668 | end; 669 | 670 | procedure TMain.ActionGenerateAllUpdate(Sender: TObject); 671 | begin 672 | ActionGenerateAll.Enabled := not ProjectName.IsEmpty; 673 | end; 674 | 675 | procedure TMain.ActionGenerateCurrentExecute(Sender: TObject); 676 | var FileName :string; 677 | begin 678 | Controller.GenerateCode(MemoOutputCode.Lines, 679 | dsTablesTABLE_NAME.AsString, 680 | dsTablesCLASS_NAME.AsString, 681 | dsFields, 682 | dsTablesDECLARE_AS_ABSTRACT.AsString = 'Y', 683 | RadioGroupNameCase.Items[RadioGroupNameCase.ItemIndex], 684 | dsTablesREGISTER_ENTITY.AsString = 'Y', 685 | RadioGroupFieldNameFormatting.ItemIndex = 1); 686 | Log.Info('Code for table '+dsTablesTABLE_NAME.AsString +' has been generated', LOG_TAG); 687 | 688 | FileName := dsTablesDEPLOY_PATH.AsString + PathDelim + Controller.GetUnitName(dsTABLESCLASS_NAME.AsString) + '.pas'; 689 | if FileExists(FileName) then begin 690 | case MessageDlg('The File '+FileName+' previously exists. Rewrite it?', mtConfirmation, mbYesNo, 0) of 691 | mrYes: begin 692 | MemoOutputCode.Lines.SaveToFile(FileName); 693 | Log.Info('File '+FileName+' rewrited.', LOG_TAG); 694 | end; 695 | mrNo: Log.Info('Saving of file '+FileName +' aborted.', LOG_TAG); 696 | end; 697 | end 698 | else begin 699 | MemoOutputCode.Lines.SaveToFile(FileName); 700 | Log.Info('File '+FileName+' has been saved', LOG_TAG); 701 | end; 702 | end; 703 | 704 | procedure TMain.ActionGenerateCurrentUpdate(Sender: TObject); 705 | begin 706 | ActionGenerateCurrent.Enabled := not ProjectName.IsEmpty; 707 | end; 708 | 709 | procedure TMain.ActionInvertMarksDeclareAsAbstractExecute(Sender: TObject); 710 | var MarkTable :TBookmark; 711 | MarkField :TBookmark; 712 | begin 713 | { Save current positions } 714 | MarkTable := dsTables.GetBookmark; 715 | MarkField := dsFields.GetBookmark; 716 | dsTables.DisableControls; 717 | dsFields.DisableControls; 718 | try 719 | dsTables.First; 720 | while not dsTables.EOF do begin 721 | dsTables.Edit; 722 | if dsTablesDECLARE_AS_ABSTRACT.AsString = 'N' then 723 | dsTablesDECLARE_AS_ABSTRACT.AsString := 'Y' 724 | else 725 | dsTablesDECLARE_AS_ABSTRACT.AsString := 'N'; 726 | dsTables.Post; 727 | dsTables.Next; 728 | end; 729 | 730 | { Restore previous positons } 731 | dsTables.GotoBookmark(MarkTable); 732 | dsFields.GotoBookmark(MarkField); 733 | finally 734 | dsTables.EnableControls; 735 | dsFields.EnableControls; 736 | dsTables.FreeBookmark(MarkTable); 737 | dsFields.FreeBookmark(MarkField); 738 | Log.Info('Marked all the Tables as Declare As Abstract', [], LOG_TAG); 739 | end; 740 | end; 741 | 742 | procedure TMain.ActionInvertMarksRegisterEntityExecute(Sender: TObject); 743 | var MarkTable :TBookmark; 744 | MarkField :TBookmark; 745 | begin 746 | { Save current positions } 747 | MarkTable := dsTables.GetBookmark; 748 | MarkField := dsFields.GetBookmark; 749 | dsTables.DisableControls; 750 | dsFields.DisableControls; 751 | try 752 | dsTables.First; 753 | while not dsTables.EOF do begin 754 | dsTables.Edit; 755 | if dsTablesREGISTER_ENTITY.AsString = 'N' then 756 | dsTablesREGISTER_ENTITY.AsString := 'Y' 757 | else 758 | dsTablesREGISTER_ENTITY.AsString := 'N'; 759 | dsTables.Post; 760 | dsTables.Next; 761 | end; 762 | 763 | { Restore previous positons } 764 | dsTables.GotoBookmark(MarkTable); 765 | dsFields.GotoBookmark(MarkField); 766 | finally 767 | dsTables.EnableControls; 768 | dsFields.EnableControls; 769 | dsTables.FreeBookmark(MarkTable); 770 | dsFields.FreeBookmark(MarkField); 771 | Log.Info('Marked all the Tables as Declare As Abstract', [], LOG_TAG); 772 | end; 773 | end; 774 | 775 | procedure TMain.ActionMarkAllDeclareAsAbstractExecute(Sender: TObject); 776 | var MarkTable :TBookmark; 777 | MarkField :TBookmark; 778 | begin 779 | { Save current positions } 780 | MarkTable := dsTables.GetBookmark; 781 | MarkField := dsFields.GetBookmark; 782 | dsTables.DisableControls; 783 | dsFields.DisableControls; 784 | try 785 | dsTables.First; 786 | while not dsTables.EOF do begin 787 | dsTables.Edit; 788 | dsTablesDECLARE_AS_ABSTRACT.AsString := 'Y'; 789 | dsTables.Post; 790 | dsTables.Next; 791 | end; 792 | 793 | { Restore previous positons } 794 | dsTables.GotoBookmark(MarkTable); 795 | dsFields.GotoBookmark(MarkField); 796 | finally 797 | dsTables.EnableControls; 798 | dsFields.EnableControls; 799 | dsTables.FreeBookmark(MarkTable); 800 | dsFields.FreeBookmark(MarkField); 801 | Log.Info('Marked all the Tables as Declare As Abstract', [], LOG_TAG); 802 | end; 803 | end; 804 | 805 | procedure TMain.ActionMarkAllRegisterEntityExecute(Sender: TObject); 806 | var MarkTable :TBookmark; 807 | MarkField :TBookmark; 808 | begin 809 | { Save current positions } 810 | MarkTable := dsTables.GetBookmark; 811 | MarkField := dsFields.GetBookmark; 812 | dsTables.DisableControls; 813 | dsFields.DisableControls; 814 | try 815 | dsTables.First; 816 | while not dsTables.EOF do begin 817 | dsTables.Edit; 818 | dsTablesREGISTER_ENTITY.AsString := 'Y'; 819 | dsTables.Post; 820 | dsTables.Next; 821 | end; 822 | 823 | { Restore previous positons } 824 | dsTables.GotoBookmark(MarkTable); 825 | dsFields.GotoBookmark(MarkField); 826 | finally 827 | dsTables.EnableControls; 828 | dsFields.EnableControls; 829 | dsTables.FreeBookmark(MarkTable); 830 | dsFields.FreeBookmark(MarkField); 831 | Log.Info('Marked all the Tables as Declare As Abstract', [], LOG_TAG); 832 | end; 833 | end; 834 | 835 | procedure TMain.ActionRefreshMetadataExecute(Sender: TObject); 836 | begin 837 | Controller.RefreshMetadata(RadioGroupFieldNameFormatting.ItemIndex = 1); 838 | SetOnViewDataFromMemory; 839 | end; 840 | 841 | procedure TMain.SetOnViewDataFromMemory; 842 | begin 843 | {Fill with data from Database} 844 | dsTables.DisableControls; 845 | dsFields.DisableControls; 846 | try 847 | Controller.FillViewData(dsTables, dsFields); 848 | TabSheetTables.Caption := 'Tables (' + dsTables.RecordCount.ToString + ')'; 849 | finally 850 | dsTables.EnableControls; 851 | dsFields.EnableControls; 852 | end; 853 | end; 854 | 855 | procedure TMain.ActionRefreshMetadataUpdate(Sender: TObject); 856 | begin 857 | ActionRefreshMetadata.Enabled := ARDB.Connected and DBConnection.Connected; 858 | end; 859 | 860 | procedure TMain.ActionNewProjectExecute(Sender: TObject); 861 | begin 862 | if FModified then begin 863 | case MessageDlg(Format('Current changes in the project will be lost. Continue?', [ProjectName]), mtConfirmation, [mbYes, mbCancel], 0) of 864 | mrCancel: Exit; 865 | end; 866 | end; 867 | 868 | ResetAllData; 869 | FFileName := ExtractFilePath(ParamStr(0)) + NOT_SAVED_PROJECT_NAME; 870 | FModified := False; 871 | Caption := Format('DMVCFramework Entities Generator :: [%0:s] - DMVCFramework-%1:s', [ProjectName, DMVCFRAMEWORK_VERSION]); 872 | Log.Info('Created a new empty project', LOG_TAG); 873 | end; 874 | 875 | procedure TMain.ActionSaveProjectAsExecute(Sender: TObject); 876 | begin 877 | {Get the desired project name} 878 | if DialogSaveProject.Execute then begin 879 | FFileName := DialogSaveProject.FileName; 880 | Caption := Format('DMVCFramework Entities Generator :: [%0:s] - DMVCFramework-%1:s', [ProjectName, DMVCFRAMEWORK_VERSION]); 881 | Log.Info('Project '+ProjectName+' ready to be saved.', LOG_TAG); 882 | ActionSaveProject.Execute; 883 | end 884 | else Exit; 885 | end; 886 | 887 | procedure TMain.ActionSaveProjectAsUpdate(Sender: TObject); 888 | begin 889 | ActionSaveProjectAs.Enabled := FModified; 890 | end; 891 | 892 | procedure TMain.ActionSaveProjectExecute(Sender: TObject); 893 | begin 894 | {Saves all the pendant changes to memory database} 895 | if ProjectName = NOT_SAVED_PROJECT_NAME then begin 896 | DialogSaveProject.DefaultFolder := ExtractFilePath(ParamStr(0)); 897 | DialogSaveProject.FileName := DEFAULT_PROJECT_NAME; 898 | ActionSaveProjectAs.Execute; 899 | end 900 | else begin 901 | if Controller.SaveProject(FFileName) then begin 902 | FModified := False; 903 | ActionRefreshMetadata.Execute; 904 | Caption := Format('DMVCFramework Entities Generator :: [%0:s] - DMVCFramework-%1:s', [ProjectName, DMVCFRAMEWORK_VERSION]); 905 | Log.Info(Format('Database %s saved on disk', [ProjectName]), LOG_TAG); 906 | SetLastOpened(FFileName); 907 | UpdateOpenRecentSubItems; 908 | end 909 | else begin 910 | Log.Info('Project '+ProjectName+' failed to be saved on disk.', LOG_TAG); 911 | raise Exception.Create('Error saving data'); 912 | end; 913 | end; 914 | end; 915 | 916 | procedure TMain.LoadProject; 917 | begin 918 | DisableVisualEvents; 919 | {Before Load a project we need to delete the current} 920 | ResetAllData; 921 | try 922 | if Controller.LoadProject(FFileName) then begin 923 | SetOnViewDataFromMemory; 924 | if not DBConnection.Params.IsEmpty then begin 925 | DBConnection.Open; 926 | end; 927 | FModified := False; 928 | SetLastOpened(FFileName); 929 | UpdateOpenRecentSubItems; 930 | Caption := Format('DMVCFramework Entities Generator :: [%0:s] - DMVCFramework-%1:s', [ProjectName, DMVCFRAMEWORK_VERSION]); 931 | end; 932 | finally 933 | EnableVisualEvents; 934 | end; 935 | end; 936 | 937 | procedure TMain.ActionOpenProjectExecute(Sender: TObject); 938 | begin 939 | {The project has not modifications} 940 | if (FModified) or (ProjectName <> NOT_SAVED_PROJECT_NAME) or (not DBConnection.Params.IsEmpty) then begin 941 | case MessageDlg(Format('Current changes in the project will be lost. Continue?', [ProjectName]), mtConfirmation, [mbYes, mbCancel], 0) of 942 | mrCancel: Exit; 943 | end; 944 | end; 945 | 946 | {The project name was never saved} 947 | if DialogOpenProject.Execute then begin 948 | FFileName := DialogOpenProject.FileName; 949 | LoadProject; 950 | end; 951 | end; 952 | 953 | procedure TMain.ActionSaveProjectUpdate(Sender: TObject); 954 | begin 955 | ActionSaveProject.Enabled := FModified; 956 | end; 957 | 958 | procedure TMain.ActionUnmarkAllDeclareAsAbstractExecute(Sender: TObject); 959 | var MarkTable :TBookmark; 960 | MarkField :TBookmark; 961 | begin 962 | { Save current positions } 963 | MarkTable := dsTables.GetBookmark; 964 | MarkField := dsFields.GetBookmark; 965 | dsTables.DisableControls; 966 | dsFields.DisableControls; 967 | try 968 | dsTables.First; 969 | while not dsTables.EOF do begin 970 | dsTables.Edit; 971 | dsTablesDECLARE_AS_ABSTRACT.AsString := 'N'; 972 | dsTables.Post; 973 | dsTables.Next; 974 | end; 975 | 976 | { Restore previous positons } 977 | dsTables.GotoBookmark(MarkTable); 978 | dsFields.GotoBookmark(MarkField); 979 | finally 980 | dsTables.EnableControls; 981 | dsFields.EnableControls; 982 | dsTables.FreeBookmark(MarkTable); 983 | dsFields.FreeBookmark(MarkField); 984 | Log.Info('Marked all the Tables as Declare As Abstract', [], LOG_TAG); 985 | end; 986 | end; 987 | 988 | procedure TMain.ActionUnmarkAllRegisterEntityExecute(Sender: TObject); 989 | var MarkTable :TBookmark; 990 | MarkField :TBookmark; 991 | begin 992 | { Save current positions } 993 | MarkTable := dsTables.GetBookmark; 994 | MarkField := dsFields.GetBookmark; 995 | dsTables.DisableControls; 996 | dsFields.DisableControls; 997 | try 998 | dsTables.First; 999 | while not dsTables.EOF do begin 1000 | dsTables.Edit; 1001 | dsTablesREGISTER_ENTITY.AsString := 'N'; 1002 | dsTables.Post; 1003 | dsTables.Next; 1004 | end; 1005 | 1006 | { Restore previous positons } 1007 | dsTables.GotoBookmark(MarkTable); 1008 | dsFields.GotoBookmark(MarkField); 1009 | finally 1010 | dsTables.EnableControls; 1011 | dsFields.EnableControls; 1012 | dsTables.FreeBookmark(MarkTable); 1013 | dsFields.FreeBookmark(MarkField); 1014 | Log.Info('Marked all the Tables as Declare As Abstract', [], LOG_TAG); 1015 | end; 1016 | end; 1017 | 1018 | procedure TMain.GridFieldsDblClick(Sender: TObject); 1019 | begin 1020 | ActionEditField.Execute; 1021 | end; 1022 | 1023 | procedure TMain.GridFieldsDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); 1024 | begin 1025 | GridFields.DrawingStyle := gdsClassic; 1026 | GridFields.Columns[0].Title.Color := clBtnShadow; 1027 | GridFields.Columns[1].Title.Color := clBtnShadow; 1028 | GridFields.Columns[0].Color := clBtnShadow; 1029 | end; 1030 | 1031 | procedure TMain.RadioGroupFieldNameFormattingClick(Sender: TObject); 1032 | begin 1033 | FModified := True; 1034 | end; 1035 | 1036 | procedure TMain.RadioGroupNameCaseClick(Sender: TObject); 1037 | begin 1038 | FModified := True; 1039 | end; 1040 | 1041 | procedure TMain.ResetAllData; 1042 | begin 1043 | dsTables.Open; 1044 | dsFields.Open; 1045 | 1046 | {First the view data} 1047 | dsFields.EmptyDataSet; 1048 | dsTables.EmptyDataSet; 1049 | 1050 | {Now In memory DB data} 1051 | Controller.EmptyEntGenDB; 1052 | 1053 | {Now the User Connection} 1054 | DBConnection.Close; 1055 | DBConnection.DriverName := ''; 1056 | DBConnection.Params.Clear; 1057 | DBConnection.LoginPrompt := False; 1058 | 1059 | {Now visual controls} 1060 | RadioGroupNameCase.ItemIndex := 0; 1061 | RadioGroupFieldNameFormatting.ItemIndex := 0; 1062 | 1063 | FModified := False; 1064 | 1065 | //FFileName := ExtractFilePath(ParamStr(0)) + NOT_SAVED_PROJECT_NAME; 1066 | end; 1067 | 1068 | end. 1069 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MVC ActiveRecord Entity Generator (by senCille) 2 | 3 | Tired of creating the descendants of TActiveRecord by hand? 4 | 5 | https://github.com/juanccilleruelo/MVC_AR_EntityGenerator 6 | Is an OpenSource project developed in Delphi XE 12 that takes the metadata of your Database and creates one class ActiveRecord of each Table in the Database. 7 | 8 | You can generate the AR of one table or one AR class for each table in the Database. You can indicate in which folder the AR file should be deployed, and the program will remember it. 9 | Each AR is generated in an independent .pas file. 10 | 11 | And this is only the Beta version. 12 | 13 | You save all the information used to generate the AR; when you need to develop it again, you only need to use it. 14 | 15 | In the next version, we plan to implement more types of AR, like, for example, AR with a Master-Detail Relationship. 16 | 17 | In the current version, you can change the name of the Class generated. This is useful when you want, for example, the AR class representing one member of the entity Customers, instead of being named TCustomers, to be named TCustomer; that is more accurate. 18 | 19 | I want to implement, too, a connection with the AI (probably Chat-GPT) to ask directly for the translation of the plural table names to singular class names. In this target, I want the AI to modify the table name to respect the Camel Style of Pascal Class names. For example, a table named Items_Owned_by_user is currently created as TItemsownedbyuser. The AI can easily convert this to TItemsOwnedByUser, which is more accurate to the style of Pascal code. 20 | 21 | And many more things can be made with an open-source project. Do you don't think it!! 22 | 23 | Try it, and let us know what you think! 24 | 25 | Thanks 26 | 27 | PD: The project is also an excellent example of using SQLite as a memory store for the data and treating this data as a standalone project, in contrast to the concept of a Database on Disk, which is more current in Delphi. 28 | 29 | # Woring in progress... 30 | 31 | # Road Map 32 | 1- Improve the modifications that the user can make to generate the ActiveRecord. 33 | (Eg: The name of the properties or the data type) 34 | Sometimes, with SQLite databases, the data type suggested by the application is 35 | not the most appropriate for the program. Ref: Dynamic Type System of SQLite. 36 | 37 | 2- Implement how we are going to manage the modifications in the Real DB after 38 | we modified his data in the program. 39 | (if a field disappeared, if there is a new field on DB or if a field definition 40 | has been modified) 41 | 42 | 2- Use of OpenAI IA connection for things like GetSingular Names for 43 | the entities and convert the names of the fields to Camel Style (Pascal). 44 | -------------------------------------------------------------------------------- /UtilsU.pas: -------------------------------------------------------------------------------- 1 | unit UtilsU; 2 | 3 | interface 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | implementation 14 | 15 | uses 16 | System.SysUtils; 17 | 18 | 19 | 20 | 21 | 22 | end. 23 | -------------------------------------------------------------------------------- /db/chinook.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juanccilleruelo/MVC_AR_EntityGenerator/920a65e836151ccaa381bb218fe45e68545077b3/db/chinook.db -------------------------------------------------------------------------------- /db/northwind.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/juanccilleruelo/MVC_AR_EntityGenerator/920a65e836151ccaa381bb218fe45e68545077b3/db/northwind.db --------------------------------------------------------------------------------