├── 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 |
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 |
--------------------------------------------------------------------------------
/Resources/Images/IconVCL-2024.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/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 |
107 | dfm
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 | dfm
117 |
118 |
119 |
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 |
--------------------------------------------------------------------------------