├── Cleanup.bat ├── DxAutoInstaller.res ├── Resources ├── Icons 16 │ ├── Add.ico │ ├── Delete.ico │ ├── Error.ico │ ├── Open.ico │ ├── Right.ico │ ├── Search.ico │ ├── Doc-Next.ico │ └── Doc-Cancel.ico ├── DxAutoInstaller.ico ├── Bmp 16 │ ├── Overlay-block.bmp │ ├── Overlay-info.bmp │ └── Overlay-Warning.bmp ├── Images │ ├── IconVCL-2010.png │ ├── IconVCL-2013.png │ ├── DxAutoInstaller.png │ ├── DevExpress-Installer-2013.jpg │ ├── IconVCL-2019.svg │ └── IconVCL-2024.svg ├── Readme.txt └── Profile.ini ├── DxAutoInstallerResource.rc ├── .gitignore ├── README.md ├── DxAutoInstaller.dpr ├── DxAutoInstaller.skincfg ├── Sources ├── DxIDE.pas ├── DxComponentFactory.pas ├── DxProgress.pas ├── DxQuantumTreeList.dfm ├── DxUtils.pas ├── DxComponent.pas ├── DxProfile.pas ├── DxProgress.dfm ├── MainFrm.pas ├── DxQuantumTreeList.pas ├── DxInstaller.pas └── MainFrm.dfm └── DxAutoInstaller.dproj /Cleanup.bat: -------------------------------------------------------------------------------- 1 | del *.~* /s 2 | del *.dcu /s 3 | del *.ddp /s -------------------------------------------------------------------------------- /DxAutoInstaller.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/DxAutoInstaller.res -------------------------------------------------------------------------------- /Resources/Icons 16/Add.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Add.ico -------------------------------------------------------------------------------- /Resources/DxAutoInstaller.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/DxAutoInstaller.ico -------------------------------------------------------------------------------- /Resources/Icons 16/Delete.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Delete.ico -------------------------------------------------------------------------------- /Resources/Icons 16/Error.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Error.ico -------------------------------------------------------------------------------- /Resources/Icons 16/Open.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Open.ico -------------------------------------------------------------------------------- /Resources/Icons 16/Right.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Right.ico -------------------------------------------------------------------------------- /Resources/Icons 16/Search.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Search.ico -------------------------------------------------------------------------------- /Resources/Icons 16/Doc-Next.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Doc-Next.ico -------------------------------------------------------------------------------- /Resources/Bmp 16/Overlay-block.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Bmp 16/Overlay-block.bmp -------------------------------------------------------------------------------- /Resources/Bmp 16/Overlay-info.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Bmp 16/Overlay-info.bmp -------------------------------------------------------------------------------- /Resources/Icons 16/Doc-Cancel.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Icons 16/Doc-Cancel.ico -------------------------------------------------------------------------------- /Resources/Images/IconVCL-2010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Images/IconVCL-2010.png -------------------------------------------------------------------------------- /Resources/Images/IconVCL-2013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Images/IconVCL-2013.png -------------------------------------------------------------------------------- /Resources/Bmp 16/Overlay-Warning.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Bmp 16/Overlay-Warning.bmp -------------------------------------------------------------------------------- /Resources/Images/DxAutoInstaller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Images/DxAutoInstaller.png -------------------------------------------------------------------------------- /Resources/Images/DevExpress-Installer-2013.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Delphier/DxAutoInstaller/HEAD/Resources/Images/DevExpress-Installer-2013.jpg -------------------------------------------------------------------------------- /DxAutoInstallerResource.rc: -------------------------------------------------------------------------------- 1 | Profile RCDATA "Resources\\Profile.ini" 2 | Readme RCDATA "Resources\\Readme.txt" 3 | IconVCL RCDATA "Resources\\Images\\IconVCL-2024.svg" 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.exe 2 | *.dll 3 | 4 | *.chm 5 | *.mdb 6 | *.rar 7 | *.zip 8 | 9 | *.dcu 10 | *.ddp 11 | *.~* 12 | *.local 13 | *.identcache 14 | *.stat 15 | *.dres 16 | 17 | Desktop.ini 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DxAutoInstaller 2 | DevExpress VCL Components Automatic Installer 3 | 4 | DxAutoInstaller 5 | 6 | ## Compiling 7 | DxAutoInstaller requires [JCL](https://github.com/project-jedi/jcl). If the JCL is [installed manually](https://gist.github.com/Delphier/f293af24da4d3e8dc052d4d4ba55f6a3), you need to add the following paths to the compiler search path: 8 | * jcl\source\common 9 | * jcl\source\include 10 | * jcl\source\windows 11 | -------------------------------------------------------------------------------- /DxAutoInstaller.dpr: -------------------------------------------------------------------------------- 1 | program DxAutoInstaller; 2 | 3 | {$R *.dres} 4 | 5 | uses 6 | Vcl.Forms, 7 | MainFrm in 'Sources\MainFrm.pas' {MainForm}, 8 | DxComponent in 'Sources\DxComponent.pas', 9 | DxComponentFactory in 'Sources\DxComponentFactory.pas', 10 | DxIDE in 'Sources\DxIDE.pas', 11 | DxInstaller in 'Sources\DxInstaller.pas', 12 | DxProfile in 'Sources\DxProfile.pas', 13 | DxProgress in 'Sources\DxProgress.pas' {DxProgressForm}, 14 | DxQuantumTreeList in 'Sources\DxQuantumTreeList.pas' {DxResourceModule: TDataModule}, 15 | DxUtils in 'Sources\DxUtils.pas'; 16 | 17 | {$R *.res} 18 | 19 | begin 20 | Application.Initialize; 21 | Application.MainFormOnTaskbar := True; 22 | Application.Title := 'DxAutoInstaller'; 23 | Application.CreateForm(TMainForm, MainForm); 24 | Application.Run; 25 | end. 26 | -------------------------------------------------------------------------------- /Resources/Images/IconVCL-2019.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 11 | -------------------------------------------------------------------------------- /Resources/Images/IconVCL-2024.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | 11 | -------------------------------------------------------------------------------- /DxAutoInstaller.skincfg: -------------------------------------------------------------------------------- 1 | [ExpressSkins] 2 | Default=0 3 | ShowNotifications=0 4 | Enabled=0 5 | dxSkinBlack=1 6 | dxSkinBlue=1 7 | dxSkinBlueprint=1 8 | dxSkinCaramel=1 9 | dxSkinCoffee=1 10 | dxSkinDarkRoom=1 11 | dxSkinDarkSide=1 12 | dxSkinDevExpressDarkStyle=1 13 | dxSkinDevExpressStyle=1 14 | dxSkinFoggy=1 15 | dxSkinGlassOceans=1 16 | dxSkinHighContrast=1 17 | dxSkiniMaginary=1 18 | dxSkinLilian=1 19 | dxSkinLiquidSky=1 20 | dxSkinLondonLiquidSky=1 21 | dxSkinMcSkin=1 22 | dxSkinMetropolis=1 23 | dxSkinMetropolisDark=1 24 | dxSkinMoneyTwins=1 25 | dxSkinOffice2007Black=1 26 | dxSkinOffice2007Blue=1 27 | dxSkinOffice2007Green=1 28 | dxSkinOffice2007Pink=1 29 | dxSkinOffice2007Silver=1 30 | dxSkinOffice2010Black=1 31 | dxSkinOffice2010Blue=1 32 | dxSkinOffice2010Silver=1 33 | dxSkinOffice2013DarkGray=1 34 | dxSkinOffice2013LightGray=1 35 | dxSkinOffice2013White=1 36 | dxSkinOffice2016Colorful=1 37 | dxSkinOffice2016Dark=1 38 | dxSkinPumpkin=1 39 | dxSkinSeven=1 40 | dxSkinSevenClassic=1 41 | dxSkinSharp=1 42 | dxSkinSharpPlus=1 43 | dxSkinSilver=1 44 | dxSkinSpringTime=1 45 | dxSkinStardust=1 46 | dxSkinSummer2008=1 47 | dxSkinTheAsphaltWorld=1 48 | dxSkinsDefaultPainters=1 49 | dxSkinValentine=1 50 | dxSkinVisualStudio2013Blue=1 51 | dxSkinVisualStudio2013Dark=1 52 | dxSkinVisualStudio2013Light=1 53 | dxSkinVS2010=1 54 | dxSkinWhiteprint=1 55 | dxSkinXmas2008Blue=1 56 | dxSkinOffice2019Colorful=1 57 | dxSkinTheBezier=1 58 | dxSkinBasic=1 59 | dxSkinOffice2019Black=1 60 | dxSkinOffice2019DarkGray=1 61 | dxSkinOffice2019White=1 62 | dxSkinWXI=1 63 | -------------------------------------------------------------------------------- /Resources/Readme.txt: -------------------------------------------------------------------------------- 1 | Changelog 2 | -------------------------- 3 | v2.3.8 2024/06/15 4 | Update profile to DevExpress VCL 24.1.3. 5 | 6 | v2.3.7 2023/11/20 7 | RAD Studio 12 Athens supported. 8 | 9 | v2.3.6 2023/06/25 10 | Add v23.1 new skin dxSkinWXI to profile. 11 | 12 | v2.3.5 2022/10/20 13 | Update profile to DevExpress VCL 22.1.2. 14 | Bugfix for mainform page control aligning. 15 | 16 | v2.3.4 2022/03/18 17 | Bugfix for component selecting. 18 | 19 | v2.3.3 2021/11/09 20 | Support for Delphi 11 Alexandria. 21 | 22 | v2.3.2 2021/06/17 23 | Update profile to DevExpress VCL 20.2.8. 24 | 25 | v2.3.1 2020/06/09 26 | Update profile to DevExpress VCL 20.1.2. 27 | 28 | v2.3 2020/06/08 29 | Delphi 10.4 supported. 30 | 31 | v2.2.3 2019/12/14 32 | Update profile to DevExpress VCL 19.2.2. 33 | Updated DevExpress version number detection method to be compatible with 19.2.2. 34 | 35 | v2.2.2 2019/07/26 36 | Fix issue that the skin names not listed since v18.2.x. 37 | 38 | v2.2.1 2019/07/24 39 | Update profile to DevExpress VCL 19.1.3. 40 | 41 | v2.2 2019/03/05 42 | DevExpress VCL 18.2.x is compatible. 43 | Hide the base components by default now. 44 | 45 | v2.1.11 2018/12/02 46 | Delphi 10.3 Rio supported. 47 | Bugfix: the error icons are not displayed in component list. 48 | 49 | v2.1.10 2018/06/28 50 | Update profile to DevExpress VCL 18.1.2, ExpressEntityMapping Framework supported. 51 | 52 | v2.1.9 2017/12/13 53 | Update profile to DevExpress VCL 17.2.1. 54 | High-DPI enhancements. 55 | 56 | v2.1.8 2017/05/07 57 | Update profile to DevExpress VCL 17.1.1. 58 | 59 | v2.1.7 2017/03/28 60 | Delphi 10.2 Tokyo supported. 61 | Update profile to DevExpress VCL 16.2.3. 62 | 63 | v2.1.6 2016/06/30 64 | Delphi 10.1 Berlin supported. 65 | Update profile to DevExpress VCL 16.1.2. 66 | 67 | v2.1.5 2016/02/02 68 | Update profile to DevExpress VCL 15.2.2. 69 | 70 | v2.1.4 2015/09/21 71 | Delphi 10, Delphi XE8 supported. 72 | 73 | v2.1.3 2015/01/25 74 | Added Express RichEdit Control; 75 | Added ExpressPrinting System ReportLink for ExpressGauge Control. 76 | 77 | v2.1.2 2014/09/21 78 | Install to C++Builder supported; 79 | New install option: Use Native Look And Feel as Default; 80 | Automatic detection installation of IBX\TeeChart\AnyDAC\FireDAC\BDE; 81 | Search new packages feature added. 82 | 83 | v2.1.1 2014/09/12 84 | DevExpress Icon Library supported. 85 | 86 | v2.1 2014/09/09 87 | Delphi XE7 supported; 88 | Fixed: IBX, TeeChart packages compile error: IBX and VclTee has been added to namespace list. 89 | 90 | v2.0 2014/08/29 91 | Initial release. 92 | 93 | v1.0 A long time ago. 94 | -------------------------------------------------------------------------------- /Sources/DxIDE.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller IDE Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxIDE; 11 | 12 | interface 13 | 14 | uses 15 | SysUtils, JclIDEUtils; 16 | 17 | type 18 | TJclBorRADToolInstallationHelper = class helper for TJclBorRADToolInstallation 19 | function CompileDelphiPackageEx(const PackageName, BPLPath, DCPPath, ExtraOptions: string): Boolean; 20 | end; 21 | 22 | TDxIDEPlatform = TJclBDSPlatform; 23 | TDxIDE = TJclBorRADToolInstallation; 24 | TDxBDSIDE = TJclBDSInstallation; 25 | TDxIDEArray = array of TDxIDE; 26 | 27 | TDxIDEs = class(TJclBorRADToolInstallations) 28 | public 29 | function IndexOf(IDE: TDxIDE): Integer; 30 | end; 31 | 32 | function IsSupportWin64(IDE: TDxIDE): Boolean; 33 | function IsSupportCppBuilder(IDE: TDxIDE): Boolean; 34 | function IsRADStudio(IDE: TDxIDE): Boolean; 35 | function GetIDEOverrideEnvironmentVariable(IDE: TDxIDE; const Name: String): String; 36 | procedure SetIDEOverrideEnvironmentVariable(IDE: TDxIDE; const Name, Value: String); 37 | 38 | const 39 | Win32 = bpWin32; 40 | Win64 = bpWin64; 41 | DxIDEPlatformNames: array[TDxIDEPlatform] of String = (BDSPlatformWin32, BDSPlatformWin64, BDSPlatformOSX32, BDSPlatformOSX64, BDSPlatformAndroid32, BDSPlatformAndroid64, BDSPlatformiOSDevice32, BDSPlatformiOSDevice64, BDSPlatformiOSSimulator, BDSPlatformLinux64); 42 | BPLExtName = '.bpl'; 43 | IDEEnvironmentVariablesSectionName = 'Environment Variables'; 44 | 45 | implementation 46 | 47 | { TJclBorRADToolInstallationHelper } 48 | 49 | function TJclBorRADToolInstallationHelper.CompileDelphiPackageEx(const PackageName, BPLPath, DCPPath, ExtraOptions: string): Boolean; 50 | begin 51 | Result := CompileDelphiPackage(PackageName, BPLPath, DCPPath, ExtraOptions); 52 | end; 53 | 54 | { TDxIDEs } 55 | 56 | function TDxIDEs.IndexOf(IDE: TDxIDE): Integer; 57 | var 58 | I: Integer; 59 | begin 60 | Result := -1; 61 | for I := 0 to Count - 1 do 62 | if IDE = Installations[I] then begin 63 | Result := I; 64 | Break; 65 | end; 66 | end; 67 | 68 | 69 | function IsSupportWin64(IDE: TDxIDE): Boolean; 70 | begin 71 | Result := clDcc64 in IDE.CommandLineTools; 72 | end; 73 | 74 | function IsSupportCppBuilder(IDE: TDxIDE): Boolean; 75 | begin 76 | Result := bpBCBuilder32 in IDE.Personalities; 77 | end; 78 | 79 | function IsRADStudio(IDE: TDxIDE): Boolean; 80 | begin 81 | Result := IDE.RadToolKind = brBorlandDevStudio; 82 | end; 83 | 84 | function GetIDEOverrideEnvironmentVariable(IDE: TDxIDE; const Name: String): String; 85 | begin 86 | Result := IDE.ConfigData.ReadString(IDEEnvironmentVariablesSectionName, Name, EmptyStr); 87 | end; 88 | 89 | procedure SetIDEOverrideEnvironmentVariable(IDE: TDxIDE; const Name, Value: String); 90 | begin 91 | if Value <> EmptyStr then 92 | IDE.ConfigData.WriteString(IDEEnvironmentVariablesSectionName, Name, Value) 93 | else 94 | IDE.ConfigData.DeleteKey(IDEEnvironmentVariablesSectionName, Name); 95 | end; 96 | 97 | 98 | end. 99 | -------------------------------------------------------------------------------- /Sources/DxComponentFactory.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller Component Factory Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxComponentFactory; 11 | 12 | interface 13 | 14 | uses 15 | SysUtils, Classes, DxComponent, DxInstaller, DxProfile, DxIDE; 16 | 17 | type 18 | TDxComponentFactory = class 19 | private 20 | FInstaller: TDxInstaller; 21 | function CreateComponent(IDE: TDxIDE; ComponentProfile: TDxComponentProfile): TDxComponent; 22 | procedure CreatePackageList(Component: TDxComponent; IDE: TDxIDE; IsRequiredPackages: Boolean); 23 | public 24 | constructor Create(Installer: TDxInstaller); 25 | property Installer: TDxInstaller read FInstaller; 26 | procedure BuildComponentList(IDE: TDxIDE; List: TDxComponentList); 27 | end; 28 | 29 | 30 | implementation 31 | 32 | { TDxComponentFactory } 33 | 34 | constructor TDxComponentFactory.Create(Installer: TDxInstaller); 35 | begin 36 | inherited Create; 37 | FInstaller := Installer; 38 | end; 39 | 40 | procedure TDxComponentFactory.BuildComponentList(IDE: TDxIDE; List:TDxComponentList); 41 | var 42 | CompProfile: TDxComponentProfile; 43 | Comp, C: TDxComponent; 44 | Package, P: TDxPackage; 45 | begin 46 | List.Clear; 47 | for CompProfile in Installer.Profile.Components do List.Add(CreateComponent(IDE, CompProfile)); 48 | 49 | for Comp in List do begin 50 | for Package in Comp.Packages do begin 51 | // Set Package Dependents; 52 | for C in List do if C <> Comp then 53 | for P in C.Packages do 54 | if Package.Requires.IndexOf(P.Name) >= 0 then begin 55 | Package.DependentComponents.Add(C); 56 | // Set Component Dependents; 57 | if Package.Required then begin 58 | if Comp.ParentComponents.IndexOf(C) < 0 then begin 59 | Comp.ParentComponents.Add(C); 60 | if C.SubComponents.IndexOf(Comp) < 0 then C.SubComponents.Add(Comp); 61 | end; 62 | end; 63 | Break; 64 | end; 65 | end; 66 | // Set Component State; 67 | if not DirectoryExists(TDxProfile.GetComponentDir(Installer.InstallFileDir, Comp.Profile.ComponentName)) then 68 | Comp.State := dxcsNotFound 69 | else if Comp.GetExistsPackageCount = 0 then 70 | Comp.State := dxcsNotSupported 71 | else if Comp.IsMissingDependents then 72 | Comp.State := dxcsMissing; 73 | end; 74 | end; 75 | 76 | function TDxComponentFactory.CreateComponent(IDE: TDxIDE; ComponentProfile: TDxComponentProfile): TDxComponent; 77 | begin 78 | Result := TDxComponent.Create(ComponentProfile); 79 | CreatePackageList(Result, IDE, True); 80 | CreatePackageList(Result, IDE, False); 81 | end; 82 | 83 | procedure TDxComponentFactory.CreatePackageList(Component: TDxComponent; IDE: TDxIDE; IsRequiredPackages: Boolean); 84 | var 85 | List: TStringList; 86 | PackageName, FileName: String; 87 | Package: TDxPackage; 88 | begin 89 | if IsRequiredPackages then List := Component.Profile.RequiredPackages else List := Component.Profile.OptionalPackages; 90 | for PackageName in List do begin 91 | FileName := TDxProfile.GetPackageFullFileName(Installer.InstallFileDir, Component.Profile.ComponentName, PackageName, IDE); 92 | if not FileExists(FileName) then Continue; 93 | Package := TDxPackage.Create(FileName); 94 | Package.Required := IsRequiredPackages; 95 | Component.Packages.Add(Package); 96 | end; 97 | end; 98 | 99 | 100 | end. 101 | -------------------------------------------------------------------------------- /Sources/DxProgress.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller Progress Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxProgress; 11 | 12 | interface 13 | 14 | uses 15 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 16 | Dialogs, StdCtrls, Buttons, ExtCtrls, DxIDE, DxProfile, DxInstaller, ActnList, 17 | ImgList, cxGraphics, DxUtils; 18 | 19 | type 20 | TDxProgressForm = class(TDxForm) 21 | PanLogs: TPanel; 22 | ProgressLogs: TMemo; 23 | ProgressTitle: TLabel; 24 | Actions: TActionList; 25 | ActionStop: TAction; 26 | ActionClose: TAction; 27 | Images: TcxImageList; 28 | BtnAction: TButton; 29 | procedure FormCreate(Sender: TObject); 30 | procedure ActionCloseExecute(Sender: TObject); 31 | procedure ActionStopExecute(Sender: TObject); 32 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 33 | procedure FormDestroy(Sender: TObject); 34 | private 35 | { Private declarations } 36 | FInstaller: TDxInstaller; 37 | FTarget: String; 38 | FTargetLogs: TStringList; 39 | public 40 | { Public declarations } 41 | property Installer: TDxInstaller read FInstaller write FInstaller; 42 | procedure Initial(); 43 | procedure UpdateProgress(IDE: TDxIDE; Component: TDxComponentProfile; const Task, Target: String); 44 | procedure UpdateProgressState(const StateText: String); 45 | end; 46 | 47 | implementation 48 | 49 | {$R *.dfm} 50 | 51 | { TDxProgressForm } 52 | 53 | procedure TDxProgressForm.ActionCloseExecute(Sender: TObject); 54 | begin 55 | Close; 56 | end; 57 | 58 | procedure TDxProgressForm.ActionStopExecute(Sender: TObject); 59 | begin 60 | Installer.Stop; 61 | end; 62 | 63 | procedure TDxProgressForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 64 | begin 65 | CanClose := Installer.State = dxisNormal; 66 | end; 67 | 68 | procedure TDxProgressForm.FormCreate(Sender: TObject); 69 | begin 70 | SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_APPWINDOW); 71 | Caption := Application.Title; 72 | FInstaller := nil; 73 | FTarget := EmptyStr; 74 | FTargetLogs := TStringList.Create; 75 | end; 76 | 77 | procedure TDxProgressForm.FormDestroy(Sender: TObject); 78 | begin 79 | FTargetLogs.Free; 80 | end; 81 | 82 | procedure TDxProgressForm.Initial; 83 | begin 84 | ProgressLogs.Clear; 85 | BtnAction.Action := ActionClose; 86 | Show; 87 | end; 88 | 89 | procedure TDxProgressForm.UpdateProgress(IDE: TDxIDE; Component: TDxComponentProfile; const Task, Target: String); 90 | begin 91 | if Installer = nil then Exit; 92 | if Installer.State = dxisRunning then BtnAction.Action := ActionStop; 93 | ProgressTitle.Caption := IDE.Name; 94 | if Component <> nil then ProgressTitle.Caption := ProgressTitle.Caption + ' > ' + Component.ComponentName; 95 | if Task <> EmptyStr then ProgressTitle.Caption := ProgressTitle.Caption + ' > ' + Task; 96 | if FTarget <> Target then begin 97 | FTargetLogs.Clear; 98 | ProgressLogs.Lines.Add(StringOfChar('-', 100)); 99 | end; 100 | FTarget := Target; 101 | if Target <> EmptyStr then ProgressTitle.Caption := ProgressTitle.Caption + ' > ' + Target; 102 | end; 103 | 104 | procedure TDxProgressForm.UpdateProgressState(const StateText: String); 105 | begin 106 | if Installer = nil then Exit; 107 | ProgressLogs.Lines.Add(StateText); 108 | FTargetLogs.Add(StateText); 109 | case Installer.State of 110 | dxisNormal: begin 111 | BtnAction.Action := ActionClose; 112 | ProgressTitle.Caption := StateText; 113 | Close; 114 | ShowModal; 115 | end; 116 | dxisError: if Application.MessageBox(PChar(FTargetLogs.Text + CRLF + 'An error has occurred, do you want to continue?'), 117 | 'Confirmation', MB_ICONQUESTION + MB_OKCANCEL) = IDCANCEL then ActionStop.Execute; 118 | end; 119 | end; 120 | 121 | end. 122 | -------------------------------------------------------------------------------- /Sources/DxQuantumTreeList.dfm: -------------------------------------------------------------------------------- 1 | object DxResourceModule: TDxResourceModule 2 | OnCreate = DataModuleCreate 3 | Height = 225 4 | Width = 323 5 | PixelsPerInch = 144 6 | object EditRepository: TcxEditRepository 7 | Left = 60 8 | Top = 60 9 | PixelsPerInch = 144 10 | object CheckBoxItem: TcxEditRepositoryCheckBoxItem 11 | Properties.ImmediatePost = True 12 | end 13 | object MissingItem: TcxEditRepositoryCheckBoxItem 14 | Properties.Glyph.SourceDPI = 96 15 | Properties.Glyph.SourceHeight = 16 16 | Properties.Glyph.SourceWidth = 16 17 | Properties.Glyph.Data = { 18 | 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554 19 | 462D38223F3E0D0A3C7376672076657273696F6E3D22312E312220786D6C6E73 20 | 3D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220786D 21 | 6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939 22 | 392F786C696E6B2220783D223070782220793D2230707822206865696768743D 23 | 22307078222077696474683D22307078222076696577426F783D223020302033 24 | 32203332223E0D0A093C67207461673D225F64782E6D756C74696672616D652E 25 | 737667223E0D0A09093C706174682066696C6C3D22234646423131352220643D 26 | 224D32392E372C32362E324C31372C342E38632D302E362D312D312E352D312D 27 | 322E312C304C332C32362E32632D302E362C312D302E322C312E382C312C312E 28 | 386832342E374332392E382C32382C33302E332C32372E322C32392E372C3236 29 | 2E327A20202623393B204D31362C3236632D312E312C302D322D302E392D322D 30 | 3273302E392D322C322D3273322C302E392C322C325331372E312C32362C3136 31 | 2C32367A204D31382C3230682D34762D3763302D302E362C302E342D312C312D 32 | 31683263302E362C302C312C302E342C312C315632307A222F3E0D0A093C2F67 33 | 3E0D0A3C2F7376673E0D0A} 34 | Properties.GlyphCount = 1 35 | Properties.NullStyle = nssUnchecked 36 | Properties.ReadOnly = True 37 | end 38 | object NotFoundItem: TcxEditRepositoryCheckBoxItem 39 | Properties.Glyph.SourceDPI = 96 40 | Properties.Glyph.SourceHeight = 16 41 | Properties.Glyph.SourceWidth = 16 42 | Properties.Glyph.Data = { 43 | 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554 44 | 462D38223F3E0D0A3C7376672076657273696F6E3D22312E312220786D6C6E73 45 | 3D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220786D 46 | 6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939 47 | 392F786C696E6B2220783D223070782220793D2230707822206865696768743D 48 | 22307078222077696474683D22307078222076696577426F783D223020302033 49 | 32203332223E0D0A093C67207461673D225F64782E6D756C74696672616D652E 50 | 737667223E0D0A09093C672069643D22D0A1D0BBD0BED0B95F32223E0D0A0909 51 | 093C706174682066696C6C3D22233131373744372220643D224D31362C326337 52 | 2E372C302C31342C362E332C31342C3134732D362E332C31342D31342C313453 53 | 322C32332E372C322C313653382E332C322C31362C327A222F3E0D0A0909093C 54 | 636972636C652066696C6C3D2223464646464646222063783D22313670782220 55 | 63793D22313070782220723D22327078222F3E0D0A0909093C70617468206669 56 | 6C6C3D22234646464646462220643D224D31362C32344C31362C3234632D312E 57 | 312C302D322D302E392D322D32762D3663302D312E312C302E392D322C322D32 58 | 6C302C3063312E312C302C322C302E392C322C3276364331382C32332E312C31 59 | 372E312C32342C31362C32347A222F3E0D0A09093C2F673E0D0A093C2F673E0D 60 | 0A3C2F7376673E0D0A} 61 | Properties.GlyphCount = 1 62 | Properties.NullStyle = nssUnchecked 63 | Properties.ReadOnly = True 64 | end 65 | object NotSupportedItem: TcxEditRepositoryCheckBoxItem 66 | Properties.Glyph.SourceDPI = 96 67 | Properties.Glyph.SourceHeight = 16 68 | Properties.Glyph.SourceWidth = 16 69 | Properties.Glyph.Data = { 70 | 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554 71 | 462D38223F3E0D0A3C7376672076657273696F6E3D22312E312220786D6C6E73 72 | 3D22687474703A2F2F7777772E77332E6F72672F323030302F7376672220786D 73 | 6C6E733A786C696E6B3D22687474703A2F2F7777772E77332E6F72672F313939 74 | 392F786C696E6B2220783D223070782220793D2230707822206865696768743D 75 | 22307078222077696474683D22307078222076696577426F783D223020302033 76 | 32203332223E0D0A093C67207461673D225F64782E6D756C74696672616D652E 77 | 737667223E0D0A09093C706174682066696C6C3D22234431314331432220643D 78 | 224D31362C3443392E342C342C342C392E342C342C313673352E342C31322C31 79 | 322C31327331322D352E342C31322D31325332322E362C342C31362C347A204D 80 | 31362C3863312E352C302C322E392C302E342C342E312C312E316C2D31312C31 81 | 3120202623393B43382E342C31382E392C382C31372E352C382C313643382C31 82 | 312E362C31312E362C382C31362C387A204D31362C3234632D312E352C302D32 83 | 2E382D302E342D342D312E314C32322E392C313263302E372C312E322C312E31 84 | 2C322E352C312E312C344332342C32302E342C32302E342C32342C31362C3234 85 | 7A222F3E0D0A093C2F673E0D0A3C2F7376673E0D0A} 86 | Properties.GlyphCount = 1 87 | Properties.NullStyle = nssUnchecked 88 | Properties.ReadOnly = True 89 | end 90 | end 91 | object HintStyleController: TcxHintStyleController 92 | HintStyleClassName = 'TcxHintStyle' 93 | HintStyle.CaptionFont.Charset = DEFAULT_CHARSET 94 | HintStyle.CaptionFont.Color = clWindowText 95 | HintStyle.CaptionFont.Height = -11 96 | HintStyle.CaptionFont.Name = 'Tahoma' 97 | HintStyle.CaptionFont.Style = [] 98 | HintStyle.Font.Charset = DEFAULT_CHARSET 99 | HintStyle.Font.Color = clWindowText 100 | HintStyle.Font.Height = -11 101 | HintStyle.Font.Name = 'Tahoma' 102 | HintStyle.Font.Style = [] 103 | HintStyle.IconSize = cxisSmall 104 | HintStyle.IconType = cxhiCurrentApplication 105 | LookAndFeel.NativeStyle = False 106 | OnShowHintEx = HintStyleControllerShowHintEx 107 | Left = 216 108 | Top = 60 109 | end 110 | end 111 | -------------------------------------------------------------------------------- /Sources/DxUtils.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller Utils Library } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxUtils; 11 | 12 | interface 13 | 14 | uses 15 | Windows, SysUtils, Classes, Forms; 16 | 17 | type 18 | TDxForm = class(TForm) 19 | public 20 | constructor Create(AOwner: TComponent); override; 21 | end; 22 | 23 | TLoadFromStreamProc = procedure(Stream: TStream) of object; 24 | 25 | function BuildFileList(const Path: String; const List: TStrings; const Attr: Integer; 26 | const FullFileName: Boolean; const Recursive: Boolean): Boolean; 27 | procedure DeleteFiles(const FilePath: String); 28 | procedure DeleteDirectory(const DirPath: String); 29 | procedure CopyFile(const ExistingFileName, NewFileName: String; const ReplaceExisting: Boolean); 30 | procedure CopyFilesToDirectory(const FilePath, DirPath: String); 31 | function IsEmptyDirectory(const DirPath, ExcludeFile: String): Boolean; 32 | function GetVersionStr(): String; 33 | procedure LoadFromResource(AProc: TLoadFromStreamProc; const AResName: string; AResType: PChar = RT_RCDATA); 34 | procedure ExportResourceToFile(const AFileName, AResName: string; AResType: PChar = RT_RCDATA); 35 | procedure ShowInformation(const Text: String); 36 | 37 | const 38 | CRLF = #13#10; 39 | 40 | implementation 41 | 42 | uses 43 | JclFileUtils; 44 | 45 | // function parameter Path can include multiple FileMasks as: 46 | // C:\Windows\System32\*.exe;*.dll 47 | // FileMask Seperator = ';' 48 | 49 | function BuildFileList(const Path: String; const List: TStrings; const Attr: Integer; 50 | const FullFileName: Boolean; const Recursive: Boolean): Boolean; 51 | var 52 | Options: TFileListOptions; 53 | begin 54 | if Recursive then begin 55 | Options := [flRecursive]; 56 | if FullFileName then Include(Options, flFullNames); 57 | Result := JclFileUtils.AdvBuildFileList(Path, Attr, List, amSuperSetOf, Options); 58 | end else 59 | Result := JclFileUtils.BuildFileList(Path, Attr, List, FullFileName); 60 | end; 61 | 62 | procedure DeleteFiles(const FilePath: String); 63 | var 64 | List: TStringList; 65 | S: String; 66 | begin 67 | List := TStringList.Create; 68 | try 69 | BuildFileList(FilePath, List, faAnyFile, True, False); 70 | for S in List do Windows.DeleteFile(PChar(S)); 71 | finally 72 | List.Free; 73 | end; 74 | end; 75 | 76 | procedure DeleteDirectory(const DirPath: String); 77 | begin 78 | JclFileUtils.DeleteDirectory(DirPath, False); 79 | end; 80 | 81 | procedure CopyFile(const ExistingFileName, NewFileName: String; const ReplaceExisting: Boolean); 82 | begin 83 | Windows.CopyFile(PChar(ExistingFileName), PChar(NewFileName), not ReplaceExisting); 84 | end; 85 | 86 | procedure CopyFilesToDirectory(const FilePath, DirPath: String); 87 | var 88 | List: TStringList; 89 | S: String; 90 | begin 91 | List := TStringList.Create; 92 | try 93 | BuildFileList(FilePath, List, faAnyFile, True, False); 94 | ForceDirectories(DirPath); 95 | for S in List do CopyFile(S, IncludeTrailingPathDelimiter(DirPath) + ExtractFileName(S), True); 96 | finally 97 | List.Free; 98 | end; 99 | end; 100 | 101 | function IsEmptyDirectory(const DirPath, ExcludeFile: String): Boolean; 102 | var 103 | List: TStringList; 104 | begin 105 | List := TStringList.Create; 106 | try 107 | BuildFileList(IncludeTrailingPathDelimiter(DirPath) + '*.*', List, faAnyFile, True, False); 108 | Result := (List.Count = 0) or ((List.Count = 1) and (List.IndexOf(ExcludeTrailingPathDelimiter(ExcludeFile)) = 0)); 109 | finally 110 | List.Free; 111 | end; 112 | end; 113 | 114 | function GetVersionStr(): String; 115 | var 116 | Major, Minor, Release: Cardinal; 117 | RS: TResourceStream; 118 | MS: TMemoryStream; 119 | Buffer: PVSFIXEDFILEINFO; 120 | BufferLen: Cardinal; 121 | begin 122 | Result := ''; 123 | try 124 | RS := TResourceStream.CreateFromID(HInstance, 1, RT_VERSION); 125 | except 126 | Exit; 127 | end; 128 | 129 | MS := TMemoryStream.Create; 130 | try 131 | MS.CopyFrom(RS, RS.Size); 132 | if VerQueryValue(MS.Memory, '\', Pointer(Buffer), BufferLen) then begin 133 | Major := Buffer.dwFileVersionMS shr 16; 134 | Minor := Buffer.dwFileVersionMS and $FFFF; 135 | Release := Buffer.dwFileVersionLS shr 16; 136 | //Build := Buffer.dwFileVersionLS and $FFFF; 137 | 138 | Result := Format('v%d.%d', [Major, Minor]); 139 | if Release <> 0 then Result := Result + '.' + IntToStr(Release); 140 | end; 141 | finally 142 | MS.Free; 143 | RS.Free; 144 | end; 145 | end; 146 | 147 | procedure LoadFromResource(AProc: TLoadFromStreamProc; const AResName: string; AResType: PChar); 148 | begin 149 | var RS := TResourceStream.Create(HInstance, AResName, AResType); 150 | try 151 | AProc(RS); 152 | finally 153 | RS.Free; 154 | end; 155 | end; 156 | 157 | procedure ExportResourceToFile(const AFileName, AResName: string; AResType: PChar); 158 | begin 159 | var RS := TResourceStream.Create(HInstance, AResName, AResType); 160 | try 161 | RS.SaveToFile(AFileName); 162 | finally 163 | RS.Free; 164 | end; 165 | end; 166 | 167 | procedure ShowInformation(const Text: String); 168 | begin 169 | Application.MessageBox(PChar(Text), 'Information', MB_ICONINFORMATION); 170 | end; 171 | 172 | { TDxForm } 173 | 174 | constructor TDxForm.Create(AOwner: TComponent); 175 | begin 176 | inherited; 177 | if Screen.Fonts.IndexOf(Font.Name) < 0 then Font.Name := 'Tahoma'; 178 | end; 179 | 180 | end. 181 | 182 | 183 | 184 | -------------------------------------------------------------------------------- /Sources/DxComponent.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller Component Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxComponent; 11 | 12 | interface 13 | 14 | uses 15 | SysUtils, Classes, Generics.Collections, DxProfile; 16 | 17 | type 18 | TDxComponent = class; 19 | TDxComponentList = TObjectList; 20 | 21 | TDxPackageCategory = (dxpcNormal, dxpcIBX, dxpcTeeChart, dxpcFireDAC, dxpcBDE); 22 | TDxPackageUsage = (dxpuDesigntimeOnly, dxpuRuntimeOnly, dxpuDesigntimeAndRuntime); 23 | 24 | TDxPackage = class 25 | private 26 | FFullFileName: String; 27 | FName: String; 28 | FCategory: TdxPackageCategory; 29 | FDescription: String; 30 | FUsage: TDxPackageUsage; 31 | FRequires: TStringList; 32 | FExists: Boolean; 33 | FRequired: Boolean; 34 | FDependentComponents: TDxComponentList; 35 | procedure ReadOptions(); 36 | public 37 | constructor Create(const FullFileName: String); 38 | destructor Destroy; override; 39 | property FullFileName: String read FFullFileName; 40 | property Name: String read FName; 41 | property Category: TDxPackageCategory read FCategory; 42 | property Description: String read FDescription; 43 | property Usage: TDxPackageUsage read FUsage; 44 | property Requires: TStringList read FRequires; 45 | property Exists: Boolean read FExists; 46 | property Required: Boolean read FRequired write FRequired; 47 | property DependentComponents: TDxComponentList read FDependentComponents; 48 | end; 49 | 50 | TDxPackageList = TObjectList; 51 | TDxComponentState = (dxcsInstall, dxcsNotInstall, dxcsNotFound, dxcsNotSupported, dxcsMissing); 52 | 53 | TDxComponent = class 54 | private 55 | FProfile: TDxComponentProfile; 56 | FPackages: TDxPackageList; 57 | FParentComponents: TDxComponentList; 58 | FSubComponents: TDxComponentList; 59 | FState: TDxComponentState; 60 | procedure SetState(const Value: TDxComponentState); 61 | public 62 | constructor Create(ComponentProfile: TDxComponentProfile); 63 | destructor Destroy; override; 64 | property Profile: TDxComponentProfile read FProfile; 65 | property Packages: TDxPackageList read FPackages; 66 | property ParentComponents: TDxComponentList read FParentComponents write FParentComponents; 67 | property SubComponents: TDxComponentList read FSubComponents write FSubComponents; 68 | property State: TDxComponentState read FState write SetState; 69 | function GetExistsPackageCount(): Integer; 70 | function IsMissingDependents(): Boolean; 71 | end; 72 | 73 | const 74 | DPKDescriptionOptionIdent = '{$DESCRIPTION '''; 75 | DPKDesigntimeOnlyOptionIdent = '{$DESIGNONLY'; 76 | DPKRuntimeOnlyOptionIdent = '{$RUNONLY'; 77 | DPKRequiresOptionIdent = 'requires'; 78 | 79 | dxcsEditModes = [dxcsInstall, dxcsNotInstall]; 80 | 81 | 82 | implementation 83 | 84 | { TDxPackage } 85 | 86 | constructor TDxPackage.Create(const FullFileName: String); 87 | begin 88 | inherited Create; 89 | FFullFileName := FullFileName; 90 | FName := ChangeFileExt(ExtractFileName(FullFileName), ''); 91 | if Pos('IBX', FName) > 0 then FCategory := dxpcIBX 92 | else if Pos('TeeChart', FName)> 0 then FCategory := dxpcTeeChart 93 | else if Pos('FireDAC', FName) > 0 then FCategory := dxpcFireDAC 94 | else if Pos('BDE', FName) > 0 then FCategory := dxpcBDE 95 | else FCategory := dxpcNormal; 96 | FDescription := ''; 97 | FUsage := dxpuDesigntimeAndRuntime; 98 | FRequires := TStringList.Create; 99 | FExists := FileExists(FullFileName); 100 | FRequired := True; 101 | FDependentComponents := TDxComponentList.Create(False); 102 | ReadOptions; 103 | end; 104 | 105 | destructor TDxPackage.Destroy; 106 | begin 107 | FRequires.Free; 108 | FDependentComponents.Free; 109 | inherited; 110 | end; 111 | 112 | procedure TDxPackage.ReadOptions; 113 | var 114 | DPK: TStringList; 115 | S: String; 116 | IsInRequiresPart: Boolean; 117 | begin 118 | if not Exists then Exit; 119 | DPK := TStringList.Create; 120 | try 121 | DPK.LoadFromFile(FullFileName); 122 | IsInRequiresPart := False; 123 | for S in DPK do begin 124 | if IsInRequiresPart then begin 125 | if Pos(',', S) > 0 then FRequires.Add(Trim(StringReplace(S, ',', '', []))) else begin 126 | FRequires.Add(Trim(StringReplace(S, ';', '', []))); 127 | Break; 128 | end; 129 | end else begin 130 | if Pos(DPKDescriptionOptionIdent, S) > 0 then 131 | FDescription := Copy(S, Length(DPKDescriptionOptionIdent) + 1, Length(S) - Length(DPKDescriptionOptionIdent) - 2) 132 | else if Pos(DPKDesigntimeOnlyOptionIdent, S) > 0 then FUsage := dxpuDesigntimeOnly 133 | else if Pos(DPKRuntimeOnlyOptionIdent, S) > 0 then FUsage := dxpuRuntimeOnly 134 | else if Trim(S) = DPKRequiresOptionIdent then IsInRequiresPart := True; 135 | end; 136 | end; 137 | finally 138 | DPK.Free; 139 | end; 140 | end; 141 | 142 | { TDxComponent } 143 | 144 | constructor TDxComponent.Create(ComponentProfile: TDxComponentProfile); 145 | begin 146 | inherited Create; 147 | FProfile := ComponentProfile; 148 | FPackages := TDxPackageList.Create(); 149 | FParentComponents := TDxComponentList.Create(False); 150 | FSubComponents := TDxComponentList.Create(False); 151 | FState := dxcsInstall; 152 | end; 153 | 154 | destructor TDxComponent.Destroy; 155 | begin 156 | FPackages.Free; 157 | FParentComponents.Free; 158 | FSubComponents.Free; 159 | inherited; 160 | end; 161 | 162 | function TDxComponent.GetExistsPackageCount: Integer; 163 | var 164 | Package: TDxPackage; 165 | begin 166 | Result := 0; 167 | for Package in Packages do if Package.Exists then Inc(Result); 168 | end; 169 | 170 | function TDxComponent.IsMissingDependents: Boolean; 171 | var 172 | Comp: TDxComponent; 173 | begin 174 | Result := False; 175 | for Comp in ParentComponents do 176 | if not (Comp.State in dxcsEditModes) then begin 177 | Result := True; 178 | Break; 179 | end; 180 | end; 181 | 182 | procedure TDxComponent.SetState(const Value: TDxComponentState); 183 | var 184 | Comp: TDxComponent; 185 | begin 186 | if State = Value then Exit; 187 | if not (State in dxcsEditModes) then Exit; 188 | case Value of 189 | dxcsInstall: for Comp in ParentComponents do Comp.State := dxcsInstall; 190 | dxcsNotInstall: for Comp in SubComponents do Comp.State := dxcsNotInstall; 191 | end; 192 | FState := Value; 193 | end; 194 | 195 | end. 196 | -------------------------------------------------------------------------------- /Sources/DxProfile.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller Profile Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxProfile; 11 | 12 | interface 13 | 14 | uses 15 | SysUtils, Classes, Generics.Collections, DxIDE; 16 | 17 | type 18 | TDxComponentProfile = class 19 | private 20 | FComponentName: String; 21 | FRequiredPackages: TStringList; 22 | FOptionalPackages: TStringList; 23 | FOutdatedPackages: TStringList; 24 | FIsBase: Boolean; 25 | public 26 | constructor Create; 27 | destructor Destroy; override; 28 | property ComponentName: String read FComponentName write FComponentName; 29 | property RequiredPackages: TStringList read FRequiredPackages; 30 | property OptionalPackages: TStringList read FOptionalPackages; 31 | property OutdatedPackages: TStringList read FOutdatedPackages; 32 | property IsBase: Boolean read FIsBase write FIsBase; 33 | end; 34 | 35 | TDxComponentProfileList = TObjectList; 36 | 37 | TDxProfile = class 38 | const 39 | RequiredPackagesIdent = 'RequiredPackages'; 40 | OptionalPackagesIdent = 'OptionalPackages'; 41 | OutdatedPackagesIdent = 'OutdatedPackages'; 42 | IsBaseIdent = 'IsBase'; 43 | 44 | ProfileResourceName = 'Profile'; 45 | private 46 | FFileName: String; 47 | FComponents: TDxComponentProfileList; 48 | procedure LoadComponents(); 49 | public 50 | constructor Create(); 51 | destructor Destroy; override; 52 | property FileName: String read FFileName; 53 | property Components: TDxComponentProfileList read FComponents; 54 | function IsCustomProfile(): Boolean; 55 | procedure ExportBuiltInProfile(const FileName: String); 56 | class function GetCustomProfileFileName(): String; 57 | class function GetIDEVersionNumberStr(IDE: TDxIDE): String; 58 | class function GetComponentDir(const InstallFileDir, ComponentName: String): String; 59 | class function GetComponentSourcesDir(const InstallFileDir, ComponentName: String): String; 60 | class function GetComponentPackagesDir(const InstallFileDir, ComponentName: String): String; 61 | class function GetPackageName(const PackageBaseName: String; IDE: TDxIDE): String; 62 | class function GetPackageFullFileName(const InstallFileDir, ComponentName, PackageBaseName: String; IDE: TDxIDE): String; 63 | class function GetDxBuildNumber(const InstallFileDir: String): Cardinal; 64 | class function GetDxBuildNumberAsVersion(const BuildNumber: Cardinal): String; 65 | end; 66 | 67 | 68 | implementation 69 | 70 | uses 71 | IniFiles, IOUtils, Forms, DxUtils; 72 | 73 | { TDxComponentProfile } 74 | 75 | constructor TDxComponentProfile.Create; 76 | begin 77 | inherited Create; 78 | FComponentName := ''; 79 | FRequiredPackages := TStringList.Create; 80 | FOptionalPackages := TStringList.Create; 81 | FOutdatedPackages := TStringList.Create; 82 | FIsBase := False; 83 | end; 84 | 85 | destructor TDxComponentProfile.Destroy; 86 | begin 87 | FRequiredPackages.Free; 88 | FOptionalPackages.Free; 89 | FOutDatedPackages.Free; 90 | inherited; 91 | end; 92 | 93 | { TDxProfile } 94 | 95 | constructor TDxProfile.Create(); 96 | begin 97 | FFileName := GetCustomProfileFileName; 98 | if not FileExists(FFileName) then begin 99 | FFileName := TPath.GetTempFileName; 100 | ExportBuiltInProfile(FFileName); 101 | end; 102 | FComponents := TDxComponentProfileList.Create(); 103 | LoadComponents(); 104 | end; 105 | 106 | destructor TDxProfile.Destroy; 107 | begin 108 | FComponents.Free; 109 | inherited; 110 | end; 111 | 112 | procedure TDxProfile.ExportBuiltInProfile(const FileName: String); 113 | begin 114 | ExportResourceToFile(FileName, ProfileResourceName); 115 | end; 116 | 117 | function TDxProfile.IsCustomProfile: Boolean; 118 | begin 119 | Result := FileName = GetCustomProfileFileName; 120 | end; 121 | 122 | procedure TDxProfile.LoadComponents; 123 | var 124 | Ini: TIniFile; 125 | Names: TStringList; 126 | Name: String; 127 | Comp: TDxComponentProfile; 128 | 129 | procedure StrToList(const S: String; List: TStringList); 130 | var 131 | I: Integer; 132 | begin 133 | List.CommaText := S; 134 | for I := List.Count - 1 downto 0 do if List[I] = EmptyStr then List.Delete(I); 135 | end; 136 | begin 137 | FComponents.Clear; 138 | Ini := TIniFile.Create(FileName); 139 | Names := TStringList.Create; 140 | try 141 | Ini.ReadSections(Names); 142 | for Name in Names do begin 143 | Comp := TDxComponentProfile.Create; 144 | Comp.ComponentName := Trim(Name); 145 | StrToList(Ini.ReadString(Name, RequiredPackagesIdent, ''), Comp.RequiredPackages); 146 | StrToList(Ini.ReadString(Name, OptionalPackagesIdent, ''), Comp.OptionalPackages); 147 | StrToList(Ini.ReadString(Name, OutdatedPackagesIdent, ''), Comp.OutdatedPackages); 148 | Comp.IsBase := Ini.ReadBool(Name, IsBaseIdent, False); 149 | Components.Add(Comp); 150 | end; 151 | finally 152 | Names.Free; 153 | Ini.Free; 154 | end; 155 | end; 156 | 157 | class function TDxProfile.GetCustomProfileFileName: String; 158 | begin 159 | Result := TPath.Combine(ExtractFilePath(Application.ExeName), ProfileResourceName + '.ini'); 160 | end; 161 | 162 | class function TDxProfile.GetComponentDir(const InstallFileDir, ComponentName: String): String; 163 | begin 164 | Result := IncludeTrailingPathDelimiter(InstallFileDir) + ComponentName; 165 | end; 166 | 167 | class function TDxProfile.GetComponentSourcesDir(const InstallFileDir, ComponentName: String): String; 168 | begin 169 | Result := GetComponentDir(InstallFileDir, ComponentName) + '\Sources'; 170 | end; 171 | 172 | class function TDxProfile.GetComponentPackagesDir(const InstallFileDir, ComponentName: String): String; 173 | begin 174 | Result := GetComponentDir(InstallFileDir, ComponentName) + '\Packages'; 175 | end; 176 | 177 | class function TDxProfile.GetPackageName(const PackageBaseName: String; IDE: TDxIDE): String; 178 | begin 179 | Result := PackageBaseName + GetIDEVersionNumberStr(IDE); 180 | end; 181 | 182 | class function TDxProfile.GetPackageFullFileName(const InstallFileDir, ComponentName, PackageBaseName: String; IDE: TDxIDE): String; 183 | begin 184 | Result := GetComponentPackagesDir(InstallFileDir, ComponentName) + '\' + 185 | GetPackageName(PackageBaseName, IDE) + IDE.PackageSourceFileExtension; 186 | end; 187 | 188 | class function TDxProfile.GetDxBuildNumber(const InstallFileDir: String): Cardinal; 189 | const 190 | VersionIdent = 'dxVersion = '; 191 | BuildNumberIdent = 'dxBuildNumber: Cardinal = '; 192 | var 193 | SourceFile: TextFile; 194 | S: String; 195 | begin 196 | Result := 0; 197 | S := IncludeTrailingPathDelimiter(InstallFileDir) + 'ExpressCore Library\Sources\dxCore.pas'; 198 | if not FileExists(S) then Exit; 199 | 200 | AssignFile(SourceFile, S); 201 | Reset(SourceFile); 202 | while not Eof(SourceFile) do begin 203 | ReadLn(SourceFile, S); 204 | S := S.Trim; 205 | if S.StartsWith(VersionIdent) or S.StartsWith(BuildNumberIdent) then begin 206 | S := S.Substring(S.IndexOf('=') + 1); 207 | S := S.Remove(S.IndexOf(';')); 208 | Result := StrToIntDef(S.Trim, 0); 209 | Break; 210 | end; 211 | end; 212 | CloseFile(SourceFile); 213 | end; 214 | 215 | class function TDxProfile.GetDxBuildNumberAsVersion(const BuildNumber: Cardinal): String; 216 | var 217 | I: Integer; 218 | begin 219 | if BuildNumber > 0 then begin 220 | I := BuildNumber mod 10000; 221 | Result := Format('%d.%d.%d', [BuildNumber div 10000 mod 100, I div 100, I mod 100]); 222 | end else 223 | Result := 'n/a'; 224 | end; 225 | 226 | class function TDxProfile.GetIDEVersionNumberStr(IDE: TDxIDE): String; 227 | begin 228 | Result := IDE.VersionNumberStr; 229 | if IsRADStudio(IDE) then Result := StringReplace(Result, 'd', 'rs', [rfIgnoreCase]); 230 | Result := UpperCase(Result); 231 | end; 232 | 233 | 234 | end. 235 | -------------------------------------------------------------------------------- /Sources/DxProgress.dfm: -------------------------------------------------------------------------------- 1 | object DxProgressForm: TDxProgressForm 2 | Left = 0 3 | Top = 0 4 | Caption = 'Progress' 5 | ClientHeight = 424 6 | ClientWidth = 796 7 | Color = clBtnFace 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -12 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | OldCreateOrder = False 14 | Position = poScreenCenter 15 | OnCloseQuery = FormCloseQuery 16 | OnCreate = FormCreate 17 | OnDestroy = FormDestroy 18 | DesignSize = ( 19 | 796 20 | 424) 21 | PixelsPerInch = 96 22 | TextHeight = 15 23 | object PanLogs: TPanel 24 | Left = 8 25 | Top = 8 26 | Width = 780 27 | Height = 377 28 | Anchors = [akLeft, akTop, akRight, akBottom] 29 | BevelEdges = [beBottom] 30 | BevelKind = bkTile 31 | BevelOuter = bvNone 32 | TabOrder = 0 33 | object ProgressTitle: TLabel 34 | Left = 0 35 | Top = 350 36 | Width = 780 37 | Height = 25 38 | Align = alBottom 39 | AutoSize = False 40 | Caption = 41 | 'RAD Studio XE > ExpressCore Library > Install Package: E:\DevExp' + 42 | 'ress\ExpressCore Library\Packages\DxCoreRS15.dpk' 43 | EllipsisPosition = epPathEllipsis 44 | Layout = tlCenter 45 | ExplicitTop = 352 46 | end 47 | object ProgressLogs: TMemo 48 | Left = 0 49 | Top = 0 50 | Width = 780 51 | Height = 350 52 | Align = alClient 53 | ReadOnly = True 54 | ScrollBars = ssVertical 55 | TabOrder = 0 56 | end 57 | end 58 | object BtnAction: TButton 59 | Left = 713 60 | Top = 391 61 | Width = 75 62 | Height = 25 63 | Action = ActionStop 64 | Anchors = [akRight, akBottom] 65 | ImageMargins.Left = 10 66 | ImageMargins.Right = -10 67 | Images = Images 68 | TabOrder = 1 69 | end 70 | object Actions: TActionList 71 | Images = Images 72 | Left = 392 73 | Top = 216 74 | object ActionStop: TAction 75 | Caption = '&Stop' 76 | ImageIndex = 0 77 | OnExecute = ActionStopExecute 78 | end 79 | object ActionClose: TAction 80 | Caption = '&Close' 81 | ImageIndex = 1 82 | OnExecute = ActionCloseExecute 83 | end 84 | end 85 | object Images: TcxImageList 86 | FormatVersion = 1 87 | DesignInfo = 14680592 88 | ImageInfo = < 89 | item 90 | Image.Data = { 91 | 36040000424D3604000000000000360000002800000010000000100000000100 92 | 2000000000000004000000000000000000000000000000000000000000000000 93 | 0000000000000000000014145585222287CF222287CF212186CF212185CF2121 94 | 83CF212182CF1313528600000000000000000000000000000000000000000000 95 | 00000000000016165D8E4242CBFF5151E7FF4C4CE3FF4747E0FF4343DDFF3E3E 96 | D9FF3C3CD8FF3838C1FF1515578F000000000000000000000000000000000000 97 | 000017175E8E4545CFFF5858EBFF4E4EE4FF4747DFFF4141DAFF3A3AD5FF3434 98 | D1FF2E2ECCFF3434D2FF3939C1FF1515578F0000000000000000000000001717 99 | 608E4848D1FF6060F0FF5A5AEBFF5555E8FF5050E5FF4949E0FF4343DBFF3C3C 100 | D7FF3636D2FF3030CDFF3636D3FF3939C1FF1515578F0000000016165C874848 101 | D2FF6363F1FF6161EFFF5F5FEEFF5B5BECFF5757E9FF5252E6FF4B4BE2FF4545 102 | DDFF3E3ED8FF3737D3FF3131CFFF3737D4FF3939C1FF14145489282899D66262 103 | EFFF6060ECFF6161EEFF6161EEFF6060EEFF5C5CEDFF5858EAFF5353E7FF4D4D 104 | E3FF4747DEFF4040D9FF3939D5FF3333D0FF3F3FDAFF24248CDA28289AD65F5F 105 | ECFF5D5DE8FF5D5DDEFF5E5EDDFF5E5EDEFF5D5DDEFF5B5BDDFF5757DBFF5353 106 | D8FF4D4DD5FF4848D1FF4141CDFF3B3BD6FF4343DDFF25258EDA28289BD65B5B 107 | E8FF5959E4FFC6C6E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 108 | FFFFFFFFFFFFFFFFFFFFD3D3E8FF4444DCFF4949E1FF25258FDA28289CD65858 109 | E3FF5555DEFFC5C5E7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 110 | FFFFFFFFFFFFFFFFFFFFD4D4E9FF4C4CE3FF5050E6FF262690DA29299DD65353 111 | DFFF5050D8FF8787D5FFA5A5E1FFA7A7E3FFA8A8E4FFA9A9E5FFAAAAE6FFAAAA 112 | E7FFAAAAE7FFA9A9E7FF9393DDFF5454E7FF5656EBFF262691DA29299DD65050 113 | DBFF4949D2FF4E4ED7FF5353DCFF5656E0FF5A5AE5FF5D5DE8FF5F5FEBFF6161 114 | EDFF6161EEFF6161EEFF5E5EEEFF5A5AECFF5B5BEEFF272792DA1A1A6A934444 115 | D1FF4A4AD3FF4848D0FF4D4DD5FF5252DAFF5555DFFF5959E3FF5C5CE7FF5F5F 116 | EAFF6060ECFF6161EEFF6161EEFF6161F0FF4949D3FF17176096000000021C1C 117 | 719D4444D1FF4848D1FF4747CFFF4B4BD4FF5050D9FF5454DEFF5858E2FF5B5B 118 | E6FF5E5EE9FF6060ECFF6262F0FF4B4BD5FF1919689F00000002000000000000 119 | 00021C1C719D4444D0FF4747D0FF4545CDFF4A4AD2FF4F4FD7FF5353DCFF5757 120 | E1FF5A5AE5FF5F5FEBFF4B4BD5FF1A1A6A9F0000000200000000000000000000 121 | 0000000000021C1C719D4343D0FF4B4BD5FF4D4DD8FF5151DCFF5555E0FF5858 122 | E3FF5B5BE8FF4A4AD4FF1A1A6C9F000000020000000000000000000000000000 123 | 000000000000000000021B1B6D972D2DA8E22D2DA7E22D2DA7E22D2DA6E22D2D 124 | A5E22D2DA5E21A1A699800000002000000000000000000000000} 125 | Mask.Data = { 126 | 7E000000424D7E000000000000003E0000002800000010000000100000000100 127 | 010000000000400000000000000000000000020000000000000000000000FFFF 128 | FF00F00F0000E0070000C0030000800100000000000000000000000000000000 129 | 0000000000000000000000000000000000000000000080010000C0030000E007 130 | 0000} 131 | end 132 | item 133 | Image.Data = { 134 | 36040000424D3604000000000000360000002800000010000000100000000100 135 | 2000000000000004000000000000000000000000000000000000000000000000 136 | 00000000010417175F930808233B000000000000000000000000000000000000 137 | 00000000000006061A3115155A94000001050000000000000000000000000000 138 | 01041B1B70A94C4CD0FF3232ABF20808233B0000000000000000000000000000 139 | 000006061A312B2B9CEC4141C5FF191969AD0000010500000000000001041C1C 140 | 72A94D4DD1FF6868E2FF6868E9FF3333ACF20808233B00000000000000000606 141 | 1B322B2B9FED4D4DD8FF4646D2FF4343C9FF191969AD000001051717618E4848 142 | CDFF5F5FD9FF6767DDFF6F6FE7FF6B6BEDFF3333ACF20808233B06061C322D2D 143 | A2ED5151DCFF4343CEFF4141CCFF4646D2FF4141C6FF15155A9407071E312F2F 144 | AAEC5D5DDEFF6767DEFF6F6FE7FF7474EEFF6C6CEFFF3333ACF22F2FA4ED5959 145 | E2FF4C4CD5FF4242CDFF4141CDFF4C4CD8FF2B2B9DED06061D33000000000707 146 | 1E313030ABEC6363E4FF6F6FE7FF7575EEFF7676F1FF6B6BEFFF6262E9FF5959 147 | DEFF4B4BD4FF4343CEFF4C4CD8FF2B2B9FED07071D3300000000000000000000 148 | 000007071E313030ABEC6767E9FF7474EEFF7676F0FF7171EEFF6666E7FF5959 149 | DEFF4C4CD5FF4D4DD9FF2C2CA1ED07071E330000000000000000000000000000 150 | 00000000000007071F313131ACEC6C6CEEFF7676F0FF7171EEFF6666E7FF5959 151 | DEFF5353DEFF2D2DA3ED07071E33000000000000000000000000000000000000 152 | 00000000000007071E313131ADEC6C6CEEFF7676F0FF7171EEFF6666E7FF5959 153 | DEFF5353DEFF2F2FAAF20808233B000000000000000000000000000000000000 154 | 000007071E313131AFEC6767EAFF7474EEFF7676F0FF7171EEFF6666E7FF5959 155 | DEFF4C4CD5FF4D4DDAFF2F2FAAF20808233B0000000000000000000000000707 156 | 1F313131B0EC6363E5FF6F6FE7FF7575EEFF7676F1FF6A6AEEFF6262E9FF5959 157 | DEFF4B4BD4FF4343CEFF4C4CD9FF2F2FAAF20808233B0000000007071F313131 158 | B1EC5D5DDFFF6767DEFF6F6FE7FF7474EEFF6B6BEFFF3131AEED3030ACEC5959 159 | E3FF4C4CD5FF4242CDFF4141CCFF4C4CD9FF2F2FAAF20808233B191968904A4A 160 | D2FF5F5FD9FF6767DDFF6F6FE7FF6A6AEDFF3232B0ED0808213307071F312F2F 161 | ABEC5252DEFF4343CEFF4141CCFF4747D3FF4242CAFF16165B8D000001041F1F 162 | 7CAA5050D7FF6868E2FF6767E9FF3333B2ED0808213300000000000000000707 163 | 1E312F2FAAEC4D4DDAFF4747D3FF4444CEFF1A1A6BA200000002000000000000 164 | 01041F1F7CAA4E4ED7FF3333B3ED080822330000000000000000000000000000 165 | 000007071E312F2FAAEC4242CCFF1B1B6DA20000000200000000000000000000 166 | 0000000001041A1A6A9208082233000000000000000000000000000000000000 167 | 00000000000007071E3117175D89000000020000000000000000} 168 | Mask.Data = { 169 | 7E000000424D7E000000000000003E0000002800000010000000100000000100 170 | 010000000000400000000000000000000000020000000000000000000000FFFF 171 | FF00C7E3000083C1000001800000000000000000000080010000C0030000E007 172 | 0000E0070000C00300008001000000000000000000000180000083C10000C7E3 173 | 0000} 174 | end> 175 | end 176 | end 177 | -------------------------------------------------------------------------------- /Resources/Profile.ini: -------------------------------------------------------------------------------- 1 | ; *======================================================== 2 | ; * * 3 | ; * DxAutoInstaller Profile * 4 | ; * Based on DevExpress VCL Products 24.1.3 * 5 | ; * * 6 | ; * https://github.com/Delphier/DxAutoInstaller * 7 | ; * Copyright(c) 2024 by faceker@gmail.com * 8 | ; *======================================================== 9 | 10 | [ExpressCore Library] 11 | RequiredPackages = dxCore, dcldxCore 12 | IsBase = 1 13 | 14 | [ExpressCommon Library] 15 | RequiredPackages = dxComn 16 | IsBase = 1 17 | 18 | [ExpressGDI+ Library] 19 | RequiredPackages = dxGDIPlus 20 | IsBase = 1 21 | 22 | [XP Theme Manager] 23 | RequiredPackages = dxTheme 24 | IsBase = 1 25 | 26 | [ExpressLibrary] 27 | RequiredPackages = cxLibrary, dxHttpIndyRequest, dclcxLibrary, dcldxHttpIndyRequest, dxCloudServiceLibrary, dcldxCloudServiceLibrary, cxADOAdapters, cxBDEAdapters, cxIBXAdapters, cxFireDACAdapters, dclcxEditorFieldLink, dxServerMode, dxADOServerMode, dxDBXServerMode, dxFireDACServerMode, dcldxServerMode, dcldxADOServerMode, dcldxDBXServerMode, dcldxFireDACServerMode 28 | OptionalPackages = dcldxIconLibrary 29 | IsBase = 1 30 | 31 | [ExpressDataController] 32 | RequiredPackages = cxData, cxADOAdapters, cxBDEAdapters, cxIBXAdapters, cxFireDACAdapters, dxServerMode, dxADOServerMode, dxDBXServerMode, dxFireDACServerMode, dcldxServerMode, dcldxADOServerMode, dcldxDBXServerMode, dcldxFireDACServerMode 33 | IsBase = 1 34 | 35 | [ExpressMemData] 36 | RequiredPackages = dxmds, dcldxmds 37 | IsBase = 1 38 | 39 | [ExpressOfficeCore Library] 40 | RequiredPackages = dxOfficeCore, dxAuthorizationAgents, dcldxAuthorizationAgents 41 | IsBase = 1 42 | 43 | [ExpressEditors Library] 44 | RequiredPackages = cxEditors, dclcxEditors, dclcxEditorFieldLink 45 | IsBase = 1 46 | 47 | [ExpressPageControl] 48 | RequiredPackages = cxPageControl, dclcxPageControl 49 | OptionalPackages = cxPageControldxBarPopupMenu, dclcxPageControldxBarPopupMenu 50 | IsBase = 1 51 | 52 | [ExpressLayout Control] 53 | RequiredPackages = dxLayoutControl, dcldxLayoutControl 54 | IsBase = 1 55 | 56 | [ExpressDocking Library] 57 | RequiredPackages = dxDocking, dcldxDocking 58 | IsBase = 1 59 | 60 | [ExpressRichEdit Control] 61 | RequiredPackages = dxRichEditCore, dxRichEditDocumentModel, dxRichEditControlCore, dxRichEditControl, dxRichEditControlOpenXMLFormat, dcldxRichEditControl, dxRichEditControlHtmlFormat, dxRichEditInplace, dxRichEditControlDocFormat 62 | 63 | [ExpressSpreadSheet Core] 64 | RequiredPackages = dxSpreadSheetCore, dxSpreadSheetCoreDialogs 65 | OptionalPackages = dxSpreadSheetCoreConditionalFormattingDialogs, dcldxSpreadSheetCoreConditionalFormattingDialogs 66 | 67 | [ExpressSpreadSheet] 68 | RequiredPackages = dxSpreadSheet, dcldxSpreadSheet, dxSpreadSheetReportDesigner, dcldxSpreadSheetReportDesigner, dxSpreadSheetInplaceRichEdit 69 | OptionalPackages = dxSpreadSheetConditionalFormattingDialogs, dcldxSpreadSheetConditionalFormattingDialogs 70 | OutdatedPackages = cxSpreadSheet, dclcxSpreadSheet 71 | 72 | [ExpressExport Library] 73 | RequiredPackages = cxExport 74 | IsBase = 1 75 | 76 | [ExpressNavBar] 77 | RequiredPackages = dxNavBar, dxNavBarAdvancedCustomizeForm, dcldxNavBar 78 | 79 | [ExpressWizard Control] 80 | RequiredPackages = dxWizardControl, dcldxWizardControl 81 | 82 | [ExpressQuantumGrid] 83 | RequiredPackages = cxGrid, dclcxGrid, dclcxGridWizard 84 | OptionalPackages = cxGridEMF, dclcxGridEMF, dclcxGridWizardEMFExtension 85 | 86 | [ExpressPivotGrid] 87 | RequiredPackages = cxPivotGrid, cxPivotGridChart, cxPivotGridOLAP, dclcxPivotGrid, dclcxPivotGridChart, dclcxPivotGridOLAP 88 | 89 | [ExpressQuantumTreeList] 90 | RequiredPackages = cxTreeList, dclcxTreeList 91 | OptionalPackages = cxTreeListdxBarPopupMenu, dclcxTreeListdxBarPopupMenu 92 | 93 | [ExpressBars] 94 | RequiredPackages = dxBar, cxBarEditItem, dxRibbon, dxRibbonCustomizationForm, dxTabbedMDI, dxBarExtItems, dxBarExtDBItems, dxBarDBNav, dcldxBar, dclcxBarEditItem, dcldxRibbon, dcldxRibbonCustomizationForm, dcldxTabbedMDI, dcldxBarExtItems, dcldxBarExtDBItems, dcldxBarDBNav 95 | 96 | [ExpressScheduler] 97 | RequiredPackages = cxScheduler, cxSchedulerGrid, cxSchedulerTreeBrowser, cxSchedulerRibbonStyleEventEditor, cxSchedulerWebServiceStorage, dclcxScheduler, dclcxSchedulerGrid, dclcxSchedulerTreeBrowser, dclcxSchedulerRibbonStyleEventEditor, dclcxSchedulerWebServiceStorage 98 | 99 | [ExpressVerticalGrid] 100 | RequiredPackages = cxVerticalGrid, dclcxVerticalGrid 101 | 102 | [ExpressDBTree Suite] 103 | RequiredPackages = dxdbtr, dxtrmd, dcldxdbtr, dcldxtrmd 104 | 105 | [ExpressSkins Library] 106 | RequiredPackages = dxSkinsCore, dcldxSkinsCore, dcldxSkinsDesignHelper, dcldxSkinscxEditorsHelper 107 | OptionalPackages = dxSkinscxPCPainter, dxSkinscxSchedulerPainter, dxSkinsdxBarPainter, dxSkinsdxBarSkinnedCustomizationForm, dxSkinsdxDLPainter, dxSkinsdxNavBarPainter, dxSkinsdxRibbonPainter, dcldxSkinscxPCPainter, dcldxSkinscxSchedulerPainter, dcldxSkinsdxBarsPainters, dcldxSkinsdxNavBarPainter, dcldxSkinsdxRibbonPainters, dcldxSkinsFluentDesignFormWizard, dxSkinBlack, dxSkinBlueprint, dxSkinBlue, dxSkinCaramel, dxSkinCoffee, dxSkinDarkRoom, dxSkinDarkSide, dxSkinDevExpressDarkStyle, dxSkinDevExpressStyle, dxSkinFoggy, dxSkinGlassOceans, dxSkinHighContrast, dxSkiniMaginary, dxSkinLilian, dxSkinLiquidSky, dxSkinLondonLiquidSky, dxSkinMcSkin, dxSkinMetropolisDark, dxSkinMetropolis, dxSkinMoneyTwins, dxSkinOffice2007Black, dxSkinOffice2007Blue, dxSkinOffice2007Green, dxSkinOffice2007Pink, dxSkinOffice2007Silver, dxSkinOffice2010Black, dxSkinOffice2010Blue, dxSkinOffice2010Silver, dxSkinOffice2013DarkGray, dxSkinOffice2013LightGray, dxSkinOffice2013White, dxSkinPumpkin, dxSkinSevenClassic, dxSkinSeven, dxSkinSharpPlus, dxSkinSharp, dxSkinSilver, dxSkinSpringTime, dxSkinStardust, dxSkinSummer2008, dxSkinTheAsphaltWorld, dxSkinValentine, dxSkinVS2010, dxSkinWhiteprint, dxSkinXmas2008Blue, dxSkinOffice2016Colorful, dxSkinOffice2016Dark, dxSkinVisualStudio2013Blue, dxSkinVisualStudio2013Dark, dxSkinVisualStudio2013Light, dxSkinTheBezier, dxSkinOffice2019Colorful, dxSkinOffice2019Black, dxSkinOffice2019DarkGray, dxSkinOffice2019White, dxSkinBasic, dxSkinWXI 108 | 109 | [ExpressPrinting System] 110 | RequiredPackages = dxPSCore, dxPSLnks, dxPScxCommon, dxPScxExtCommon, dxPScxPCProd, dxPSTeeChart, dxPSDBTeeChart, dxPSPrVwAdv, dxPSPrVwRibbon, dcldxPSCore, dcldxPSLnks, dcldxPScxCommon, dcldxPScxExtCommon, dcldxPSTeeChart, dcldxPSDBTeeChart, dcldxPSPrVwAdv, dcldxPSPrVwRibbon 111 | OptionalPackages = dxPSdxLCLnk, dxPSdxSpreadSheetLnk, dxPScxGridLnk, dxPScxPivotGridLnk, dxPScxSchedulerLnk, dxPScxTLLnk, dxPScxVGridLnk, dxPSdxOCLnk, dxPSdxDBOCLnk, dxPSdxDBTVLnk, dxPSdxFCLnk, dxPSdxGaugeControlLnk, dxPSRichEditControlLnk, dxPSdxPDFViewerLnk, dcldxPSdxLCLnk, dcldxPSdxSpreadSheetLnk, dcldxPScxGridLnk, dcldxPScxPivotGridLnk, dcldxPScxSchedulerLnk, dcldxPScxTLLnk, dcldxPScxVGridLnk, dcldxPSdxOCLnk, dcldxPSdxDBOCLnk, dcldxPSdxDBTVLnk, dcldxPSdxFCLnk, dcldxPSdxGaugeControlLnk, dcldxPSRichEditControlLnk, dxPSdxMapControlLnk, dcldxPSdxMapControlLnk, dcldxPSdxPDFViewerLnk, dxPSdxChartControlLnk, dcldxPSdxChartControlLnk 112 | OutdatedPackages = dxPScxSSLnk, dcldxPScxSSLnk 113 | 114 | [ExpressSpellChecker] 115 | RequiredPackages = dxSpellChecker, dcldxSpellChecker 116 | 117 | [ExpressFlowChart] 118 | RequiredPackages = dxFlowChartLayouts, dxFlowChart, dcldxFlowChart, dxFlowChartAdvancedCustomizeForm, dcldxFlowChartAdvancedCustomizeForm, dxFlowChartDesigner, dcldxFlowChartDesigner 119 | 120 | [ExpressOrgChart] 121 | RequiredPackages = dxOrgC, dxDBOr, dxOrgChartAdvancedCustomizeForm, dcldxOrgChartAdvancedCustomizeForm, dcldxOrgC, dcldxDBOr 122 | 123 | [ExpressTile Control] 124 | RequiredPackages = dxTileControl, dcldxTileControl 125 | 126 | [ExpressGauge Control] 127 | RequiredPackages = dxGaugeControl, dcldxGaugeControl 128 | 129 | [ExpressMap Control] 130 | RequiredPackages = dxMapControl, dcldxMapControl 131 | 132 | [ExpressPDFViewer] 133 | RequiredPackages = dxPDFViewer, dcldxPDFViewer 134 | 135 | [ExpressEntityMapping Framework] 136 | RequiredPackages = dxEMF, dxEMFData, dxADOEMF, dxFireDACEMF, dcldxEMF, dcldxADOEMF, dcldxFireDACEMF 137 | 138 | [ExpressGantt Control] 139 | RequiredPackages = dxGanttControl, dcldxGanttControl 140 | OptionalPackages = dxGanttControlSchedulerStorageImporter 141 | 142 | [ExpressCharts] 143 | RequiredPackages = dxChartControl, dcldxChartControl 144 | -------------------------------------------------------------------------------- /Sources/MainFrm.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller MainForm Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit MainFrm; 11 | 12 | interface 13 | 14 | uses 15 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 16 | Dialogs, ExtCtrls, dxGDIPlusClasses, StdCtrls, ComCtrls, ImgList, cxGraphics, 17 | ActnList, Buttons, DxQuantumTreeList, DxInstaller, DxProgress, DxIDE, DxUtils, 18 | System.Actions, System.ImageList, cxLookAndFeels, cxLookAndFeelPainters, 19 | Vcl.Menus, cxImageList, cxButtons; 20 | 21 | {$WARN UNIT_PLATFORM OFF} 22 | 23 | type 24 | TMainForm = class(TDxForm) 25 | PanelTop: TPanel; 26 | ImageIcon: TImage; 27 | LblAppName: TLabel; 28 | Label2: TLabel; 29 | LblVersion: TLabel; 30 | PageFuns: TPageControl; 31 | TabInstall: TTabSheet; 32 | TabUninstall: TTabSheet; 33 | TabTools: TTabSheet; 34 | TabAbout: TTabSheet; 35 | Label4: TLabel; 36 | Label5: TLabel; 37 | Label6: TLabel; 38 | LinkDownApp: TLinkLabel; 39 | LinkDownDoc: TLinkLabel; 40 | LinkEmail: TLinkLabel; 41 | Label7: TLabel; 42 | Label8: TLabel; 43 | EditInstallFileDir: TButtonedEdit; 44 | EditVersion: TEdit; 45 | PanTreeList: TPanel; 46 | ActionBase: TActionList; 47 | ImageSmall: TcxImageList; 48 | Install: TAction; 49 | Uninstall: TAction; 50 | ExitApp: TAction; 51 | Label9: TLabel; 52 | IDEListView: TListView; 53 | ChkHideBaseComponents: TCheckBox; 54 | GroupBox1: TGroupBox; 55 | LblCurrentProfile: TLabel; 56 | BtnProfile: TButton; 57 | ProfileExport: TAction; 58 | ProfileDelete: TAction; 59 | LblCustomProfile: TLinkLabel; 60 | Label1: TLabel; 61 | MemoReadme: TMemo; 62 | GroupBox2: TGroupBox; 63 | Button1: TButton; 64 | SearchNewPackages: TAction; 65 | Panel2: TPanel; 66 | Panel3: TPanel; 67 | Panel4: TPanel; 68 | Panel5: TPanel; 69 | BtnRun: TcxButton; 70 | BtnExit: TcxButton; 71 | PanelBottom: TPanel; 72 | procedure FormCreate(Sender: TObject); 73 | procedure URLLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType); 74 | procedure InstallExecute(Sender: TObject); 75 | procedure UninstallExecute(Sender: TObject); 76 | procedure ExitAppExecute(Sender: TObject); 77 | procedure PageFunsChange(Sender: TObject); 78 | procedure EditInstallFileDirRightButtonClick(Sender: TObject); 79 | procedure FormDestroy(Sender: TObject); 80 | procedure InitialIDEListView(); 81 | procedure InitialProfileInfo(); 82 | procedure RefreshTreeList(Sender: TObject); 83 | procedure ProfileExportExecute(Sender: TObject); 84 | procedure ProfileDeleteExecute(Sender: TObject); 85 | procedure SearchNewPackagesExecute(Sender: TObject); 86 | private 87 | { Private declarations } 88 | FInstaller: TDxInstaller; 89 | FTreeList: TDxQuantumTreeList; 90 | FProgressForm: TDxProgressForm; 91 | procedure RunInstaller(Action: TDxInstallerAction; const IDEArray: TDxIDEArray); 92 | public 93 | { Public declarations } 94 | end; 95 | 96 | var 97 | MainForm: TMainForm; 98 | 99 | implementation 100 | 101 | uses 102 | ShellAPI, FileCtrl, IOUtils; 103 | 104 | {$R *.dfm} 105 | 106 | procedure TMainForm.FormCreate(Sender: TObject); 107 | begin 108 | if Height > Screen.WorkAreaHeight then Height := Screen.WorkAreaHeight; 109 | Caption := Application.Title; 110 | LblAppName.Caption := Application.Title; 111 | LblVersion.Caption := GetVersionStr(); 112 | LoadFromResource(ImageIcon.Picture.LoadFromStream, 'IconVCL'); 113 | PageFuns.ActivePage := TabInstall; 114 | 115 | // Initial Install Page; 116 | FInstaller := TDxInstaller.Create; 117 | PanTreeList.BevelKind := bkNone; 118 | FTreeList := TDxQuantumTreeList.Create(FInstaller, PanTreeList); 119 | FProgressForm := TDxProgressForm.Create(nil); 120 | FProgressForm.Installer := FInstaller; 121 | FInstaller.OnUpdateProgress := FProgressForm.UpdateProgress; 122 | FInstaller.OnUpdateProgressState := FProgressForm.UpdateProgressState; 123 | 124 | // Initial Uninstall Page; 125 | InitialIDEListView(); 126 | 127 | // Initial Tools Page; 128 | InitialProfileInfo(); 129 | 130 | // Initial About Page; 131 | LinkDownApp.Caption := Format('%s', [LinkDownApp.Caption, LinkDownApp.Caption]); 132 | LinkDownDoc.Caption := Format('%s', [LinkDownDoc.Caption, LinkDownDoc.Caption]); 133 | LinkEmail.Caption := Format('%s', [LinkEmail.Caption, LinkEmail.Caption]); 134 | LoadFromResource(MemoReadme.Lines.LoadFromStream, 'Readme'); 135 | end; 136 | 137 | procedure TMainForm.FormDestroy(Sender: TObject); 138 | begin 139 | FProgressForm.Free; 140 | FTreeList.Free; 141 | FInstaller.Free; 142 | end; 143 | 144 | procedure TMainForm.InitialIDEListView; 145 | var 146 | I: Integer; 147 | begin 148 | IDEListView.Clear; 149 | for I := 0 to FInstaller.IDEs.Count - 1 do IDEListView.AddItem(FInstaller.IDEs[I].Name, nil); 150 | end; 151 | 152 | procedure TMainForm.InitialProfileInfo; 153 | var 154 | FileName: String; 155 | begin 156 | if FInstaller.Profile.IsCustomProfile 157 | then LblCurrentProfile.Caption := 'Current Profile: ' 158 | else LblCurrentProfile.Caption := 'Current Profile: '; 159 | 160 | FileName := FInstaller.Profile.GetCustomProfileFileName; 161 | LblCustomProfile.Caption := Format('Custom Profile: %s', [FileName, FileName]); 162 | LblCustomProfile.Visible := FileExists(FileName); 163 | if FileExists(FileName) 164 | then BtnProfile.Action := ProfileDelete 165 | else BtnProfile.Action := ProfileExport; 166 | end; 167 | 168 | procedure TMainForm.PageFunsChange(Sender: TObject); 169 | begin 170 | if PageFuns.ActivePage = TabInstall then BtnRun.Action := Install 171 | else if PageFuns.ActivePage = TabUninstall then BtnRun.Action := Uninstall 172 | else BtnRun.Visible := False; 173 | ChkHideBaseComponents.Visible := PageFuns.ActivePage = TabInstall; 174 | end; 175 | 176 | procedure TMainForm.ProfileDeleteExecute(Sender: TObject); 177 | begin 178 | DeleteFile(FInstaller.Profile.GetCustomProfileFileName); 179 | InitialProfileInfo; 180 | end; 181 | 182 | procedure TMainForm.ProfileExportExecute(Sender: TObject); 183 | begin 184 | FInstaller.Profile.ExportBuiltInProfile(FInstaller.Profile.GetCustomProfileFileName); 185 | InitialProfileInfo; 186 | end; 187 | 188 | procedure TMainForm.RefreshTreeList(Sender: TObject); 189 | begin 190 | FTreeList.DispData(TCheckBox(Sender).Checked); 191 | end; 192 | 193 | procedure TMainForm.RunInstaller(Action: TDxInstallerAction; const IDEArray: TDxIDEArray); 194 | begin 195 | if FInstaller.IDEs.AnyInstanceRunning then begin 196 | ShowInformation('Please close all running IDEs.'); 197 | Exit; 198 | end; 199 | Hide; 200 | try 201 | FProgressForm.Initial; 202 | Action(IDEArray); 203 | finally 204 | Show; 205 | end; 206 | end; 207 | 208 | procedure TMainForm.SearchNewPackagesExecute(Sender: TObject); 209 | var 210 | List: TStringList; 211 | begin 212 | Screen.Cursor := crHourGlass; 213 | List := TStringList.Create; 214 | try 215 | FInstaller.SearchNewPackages(List); 216 | if List.Count > 0 then ShowInformation(List.Text); 217 | finally 218 | List.Free; 219 | Screen.Cursor := crDefault; 220 | end; 221 | end; 222 | 223 | procedure TMainForm.InstallExecute(Sender: TObject); 224 | var 225 | IDEs: TDxIDEArray; 226 | begin 227 | IDEs := FTreeList.GetSelectedIDEs; 228 | if Length(IDEs) = 0 then Exit; 229 | RunInstaller(FInstaller.Install, IDEs); 230 | end; 231 | 232 | procedure TMainForm.UninstallExecute(Sender: TObject); 233 | var 234 | IDEs: TDxIDEArray; 235 | ListItem: TListItem; 236 | begin 237 | for ListItem in IDEListView.Items do begin 238 | if ListItem.Checked then begin 239 | SetLength(IDEs, Length(IDEs) + 1); 240 | IDEs[Length(IDEs) - 1] := FInstaller.IDEs[ListItem.Index]; 241 | end; 242 | end; 243 | 244 | if Length(IDEs) = 0 then Exit; 245 | RunInstaller(FInstaller.Uninstall, IDEs); 246 | end; 247 | 248 | procedure TMainForm.EditInstallFileDirRightButtonClick(Sender: TObject); 249 | var 250 | Arr: TArray; 251 | Dir: String; 252 | I: Integer; 253 | begin 254 | if Win32MajorVersion < 6 then begin 255 | if not SelectDirectory('Select Installation File Directory:', '', Dir, [sdNewUI], Self) then Exit; 256 | end else begin 257 | if not SelectDirectory('', Arr) then Exit; 258 | Dir := Arr[0]; 259 | end; 260 | if not SysUtils.DirectoryExists(Dir) then Exit; 261 | EditInstallFileDir.Text := Dir; 262 | I := FInstaller.Profile.GetDxBuildNumber(Dir); 263 | EditVersion.Text := FInstaller.Profile.GetDxBuildNumberAsVersion(I); 264 | Screen.Cursor := crHourGlass; 265 | try 266 | FInstaller.InstallFileDir := Dir; 267 | finally 268 | Screen.Cursor := crDefault; 269 | end; 270 | RefreshTreeList(ChkHideBaseComponents); 271 | end; 272 | 273 | procedure TMainForm.ExitAppExecute(Sender: TObject); 274 | begin 275 | Close; 276 | end; 277 | 278 | procedure TMainForm.URLLinkClick(Sender: TObject; const Link: string; LinkType: TSysLinkType); 279 | begin 280 | ShellExecute(Application.Handle, 'Open', PChar(Link), nil, nil, SW_SHOWNORMAL); 281 | end; 282 | 283 | end. 284 | -------------------------------------------------------------------------------- /Sources/DxQuantumTreeList.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller QuantumTreeList Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxQuantumTreeList; 11 | 12 | interface 13 | 14 | uses 15 | SysUtils, Classes, DxInstaller, DxIDE, Controls, cxTL, cxEdit, cxGraphics, 16 | cxExtEditRepositoryItems, cxEditRepositoryItems, cxStyles, cxClasses, 17 | dxScreenTip, dxCustomHint, cxHint, Windows; 18 | 19 | type 20 | TDxQuantumTreeList = class; 21 | TDxResourceModule = class(TDataModule) 22 | EditRepository: TcxEditRepository; 23 | CheckBoxItem: TcxEditRepositoryCheckBoxItem; 24 | MissingItem: TcxEditRepositoryCheckBoxItem; 25 | NotFoundItem: TcxEditRepositoryCheckBoxItem; 26 | NotSupportedItem: TcxEditRepositoryCheckBoxItem; 27 | HintStyleController: TcxHintStyleController; 28 | procedure HintStyleControllerShowHintEx(Sender: TObject; var Caption, 29 | HintStr: string; var CanShow: Boolean; var HintInfo: THintInfo); 30 | procedure DataModuleCreate(Sender: TObject); 31 | private 32 | { Private declarations } 33 | FTreeList: TDxQuantumTreeList; 34 | public 35 | { Public declarations } 36 | end; 37 | 38 | TDxQuantumTreeList = class 39 | private 40 | FResources: TDxResourceModule; 41 | FInstaller: TDxInstaller; 42 | FTreeList: TcxTreeList; 43 | FComponentsNode: TcxTreeListNode; 44 | FOptionsNode: TcxTreeListNode; 45 | procedure InitialHeader(); 46 | procedure RefreshIDEColumn(Column: TcxTreeListColumn; ParentNode: TcxTreeListNode); 47 | property Resources: TDxResourceModule read FResources; 48 | property Installer: TDxInstaller read FInstaller; 49 | property TreeList: TcxTreeList read FTreeList; 50 | 51 | procedure TreeListColumnGetEditProperties(Sender: TcxTreeListColumn; 52 | ANode: TcxTreeListNode; var EditProperties: TcxCustomEditProperties); 53 | procedure TreeListCustomDrawDataCell(Sender: TcxCustomTreeList; 54 | ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo; var ADone: Boolean); 55 | procedure TreeListEditValueChanged(Sender: TcxCustomTreeList; AColumn: TcxTreeListColumn); 56 | procedure TreeListEditing(Sender: TcxCustomTreeList; AColumn: TcxTreeListColumn; var Allow: Boolean); 57 | public 58 | constructor Create(Installer: TDxInstaller; Parent: TWinControl); 59 | destructor Destroy; override; 60 | procedure DispData(const IsHideBaseComponents: Boolean); 61 | function GetSelectedIDEs(): TDxIDEArray; 62 | end; 63 | 64 | implementation 65 | 66 | {$R *.dfm} 67 | 68 | uses 69 | DxProfile, DxComponent, Variants, Graphics, Forms; 70 | 71 | { TDxResourceModule } 72 | 73 | procedure TDxResourceModule.DataModuleCreate(Sender: TObject); 74 | begin 75 | FTreeList := nil; 76 | end; 77 | 78 | procedure TDxResourceModule.HintStyleControllerShowHintEx(Sender: TObject; 79 | var Caption, HintStr: string; var CanShow: Boolean; var HintInfo: Controls.THintInfo); 80 | var 81 | Node: TcxTreeListNode; 82 | Column: TcxTreeListColumn; 83 | Comp: TDxComponent; 84 | HintStyle: TcxHintStyle; 85 | Hint: String; 86 | begin 87 | CanShow := False; 88 | if FTreeList = nil then Exit; 89 | if FTreeList.TreeList <> HintInfo.HintControl then Exit; 90 | Node := FTreeList.TreeList.HitTest.HitNode; 91 | Column := FTreeList.TreeList.HitTest.HitColumn; 92 | if Node = nil then Exit; 93 | if Column = nil then Exit; 94 | if Column.Tag < 0 then Exit; 95 | if Column.Values[Node] <> Null then Exit; 96 | 97 | HintStyle := TcxHintStyle(HintStyleController.HintStyle); 98 | HintStyle.Font.Assign(Application.MainForm.Font); 99 | HintStyle.CaptionFont.Assign(HintStyle.Font); 100 | HintStyle.CaptionFont.Style := [fsBold]; 101 | 102 | Hint := EmptyStr; 103 | if Node.Parent = FTreeList.FComponentsNode then begin 104 | Comp := FTreeList.Installer.Components[FTreeList.Installer.IDEs[Column.Tag]][Node.Index]; 105 | case Comp.State of 106 | dxcsNotFound: Hint := 'Not Found|Component installation file is not found.'; 107 | dxcsNotSupported: Hint := 'Not Supported|Component does not support the current IDE.'; 108 | dxcsMissing: Hint := 'Missing Components|Dependent components are missing.'; 109 | end; 110 | end else if Node.Parent = FTreeList.FOptionsNode then 111 | Hint := 'Not Supported|Current IDE does not support this option.'; 112 | 113 | if Hint <> EmptyStr then begin 114 | Caption := GetShortHint(Hint); 115 | HintStr := GetLongHint(Hint); 116 | CanShow := True; 117 | end; 118 | end; 119 | 120 | 121 | { TDxQuantumTreeList } 122 | 123 | constructor TDxQuantumTreeList.Create(Installer: TDxInstaller; Parent: TWinControl); 124 | var 125 | Style: TcxStyle; 126 | begin 127 | inherited Create; 128 | FResources := TDxResourceModule.Create(nil); 129 | FResources.FTreeList := Self; 130 | FInstaller := Installer; 131 | 132 | FTreeList := TcxTreeList.Create(nil); 133 | FTreeList.Parent := Parent; 134 | FTreeList.Align := alClient; 135 | FTreeList.ShowHint := True; 136 | FTreeList.OptionsBehavior.Sorting := False; 137 | FTreeList.OptionsBehavior.ExpandOnDblClick := False; 138 | FTreeList.OptionsBehavior.HotTrack := True; 139 | FTreeList.OptionsCustomizing.ColumnVertSizing := False; 140 | FTreeList.OptionsCustomizing.ColumnMoving := False; 141 | FTreeList.OptionsData.Deleting := False; 142 | FTreeList.OptionsView.ColumnAutoWidth := True; 143 | FTreeList.OptionsSelection.HideSelection := True; 144 | 145 | Style := TcxStyle.Create(FResources); 146 | Style.Color := clWindow; 147 | Style.TextColor := FTreeList.Font.Color; 148 | FTreeList.Styles.Selection := Style; 149 | 150 | Style := TcxStyle.Create(FResources); 151 | Style.TextColor := clBlue; 152 | FTreeList.Styles.HotTrack := Style; 153 | 154 | FTreeList.OnCustomDrawDataCell := TreeListCustomDrawDataCell; 155 | FTreeList.OnEditValueChanged := TreeListEditValueChanged; 156 | FTreeList.OnEditing := TreeListEditing; 157 | end; 158 | 159 | destructor TDxQuantumTreeList.Destroy; 160 | begin 161 | FTreeList.Free; 162 | FResources.Free; 163 | inherited; 164 | end; 165 | 166 | procedure TDxQuantumTreeList.InitialHeader; 167 | var 168 | Column: TcxTreeListColumn; 169 | I: Integer; 170 | begin 171 | Column := TreeList.CreateColumn(); 172 | Column.Caption.Text := 'Name'; 173 | Column.Tag := -1; 174 | Column.Width := 200; 175 | Column.Options.Editing := False; 176 | 177 | for I := 0 to Installer.IDEs.Count - 1 do begin 178 | Column := TreeList.CreateColumn(); 179 | Column.Caption.AlignHorz := taCenter; 180 | Column.Tag := I; 181 | Column.Width := 150; 182 | Column.OnGetEditProperties := TreeListColumnGetEditProperties; 183 | end; 184 | end; 185 | 186 | procedure TDxQuantumTreeList.DispData(const IsHideBaseComponents: Boolean); 187 | var 188 | I: Integer; 189 | Option: TDxInstallOption; 190 | begin 191 | if Installer.InstallFileDir = EmptyStr then Exit; 192 | if TreeList.ColumnCount = 0 then InitialHeader; 193 | TreeList.Clear; 194 | FComponentsNode := TreeList.Add; 195 | FOptionsNode := TreeList.Add; 196 | 197 | // Display Components; 198 | for I := 0 to Installer.Profile.Components.Count - 1 do 199 | with FComponentsNode.AddChild do begin 200 | Texts[0] := Installer.Profile.Components[I].ComponentName; 201 | if IsHideBaseComponents and Installer.Profile.Components[I].IsBase then Visible := False; 202 | end; 203 | 204 | FComponentsNode.Texts[0] := Format('Components (%d)', [FComponentsNode.ChildVisibleCount]); 205 | FComponentsNode.Expanded := True; 206 | 207 | // Display Options; 208 | for Option := Low(TDxInstallOption) to High(TDxInstallOption) do 209 | with FOptionsNode.AddChild do Texts[0] := DxInstallOptionNames[Option]; 210 | 211 | FOptionsNode.Texts[0] := Format('Options (%d)', [FOptionsNode.ChildVisibleCount]);; 212 | FOptionsNode.Expanded := True; 213 | 214 | for I := 0 to TreeList.ColumnCount - 1 do begin 215 | RefreshIDEColumn(TreeList.Columns[I], FComponentsNode); 216 | RefreshIDEColumn(TreeList.Columns[I], FOptionsNode); 217 | end; 218 | end; 219 | 220 | function TDxQuantumTreeList.GetSelectedIDEs(): TDxIDEArray; 221 | var 222 | I, N, Tag: Integer; 223 | Node: TcxTreeListNode; 224 | begin 225 | for I := 0 to TreeList.ColumnCount - 1 do begin 226 | Tag := TreeList.Columns[I].Tag; 227 | if Tag < 0 then Continue; 228 | for N := 0 to FComponentsNode.Count - 1 do begin 229 | Node := FComponentsNode[N]; 230 | if Node.Visible and (TreeList.Columns[I].Values[Node] = True) then begin 231 | SetLength(Result, Length(Result) + 1); 232 | Result[Length(Result) - 1] := Installer.IDEs[Tag]; 233 | Break; 234 | end; 235 | end; 236 | end; 237 | end; 238 | 239 | procedure TDxQuantumTreeList.RefreshIDEColumn(Column: TcxTreeListColumn; ParentNode: TcxTreeListNode); 240 | var 241 | Node: TcxTreeListNode; 242 | Comp: TDxComponent; 243 | I, TotalCount, SelectedCount: Integer; 244 | begin 245 | if Column.Tag < 0 then Exit; 246 | 247 | TotalCount := 0; 248 | SelectedCount := 0; 249 | for I := 0 to ParentNode.Count - 1 do begin 250 | Node := ParentNode.Items[I]; 251 | if ParentNode = FComponentsNode then begin 252 | Comp := Installer.Components[Installer.IDEs[Column.Tag]].Items[Node.Index]; 253 | case Comp.State of 254 | dxcsInstall: Column.Values[Node] := True; 255 | dxcsNotInstall: Column.Values[Node] := False; 256 | else Column.Values[Node] := Null; 257 | end; 258 | end else if ParentNode = FOptionsNode then begin 259 | if ( (TDxInstallOption(Node.Index) = dxioCompileWin64Library) and not IsSupportWin64(Installer.IDEs[Column.Tag]) ) or 260 | ( (TDxInstallOption(Node.Index) = dxioInstallToCppBuilder) and not IsSupportCppBuilder(Installer.IDEs[Column.Tag]) ) then 261 | Column.Values[Node] := Null 262 | else if TDxInstallOption(Node.Index) in Installer.Options[Installer.IDEs[Column.Tag]] then 263 | Column.Values[Node] := True 264 | else 265 | Column.Values[Node] := False; 266 | end; 267 | if Node.Visible then begin 268 | if Column.Values[Node] <> Null then Inc(TotalCount); 269 | if Column.Values[Node] = True then Inc(SelectedCount); 270 | end; 271 | end; 272 | 273 | if ParentNode = FComponentsNode then 274 | Column.Caption.Text := Format('%s (%d)', [Installer.IDEs[Column.Tag].Name, SelectedCount]); 275 | 276 | if SelectedCount = 0 then Column.Values[ParentNode] := False 277 | else if TotalCount = SelectedCount then Column.Values[ParentNode] := True 278 | else Column.Values[ParentNode] := Null; 279 | end; 280 | 281 | procedure TDxQuantumTreeList.TreeListColumnGetEditProperties(Sender: TcxTreeListColumn; 282 | ANode: TcxTreeListNode; var EditProperties: TcxCustomEditProperties); 283 | begin 284 | if ANode.Parent = FComponentsNode then 285 | case Installer.Components[Installer.IDEs[Sender.Tag]][ANode.Index].State of 286 | dxcsNotFound: EditProperties := Resources.NotFoundItem.Properties; 287 | dxcsNotSupported: EditProperties := Resources.NotSupportedItem.Properties; 288 | dxcsMissing: EditProperties := Resources.MissingItem.Properties; 289 | else EditProperties := Resources.CheckBoxItem.Properties; 290 | end 291 | else if (ANode.Parent = FOptionsNode) and (Sender.Values[ANode] = Null) then 292 | EditProperties := Resources.NotSupportedItem.Properties 293 | else 294 | EditProperties := Resources.CheckBoxItem.Properties; 295 | end; 296 | 297 | procedure TDxQuantumTreeList.TreeListCustomDrawDataCell(Sender: TcxCustomTreeList; 298 | ACanvas: TcxCanvas; AViewInfo: TcxTreeListEditCellViewInfo; var ADone: Boolean); 299 | begin 300 | if (AViewInfo.Node = FComponentsNode) or (AViewInfo.Node = FOptionsNode) then 301 | ACanvas.Font.Style := [fsBold]; 302 | end; 303 | 304 | procedure TDxQuantumTreeList.TreeListEditing(Sender: TcxCustomTreeList; 305 | AColumn: TcxTreeListColumn; var Allow: Boolean); 306 | begin 307 | Allow := (Sender.FocusedNode.Count <> 0) or (AColumn.Values[Sender.FocusedNode] <> Null); 308 | end; 309 | 310 | procedure TDxQuantumTreeList.TreeListEditValueChanged(Sender: TcxCustomTreeList; AColumn: TcxTreeListColumn); 311 | var 312 | Node: TcxTreeListNode; 313 | Checked: Boolean; 314 | IDE: TDxIDE; 315 | Options: TDxInstallOptions; 316 | I: Integer; 317 | procedure SetComponentNodeState(Node: TcxTreeListNode); 318 | begin 319 | if Checked then Installer.Components[IDE][Node.Index].State := dxcsInstall 320 | else Installer.Components[IDE][Node.Index].State := dxcsNotInstall; 321 | end; 322 | procedure SetOptionNodeState(Node: TcxTreeListNode); 323 | begin 324 | if AColumn.Values[Node] = Null then Exit; 325 | Options := Installer.Options[IDE]; 326 | if Checked then Include(Options, TDxInstallOption(Node.Index)) 327 | else exclude(Options, TDxInstallOption(Node.Index)); 328 | Installer.Options[IDE] := Options; 329 | end; 330 | begin 331 | Node := Sender.FocusedNode; 332 | Checked := AColumn.Values[Node] = True; 333 | IDE := Installer.IDEs[AColumn.Tag]; 334 | if Node.Parent = FComponentsNode then SetComponentNodeState(Node) 335 | else if Node.Parent = FOptionsNode then SetOptionNodeState(Node) 336 | else if Node = FComponentsNode then for I := 0 to Node.Count - 1 do SetComponentNodeState(Node[I]) 337 | else if Node = FOptionsNode then for I := 0 to Node.Count - 1 do SetOptionNodeState(Node[I]); 338 | 339 | if (Node = FComponentsNode) or (Node.Parent = FComponentsNode) then RefreshIDEColumn(AColumn, FComponentsNode); 340 | if (Node = FOptionsNode) or (Node.Parent = FOptionsNode) then RefreshIDEColumn(AColumn, FOptionsNode); 341 | end; 342 | 343 | end. 344 | -------------------------------------------------------------------------------- /Sources/DxInstaller.pas: -------------------------------------------------------------------------------- 1 | {*******************************************************} 2 | { } 3 | { DxAutoInstaller Installer Classes } 4 | { } 5 | { http://www.delphier.com/DxAutoIntaller } 6 | { Copyright(c) 2014 by faceker@gmail.com } 7 | { } 8 | {*******************************************************} 9 | 10 | unit DxInstaller; 11 | 12 | interface 13 | 14 | uses 15 | Forms, Classes, SysUtils, DxIDE, DxComponent, DxProfile; 16 | 17 | type 18 | TDxInstallOption = (dxioAddBrowsingPath, dxioNativeLookAndFeel, dxioCompileWin64Library, dxioInstallToCppBuilder); 19 | TDxInstallOptions = set of TDxInstallOption; 20 | 21 | TDxThirdPartyComponent = (dxtpcIBX, dxtpcTeeChart, dxtpcFireDAC, dxtpcBDE); 22 | TDxThirdPartyComponents = set of TDxThirdPartyComponent; 23 | 24 | TDxInstallerState = (dxisNormal, dxisRunning, dxisStopped, dxisError); 25 | TDxInstallerAction = procedure(const IDEArray: TDxIDEArray) of object; 26 | 27 | TDxUpdateProgressEvent = procedure(IDE: TDxIDE; Component: TDxComponentProfile; const Task, Target: String) of object; 28 | TDxUpdateProgressStateEvent = procedure(const StateText: String) of object; 29 | 30 | TDxInstaller = class 31 | const 32 | DxEnvironmentVariableName = 'DXVCL'; 33 | private 34 | FIDEs: TDxIDEs; 35 | FProfile: TDxProfile; 36 | FInstallFileDir: String; 37 | FComponents: array of TDxComponentList; 38 | FOptions: array of TDxInstallOptions; 39 | FThirdPartyComponents: array of TDxThirdPartyComponents; 40 | FState: TDxInstallerState; 41 | FOnUpdateProgress: TDxUpdateProgressEvent; 42 | FOnUpdateProgressState: TDxUpdateProgressStateEvent; 43 | procedure SetInstallFileDir(const Value: String); 44 | function GetComponents(IDE: TDxIDE): TDxComponentList; 45 | function GetOptions(IDE: TDxIDE): TDxInstallOptions; 46 | procedure SetOptions(IDE: TDxIDE; const Value: TDxInstallOptions); 47 | function GetThirdPartyComponents(IDE: TDxIDE): TDxThirdPartyComponents; 48 | procedure SetThirdPartyComponents(IDE: TDxIDE; const Value: TDxThirdPartyComponents); 49 | procedure DetectionThirdPartyComponents(IDE: TDxIDE); 50 | procedure SetState(const Value: TDxInstallerState); 51 | procedure Install(IDE: TDxIDE); overload; 52 | procedure InstallPackage(IDE: TDxIDE; const IDEPlatform: TDxIDEPlatform; Component: TDxComponent; Package: TDxPackage); 53 | procedure Uninstall(IDE: TDxIDE); overload; 54 | procedure UninstallPackage(IDE: TDxIDE; const IDEPlatform: TDxIDEPlatform; Component: TDxComponentProfile; const PackageBaseName: String); 55 | procedure UpdateProgress(IDE: TDxIDE; Component: TDxComponentProfile; const Task, Target: String); 56 | procedure UpdateProgressState(const StateText: String); 57 | procedure CheckStoppedState(); 58 | public 59 | constructor Create(); 60 | destructor Destroy; override; 61 | property IDEs: TDxIDEs read FIDEs; 62 | property Profile: TDxProfile read FProfile; 63 | property InstallFileDir: String read FInstallFileDir write SetInstallFileDir; 64 | property Components[IDE: TDxIDE]: TDxComponentList read GetComponents; 65 | property Options[IDE: TDxIDE]: TDxInstallOptions read GetOptions write SetOptions; 66 | property ThirdPartyComponents[IDE: TDxIDE]: TDxThirdPartyComponents read GetThirdPartyComponents write SetThirdPartyComponents; 67 | property State: TDxInstallerState read FState; 68 | property OnUpdateProgress: TDxUpdateProgressEvent read FOnUpdateProgress write FOnUpdateProgress; 69 | property OnUpdateProgressState: TDxUpdateProgressStateEvent read FOnUpdateProgressState write FOnUpdateProgressState; 70 | procedure Install(const IDEArray: TDxIDEArray); overload; 71 | procedure Uninstall(const IDEArray: TDxIDEArray); overload; 72 | procedure Stop(); 73 | procedure SearchNewPackages(List: TStringList); 74 | class function GetInstallLibraryDir(const InstallFileDir: String; IDE: TDxIDE; const IDEPlatform: TDxIDEPlatform = Win32): String; 75 | class function GetInstallSourcesDir(const InstallFileDir: String): String; 76 | end; 77 | 78 | const 79 | DxInstallOptionNames: array[TDxInstallOption] of String = ('Add Browsing Path', 'Use Native Look and Feel as Default', 'Compile Win64 Library', 'Install to C++Builder'); 80 | 81 | implementation 82 | 83 | uses 84 | DxComponentFactory, DxUtils; 85 | 86 | { TDxInstaller } 87 | 88 | constructor TDxInstaller.Create; 89 | var 90 | I: Integer; 91 | begin 92 | inherited Create; 93 | FIDEs := TDxIDEs.Create; 94 | for I := 0 to FIDEs.Count - 1 do FIDEs[I].OutputCallback := UpdateProgressState; 95 | FProfile := TDxProfile.Create; 96 | FInstallFileDir := EmptyStr; 97 | SetLength(FComponents, FIDEs.Count); 98 | SetLength(FOptions, FIDEs.Count); 99 | SetLength(FThirdPartyComponents, FIDEs.Count); 100 | for I := 0 to FIDEs.Count - 1 do DetectionThirdPartyComponents(FIDEs[I]); 101 | FState := dxisNormal; 102 | end; 103 | 104 | destructor TDxInstaller.Destroy; 105 | var 106 | I: Integer; 107 | begin 108 | for I := Low(FComponents) to High(FComponents) do FreeAndNil(FComponents[I]); 109 | FProfile.Free; 110 | FIDEs.Free; 111 | inherited; 112 | end; 113 | 114 | procedure TDxInstaller.DetectionThirdPartyComponents(IDE: TDxIDE); 115 | var 116 | I: Integer; 117 | FileName: String; 118 | Components: TDxThirdPartyComponents; 119 | begin 120 | Components := []; 121 | for I := 0 to IDE.IdePackages.Count - 1 do begin 122 | FileName := IDE.IdePackages.PackageFileNames[I]; 123 | if (not(dxtpcIBX in Components)) and (Pos('\dclib', FileName) > 0) then Include(Components, dxtpcIBX) 124 | else if (not(dxtpcTeeChart in Components)) and (Pos('\dcltee', FileName) > 0) then Include(Components, dxtpcTeeChart) 125 | else if (not(dxtpcFireDAC in Components)) and ((Pos('\dclFireDAC', FileName) > 0) or (Pos('\AnyDAC_', FileName) > 0)) then Include(Components, dxtpcFireDAC) 126 | else if (not(dxtpcBDE in Components)) and (Pos('\dclbde', FileName) > 0) then Include(Components, dxtpcBDE); 127 | end; 128 | ThirdPartyComponents[IDE] := Components; 129 | end; 130 | 131 | class function TDxInstaller.GetInstallLibraryDir(const InstallFileDir: String; IDE: TDxIDE; const IDEPlatform: TDxIDEPlatform): String; 132 | begin 133 | Result := IncludeTrailingPathDelimiter(InstallFileDir) + 'Library'; 134 | if IDE <> nil then begin 135 | Result := Result + '\' + TDxProfile.GetIDEVersionNumberStr(IDE); 136 | if IDEPlatform = Win64 then Result := Result + '\' + DxIDEPlatformNames[IDEPlatform]; 137 | end; 138 | end; 139 | 140 | class function TDxInstaller.GetInstallSourcesDir(const InstallFileDir: String): String; 141 | begin 142 | Result := GetInstallLibraryDir(InstallFileDir, nil) + '\Sources'; 143 | end; 144 | 145 | function TDxInstaller.GetComponents(IDE: TDxIDE): TDxComponentList; 146 | begin 147 | Result := FComponents[IDEs.IndexOf(IDE)]; 148 | end; 149 | 150 | function TDxInstaller.GetOptions(IDE: TDxIDE): TDxInstallOptions; 151 | begin 152 | Result := FOptions[IDEs.IndexOf(IDE)]; 153 | end; 154 | 155 | procedure TDxInstaller.SetOptions(IDE: TDxIDE; const Value: TDxInstallOptions); 156 | var 157 | Options: TDxInstallOptions; 158 | begin 159 | Options := Value; 160 | if (dxioCompileWin64Library in Options) and (not IsSupportWin64(IDE)) then Exclude(Options, dxioCompileWin64Library); 161 | if (dxioInstallToCppBuilder in Options) and (not IsSupportCppBuilder(IDE)) then Exclude(Options, dxioInstallToCppBuilder); 162 | FOptions[IDEs.IndexOf(IDE)] := Options; 163 | end; 164 | 165 | 166 | function TDxInstaller.GetThirdPartyComponents(IDE: TDxIDE): TDxThirdPartyComponents; 167 | begin 168 | Result := FThirdPartyComponents[IDEs.IndexOf(IDE)]; 169 | end; 170 | 171 | procedure TDxInstaller.SetThirdPartyComponents(IDE: TDxIDE; const Value: TDxThirdPartyComponents); 172 | begin 173 | FThirdPartyComponents[IDEs.IndexOf(IDE)] := Value; 174 | end; 175 | 176 | procedure TDxInstaller.SearchNewPackages(List: TStringList); 177 | var 178 | Packages, DPKFileList: TStringList; 179 | Component: TDxComponentProfile; 180 | S, FileName: String; 181 | I: Integer; 182 | begin 183 | List.Clear; 184 | if InstallFileDir = EmptyStr then Exit; 185 | 186 | Packages := TStringList.Create; 187 | DPKFileList := TStringList.Create; 188 | try 189 | for Component in Profile.Components do begin 190 | Packages.AddStrings(Component.RequiredPackages); 191 | Packages.AddStrings(Component.OptionalPackages); 192 | Packages.AddStrings(Component.OutdatedPackages); 193 | end; 194 | BuildFileList(IncludeTrailingPathDelimiter(InstallFileDir) + '*.dpk', DPKFileList, faAnyFile, True, True); 195 | for S in DPKFileList do begin 196 | FileName := ChangeFileExt(ExtractFileName(S), ''); 197 | for I := Length(FileName) downto 1 do if CharInSet(FileName[I], ['0'..'9']) then Delete(FileName, I, 1) else Break; 198 | if SameText(FileName[Length(FileName)], 'D') then FileName := Copy(FileName, 1, Length(FileName) - 1) 199 | else if SameText(Copy(FileName, Length(FileName) - 1, 2), 'RS') then FileName := Copy(FileName, 1, Length(FileName) - 2); 200 | if Packages.IndexOf(FileName) < 0 then List.Add(S); 201 | end; 202 | finally 203 | Packages.Free; 204 | DPKFileList.Free; 205 | end; 206 | end; 207 | 208 | procedure TDxInstaller.SetInstallFileDir(const Value: String); 209 | var 210 | Factory: TDxComponentFactory; 211 | I: Integer; 212 | begin 213 | FInstallFileDir := Value; 214 | Factory := TDxComponentFactory.Create(Self); 215 | try 216 | for I := 0 to IDEs.Count - 1 do begin 217 | if FComponents[I] = nil then FComponents[I] := TDxComponentList.Create; 218 | Factory.BuildComponentList(IDEs[I], FComponents[I]); 219 | end; 220 | finally 221 | Factory.Free; 222 | end; 223 | for I := 0 to IDEs.Count - 1 do Options[IDEs[I]] := [dxioAddBrowsingPath, dxioNativeLookAndFeel]; 224 | end; 225 | 226 | procedure TDxInstaller.SetState(const Value: TDxInstallerState); 227 | begin 228 | if State = Value then Exit; 229 | if (Value = dxisStopped) and (State = dxisNormal) then Exit; 230 | FState := Value; 231 | case State of 232 | dxisNormal: UpdateProgressState('Finished!'); 233 | dxisStopped: UpdateProgressState('Stopped.'); 234 | dxisError: UpdateProgressState('Error.'); 235 | end; 236 | if State = dxisError then SetState(dxisRunning); // On Ignore Error. 237 | end; 238 | 239 | procedure TDxInstaller.Stop; 240 | begin 241 | SetState(dxisStopped); 242 | end; 243 | 244 | procedure TDxInstaller.CheckStoppedState; 245 | begin 246 | Application.ProcessMessages; 247 | if State = dxisStopped then begin 248 | SetState(dxisNormal); 249 | Abort; 250 | end; 251 | end; 252 | 253 | procedure TDxInstaller.Install(const IDEArray: TDxIDEArray); 254 | var 255 | IDE: TDxIDE; 256 | begin 257 | SetState(dxisRunning); 258 | for IDE in IDEArray do Install(IDE); 259 | SetState(dxisNormal); 260 | end; 261 | 262 | procedure TDxInstaller.Uninstall(const IDEArray: TDxIDEArray); 263 | var 264 | IDE: TDxIDE; 265 | begin 266 | SetState(dxisRunning); 267 | for IDE in IDEArray do Uninstall(IDE); 268 | SetState(dxisNormal); 269 | end; 270 | 271 | procedure TDxInstaller.Install(IDE: TDxIDE); 272 | var 273 | Comp: TDxComponent; 274 | Package: TDxPackage; 275 | SourcesFileDir, InstallSourcesDir: String; 276 | dxBuildNumber: Cardinal; 277 | I: Integer; 278 | 279 | procedure AddLibrarySearchPath(const Dir: String; const IDEPlatform: TDxIDEPlatform); 280 | begin 281 | IDE.AddToLibrarySearchPath(Dir, IDEPlatform); 282 | if (dxioInstallToCppBuilder in Options[IDE]) and IsRADStudio(IDE) then TDxBDSIDE(IDE).AddToCppLibraryPath(Dir, IDEPlatform); 283 | end; 284 | procedure AddLibraryBrowsingPath(const Dir: String; const IDEPlatform: TDxIDEPlatform); 285 | begin 286 | IDE.AddToLibraryBrowsingPath(Dir, IDEPlatform); 287 | if (dxioInstallToCppBuilder in Options[IDE]) and IsRADStudio(IDE) then TDxBDSIDE(IDE).AddToCppBrowsingPath(Dir, IDEPlatform); 288 | end; 289 | procedure CopyFiles(const ASourcesFileDir: String); 290 | begin 291 | CopyFilesToDirectory(ASourcesFileDir + '*.*', InstallSourcesDir); 292 | CopyFilesToDirectory(ASourcesFileDir + '*.dfm;*.res', GetInstallLibraryDir(InstallFileDir, IDE, Win32)); 293 | if dxioCompileWin64Library in Options[IDE] then 294 | CopyFilesToDirectory(ASourcesFileDir + '*.dfm;*.res', GetInstallLibraryDir(InstallFileDir, IDE, Win64)); 295 | end; 296 | begin 297 | Uninstall(IDE); 298 | dxBuildNumber := Profile.GetDxBuildNumber(InstallFileDir); 299 | InstallSourcesDir := GetInstallSourcesDir(InstallFileDir); 300 | for Comp in Components[IDE] do begin 301 | if Comp.State <> dxcsInstall then Continue; 302 | SourcesFileDir := IncludeTrailingPathDelimiter(Profile.GetComponentSourcesDir(InstallFileDir, Comp.Profile.ComponentName)); 303 | UpdateProgress(IDE, Comp.Profile, 'Copying', 'Sources Files'); 304 | UpdateProgressState('Copying Files: ' + SourcesFileDir + '*.*'); 305 | CopyFiles(SourcesFileDir); 306 | // Fix for version >= 18.2.x 307 | if (dxBuildNumber >= 20180200) and (Comp.Profile.ComponentName = 'ExpressLibrary') then begin 308 | for I := 0 to Profile.Components.Count - 1 do 309 | if DirectoryExists(Profile.GetComponentSourcesDir(InstallFileDir, Profile.Components[I].ComponentName)) and 310 | not DirectoryExists(Profile.GetComponentPackagesDir(InstallFileDir, Profile.Components[I].ComponentName)) then 311 | CopyFiles(IncludeTrailingPathDelimiter(Profile.GetComponentSourcesDir(InstallFileDir, Profile.Components[I].ComponentName))); 312 | CopyFiles(IncludeTrailingPathDelimiter(Profile.GetComponentSourcesDir(InstallFileDir, 'ExpressPageControl'))); 313 | end; 314 | for Package in Comp.Packages do if Package.Required then begin 315 | InstallPackage(IDE, Win32, Comp, Package); 316 | InstallPackage(IDE, Win64, Comp, Package); 317 | end; 318 | end; 319 | 320 | for Comp in Components[IDE] do begin 321 | if Comp.State <> dxcsInstall then Continue; 322 | for Package in Comp.Packages do if not Package.Required then begin 323 | InstallPackage(IDE, Win32, Comp, Package); 324 | InstallPackage(IDE, Win64, Comp, Package); 325 | end; 326 | end; 327 | 328 | AddLibrarySearchPath(GetInstallLibraryDir(InstallFileDir, IDE, Win32), Win32); 329 | if dxioCompileWin64Library in Options[IDE] then AddLibrarySearchPath(GetInstallLibraryDir(InstallFileDir, IDE, Win64), Win64); 330 | if dxioAddBrowsingPath in Options[IDE] then begin 331 | AddLibraryBrowsingPath(InstallSourcesDir, Win32); 332 | if dxioCompileWin64Library in Options[IDE] then AddLibraryBrowsingPath(InstallSourcesDir, Win64); 333 | end else begin 334 | AddLibrarySearchPath(installSourcesDir, Win32); 335 | if dxioCompileWin64Library In Options[IDE] then AddLibrarySearchPath(InstallSourcesDir, Win64) 336 | end; 337 | 338 | SetIDEOverrideEnvironmentVariable(IDE, DxEnvironmentVariableName, InstallFileDir); 339 | end; 340 | 341 | procedure TDxInstaller.InstallPackage(IDE: TDxIDE; const IDEPlatform: TDxIDEPlatform; Component: TDxComponent; Package: TDxPackage); 342 | var 343 | BPLPath, DCPPath: String; 344 | I: Integer; 345 | R: Boolean; 346 | ExtraOptions: String; 347 | InstallSourcesDir, InstallLibraryDir: String; 348 | begin 349 | CheckStoppedState; 350 | if not Package.Exists then Exit; 351 | case Package.Category of 352 | dxpcIBX: if not (dxtpcIBX in ThirdPartyComponents[IDE]) then Exit; 353 | dxpcTeeChart: if not (dxtpcTeeChart in ThirdPartyComponents[IDE]) then Exit; 354 | dxpcFireDAC: if not (dxtpcFireDAC in ThirdPartyComponents[IDE]) then Exit; 355 | dxpcBDE: if not (dxtpcBDE in ThirdPartyComponents[IDE]) or (IDEPlatform = Win64) then Exit; 356 | end; 357 | if (IDEPlatform = Win64) and (not (dxioCompileWin64Library in Options[IDE])) then Exit; 358 | if (IDEPlatform = Win64) and (Package.Usage = dxpuDesigntimeOnly) then Exit; 359 | if not Package.Required then 360 | for I := 0 to Package.DependentComponents.Count - 1 do 361 | if Package.DependentComponents[I].State <> dxcsInstall then Exit; 362 | 363 | UpdateProgress(IDE, Component.Profile, 'Install Package', DxIDEPlatformNames[IDEPlatform] + ' > ' + Package.FullFileName); 364 | if IDEPlatform = Win32 then IDE.DCC := IDE.DCC32 else 365 | if IDEPlatform = Win64 then TDxBDSIDE(IDE).DCC := TDxBDSIDE(IDE).DCC64; 366 | 367 | BPLPath := IDE.BPLOutputPath[IDEPlatform]; 368 | DCPPath := IDE.DCPOutputPath[IDEPlatform]; 369 | InstallSourcesDir := GetInstallSourcesDir(InstallFileDir); 370 | InstallLibraryDir := GetInstallLibraryDir(InstallFileDir, IDE, IDEPlatform); 371 | ForceDirectories(BPLPath); 372 | ForceDirectories(DCPPath); 373 | // -$D- Debug Information; 374 | // -$L- Local Debug Symbols; 375 | // -$Y- Symbol Reference Info; 376 | // -Q Quiet Compile; 377 | // -U Unit Search Paths; 378 | // -R Resource Search Paths; 379 | // -B Build All Units; 380 | // -NU Unit .dcu Output Directory; XE2+ 381 | // -N0 Unit .dcu Output Directory; XE2- 382 | // -A Unit Alias; 383 | // -NS Namespaces Search Paths; 384 | 385 | // -D Define Donditionals; 386 | 387 | // -JL Generate package .lib, .bpi, and all .hpp files for C++; 388 | // -NB Unit .bpi Output Directory - DCP Path; 389 | // -NH Unit .hpp Output Directory; 390 | // -NO Unit .obj Output Directory - DCP Path; 391 | ExtraOptions := 392 | ' -$D- -$L- -$Y- -Q ' + 393 | Format(' -U"%s" -U"%s" -R"%s" ', [DCPPath, InstallSourcesDir, InstallSourcesDir]) + 394 | Format(' -B -NU"%s" -N0"%s" ', [InstallLibraryDir, InstallLibraryDir]) + 395 | '-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE ' + 396 | '-NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;IBX;VclTee; '; 397 | 398 | if dxioNativeLookAndFeel in Options[IDE] then ExtraOptions := ExtraOptions + ' -DUSENATIVELOOKANDFEELASDEFAULT '; 399 | if dxioInstallToCppBuilder in Options[IDE] then 400 | ExtraOptions := ExtraOptions + Format(' -JL -NB"%s" -NH"%s" -NO"%s" ', [DCPPath, InstallLibraryDir, DCPPath]); 401 | 402 | R := IDE.CompileDelphiPackageEx(Package.FullFileName, BPLPath, DCPPath, ExtraOptions); 403 | if R then begin 404 | // Fix issue that the skin names not listed since v18.2.x. dxSkinXxxxx.bpl should be placed in the library install directory. 405 | if Package.Name.StartsWith('dxSkin') and CharInSet(Package.Name.Chars[6], ['A'..'Z']) then 406 | CopyFile(IncludeTrailingPathDelimiter(BPLPath) + Package.Name + BPLExtName, IncludeTrailingPathDelimiter(InstallLibraryDir) + Package.Name + BPLExtName, True); 407 | 408 | if (IDEPlatform = Win32) and (Package.Usage <> dxpuRuntimeOnly) then 409 | R := IDE.RegisterPackage(Package.FullFileName, BPLPath, Package.Description); 410 | end; 411 | if not R then SetState(dxisError); 412 | end; 413 | 414 | procedure TDxInstaller.Uninstall(IDE: TDxIDE); 415 | var 416 | Comp: TDxComponentProfile; 417 | InstallFileDir, InstallLibraryDir, InstallSourcesDir: String; 418 | 419 | procedure RemoveLibraryPath(const IDEPlatform: TDxIDEPlatform); 420 | begin 421 | IDE.RemoveFromLibrarySearchPath(InstallLibraryDir, IDEPlatform); 422 | IDE.RemoveFromLibrarySearchPath(InstallSourcesDir, IDEPlatform); 423 | IDE.RemoveFromLibraryBrowsingPath(InstallSourcesDir, IDEPlatform); 424 | if IsRADStudio(IDE) and IsSupportCppBuilder(IDE) then begin 425 | TDxBDSIDE(IDE).RemoveFromCppLibraryPath(InstallLibraryDir, IDEPlatform); 426 | TDxBDSIDE(IDE).RemoveFromCppLibraryPath(InstallSourcesDir, IDEPlatform); 427 | TDxBDSIDE(IDE).RemoveFromCppBrowsingPath(InstallSourcesDir, IDEPlatform); 428 | end; 429 | end; 430 | 431 | procedure UninstallPackages(List: TStringList); 432 | var 433 | Package: String; 434 | begin 435 | for Package in List do begin 436 | UninstallPackage(IDE, Win32, Comp, Package); 437 | UninstallPackage(IDE, Win64, Comp, Package); 438 | end; 439 | end; 440 | begin 441 | for Comp in Profile.Components do begin 442 | UninstallPackages(Comp.RequiredPackages); 443 | UninstallPackages(Comp.OptionalPackages); 444 | UninstallPackages(Comp.OutdatedPackages); 445 | end; 446 | 447 | InstallFileDir := GetIDEOverrideEnvironmentVariable(IDE, DxEnvironmentVariableName); 448 | if InstallFileDir = EmptyStr then Exit; 449 | InstallLibraryDir := GetInstallLibraryDir(InstallFileDir, IDE); 450 | InstallSourcesDir := GetInstallSourcesDir(InstallFileDir); 451 | UpdateProgress(IDE, nil, 'Deleting', 'Installation Files'); 452 | UpdateProgressState('Deleting Directory: ' + InstallLibraryDir); 453 | DxUtils.DeleteDirectory(InstallLibraryDir); 454 | 455 | RemoveLibraryPath(Win32); 456 | if IsSupportWin64(IDE) then begin 457 | InstallLibraryDir := GetInstallLibraryDir(InstallFileDir, IDE, Win64); 458 | RemoveLibraryPath(Win64); 459 | end; 460 | 461 | InstallLibraryDir := GetInstallLibraryDir(InstallFileDir, nil); 462 | if IsEmptyDirectory(InstallLibraryDir, InstallSourcesDir) then begin 463 | UpdateProgressState('Deleting Directory: ' + InstallSourcesDir); 464 | DxUtils.DeleteDirectory(InstallSourcesDir); 465 | RemoveDir(InstallLibraryDir); 466 | end; 467 | 468 | SetIDEOverrideEnvironmentVariable(IDE, DxEnvironmentVariableName, EmptyStr); 469 | end; 470 | 471 | procedure TDxInstaller.UninstallPackage(IDE: TDxIDE; const IDEPlatform: TDxIDEPlatform; Component: TDxComponentProfile; const PackageBaseName: String); 472 | var 473 | BPLPath, DCPPath, PackageName, FileName: String; 474 | begin 475 | CheckStoppedState; 476 | if (IDEPlatform = Win64) and (not IsSupportWin64(IDE)) then Exit; 477 | 478 | BPLPath := IncludeTrailingPathDelimiter(IDE.BPLOutputPath[IDEPlatform]); 479 | DCPPath := IncludeTrailingPathDelimiter(IDE.DCPOutputPath[IDEPlatform]); 480 | PackageName := Profile.GetPackageName(PackageBaseName, IDE); 481 | 482 | FileName := BPLPath + PackageName + BPLExtName; 483 | UpdateProgress(IDE, Component, 'Uninstall Package', FileName); 484 | IDE.UnregisterPackage(FileName); 485 | 486 | FileName := ChangeFileExt(FileName, '.*'); 487 | UpdateProgressState('Deleting BPL Files: ' + FileName); 488 | DeleteFiles(FileName); 489 | 490 | FileName := DCPPath + PackageName + '.*'; 491 | UpdateProgressState('Deleting DCP Files: ' + FileName); 492 | DeleteFiles(FileName); 493 | end; 494 | 495 | procedure TDxInstaller.UpdateProgress(IDE: TDxIDE; Component: TDxComponentProfile; const Task, Target: String); 496 | begin 497 | if Assigned(FOnUpdateProgress) then FOnUpdateProgress(IDE, Component, Task, Target); 498 | end; 499 | 500 | procedure TDxInstaller.UpdateProgressState(const StateText: String); 501 | begin 502 | if Assigned(FOnUpdateProgressState) then FOnUpdateProgressState(StateText) 503 | end; 504 | 505 | end. 506 | -------------------------------------------------------------------------------- /Sources/MainFrm.dfm: -------------------------------------------------------------------------------- 1 | object MainForm: TMainForm 2 | Left = 0 3 | Top = 0 4 | Caption = 'MainForm' 5 | ClientHeight = 854 6 | ClientWidth = 618 7 | Color = clBtnFace 8 | Font.Charset = ANSI_CHARSET 9 | Font.Color = clWindowText 10 | Font.Height = -12 11 | Font.Name = 'Segoe UI' 12 | Font.Style = [] 13 | Position = poScreenCenter 14 | OnCreate = FormCreate 15 | OnDestroy = FormDestroy 16 | TextHeight = 15 17 | object PanelTop: TPanel 18 | Left = 0 19 | Top = 0 20 | Width = 618 21 | Height = 97 22 | Align = alTop 23 | BevelEdges = [beBottom] 24 | BevelKind = bkTile 25 | BevelOuter = bvNone 26 | Color = clWhite 27 | ParentBackground = False 28 | TabOrder = 0 29 | DesignSize = ( 30 | 618 31 | 95) 32 | object ImageIcon: TImage 33 | Left = 536 34 | Top = 16 35 | Width = 64 36 | Height = 64 37 | Anchors = [akTop, akRight] 38 | Stretch = True 39 | ExplicitLeft = 723 40 | end 41 | object LblAppName: TLabel 42 | Left = 24 43 | Top = 28 44 | Width = 167 45 | Height = 25 46 | Caption = 'DxAutoInstaller' 47 | Font.Charset = ANSI_CHARSET 48 | Font.Color = clWindowText 49 | Font.Height = -21 50 | Font.Name = 'Tahoma' 51 | Font.Style = [fsBold] 52 | ParentFont = False 53 | end 54 | object Label2: TLabel 55 | Left = 24 56 | Top = 60 57 | Width = 258 58 | Height = 15 59 | Caption = 'DevExpress VCL Components Automatic Installer' 60 | end 61 | object LblVersion: TLabel 62 | Left = 203 63 | Top = 37 64 | Width = 21 65 | Height = 15 66 | Caption = 'v2.x' 67 | end 68 | end 69 | object PageFuns: TPageControl 70 | AlignWithMargins = True 71 | Left = 8 72 | Top = 109 73 | Width = 602 74 | Height = 705 75 | Margins.Left = 8 76 | Margins.Top = 12 77 | Margins.Right = 8 78 | Margins.Bottom = 0 79 | ActivePage = TabInstall 80 | Align = alClient 81 | TabOrder = 1 82 | OnChange = PageFunsChange 83 | object TabInstall: TTabSheet 84 | Caption = 'Install' 85 | object Panel5: TPanel 86 | Left = 0 87 | Top = 0 88 | Width = 594 89 | Height = 675 90 | Align = alClient 91 | BevelOuter = bvNone 92 | TabOrder = 0 93 | DesignSize = ( 94 | 594 95 | 675) 96 | object Label7: TLabel 97 | Left = 8 98 | Top = 10 99 | Width = 133 100 | Height = 15 101 | Caption = 'Installation File Directory:' 102 | end 103 | object Label8: TLabel 104 | Left = 523 105 | Top = 10 106 | Width = 41 107 | Height = 15 108 | Anchors = [akTop, akRight] 109 | Caption = 'Version:' 110 | ExplicitLeft = 710 111 | end 112 | object EditInstallFileDir: TButtonedEdit 113 | Left = 8 114 | Top = 30 115 | Width = 509 116 | Height = 23 117 | Anchors = [akLeft, akTop, akRight] 118 | Images = ImageSmall 119 | ReadOnly = True 120 | RightButton.ImageIndex = 3 121 | RightButton.Visible = True 122 | TabOrder = 0 123 | OnRightButtonClick = EditInstallFileDirRightButtonClick 124 | end 125 | object EditVersion: TEdit 126 | Left = 523 127 | Top = 30 128 | Width = 61 129 | Height = 23 130 | Anchors = [akTop, akRight] 131 | ReadOnly = True 132 | TabOrder = 1 133 | end 134 | object PanTreeList: TPanel 135 | Left = 8 136 | Top = 62 137 | Width = 576 138 | Height = 604 139 | Anchors = [akLeft, akTop, akRight, akBottom] 140 | BevelKind = bkTile 141 | BevelOuter = bvNone 142 | TabOrder = 2 143 | end 144 | end 145 | end 146 | object TabUninstall: TTabSheet 147 | Caption = 'Uninstall' 148 | ImageIndex = 1 149 | object Panel4: TPanel 150 | Left = 0 151 | Top = 0 152 | Width = 594 153 | Height = 655 154 | Align = alClient 155 | BevelOuter = bvNone 156 | TabOrder = 0 157 | object Label9: TLabel 158 | AlignWithMargins = True 159 | Left = 8 160 | Top = 10 161 | Width = 343 162 | Height = 15 163 | Margins.Left = 8 164 | Margins.Top = 10 165 | Margins.Right = 8 166 | Margins.Bottom = 10 167 | Align = alTop 168 | Caption = 'Uninstall DevExpress Components in the Following Selected IDEs:' 169 | end 170 | object IDEListView: TListView 171 | AlignWithMargins = True 172 | Left = 8 173 | Top = 35 174 | Width = 578 175 | Height = 610 176 | Margins.Left = 8 177 | Margins.Top = 0 178 | Margins.Right = 8 179 | Margins.Bottom = 10 180 | Align = alClient 181 | Checkboxes = True 182 | Columns = < 183 | item 184 | AutoSize = True 185 | Caption = 'IDE Name' 186 | end> 187 | ReadOnly = True 188 | TabOrder = 0 189 | ViewStyle = vsReport 190 | ExplicitTop = 30 191 | ExplicitWidth = 576 192 | ExplicitHeight = 616 193 | end 194 | end 195 | end 196 | object TabTools: TTabSheet 197 | Caption = 'Tools' 198 | ImageIndex = 2 199 | object Panel3: TPanel 200 | Left = 0 201 | Top = 0 202 | Width = 594 203 | Height = 675 204 | Align = alClient 205 | BevelOuter = bvNone 206 | TabOrder = 0 207 | object GroupBox1: TGroupBox 208 | AlignWithMargins = True 209 | Left = 8 210 | Top = 102 211 | Width = 578 212 | Height = 563 213 | Margins.Left = 8 214 | Margins.Right = 8 215 | Margins.Bottom = 10 216 | Align = alClient 217 | Caption = 'Profile' 218 | TabOrder = 1 219 | DesignSize = ( 220 | 578 221 | 563) 222 | object LblCurrentProfile: TLabel 223 | Left = 16 224 | Top = 32 225 | Width = 138 226 | Height = 15 227 | Caption = 'Current Profile: ' 228 | end 229 | object Label1: TLabel 230 | Left = 256 231 | Top = 59 232 | Width = 311 233 | Height = 15 234 | Caption = '* Profile changes will take effect after re-open the software.' 235 | end 236 | object BtnProfile: TButton 237 | Left = 16 238 | Top = 55 239 | Width = 225 240 | Height = 25 241 | Caption = 'Export Profile' 242 | ImageMargins.Left = 30 243 | ImageMargins.Right = -30 244 | Images = ImageSmall 245 | TabOrder = 0 246 | end 247 | object LblCustomProfile: TLinkLabel 248 | Left = 16 249 | Top = 88 250 | Width = 545 251 | Height = 19 252 | Anchors = [akLeft, akTop, akRight] 253 | AutoSize = False 254 | Caption = 'Custom Profile:' 255 | TabOrder = 1 256 | OnLinkClick = URLLinkClick 257 | ExplicitWidth = 543 258 | end 259 | end 260 | object GroupBox2: TGroupBox 261 | AlignWithMargins = True 262 | Left = 8 263 | Top = 10 264 | Width = 578 265 | Height = 79 266 | Margins.Left = 8 267 | Margins.Top = 10 268 | Margins.Right = 8 269 | Margins.Bottom = 10 270 | Align = alTop 271 | Caption = 'Packages' 272 | TabOrder = 0 273 | ExplicitWidth = 576 274 | object Button1: TButton 275 | Left = 16 276 | Top = 32 277 | Width = 225 278 | Height = 25 279 | Action = SearchNewPackages 280 | ImageMargins.Left = 35 281 | ImageMargins.Right = -35 282 | Images = ImageSmall 283 | TabOrder = 0 284 | end 285 | end 286 | end 287 | end 288 | object TabAbout: TTabSheet 289 | Caption = 'About' 290 | ImageIndex = 3 291 | object Panel2: TPanel 292 | Left = 0 293 | Top = 0 294 | Width = 594 295 | Height = 675 296 | Align = alClient 297 | BevelOuter = bvNone 298 | TabOrder = 0 299 | DesignSize = ( 300 | 594 301 | 675) 302 | object Label4: TLabel 303 | Left = 8 304 | Top = 21 305 | Width = 132 306 | Height = 15 307 | Caption = 'Download Latest Version:' 308 | end 309 | object Label5: TLabel 310 | Left = 8 311 | Top = 119 312 | Width = 138 313 | Height = 15 314 | Caption = 'Feedback and Bug Report:' 315 | end 316 | object Label6: TLabel 317 | Left = 8 318 | Top = 69 319 | Width = 229 320 | Height = 15 321 | Caption = 'Download DevExpress VCL Documentation:' 322 | end 323 | object LinkDownApp: TLinkLabel 324 | Left = 8 325 | Top = 42 326 | Width = 241 327 | Height = 19 328 | Caption = 'https://github.com/Delphier/DxAutoInstaller' 329 | TabOrder = 0 330 | OnLinkClick = URLLinkClick 331 | end 332 | object LinkDownDoc: TLinkLabel 333 | Left = 8 334 | Top = 89 335 | Width = 188 336 | Height = 19 337 | Caption = 'https://docs.devexpress.com/VCL/' 338 | TabOrder = 1 339 | OnLinkClick = URLLinkClick 340 | end 341 | object LinkEmail: TLinkLabel 342 | Left = 8 343 | Top = 138 344 | Width = 110 345 | Height = 19 346 | Caption = 'faceker@gmail.com' 347 | TabOrder = 2 348 | OnLinkClick = URLLinkClick 349 | end 350 | object MemoReadme: TMemo 351 | Left = 8 352 | Top = 172 353 | Width = 576 354 | Height = 493 355 | Anchors = [akLeft, akTop, akRight, akBottom] 356 | ReadOnly = True 357 | ScrollBars = ssVertical 358 | TabOrder = 3 359 | ExplicitHeight = 473 360 | end 361 | end 362 | end 363 | end 364 | object PanelBottom: TPanel 365 | Left = 0 366 | Top = 814 367 | Width = 618 368 | Height = 40 369 | Align = alBottom 370 | BevelOuter = bvNone 371 | TabOrder = 2 372 | DesignSize = ( 373 | 618 374 | 40) 375 | object BtnExit: TcxButton 376 | Left = 521 377 | Top = 7 378 | Width = 75 379 | Height = 25 380 | Action = ExitApp 381 | Anchors = [akTop, akRight] 382 | TabOrder = 2 383 | end 384 | object BtnRun: TcxButton 385 | Left = 439 386 | Top = 7 387 | Width = 75 388 | Height = 25 389 | Action = Install 390 | Anchors = [akTop, akRight] 391 | TabOrder = 1 392 | end 393 | object ChkHideBaseComponents: TCheckBox 394 | Left = 20 395 | Top = 11 396 | Width = 167 397 | Height = 17 398 | Caption = 'Hide Base Components' 399 | Checked = True 400 | State = cbChecked 401 | TabOrder = 0 402 | OnClick = RefreshTreeList 403 | end 404 | end 405 | object ActionBase: TActionList 406 | Images = ImageSmall 407 | Left = 400 408 | Top = 288 409 | object Install: TAction 410 | Caption = '&Install' 411 | ImageIndex = 0 412 | OnExecute = InstallExecute 413 | end 414 | object Uninstall: TAction 415 | Caption = '&Uninstall' 416 | ImageIndex = 1 417 | OnExecute = UninstallExecute 418 | end 419 | object ExitApp: TAction 420 | Caption = 'E&xit' 421 | ImageIndex = 2 422 | OnExecute = ExitAppExecute 423 | end 424 | object ProfileExport: TAction 425 | Caption = 'Export Built-in Profile' 426 | ImageIndex = 4 427 | OnExecute = ProfileExportExecute 428 | end 429 | object ProfileDelete: TAction 430 | Caption = 'Delete Custom Profile' 431 | ImageIndex = 5 432 | OnExecute = ProfileDeleteExecute 433 | end 434 | object SearchNewPackages: TAction 435 | Caption = 'Search New Packages' 436 | ImageIndex = 6 437 | OnExecute = SearchNewPackagesExecute 438 | end 439 | end 440 | object ImageSmall: TcxImageList 441 | SourceDPI = 96 442 | FormatVersion = 1 443 | Left = 400 444 | Top = 368 445 | Bitmap = { 446 | 494C010107000800040010001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 447 | 0000000000003600000028000000400000002000000001002000000000000020 448 | 00000000000000000000000000000000000000000000686565D7908C8CF58E8A 449 | 8AF58D8989F58C8888F58B8787F58A8686F5898585F5888585F5888585F58784 450 | 84F5878484F55C5959D200000000000000000000000000000000686565D7908C 451 | 8CF58E8A8AF58D8989F58C8888F5C1BFBFFA4D4B88FB3F3E9CFDBFBEBEFA8885 452 | 85F5BFBDBDFA3D3C90FD3B3970ED383838780000000000000000000000000000 453 | 0000000000000000000000000000000000000000000000000000000000000000 454 | 000002233C810163C4E8004790C7000509340000000000000000000000000000 455 | 0000000000000000000000000000000000000000000000000000000000000000 456 | 00000000000000000000000000000000000000000000888484EFFAF6F4FFF7EF 457 | ECFFF6EDEAFFF6ECE8FFF5EAE7FFF5E9E5FFF4E8E4FFF4E8E3FFC37A74FFD4B5 458 | B0FFF8F1EFFF767171E900000000000000000000000000000000888484EFFAF6 459 | F4FFF7EFECFFF6EDEAFFFAF5F3FF7773B1FF5353D3FF6262E1FF504EAEFFF9F3 460 | F0FF524FA7FF4444CFFF4141C9FF0B0B2E990000000000000000000000000000 461 | 0000000000000000000000000000000000000000000000000000000000000828 462 | 3F8518A6F5FF4CF5FDFF32C6F9FF00458DC50000000000000000000000000000 463 | 0000000000000000000000000000000000000000000000000000000000000000 464 | 000000000000000000000000000000000000000000008A8585EFF9F3F0FFF5E8 465 | E3FFF3E5E0FFF2E2DDFFF1DFD9FFF0DDD6FFEFDAD3FFEED9D1FFC37561FFD184 466 | 4DFFCA9A94FF777272E9000000000000000000000000000000008A8585EFF9F3 467 | F0FFF5E8E3FFF3E5E0FFF8F0EDFF5854B1FF5959D8FF6E6EE6FF6767E8FF3C3B 468 | B8FF4F4FD8FF4242CDFF4444CEFF171759C50000000000000000000000000000 469 | 00132523237E5A5858CA848180F2868181F45C5A5ACE28272885535455AF65B2 470 | D8FF4BF5FEFF36D8FDFF30CAFCFF036AD1EF0000000000000000000000000000 471 | 0000000000000000000000000000000000000000000000000000000000000000 472 | 000000000000000000000000000000000000000000008B8787EFFAF5F3FFF6EC 473 | E8FFF5EAE5FFCB8C76FFCC8B6DFFCB896CFFCA866BFFC88469FFCB7951FFE18C 474 | 59FFD6874FFF905149F6000000060000000000000000000000008B8787EFFAF5 475 | F3FFF6ECE8FFF5EAE5FFF4E7E2FFF9F1EEFF5753B2FF6363E3FF7575F0FF6A6A 476 | EDFF5454DBFF4646D0FF393892FA3838387800000000000000000E0E0E4C8280 477 | 80ECB6B1B2FFC2BDBDFFBEB8B9FFB7B0B1FFB0A9AAFFA39D9EFFA6A1A1FFE8E6 478 | E6FF77CADDFF2EC9FCFF17A1F6FF012F589B0000000000000000000000000000 479 | 0000000000000000000000000000000000000000000000000000000000000000 480 | 000000000000000000000000000000000000000000008C8888EFFAF6F4FFF8EF 481 | ECFFF7EEEAFFCF8155FFE8906EFFED9473FFF09875FFF09973FFED956DFFE68C 482 | 64FFDE835AFFDA8A51FF662C1FC30000001500000000000000008C8888EFFAF6 483 | F4FFF8EFECFFF7EEEAFFF6EBE7FFF5E9E4FFF9F2EFFF403FC0FF7373F1FF6B6B 484 | EBFF5757DFFF3A39B6FFB3B1B1F300000000000000000E0E0E4BA09C9CFBDDDA 485 | DAFFD4D0D0FFB0ACACFF9F9B9BFF9C9797FFA29C9DFFAFA8A9FFB0A9AAFFACA8 486 | A8FFD1CDCDFF61ACD6FF05365C9F000000020000000000000000000000000000 487 | 0000000000000000000000000000000000000000000000000000000000000000 488 | 000000000000000000000000000000000000000000008C8989EFFAF6F4FFF9F1 489 | EEFFF8F0EDFFCF8254FFE08468FFE78B6EFFED9273FFF09675FFF09674FFED93 490 | 6EFFE78C65FFDF8359FFDF9454FF581F18BA00000000000000008C8989EFFAF6 491 | F4FFF9F1EEFFF8F0EDFFF8EFEBFFFBF5F3FF5855B5FF6363E3FF7575F0FF6A6A 492 | EDFF5454DBFF4646D1FF393896FB3838387800000011878282EAECE9E9FFD7D3 493 | D3FF9B9796F997928BD9908A80C7908A81C795918CD8948F8FF8A9A3A3FFB0A9 494 | AAFFA4A0A0FF5B5D60B900000003000000000000000000000000000000000000 495 | 0000000000000000000000000000000000000000000000000000000000000000 496 | 000000000000000000000000000000000000000000008D8A8AEFFAF6F4FFF9F1 497 | EEFFF9F1EEFFCF8354FFD97C61FFE08668FFE78E6EFFED9572FFF09875FFF096 498 | 74FFED936EFFE5965FFF622B1DBD0000001300000000000000008D8A8AEFFAF6 499 | F4FFF9F1EEFFF9F1EEFFFCF7F5FF5C5ABAFF5959D9FF6E6EE6FF6767E9FF3F3F 500 | C0FF5050D9FF4242CDFF4444D0FF191962C924222277CECACBFFF0EDEEFF9E9A 501 | 98F9928876C78D7E60BF8E7E63BF8E8069BF8D816EBF908A80C6948F8FF8AFA8 502 | A9FFA49E9EFF2A2A2B8A00000000000000000000000000000000000000000000 503 | 0000000000000000000000000000000000000000000000000000000000000000 504 | 000000000000000000000000000000000000000000008F8B8BEFFAF6F4FFF9F1 505 | EEFFF9F1EEFFD29881FFD19473FFD09374FFD09273FFCF9173FFD18555FFF19E 506 | 74FFE49761FF945C4EF6000000040000000000000000000000008F8B8BEFFAF6 507 | F4FFF9F1EEFFF9F1EEFFFCF8F6FF7A77BCFF5454D7FF6262E2FF5856BBFFFAF4 508 | F2FF5754B4FF4545D2FF4242CDFF0A0A2D925C5959C2EEEBEBFFC9C6C6FF9E97 509 | 88DD96835AC5907B53C08E7C5ABF8E7E63BF8E8069BF8D816DBF96918BD8A19C 510 | 9CFFB1AAABFF625F5FD500000000000000000000000000000000000000000000 511 | 0000000000000000000000000000000000000000000000000000000000000000 512 | 00000000000000000000000000000000000000000000908C8CEFFAF6F4FFF9F1 513 | EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0EDFFD08A6BFFDB90 514 | 57FFD4ACA2FF7A7878E900000000000000000000000000000000908C8CEFFAF6 515 | F4FFF9F1EEFFF9F1EEFFF9F1EEFFFCF8F6FF7A77BCFF5C5ABEFFFBF7F5FFF8EF 516 | EBFFFBF5F3FF5A59B7FF494885F638383878848181E8EFECECFFB3AFAFFFA094 517 | 78D1A79161CF967F50C48E7950BF8E7C5ABF8E7E63BF8E8069BF918A7FC79C97 518 | 97FFB7B0B1FF8F8A8AFB00000001000000000000000000000000000000000000 519 | 0000000000000000000000000000000000000000000000000000000000000000 520 | 00000000000000000000000000000000000000000000908C8CEFFAF6F4FFF9F1 521 | EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFD29380FFDEC5 522 | BDFFFAF5F3FF7B7878E900000000000000000000000000000000908C8CEFFAF6 523 | F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFFCF8F6FFFCF8F6FFF9F1EEFFF9F0 524 | EDFFF8F0ECFFFCFAF9FFB6B4B4F300000000858181E8E1DEDEFFB0ACACFFA598 525 | 7AD4C3B08BDFB19E74D5947E4FC38E7950BF8E7C5ABF8E7E63BF918A7DC79F9A 526 | 9AFFBEB8B9FF918C8CFB00000000000000000000000000000000000000000000 527 | 0000000000000000000000000000000000000000000000000000000000000000 528 | 00000000000000000000000000000000000000000000918D8DEFFAF6F4FFF9F1 529 | EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0EDFFF8F0 530 | EDFFFAF6F4FF7C7979E900000000000000000000000000000000918D8DEFFAF6 531 | F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0 532 | EDFFF8F0EDFFFAF6F4FF7C7979E9000000005C5959C1CDC9C9FFBCB7B7FFA69C 533 | 88E1D0C2A4E7DCD1BBEDB29F76D6967F51C4907B53C08D7D5EBF979187D8AFAB 534 | ABFFC4BEBFFF656262D400000000000000000000000000000000000000000000 535 | 0000000000000000000000000000000000000000000000000000000000000000 536 | 00000000000000000000000000000000000000000000918E8EEFFAF6F4FFF9F1 537 | EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0EDFFEEE6E3FFE4DC 538 | DAFFE7E4E2FF797777E900000000000000000000000000000000918E8EEFFAF6 539 | F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0EDFFEEE6 540 | E3FFE4DCDAFFE7E4E2FF797777E90000000022212175B5B0B0FFCCC7C7FFA29C 541 | 99F9B1A688DBD0C2A5E7C4B38EE0A99465D0998559C6928871C79B9795F8D3CF 542 | CFFFB9B4B5FF2B2A2A8900000000000000000000000000000000000000000000 543 | 0000000000000000000000000000000000000000000000000000000000000000 544 | 00000000000000000000000000000000000000000000928F8FEFFAF6F4FFF9F1 545 | EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF7EFECFFA5A0A0FF9E9A 546 | 9AFF999595FF736D6DE100000000000000000000000000000000928F8FEFFAF6 547 | F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF7EFECFFA5A0 548 | A0FF9E9A9AFF999595FF736D6DE10000000000000010888383E9C1BDBDFFC2BD 549 | BDFFA29C99F9A89E87E2A89977D5A39574D29F9684DD9D9997F8D5D2D2FFDFDC 550 | DCFF8C8888F20101011A00000000000000000000000000000000000000000000 551 | 0000000000000000000000000000000000000000000000000000000000000000 552 | 00000000000000000000000000000000000000000000938F8FEFFAF6F4FFF9F1 553 | EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF7EFECFFA19D9DFFD3D1 554 | D2FF868383EE0606063400000000000000000000000000000000938F8FEFFAF6 555 | F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF7EFECFFA19D 556 | 9DFFD3D1D2FF868383EE0606063400000000000000000D0C0C48A09B9BFAC1BD 557 | BDFFCCC7C7FFBBB7B7FFB0ACACFFB2AFAEFFC8C5C5FFF0EDEDFFEEEBEBFFA7A3 558 | A3FD131212580000000000000000000000000000000000000000000000000000 559 | 0000000000000000000000000000000000000000000000000000000000000000 560 | 00000000000000000000000000000000000000000000949090EFFBF9F8FFFAF6 561 | F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF5F4FFA19C9CFF8784 562 | 84EE060606340000000000000000000000000000000000000000949090EFFBF9 563 | F8FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF5F4FFA19C 564 | 9CFF878484EE06060634000000000000000000000000000000000D0C0C488985 565 | 85EAB5B1B1FFCECACAFFE1DEDEFFEFECECFFF1EFEFFFD2CFCFFF8F8C8BF01313 566 | 1357000000000000000000000000000000000000000000000000000000000000 567 | 0000000000000000000000000000000000000000000000000000000000000000 568 | 000000000000000000000000000000000000000000006F6C6CD2949090EF938F 569 | 8FEF928F8FEF918E8EEF918D8DEF908C8CEF908C8CEF8F8B8BEF787474E10606 570 | 06340000000000000000000000000000000000000000000000006F6C6CD29490 571 | 90EF938F8FEF928F8FEF918E8EEF918D8DEF908C8CEF908C8CEF8F8B8BEF7874 572 | 74E1060606340000000000000000000000000000000000000000000000000000 573 | 001125242479615E5EC78F8B8BEF908C8CF0646161CB2B2A2980010101160000 574 | 0000000000000000000000000000000000000000000000000000000000000000 575 | 0000000000000000000000000000000000000000000000000000000000000000 576 | 0000000000000000000000000000000000000000000000000000000000000000 577 | 0000000000000000000000000000000000000000000000000000000000000000 578 | 0000000000000000000000000000000000000000000000000000000000000000 579 | 0000000000000000000000000000000000000000000000000000000000000000 580 | 0000000000000000000000000000000000000000000000000000000000000000 581 | 0000000000000000000000000000000000000000000000000000000000000000 582 | 0000000000000000000000000000000000000000000000000000000000000000 583 | 0000000000000000000000000000000000000000000000000000000000000000 584 | 0000000000000000000000000000000000000000000000000000000000000000 585 | 00000001001B0A2C0189186E02D6219602FB219602FB196F02D70A2E018B0002 586 | 001D000000000000000000000000000000000000000000000000000000000000 587 | 00000201001B3E22048998530BD6CF7210FBD07210FB98530BD74023048B0201 588 | 001D000000000000000000000000000000000000000000000000000000000000 589 | 00000000021A07073A88131392D51B1BC9FB1B1BCAFB141494D708083C8A0000 590 | 021B000000000000000000000000000000000000000000000000000000000000 591 | 0000000000000000000000000000000000000000000000000000000000000000 592 | 0000000000000000000000000000000000000000000000000000000000000413 593 | 005A1F8D02F3229C02FF229C02FF229C02FF229C02FF229C02FF229C02FF208E 594 | 02F40415005E0000000000000000000000000000000000000000000000001A0E 595 | 025AC36B0FF3D77610FFD77610FFD77610FFD77610FFD77610FFD77610FFC56C 596 | 0FF41D10025E0000000000000000000000000000000000000000000000000303 597 | 18581919BCF21B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1919 598 | BDF303031A5C000000000000000000000000001C2A8D00324CBD00324CBD0032 599 | 4CBD00324CBD00324CBD00324CBD00324CBD00324CBD00324CBD00324CBD0032 600 | 4CBD00324CBD001C2A8D0000000000000000000000000000000004120059229A 601 | 02FE229C02FF229C02FF229C02FF229C02FF229C02FF229C02FF229C02FF229C 602 | 02FF229B02FE0415005E000000000000000000000000000000001A0E0259D575 603 | 10FED77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 604 | 10FFD57610FE1D10025E00000000000000000000000000000000030318571B1B 605 | CEFD1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1B 606 | D1FF1B1BCFFE03031A5C0000000000000000003048B068B7DAFF82CCEDFF82CC 607 | EDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CC 608 | EDFF83CDEEFF1D5773C9000508400000000000000000000100191F8C02F2229C 609 | 02FF229C02FF229C02FF229C02FFFFFFFFFFFFFFFFFF229C02FF229C02FF229C 610 | 02FF229C02FF208E02F40002001D000000000000000002010019C16A0FF2D776 611 | 10FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 612 | 10FFD77610FFC56C0FF40201001D0000000000000000000001181818BAF11B1B 613 | D1FF9090E8FF9090E8FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF9090E8FF9090 614 | E8FF1B1BD1FF1919BDF30000021B00000000002C43A254AACEFF80CBEAFF7CC9 615 | E9FF7CC9E9FF7CC9E9FF7CC9E9FF7CC9E9FF7CC9E9FF7CC9E9FF7CC9E9FF7CC9 616 | E9FF7CC9E9FF3D7F9BD900121C6E0000000000000000092A0186229C02FF229C 617 | 02FF229C02FF229C02FF229C02FFFFFFFFFFFFFFFFFF229C02FF229C02FF229C 618 | 02FF229C02FF229C02FF0A2E018B00000000000000003B200486D77610FFD776 619 | 10FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 620 | 10FFD77610FFD77610FF3F23048B0000000000000000070738851B1BD1FF1B1B 621 | D1FF8B8BE7FFFFFFFFFF9090E8FF1B1BD1FF1B1BD1FF9090E8FFFFFFFFFF8B8B 622 | E7FF1B1BD1FF1B1BD1FF08083C8A00000000002B419D42A1CBFF8AD3EFFF83CD 623 | EBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CD 624 | EBFF83CDEBFF73B8D3F2002437930000000100000000176901D2229C02FF229C 625 | 02FF229C02FF229C02FF229C02FFFFFFFFFFFFFFFFFF229C02FF229C02FF229C 626 | 02FF229C02FF229C02FF196F02D7000000000000000092500BD2D77610FFD776 627 | 10FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 628 | 10FFD77610FFD77610FF99540BD7000000000000000012128CD11B1BD1FF1B1B 629 | D1FF1B1BD1FF8B8BE7FFFFFFFFFF9090E8FF9090E8FFFFFFFFFF8B8BE7FF1B1B 630 | D1FF1B1BD1FF1B1BD1FF141494D70000000000293F9950B0D7FF85D2EDFF89D2 631 | EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2 632 | EEFF89D2EEFF90D8F1FF0E3E55AA0001021D00000000209102F6229C02FF229C 633 | 02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 634 | FFFF229C02FF229C02FF219602FB0000000000000000C76D10F6D77610FFD776 635 | 10FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 636 | FFFFD77610FFD77610FFCF7210FB00000000000000001919C2F61B1BD1FF1B1B 637 | D1FF1B1BD1FF1B1BD1FF8B8BE7FFFFFFFFFFFFFFFFFF8B8BE7FF1B1BD1FF1B1B 638 | D1FF1B1BD1FF1B1BD1FF1A1ACAFB0000000000283D9572CAE8FF73CAE8FF90D8 639 | F2FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7 640 | F1FF8FD7F1FF91D8F2FF2C667DC200090D4600000000209002F5229C02FF229C 641 | 02FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 642 | FFFF229C02FF229C02FF219602FB0000000000000000C76D0FF5D77610FFD776 643 | 10FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 644 | FFFFD77610FFD77610FFCF7210FB00000000000000001919C1F51B1BD1FF1B1B 645 | D1FF1B1BD1FF1B1BD1FF9090E8FFFFFFFFFFFFFFFFFF9090E8FF1B1BD1FF1B1B 646 | D1FF1B1BD1FF1B1BD1FF1A1AC9FB0000000000273C928FDDF4FF61C0E5FFA8EE 647 | FAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EE 648 | FAFFA8EEFAFFA8EEFAFF65A3B5DE0019267100000000176901D1229C02FF229C 649 | 02FF229C02FF229C02FF229C02FFFFFFFFFFFFFFFFFF229C02FF229C02FF229C 650 | 02FF229C02FF229C02FF186E01D60000000000000000904F0BD1D77610FFD776 651 | 10FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 652 | 10FFD77610FFD77610FF98530BD6000000000000000012128AD01B1BD1FF1B1B 653 | D1FF1B1BD1FF9090E8FFFFFFFFFF8B8BE7FF8B8BE7FFFFFFFFFF9090E8FF1B1B 654 | D1FF1B1BD1FF1B1BD1FF131392D50000000000263A8EA6ECFCFF62C2E9FF4DB5 655 | E2FF4BB4E2FF4AB3E1FF49B2E0FF47B1DFFF46B0DFFF45AEDEFF43ADDDFF42AC 656 | DDFF44AEDFFF005078C70022338100131D610000000009290184229C02FF229C 657 | 02FF229C02FF229C02FF229C02FFFFFFFFFFFFFFFFFF229C02FF229C02FF229C 658 | 02FF229C02FF229C02FF0A2C01890000000000000000391F0484D77610FFD776 659 | 10FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 660 | 10FFD77610FFD77610FF3E2204890000000000000000070736831B1BD1FF1B1B 661 | D1FF9090E8FFFFFFFFFF8B8BE7FF1B1BD1FF1B1BD1FF8B8BE7FFFFFFFFFF9090 662 | E8FF1B1BD1FF1B1BD1FF07073A88000000000026398BABF0FEFFA4E9FCFFA2E7 663 | FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9F3FF8ED7F1FF8BD4 664 | F0FF90D8F3FF0026398B000000000000000000000000000100181F8B02F1229C 665 | 02FF229C02FF229C02FF229C02FFFFFFFFFFFFFFFFFF229C02FF229C02FF229C 666 | 02FF229C02FF1F8D02F30001001B000000000000000001010018C0690FF1D776 667 | 10FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 668 | 10FFD77610FFC36B0FF30201001B0000000000000000000001171818B8F01B1B 669 | D1FF8B8BE7FF8B8BE7FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF8B8BE7FF8B8B 670 | E7FF1B1BD1FF1919BCF20000021A0000000000253788ADF1FFFFA6EBFDFFA4E9 671 | FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9F3FF8ED7 672 | F1FF93DAF4FF002537880000000000000000000000000000000003110055229A 673 | 02FD229C02FF229C02FF229C02FF229C02FF229C02FF229C02FF229C02FF229C 674 | 02FF229A02FE0413005A00000000000000000000000000000000170D0155D474 675 | 10FDD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD77610FFD776 676 | 10FFD57510FE1A0E025A00000000000000000000000000000000020216531B1B 677 | CDFD1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1B 678 | D1FF1B1BCEFD03031858000000000000000000233585B0F4FFFFADF1FFFFABF0 679 | FEFFA9EEFDFFA7ECFCFFA5EAFBFFA2E8FAFFA0E6F9FF9DE3F8FF9AE1F7FF98DF 680 | F6FF99E0F7FF0023358500000000000000000000000000000000000000000311 681 | 00551F8B02F1229C02FF229C02FF229C02FF229C02FF229C02FF229C02FF1F8C 682 | 02F204130059000000000000000000000000000000000000000000000000170D 683 | 0155C0690FF1D77610FFD77610FFD77610FFD77610FFD77610FFD77610FFC16A 684 | 0FF21A0E02590000000000000000000000000000000000000000000000000202 685 | 16531818B8F01B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1B1BD1FF1818 686 | BAF10303185700000000000000000000000000131D6200233483002334830023 687 | 3483002334830023348300233483FEFEFDFFF5F5EEFFEBEBDDFFFEC93FFFF4B6 688 | 2CFF0023348300131D6200000000000000000000000000000000000000000000 689 | 00000001001809290184176901D1209002F5209102F6176901D2092A01860001 690 | 0019000000000000000000000000000000000000000000000000000000000000 691 | 000001010018391F0484904F0BD1C76D0FF5C76E0FF692500BD23B2004860201 692 | 0019000000000000000000000000000000000000000000000000000000000000 693 | 0000000001170707368312128AD01919C1F51919C2F612128DD2070738850000 694 | 0118000000000000000000000000000000000000000000000000000000000000 695 | 000000000000000000000004062E002233810022338100223381002233810022 696 | 33810004062E0000000000000000000000000000000000000000000000000000 697 | 0000000000000000000000000000000000000000000000000000000000000000 698 | 0000000000000000000000000000000000000000000000000000000000000000 699 | 0000000000000000000000000000000000000000000000000000000000000000 700 | 0000000000000000000000000000000000000000000000000000000000000000 701 | 0000000000000000000000000000000000000000000000000000000000000000 702 | 0000000000000000000000000000000000000000000000000000000000000000 703 | 0000000000000000000000000000000000000000000000000000000000000000 704 | 000000000000000000000000000000000000424D3E000000000000003E000000 705 | 2800000040000000200000000100010000000000000100000000000000000000 706 | 000000000000000000000000FFFFFF008003C000FFF000008003C000FFE00000 707 | 8003C000E00000008001C000C00000008000C001800000008000C00000010000 708 | 8000C000000300008001C000000300008003C000000100008003C00100030000 709 | 8003C001000300008003C001000300008003C001000300008003C00180070000 710 | 8007C003C00F0000800FC007E01F0000000000000000FFFF000000000000FFFF 711 | 0000000000000003000000000000000100000000000000010000000000000000 712 | 0000000000000000000000000000000000000000000000000000000000000000 713 | 0000000000000003000000000000000300000000000000030000000000000003 714 | 000000000000FC07000000000000FFFF00000000000000000000000000000000 715 | 000000000000} 716 | DesignInfo = 24117648 717 | ImageInfo = < 718 | item 719 | ImageClass = 'TdxSmartImage' 720 | Image.Data = { 721 | 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554 722 | 462D38223F3E0D0A3C7376672076657273696F6E3D22312E31222069643D22D0 723 | A1D0BBD0BED0B95F312220786D6C6E733D22687474703A2F2F7777772E77332E 724 | 6F72672F323030302F7376672220786D6C6E733A786C696E6B3D22687474703A 725 | 2F2F7777772E77332E6F72672F313939392F786C696E6B2220783D2230707822 726 | 20793D22307078222076696577426F783D223020302033322033322220737479 727 | 6C653D22656E61626C652D6261636B67726F756E643A6E657720302030203332 728 | 2033323B2220786D6C3A73706163653D227072657365727665223E262331333B 729 | 262331303B3C7374796C6520747970653D22746578742F6373732220786D6C3A 730 | 73706163653D227072657365727665223E2E57686974657B66696C6C3A234646 731 | 464646463B7D262331333B262331303B2623393B2E477265656E7B66696C6C3A 732 | 233033394332333B7D3C2F7374796C653E0D0A3C672069643D22416464223E0D 733 | 0A09093C636972636C6520636C6173733D22477265656E222063783D22313622 734 | 2063793D2231362220723D223134222F3E0D0A09093C706F6C79676F6E20636C 735 | 6173733D2257686974652220706F696E74733D2232342C31342031382C313420 736 | 31382C382031342C382031342C313420382C313420382C31382031342C313820 737 | 31342C32342031382C32342031382C31382032342C3138202623393B222F3E0D 738 | 0A093C2F673E0D0A3C2F7376673E0D0A} 739 | end 740 | item 741 | ImageClass = 'TdxSmartImage' 742 | Image.Data = { 743 | 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554 744 | 462D38223F3E0D0A3C7376672076657273696F6E3D22312E31222069643D22D0 745 | A1D0BBD0BED0B95F312220786D6C6E733D22687474703A2F2F7777772E77332E 746 | 6F72672F323030302F7376672220786D6C6E733A786C696E6B3D22687474703A 747 | 2F2F7777772E77332E6F72672F313939392F786C696E6B2220783D2230707822 748 | 20793D22307078222076696577426F783D223020302033322033322220737479 749 | 6C653D22656E61626C652D6261636B67726F756E643A6E657720302030203332 750 | 2033323B2220786D6C3A73706163653D227072657365727665223E262331333B 751 | 262331303B3C7374796C6520747970653D22746578742F6373732220786D6C3A 752 | 73706163653D227072657365727665223E2E426C75657B66696C6C3A23313137 753 | 3744373B7D262331333B262331303B2623393B2E57686974657B66696C6C3A23 754 | 4646464646463B7D3C2F7374796C653E0D0A3C672069643D22416464223E0D0A 755 | 09093C636972636C6520636C6173733D22426C7565222063783D223136222063 756 | 793D2231362220723D223134222F3E0D0A09093C7265637420783D2238222079 757 | 3D2231342220636C6173733D225768697465222077696474683D223136222068 758 | 65696768743D2234222F3E0D0A093C2F673E0D0A3C2F7376673E0D0A} 759 | end 760 | item 761 | ImageClass = 'TdxSmartImage' 762 | Image.Data = { 763 | 3C3F786D6C2076657273696F6E3D22312E302220656E636F64696E673D225554 764 | 462D38223F3E0D0A3C7376672076657273696F6E3D22312E31222069643D22D0 765 | A1D0BBD0BED0B95F312220786D6C6E733D22687474703A2F2F7777772E77332E 766 | 6F72672F323030302F7376672220786D6C6E733A786C696E6B3D22687474703A 767 | 2F2F7777772E77332E6F72672F313939392F786C696E6B2220783D2230707822 768 | 20793D22307078222076696577426F783D223020302033322033322220737479 769 | 6C653D22656E61626C652D6261636B67726F756E643A6E657720302030203332 770 | 2033323B2220786D6C3A73706163653D227072657365727665223E262331333B 771 | 262331303B3C7374796C6520747970653D22746578742F6373732220786D6C3A 772 | 73706163653D227072657365727665223E2E57686974657B66696C6C3A234646 773 | 464646463B7D262331333B262331303B2623393B2E5265647B66696C6C3A2344 774 | 31314331433B7D3C2F7374796C653E0D0A3C672069643D22D0A1D0BBD0BED0B9 775 | 5F32223E0D0A09093C7061746820636C6173733D225265642220643D224D3136 776 | 2C3263372E372C302C31342C362E332C31342C313463302C372E372D362E332C 777 | 31342D31342C313453322C32332E372C322C313643322C382E332C382E332C32 778 | 2C31362C327A222F3E0D0A09093C7061746820636C6173733D22576869746522 779 | 20643D224D32342C32326C2D322C326C2D362D366C2D362C366C2D322D326C36 780 | 2D366C2D362D366C322D326C362C366C362D366C322C326C2D362C364C32342C 781 | 32327A222F3E0D0A093C2F673E0D0A3C2F7376673E0D0A} 782 | end 783 | item 784 | Image.Data = { 785 | 36040000424D3604000000000000360000002800000010000000100000000100 786 | 2000000000000004000000000000000000000000000000000000000000000000 787 | 0000000000000000000000000000000000000000000000000000000000000000 788 | 0000000000000000000000000000000000000000000000000000000000000000 789 | 0000000000000000000000000000000000000000000000000000000000000000 790 | 000000000000000000000000000000000000000000000000000000334E8D0044 791 | 68BD004468BD004468BD004468BD004468BD004468BD004468BD004468BD0044 792 | 68BD004468BD004468BD004468BD00334E8D000000000000000000466AB069B7 793 | DAFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CCEDFF82CC 794 | EDFF82CCEDFF82CCEDFF83CDEEFF266F92C9001723400000000000466BA255AA 795 | CEFF80CBEAFF7DC9E9FF7DC9E9FF7DC9E9FF7DC9E9FF7DC9E9FF7DC9E9FF7DC9 796 | E9FF7DC9E9FF7DC9E9FF7DC9E9FF4995B6D9002B426E0000000000476A9D43A1 797 | CBFF8AD3EFFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CDEBFF83CD 798 | EBFF83CDEBFF83CDEBFF83CDEBFF7AC2DFF2003F61930000000100466A9951B0 799 | D7FF85D2EDFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2EEFF89D2 800 | EEFF89D2EEFF89D2EEFF89D2EEFF90D8F1FF165E80AA000D141D00466A9573CA 801 | E8FF74CAE8FF90D8F2FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7F1FF8FD7 802 | F1FF8FD7F1FF8FD7F1FF8FD7F1FF91D8F2FF3B86A5C20022334600466A928FDD 803 | F4FF62C0E5FFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EE 804 | FAFFA8EEFAFFA8EEFAFFA8EEFAFFA8EEFAFF75BCD0DE003A57710046698EA6EC 805 | FCFF63C2E9FF4EB5E2FF4CB4E2FF4BB3E1FF4AB2E0FF48B1DFFF47B0DFFF46AE 806 | DEFF44ADDDFF43ACDDFF45AEDFFF00679AC70044668100334D610046698BABF0 807 | FEFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DCF4FF91D9 808 | F3FF8ED7F1FF8BD4F0FF90D8F3FF0046698B000000000000000000466888ADF1 809 | FFFFA6EBFDFFA4E9FCFFA2E7FBFF9FE5FAFF9CE3F8FF9AE1F7FF97DEF6FF94DC 810 | F4FF91D9F3FF8ED7F1FF93DAF4FF00466888000000000000000000456785B0F4 811 | FFFFADF1FFFFABF0FEFFA9EEFDFFA7ECFCFFA5EAFBFFA2E8FAFFA0E6F9FF9DE3 812 | F8FF9AE1F7FF98DFF6FF99E0F7FF00456785000000000000000000344D620045 813 | 67830045678300456783004567830045678300456783FEFEFDFFF5F5EEFFEBEB 814 | DDFFFEC940FFF4B62DFF0045678300344D620000000000000000000000000000 815 | 0000000000000000000000000000000000000018242E00456781004567810045 816 | 678100456781004567810018242E000000000000000000000000000000000000 817 | 0000000000000000000000000000000000000000000000000000000000000000 818 | 0000000000000000000000000000000000000000000000000000} 819 | Mask.Data = { 820 | 7E000000424D7E000000000000003E0000002800000010000000100000000100 821 | 010000000000400000000000000000000000020000000000000000000000FFFF 822 | FF00FFFF0000FFFF000000030000000100000001000000000000000000000000 823 | 0000000000000000000000030000000300000003000000030000FC070000FFFF 824 | 0000} 825 | end 826 | item 827 | Image.Data = { 828 | 36040000424D3604000000000000360000002800000010000000100000000100 829 | 2000000000000004000000000000000000000000000000000000000000007D79 830 | 79D7969292F5949090F5938F8FF5928E8EF5918D8DF5908C8CF58F8B8BF58E8B 831 | 8BF58E8A8AF58D8989F58D8989F5716D6DD2000000000000000000000000918D 832 | 8DEFFAF6F4FFF7EFECFFF6EDEAFFF6ECE8FFF5EAE7FFF5E9E5FFF4E8E4FFF4E8 833 | E3FFC37B75FFD4B5B0FFF8F1EFFF817D7DE9000000000000000000000000938E 834 | 8EEFF9F3F0FFF5E8E3FFF3E5E0FFF2E2DDFFF1DFD9FFF0DDD6FFEFDAD3FFEED9 835 | D1FFC37662FFD1844EFFCA9A94FF827E7EE90000000000000000000000009490 836 | 90EFFAF5F3FFF6ECE8FFF5EAE5FFCB8C77FFCC8B6EFFCB896DFFCA866CFFC884 837 | 6AFFCB7A52FFE18C5AFFD68750FF95554DF60100000600000000000000009591 838 | 91EFFAF6F4FFF8EFECFFF7EEEAFFCF8156FFE8906FFFED9474FFF09876FFF099 839 | 74FFED956EFFE68C65FFDE835BFFDA8A52FF863A29C306010115000000009692 840 | 92EFFAF6F4FFF9F1EEFFF8F0EDFFCF8255FFE08469FFE78B6FFFED9274FFF096 841 | 76FFF09675FFED936FFFE78C66FFDF835AFFDF9455FF7A2C22BA000000009793 842 | 93EFFAF6F4FFF9F1EEFFF9F1EEFFCF8355FFD97D62FFE08669FFE78E6FFFED95 843 | 73FFF09876FFF09675FFED936FFFE59660FF843B28BD06010113000000009994 844 | 94EFFAF6F4FFF9F1EEFFF9F1EEFFD29881FFD19474FFD09375FFD09274FFCF91 845 | 74FFD18556FFF19E75FFE49762FF9A6052F60000000400000000000000009A95 846 | 95EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0 847 | EDFFD08A6CFFDB9058FFD4ACA2FF868383E90000000000000000000000009A96 848 | 96EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1 849 | EEFFD29380FFDEC5BDFFFAF5F3FF878383E90000000000000000000000009B97 850 | 97EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1 851 | EEFFF8F0EDFFF8F0EDFFFAF6F4FF888484E90000000000000000000000009B98 852 | 98EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF8F0 853 | EDFFEEE6E3FFE4DCDAFFE7E4E2FF858282E90000000000000000000000009C99 854 | 99EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF7EF 855 | ECFFA5A0A0FF9E9A9AFF999595FF827D7DE10000000000000000000000009D99 856 | 99EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF7EF 857 | ECFFA19D9DFFD3D1D2FF908C8CEE1F1F1F340000000000000000000000009E9A 858 | 9AEFFBF9F8FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF5 859 | F4FFA19C9CFF918E8EEE201F1F34000000000000000000000000000000008783 860 | 83D29E9A9AEF9D9999EF9C9999EF9B9898EF9B9797EF9A9696EF9A9595EF9994 861 | 94EF888383E12120203400000000000000000000000000000000} 862 | Mask.Data = { 863 | 7E000000424D7E000000000000003E0000002800000010000000100000000100 864 | 010000000000400000000000000000000000020000000000000000000000FFFF 865 | FF00800300008003000080030000800100008000000080000000800000008001 866 | 000080030000800300008003000080030000800300008003000080070000800F 867 | 0000} 868 | end 869 | item 870 | Image.Data = { 871 | 36040000424D3604000000000000360000002800000010000000100000000100 872 | 2000000000000004000000000000000000000000000000000000000000000000 873 | 00007D7979D7969292F5949090F5938F8FF5928E8EF5C5C3C3FA4F4D8AFB403F 874 | 9DFDC3C2C2FA8E8A8AF5C3C1C1FA3E3D91FD403E79ED78787878000000000000 875 | 0000918D8DEFFAF6F4FFF7EFECFFF6EDEAFFFAF5F3FF7874B1FF5454D3FF6363 876 | E1FF514FAEFFF9F3F0FF5350A7FF4545CFFF4242C9FF13134D99000000000000 877 | 0000938E8EEFF9F3F0FFF5E8E3FFF3E5E0FFF8F0EDFF5955B1FF5A5AD8FF6F6F 878 | E6FF6868E8FF3D3CB8FF5050D8FF4343CDFF4545CEFF1E1E74C5000000000000 879 | 0000949090EFFAF5F3FFF6ECE8FFF5EAE5FFF4E7E2FFF9F1EEFF5854B2FF6464 880 | E3FF7676F0FF6B6BEDFF5555DBFF4747D0FF3B3A95FA78787878000000000000 881 | 0000959191EFFAF6F4FFF8EFECFFF7EEEAFFF6EBE7FFF5E9E4FFF9F2EFFF4140 882 | C0FF7474F1FF6C6CEBFF5858DFFF3B3AB6FFBCBABAF300000000000000000000 883 | 0000969292EFFAF6F4FFF9F1EEFFF8F0EDFFF8EFEBFFFBF5F3FF5956B5FF6464 884 | E3FF7676F0FF6B6BEDFF5555DBFF4747D1FF3B3A99FB78787878000000000000 885 | 0000979393EFFAF6F4FFF9F1EEFFF9F1EEFFFCF7F5FF5D5BBAFF5A5AD9FF6F6F 886 | E6FF6868E9FF4040C0FF5151D9FF4343CDFF4545D0FF20207EC9000000000000 887 | 0000999494EFFAF6F4FFF9F1EEFFF9F1EEFFFCF8F6FF7B78BCFF5555D7FF6363 888 | E2FF5957BBFFFAF4F2FF5855B4FF4646D2FF4343CDFF13134F92000000000000 889 | 00009A9595EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFFCF8F6FF7B78BCFF5D5B 890 | BEFFFBF7F5FFF8EFEBFFFBF5F3FF5B5AB7FF4D4B8AF678787878000000000000 891 | 00009A9696EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFFCF8F6FFFCF8 892 | F6FFF9F1EEFFF9F0EDFFF8F0ECFFFCFAF9FFBFBDBDF300000000000000000000 893 | 00009B9797EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1 894 | EEFFF9F1EEFFF8F0EDFFF8F0EDFFFAF6F4FF888484E900000000000000000000 895 | 00009B9898EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1 896 | EEFFF8F0EDFFEEE6E3FFE4DCDAFFE7E4E2FF858282E900000000000000000000 897 | 00009C9999EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1 898 | EEFFF7EFECFFA5A0A0FF9E9A9AFF999595FF827D7DE100000000000000000000 899 | 00009D9999EFFAF6F4FFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1EEFFF9F1 900 | EEFFF7EFECFFA19D9DFFD3D1D2FF908C8CEE1F1F1F3400000000000000000000 901 | 00009E9A9AEFFBF9F8FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6F4FFFAF6 902 | F4FFFAF5F4FFA19C9CFF918E8EEE201F1F340000000000000000000000000000 903 | 0000878383D29E9A9AEF9D9999EF9C9999EF9B9898EF9B9797EF9A9696EF9A95 904 | 95EF999494EF888383E121202034000000000000000000000000} 905 | Mask.Data = { 906 | 7E000000424D7E000000000000003E0000002800000010000000100000000100 907 | 010000000000400000000000000000000000020000000000000000000000FFFF 908 | FF00C0000000C0000000C0000000C0000000C0010000C0000000C0000000C000 909 | 0000C0000000C0010000C0010000C0010000C0010000C0010000C0030000C007 910 | 0000} 911 | end 912 | item 913 | Image.Data = { 914 | 36040000424D3604000000000000360000002800000010000000100000000100 915 | 2000000000000004000000000000000000000000000000000000000000000000 916 | 0000000000000000000000000000000000000000000000000000000000000000 917 | 0000000000000000000005467981026ED8E8005CB9C7031C3034000000000000 918 | 0000000000000000000000000000000000000000000000000000000000000000 919 | 000000000000104E7A8519A6F5FF4DF5FDFF33C6F9FF005AB7C5000000000000 920 | 0000000000000C0B0B134C49497E737070CA8B8887F28C8787F4737070CE4D4C 921 | 4D857A7B7DAF66B2D8FF4CF5FEFF37D8FDFF31CAFCFF0472DFEF000000000000 922 | 00003130304C8D8A8AECB6B1B2FFC2BDBDFFBEB8B9FFB7B0B1FFB0A9AAFFA39D 923 | 9EFFA6A1A1FFE8E6E6FF78CADDFF2FC9FCFF18A1F6FF034F919B000000003230 924 | 304BA39F9FFBDDDADAFFD4D0D0FFB0ACACFF9F9B9BFF9C9797FFA29C9DFFAFA8 925 | A9FFB0A9AAFFACA8A8FFD1CDCDFF62ACD6FF0958949F000101020B0B0B11938E 926 | 8EEAECE9E9FFD7D3D3FF9F9B9AF9B2ACA3D9B9B1A4C7B9B1A5C7B0ABA5D89893 927 | 93F8A9A3A3FFB0A9AAFFA4A0A0FF7F8184B901010203000000004E4B4B77CECA 928 | CBFFF0EDEEFFA29E9CF9BBAF98C7BDA881BFBEA985BFBEAB8DBFBDAD93BFBAB2 929 | A5C6989393F8AFA8A9FFA49E9EFF4E4E508A00000000000000007A7676C2EEEB 930 | EBFFC9C6C6FFB7AE9DDDC3AA75C5BFA46FC0BEA679BFBEA985BFBEAB8DBFBDAD 931 | 92BFB1ABA4D8A19C9CFFB1AAABFF767373D50000000000000000918E8EE8EFEC 932 | ECFFB3AFAFFFC4B592D1CEB379CFC3A669C4BEA26CBFBEA679BFBEA985BFBEAB 933 | 8DBFBAB1A3C79C9797FFB7B0B1FF918C8CFB0000000100000000928E8EE8E1DE 934 | DEFFB0ACACFFC7B793D4DFCA9FDFD4BD8BD5C2A568C3BEA26CBFBEA679BFBEA9 935 | 85BFBAB1A1C79F9A9AFFBEB8B9FF938E8EFB00000000000000007B7777C1CDC9 936 | C9FFBCB7B7FFBCB19AE1E6D7B5E7EDE1CAEDD5BE8DD6C3A66BC4BFA46FC0BDA7 937 | 7EBFB2ABA0D8AFABABFFC4BEBFFF7A7777D400000000000000004C4A4A75B5B0 938 | B0FFCCC7C7FFA6A09DF9CFC29FDBE6D7B6E7E0CCA2E0CFB67DD0C5AB74C6BCAE 939 | 91C79F9B99F8D3CFCFFFB9B4B5FF5250508900000000000000000A0A0A109590 940 | 90E9C1BDBDFFC2BDBDFFA6A09DF9BEB298E2C9B78FD5C6B58DD2B8AD98DDA29D 941 | 9BF8D5D2D2FFDFDCDCFF948F8FF21010101A0000000000000000000000002F2E 942 | 2E48A39E9EFAC1BDBDFFCCC7C7FFBBB7B7FFB0ACACFFB2AFAEFFC8C5C5FFF0ED 943 | EDFFEEEBEBFFA8A4A4FD38363658000000000000000000000000000000000000 944 | 00002F2E2E48959191EAB5B1B1FFCECACAFFE1DEDEFFEFECECFFF1EFEFFFD2CF 945 | CFFF989594F03938385700000000000000000000000000000000000000000000 946 | 0000000000000B0B0B114F4D4D797D7A7AC7999494EF999595F07F7B7BCB5654 947 | 53800F0F0F160000000000000000000000000000000000000000} 948 | Mask.Data = { 949 | 7E000000424D7E000000000000003E0000002800000010000000100000000100 950 | 010000000000400000000000000000000000020000000000000000000000FFFF 951 | FF00FFF00000FFE00000E0000000C00000008000000000010000000300000003 952 | 0000000100000003000000030000000300000003000080070000C00F0000E01F 953 | 0000} 954 | end> 955 | end 956 | end 957 | -------------------------------------------------------------------------------- /DxAutoInstaller.dproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | {5FC1B1D2-CCEA-4C74-B248-EADD6A5E7EBB} 4 | 19.5 5 | VCL 6 | DxAutoInstaller.dpr 7 | True 8 | Release 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 | true 44 | Cfg_2 45 | true 46 | true 47 | 48 | 49 | F:\Codes\JCL\source\common;F:\Codes\JCL\source\include;F:\Codes\JCL\source\windows;$(DCC_UnitSearchPath) 50 | $(BDS)\bin\default_app.manifest 51 | true 52 | 2 53 | 3 54 | 8 55 | CompanyName=;FileDescription=;FileVersion=2.3.8.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=2.3;Comments= 56 | 1033 57 | DxAutoInstaller 58 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 59 | $(BDS)\bin\delphi_PROJECTICON.ico 60 | $(Temp)\DxAutoInstaller 61 | .\Bin 62 | false 63 | false 64 | false 65 | false 66 | false 67 | 68 | 69 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 70 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 71 | Resources\DxAutoInstaller.ico 72 | dxPScxSchedulerLnkRS21;cxSchedulerRibbonStyleEventEditorRS21;cxSchedulerRS21;FireDACPgDriver;dxSkinOffice2007BlueRS21;cxTreeListdxBarPopupMenuRS21;dxSkinHighContrastRS21;cxPivotGridRS21;dxSkinSevenRS21;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;dxGaugeControlRS21;cxEditorsRS21;DbxCommonDriver;vclimg;cxPivotGridOLAPRS21;dxPsPrVwAdvRS21;dbxcds;dxTileControlRS21;DatasnapConnectorsFreePascal;dxSkinSilverRS21;dxSkinMoneyTwinsRS21;vcldb;cxTreeListRS21;dxdborRS21;dxBarExtItemsRS21;dxWizardControlRS21;dxSkinBlueprintRS21;CustomIPTransport;dsnap;IndyIPServer;dxSkinOffice2010BlackRS21;IndyCore;dxSkinsdxBarPainterRS21;dxSkinValentineRS21;CloudService;dxSkinDevExpressStyleRS21;FmxTeeUI;FireDACIBDriver;dxSkinCaramelRS21;dxPScxPCProdRS21;dxSkinOffice2013DarkGrayRS21;dxDockingRS21;dxLayoutControlRS21;dsnapxml;FireDACDb2Driver;dxSkinscxSchedulerPainterRS21;dxPSLnksRS21;dxPSdxDBOCLnkRS21;dxSkinVS2010RS21;cxLibraryRS21;bindcompfmx;cxDataRS21;dxComnRS21;FireDACODBCDriver;RESTBackendComponents;dxSkinBlackRS21;dxSkinDarkSideRS21;dbrtl;FireDACCommon;bindcomp;inetdb;dxPScxTLLnkRS21;DBXOdbcDriver;vclFireDAC;xmlrtl;ibxpress;cxExportRS21;FireDACCommonDriver;dxSkinOffice2007PinkRS21;dxFlowChartRS21;bindengine;vclactnband;soaprtl;FMXTee;bindcompvcl;cxPageControlRS21;dxCoreRS21;vclie;dcldxSkinsCoreRS21;dxSkinOffice2007BlackRS21;dxPSCoreRS21;dxPSdxDBTVLnkRS21;dxPScxCommonRS21;dxADOServerModeRS21;FireDACMSSQLDriver;DBXInformixDriver;dxSkinLilianRS21;dxSkinWhiteprintRS21;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;dxNavBarRS21;inet;dxRibbonRS21;dxSkinsdxNavBarPainterRS21;FireDACMySQLDriver;soapmidas;vclx;dxSkinOffice2013WhiteRS21;cxBarEditItemRS21;dxSkinsCoreRS21;DBXSybaseASADriver;dxFireDACServerModeRS21;dxSkinSharpPlusRS21;RESTComponents;dbexpress;dxSkinSevenClassicRS21;IndyIPClient;dxThemeRS21;FireDACSqliteDriver;dxSkinBlueRS21;FireDACDSDriver;dxDBXServerModeRS21;DBXSqliteDriver;dxSkinsdxDLPainterRS21;fmx;dxSkinMetropolisDarkRS21;cxVerticalGridRS21;IndySystem;dxSpreadSheetRS21;TeeDB;tethering;dxSkinMetropolisRS21;dxSkinGlassOceansRS21;vclib;dxSkinSummer2008RS21;DataSnapClient;dxPScxPivotGridLnkRS21;DataSnapProviderClient;dxPSPrVwRibbonRS21;DBXSybaseASEDriver;cxGridRS21;MetropolisUILiveTile;vcldsnap;dxSpellCheckerRS21;dxSkinLondonLiquidSkyRS21;dxSkinMcSkinRS21;dxSkinOffice2010SilverRS21;dxSkinOffice2007GreenRS21;fmxFireDAC;DBXDb2Driver;dxSkinFoggyRS21;DBXOracleDriver;vclribbon;dxtrmdRS21;fmxase;vcl;dxBarExtDBItemsRS21;dxGDIPlusRS21;DBXMSSQLDriver;IndyIPCommon;dxSkinOffice2007SilverRS21;DataSnapFireDAC;FireDACDBXDriver;dxSkinStardustRS21;dxPSdxSpreadSheetLnkRS21;soapserver;dxdbtrRS21;inetdbxpress;FireDACInfxDriver;dxSkinCoffeeRS21;dxPScxGridLnkRS21;dxPSdxFCLnkRS21;adortl;FireDACASADriver;dxTabbedMDIRS21;emsclientfiredac;rtl;dxPSdxOCLnkRS21;DbxClientDriver;dxorgcRS21;dxPScxExtCommonRS21;dxSkinDarkRoomRS21;Tee;dxPSdxLCLnkRS21;dxMapControlRS21;DataSnapNativeClient;svnui;dxSkinSpringTimeRS21;IndyProtocols;DBXMySQLDriver;cxPivotGridChartRS21;dxSkinOffice2013LightGrayRS21;dxSkinPumpkinRS21;bindcompdbx;TeeUI;cxSchedulerTreeBrowserRS21;dxmdsRS21;dxSkinDevExpressDarkStyleRS21;dxSkinSharpRS21;FireDACADSDriver;vcltouch;dxSkinscxPCPainterRS21;dxServerModeRS21;emsclient;dxSkinsdxRibbonPainterRS21;VCLRESTComponents;FireDAC;VclSmp;dxBarDBNavRS21;dxSkinTheAsphaltWorldRS21;dxSkinXmas2008BlueRS21;DataSnapConnectors;dxSkinLiquidSkyRS21;cxSchedulerGridRS21;fmxobj;dxPScxVGridLnkRS21;svn;dxBarRS21;FireDACOracleDriver;fmxdae;dxSkinOffice2010BlueRS21;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dxSkiniMaginaryRS21;$(DCC_UsePackage) 73 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 74 | PerMonitorV2 75 | 76 | 77 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 78 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 79 | dxPScxSchedulerLnkRS21;cxSchedulerRibbonStyleEventEditorRS21;cxSchedulerRS21;FireDACPgDriver;dxSkinOffice2007BlueRS21;cxTreeListdxBarPopupMenuRS21;dxSkinHighContrastRS21;cxPivotGridRS21;dxSkinSevenRS21;DBXInterBaseDriver;DataSnapServer;DataSnapCommon;dxGaugeControlRS21;cxEditorsRS21;DbxCommonDriver;vclimg;cxPivotGridOLAPRS21;dxPsPrVwAdvRS21;dbxcds;dxTileControlRS21;DatasnapConnectorsFreePascal;dxSkinSilverRS21;dxSkinMoneyTwinsRS21;vcldb;cxTreeListRS21;dxdborRS21;dxBarExtItemsRS21;dxWizardControlRS21;dxSkinBlueprintRS21;CustomIPTransport;dsnap;IndyIPServer;dxSkinOffice2010BlackRS21;IndyCore;dxSkinsdxBarPainterRS21;dxSkinValentineRS21;CloudService;dxSkinDevExpressStyleRS21;FmxTeeUI;FireDACIBDriver;dxSkinCaramelRS21;dxPScxPCProdRS21;dxSkinOffice2013DarkGrayRS21;dxDockingRS21;dxLayoutControlRS21;dsnapxml;FireDACDb2Driver;dxSkinscxSchedulerPainterRS21;dxPSLnksRS21;dxPSdxDBOCLnkRS21;dxSkinVS2010RS21;cxLibraryRS21;bindcompfmx;cxDataRS21;dxComnRS21;FireDACODBCDriver;RESTBackendComponents;dxSkinBlackRS21;dxSkinDarkSideRS21;dbrtl;FireDACCommon;bindcomp;inetdb;dxPScxTLLnkRS21;DBXOdbcDriver;vclFireDAC;xmlrtl;ibxpress;cxExportRS21;FireDACCommonDriver;dxSkinOffice2007PinkRS21;dxFlowChartRS21;bindengine;vclactnband;soaprtl;FMXTee;bindcompvcl;cxPageControlRS21;dxCoreRS21;vclie;dcldxSkinsCoreRS21;dxSkinOffice2007BlackRS21;dxPSCoreRS21;dxPSdxDBTVLnkRS21;dxPScxCommonRS21;dxADOServerModeRS21;FireDACMSSQLDriver;DBXInformixDriver;dxSkinLilianRS21;dxSkinWhiteprintRS21;DataSnapServerMidas;dsnapcon;DBXFirebirdDriver;dxNavBarRS21;inet;dxRibbonRS21;dxSkinsdxNavBarPainterRS21;FireDACMySQLDriver;soapmidas;vclx;dxSkinOffice2013WhiteRS21;cxBarEditItemRS21;dxSkinsCoreRS21;DBXSybaseASADriver;dxFireDACServerModeRS21;dxSkinSharpPlusRS21;RESTComponents;dbexpress;dxSkinSevenClassicRS21;IndyIPClient;dxThemeRS21;FireDACSqliteDriver;dxSkinBlueRS21;FireDACDSDriver;dxDBXServerModeRS21;DBXSqliteDriver;dxSkinsdxDLPainterRS21;fmx;dxSkinMetropolisDarkRS21;cxVerticalGridRS21;IndySystem;dxSpreadSheetRS21;TeeDB;tethering;dxSkinMetropolisRS21;dxSkinGlassOceansRS21;vclib;dxSkinSummer2008RS21;DataSnapClient;dxPScxPivotGridLnkRS21;DataSnapProviderClient;dxPSPrVwRibbonRS21;DBXSybaseASEDriver;cxGridRS21;MetropolisUILiveTile;vcldsnap;dxSpellCheckerRS21;dxSkinLondonLiquidSkyRS21;dxSkinMcSkinRS21;dxSkinOffice2010SilverRS21;dxSkinOffice2007GreenRS21;fmxFireDAC;DBXDb2Driver;dxSkinFoggyRS21;DBXOracleDriver;vclribbon;dxtrmdRS21;fmxase;vcl;dxBarExtDBItemsRS21;dxGDIPlusRS21;DBXMSSQLDriver;IndyIPCommon;dxSkinOffice2007SilverRS21;DataSnapFireDAC;FireDACDBXDriver;dxSkinStardustRS21;dxPSdxSpreadSheetLnkRS21;soapserver;dxdbtrRS21;inetdbxpress;FireDACInfxDriver;dxSkinCoffeeRS21;dxPScxGridLnkRS21;dxPSdxFCLnkRS21;adortl;FireDACASADriver;dxTabbedMDIRS21;emsclientfiredac;rtl;dxPSdxOCLnkRS21;DbxClientDriver;dxorgcRS21;dxPScxExtCommonRS21;dxSkinDarkRoomRS21;Tee;dxPSdxLCLnkRS21;dxMapControlRS21;DataSnapNativeClient;dxSkinSpringTimeRS21;IndyProtocols;DBXMySQLDriver;cxPivotGridChartRS21;dxSkinOffice2013LightGrayRS21;dxSkinPumpkinRS21;bindcompdbx;TeeUI;cxSchedulerTreeBrowserRS21;dxmdsRS21;dxSkinDevExpressDarkStyleRS21;dxSkinSharpRS21;FireDACADSDriver;vcltouch;dxSkinscxPCPainterRS21;dxServerModeRS21;emsclient;dxSkinsdxRibbonPainterRS21;VCLRESTComponents;FireDAC;VclSmp;dxBarDBNavRS21;dxSkinTheAsphaltWorldRS21;dxSkinXmas2008BlueRS21;DataSnapConnectors;dxSkinLiquidSkyRS21;cxSchedulerGridRS21;fmxobj;dxPScxVGridLnkRS21;dxBarRS21;FireDACOracleDriver;fmxdae;dxSkinOffice2010BlueRS21;FireDACMSAccDriver;DataSnapIndy10ServerTransport;dxSkiniMaginaryRS21;$(DCC_UsePackage) 80 | 81 | 82 | DEBUG;$(DCC_Define) 83 | true 84 | false 85 | true 86 | true 87 | true 88 | 89 | 90 | false 91 | 92 | 93 | false 94 | RELEASE;$(DCC_Define) 95 | 0 96 | 0 97 | 98 | 99 | Debug 100 | 101 | 102 | 103 | MainSource 104 | 105 | 106 |
MainForm
107 | dfm 108 |
109 | 110 | 111 | 112 | 113 | 114 | 115 |
DxProgressForm
116 | dfm 117 |
118 | 119 |
DxResourceModule
120 | dfm 121 | TDataModule 122 |
123 | 124 | 125 | ResourceItem 126 | RCDATA 127 | Profile 128 | 129 | 130 | ResourceItem 131 | RCDATA 132 | Readme 133 | 134 | 135 | ResourceItem 136 | RCDATA 137 | IconVCL 138 | 139 | 140 | Base 141 | 142 | 143 | Cfg_1 144 | Base 145 | 146 | 147 | Cfg_2 148 | Base 149 | 150 |
151 | 152 | Delphi.Personality.12 153 | Application 154 | 155 | 156 | 157 | DxAutoInstaller.dpr 158 | 159 | 160 | Microsoft Office 2000 Sample Automation Server Wrapper Components 161 | Microsoft Office XP Sample Automation Server Wrapper Components 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 1 175 | 176 | 177 | Contents\MacOS 178 | 1 179 | 180 | 181 | 0 182 | 183 | 184 | 185 | 186 | classes 187 | 64 188 | 189 | 190 | classes 191 | 64 192 | 193 | 194 | 195 | 196 | res\xml 197 | 1 198 | 199 | 200 | res\xml 201 | 1 202 | 203 | 204 | 205 | 206 | library\lib\armeabi-v7a 207 | 1 208 | 209 | 210 | 211 | 212 | library\lib\armeabi 213 | 1 214 | 215 | 216 | library\lib\armeabi 217 | 1 218 | 219 | 220 | 221 | 222 | library\lib\armeabi-v7a 223 | 1 224 | 225 | 226 | 227 | 228 | library\lib\mips 229 | 1 230 | 231 | 232 | library\lib\mips 233 | 1 234 | 235 | 236 | 237 | 238 | library\lib\armeabi-v7a 239 | 1 240 | 241 | 242 | library\lib\arm64-v8a 243 | 1 244 | 245 | 246 | 247 | 248 | library\lib\armeabi-v7a 249 | 1 250 | 251 | 252 | 253 | 254 | res\drawable 255 | 1 256 | 257 | 258 | res\drawable 259 | 1 260 | 261 | 262 | 263 | 264 | res\values 265 | 1 266 | 267 | 268 | res\values 269 | 1 270 | 271 | 272 | 273 | 274 | res\values-v21 275 | 1 276 | 277 | 278 | res\values-v21 279 | 1 280 | 281 | 282 | 283 | 284 | res\values 285 | 1 286 | 287 | 288 | res\values 289 | 1 290 | 291 | 292 | 293 | 294 | res\drawable 295 | 1 296 | 297 | 298 | res\drawable 299 | 1 300 | 301 | 302 | 303 | 304 | res\drawable-xxhdpi 305 | 1 306 | 307 | 308 | res\drawable-xxhdpi 309 | 1 310 | 311 | 312 | 313 | 314 | res\drawable-xxxhdpi 315 | 1 316 | 317 | 318 | res\drawable-xxxhdpi 319 | 1 320 | 321 | 322 | 323 | 324 | res\drawable-ldpi 325 | 1 326 | 327 | 328 | res\drawable-ldpi 329 | 1 330 | 331 | 332 | 333 | 334 | res\drawable-mdpi 335 | 1 336 | 337 | 338 | res\drawable-mdpi 339 | 1 340 | 341 | 342 | 343 | 344 | res\drawable-hdpi 345 | 1 346 | 347 | 348 | res\drawable-hdpi 349 | 1 350 | 351 | 352 | 353 | 354 | res\drawable-xhdpi 355 | 1 356 | 357 | 358 | res\drawable-xhdpi 359 | 1 360 | 361 | 362 | 363 | 364 | res\drawable-mdpi 365 | 1 366 | 367 | 368 | res\drawable-mdpi 369 | 1 370 | 371 | 372 | 373 | 374 | res\drawable-hdpi 375 | 1 376 | 377 | 378 | res\drawable-hdpi 379 | 1 380 | 381 | 382 | 383 | 384 | res\drawable-xhdpi 385 | 1 386 | 387 | 388 | res\drawable-xhdpi 389 | 1 390 | 391 | 392 | 393 | 394 | res\drawable-xxhdpi 395 | 1 396 | 397 | 398 | res\drawable-xxhdpi 399 | 1 400 | 401 | 402 | 403 | 404 | res\drawable-xxxhdpi 405 | 1 406 | 407 | 408 | res\drawable-xxxhdpi 409 | 1 410 | 411 | 412 | 413 | 414 | res\drawable-small 415 | 1 416 | 417 | 418 | res\drawable-small 419 | 1 420 | 421 | 422 | 423 | 424 | res\drawable-normal 425 | 1 426 | 427 | 428 | res\drawable-normal 429 | 1 430 | 431 | 432 | 433 | 434 | res\drawable-large 435 | 1 436 | 437 | 438 | res\drawable-large 439 | 1 440 | 441 | 442 | 443 | 444 | res\drawable-xlarge 445 | 1 446 | 447 | 448 | res\drawable-xlarge 449 | 1 450 | 451 | 452 | 453 | 454 | res\values 455 | 1 456 | 457 | 458 | res\values 459 | 1 460 | 461 | 462 | 463 | 464 | 1 465 | 466 | 467 | Contents\MacOS 468 | 1 469 | 470 | 471 | 0 472 | 473 | 474 | 475 | 476 | Contents\MacOS 477 | 1 478 | .framework 479 | 480 | 481 | Contents\MacOS 482 | 1 483 | .framework 484 | 485 | 486 | Contents\MacOS 487 | 1 488 | .framework 489 | 490 | 491 | 0 492 | 493 | 494 | 495 | 496 | 1 497 | .dylib 498 | 499 | 500 | 1 501 | .dylib 502 | 503 | 504 | 1 505 | .dylib 506 | 507 | 508 | Contents\MacOS 509 | 1 510 | .dylib 511 | 512 | 513 | Contents\MacOS 514 | 1 515 | .dylib 516 | 517 | 518 | Contents\MacOS 519 | 1 520 | .dylib 521 | 522 | 523 | 0 524 | .dll;.bpl 525 | 526 | 527 | 528 | 529 | 1 530 | .dylib 531 | 532 | 533 | 1 534 | .dylib 535 | 536 | 537 | 1 538 | .dylib 539 | 540 | 541 | Contents\MacOS 542 | 1 543 | .dylib 544 | 545 | 546 | Contents\MacOS 547 | 1 548 | .dylib 549 | 550 | 551 | Contents\MacOS 552 | 1 553 | .dylib 554 | 555 | 556 | 0 557 | .bpl 558 | 559 | 560 | 561 | 562 | 0 563 | 564 | 565 | 0 566 | 567 | 568 | 0 569 | 570 | 571 | 0 572 | 573 | 574 | 0 575 | 576 | 577 | Contents\Resources\StartUp\ 578 | 0 579 | 580 | 581 | Contents\Resources\StartUp\ 582 | 0 583 | 584 | 585 | Contents\Resources\StartUp\ 586 | 0 587 | 588 | 589 | 0 590 | 591 | 592 | 593 | 594 | 1 595 | 596 | 597 | 1 598 | 599 | 600 | 601 | 602 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 603 | 1 604 | 605 | 606 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 607 | 1 608 | 609 | 610 | 611 | 612 | ..\ 613 | 1 614 | 615 | 616 | ..\ 617 | 1 618 | 619 | 620 | ..\ 621 | 1 622 | 623 | 624 | 625 | 626 | Contents 627 | 1 628 | 629 | 630 | Contents 631 | 1 632 | 633 | 634 | Contents 635 | 1 636 | 637 | 638 | 639 | 640 | Contents\Resources 641 | 1 642 | 643 | 644 | Contents\Resources 645 | 1 646 | 647 | 648 | Contents\Resources 649 | 1 650 | 651 | 652 | 653 | 654 | library\lib\armeabi-v7a 655 | 1 656 | 657 | 658 | library\lib\arm64-v8a 659 | 1 660 | 661 | 662 | 1 663 | 664 | 665 | 1 666 | 667 | 668 | 1 669 | 670 | 671 | 1 672 | 673 | 674 | Contents\MacOS 675 | 1 676 | 677 | 678 | Contents\MacOS 679 | 1 680 | 681 | 682 | Contents\MacOS 683 | 1 684 | 685 | 686 | 0 687 | 688 | 689 | 690 | 691 | library\lib\armeabi-v7a 692 | 1 693 | 694 | 695 | 696 | 697 | 1 698 | 699 | 700 | 1 701 | 702 | 703 | 704 | 705 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 706 | 1 707 | 708 | 709 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 710 | 1 711 | 712 | 713 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 714 | 1 715 | 716 | 717 | 718 | 719 | ..\ 720 | 1 721 | 722 | 723 | ..\ 724 | 1 725 | 726 | 727 | ..\ 728 | 1 729 | 730 | 731 | 732 | 733 | 1 734 | 735 | 736 | 1 737 | 738 | 739 | 1 740 | 741 | 742 | 743 | 744 | ..\$(PROJECTNAME).launchscreen 745 | 64 746 | 747 | 748 | ..\$(PROJECTNAME).launchscreen 749 | 64 750 | 751 | 752 | 753 | 754 | 1 755 | 756 | 757 | 1 758 | 759 | 760 | 1 761 | 762 | 763 | 764 | 765 | Assets 766 | 1 767 | 768 | 769 | Assets 770 | 1 771 | 772 | 773 | 774 | 775 | Assets 776 | 1 777 | 778 | 779 | Assets 780 | 1 781 | 782 | 783 | 784 | 785 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 786 | 1 787 | 788 | 789 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 790 | 1 791 | 792 | 793 | 794 | 795 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 796 | 1 797 | 798 | 799 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 800 | 1 801 | 802 | 803 | 804 | 805 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 806 | 1 807 | 808 | 809 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 810 | 1 811 | 812 | 813 | 814 | 815 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 816 | 1 817 | 818 | 819 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 820 | 1 821 | 822 | 823 | 824 | 825 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 826 | 1 827 | 828 | 829 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 830 | 1 831 | 832 | 833 | 834 | 835 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 836 | 1 837 | 838 | 839 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 840 | 1 841 | 842 | 843 | 844 | 845 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 846 | 1 847 | 848 | 849 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 850 | 1 851 | 852 | 853 | 854 | 855 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 856 | 1 857 | 858 | 859 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 860 | 1 861 | 862 | 863 | 864 | 865 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 866 | 1 867 | 868 | 869 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 870 | 1 871 | 872 | 873 | 874 | 875 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 876 | 1 877 | 878 | 879 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 880 | 1 881 | 882 | 883 | 884 | 885 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 886 | 1 887 | 888 | 889 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 890 | 1 891 | 892 | 893 | 894 | 895 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 896 | 1 897 | 898 | 899 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 900 | 1 901 | 902 | 903 | 904 | 905 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 906 | 1 907 | 908 | 909 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 910 | 1 911 | 912 | 913 | 914 | 915 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 916 | 1 917 | 918 | 919 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 920 | 1 921 | 922 | 923 | 924 | 925 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 926 | 1 927 | 928 | 929 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 930 | 1 931 | 932 | 933 | 934 | 935 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 936 | 1 937 | 938 | 939 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 940 | 1 941 | 942 | 943 | 944 | 945 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 946 | 1 947 | 948 | 949 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 950 | 1 951 | 952 | 953 | 954 | 955 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 956 | 1 957 | 958 | 959 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 960 | 1 961 | 962 | 963 | 964 | 965 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 966 | 1 967 | 968 | 969 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 970 | 1 971 | 972 | 973 | 974 | 975 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 976 | 1 977 | 978 | 979 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 980 | 1 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | True 998 | False 999 | 1000 | 1001 | 12 1002 | 1003 | 1004 | 1005 | 1006 |
1007 | --------------------------------------------------------------------------------