├── MAKE_RELEASE.bat ├── Readme.md ├── clean_DCU.bat ├── doc_img ├── di_browsing_path.png ├── di_env.png ├── di_general.png ├── di_lib_path.png └── di_packages.png ├── images ├── Icons.axicp ├── Main.ico ├── VirusTotal.png ├── explorer.png └── text-preview.png └── src ├── DELI.ConOut.pas ├── DELI.FormMain.dfm ├── DELI.FormMain.pas ├── DELI.FormTextPreview.dfm ├── DELI.FormTextPreview.pas ├── DELI.PROCS.pas ├── DELI.Types.pas ├── DelphiInfo.dpr ├── DelphiInfo.dproj └── DelphiInfo.res /MAKE_RELEASE.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | set ArchFile=DelphiInfo.zip 4 | 5 | if exist %ArchFile% del %ArchFile% 6 | 7 | 7z a %ArchFile% DelphiInfo.32.exe DelphiInfo.64.exe RegJump.exe 8 | -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # DelphiInfo 2 | 3 | ## Overview 4 | 5 | The program displays detailed information about the installed versions of the Delphi environment. 6 | 7 | Supported versions: Borland Delphi 7 - Embarcadero Delphi 11.0 Alexandria 8 | 9 | The program is not finished yet, but is already working. 10 | 11 | Compiled binaries (32 & 64-bit): 12 | 13 | ## Icons 14 | 15 | Some icons created with Axialis **IconGenerator** from [Axialis](https://www.axialis.com/icongenerator/) 16 | License: [Free License with Attribution (CC BY-ND 4.0)](https://www.axialis.com/icongenerator/iconset-license.html#free) 17 | 18 | ## Compilation 19 | 20 | You need: 21 | 22 | * [JCL](https://github.com/project-jedi/jcl) 23 | * [JVCL](https://github.com/project-jedi/jvcl) 24 | * [PngComponents](https://github.com/UweRaabe/PngComponents) 25 | * [JPLib](https://github.com/jackdp/JPLib) 26 | * [JPPack](https://github.com/jackdp/JPPack) 27 | * [SynEdit](https://github.com/SynEdit/SynEdit) 28 | * [Hashing unts](https://github.com/jackdp/www.wolfgang-ehrhardt.de) 29 | * Delphi XE5 (XE2?) or newer. 30 | 31 | ## Screenshots 32 | 33 | ### General 34 | 35 | ![General](./doc_img/di_general.png) 36 | 37 | ### Environmnet 38 | 39 | ![Environment](./doc_img/di_env.png) 40 | 41 | ### Library Path 42 | 43 | ![Library Path](./doc_img/di_lib_path.png) 44 | 45 | ### Browsing Path 46 | 47 | ![Browsing Path](./doc_img/di_browsing_path.png) 48 | 49 | ### Packages 50 | 51 | ![Pckages](./doc_img/di_packages.png) 52 | -------------------------------------------------------------------------------- /clean_DCU.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | 3 | del /s *.dcu 4 | -------------------------------------------------------------------------------- /doc_img/di_browsing_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/doc_img/di_browsing_path.png -------------------------------------------------------------------------------- /doc_img/di_env.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/doc_img/di_env.png -------------------------------------------------------------------------------- /doc_img/di_general.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/doc_img/di_general.png -------------------------------------------------------------------------------- /doc_img/di_lib_path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/doc_img/di_lib_path.png -------------------------------------------------------------------------------- /doc_img/di_packages.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/doc_img/di_packages.png -------------------------------------------------------------------------------- /images/Icons.axicp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Icons 4 | 5 | clipboard-copy 6 | clipboard-copy.axvi 7 | Axialis Flat Pro 2017 8 | Basic 9 | 10 | 100 11 | ID_CLIPBOARD-COPY 12 | 1 13 | 255 14 | 0 15 | 4 16 | 0 17 | 18 | 19 | folder-open 20 | folder-open.axvi 21 | Axialis Flat Pro 2017 22 | Basic 23 | 24 | 101 25 | ID_FOLDER-OPEN 26 | 1 27 | 255 28 | 0 29 | 4 30 | 0 31 | 32 | 33 | note-text 34 | note-text.axvi 35 | Axialis Flat Pro 2017 36 | Basic 37 | 38 | 102 39 | ID_NOTE-TEXT 40 | 1 41 | 255 42 | 0 43 | #7B7B7B 44 | 18465807 45 | 0 46 | 47 | 48 | properties 49 | properties.axvi 50 | Axialis Flat Pro 2017 51 | Development 52 | 53 | 103 54 | ID_PROPERTIES 55 | 1 56 | 255 57 | 0 58 | 3 59 | 0 60 | 61 | 62 | -------------------------------------------------------------------------------- /images/Main.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/images/Main.ico -------------------------------------------------------------------------------- /images/VirusTotal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/images/VirusTotal.png -------------------------------------------------------------------------------- /images/explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/images/explorer.png -------------------------------------------------------------------------------- /images/text-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/images/text-preview.png -------------------------------------------------------------------------------- /src/DELI.ConOut.pas: -------------------------------------------------------------------------------- 1 | unit DELI.ConOut; 2 | 3 | 4 | // License // 5 | // // 6 | // The ExecConsoleApp function was written by Martin Lafferty (http://www.prel.co.uk). // 7 | // You can found original source at http://cc.embarcadero.com/item/14692 // 8 | // Martin has not provided any license information, but on Embarcadero's page it is copyrighted // 9 | // as "No significant restrictions". // 10 | // I have made some modifications to the needs of the program. // 11 | // // 12 | // My (jp) code // 13 | // "Total free" - you can do with my code whatever you want. // 14 | 15 | interface 16 | 17 | uses 18 | Windows, SysUtils, Classes; 19 | 20 | 21 | const 22 | //SILENT = False; 23 | CON_BUF_SIZE = 10240; 24 | 25 | 26 | type 27 | TConsoleEvent = procedure(Process: THandle; const OutputLine: string); 28 | 29 | 30 | procedure GetConsoleAppOutput(const Exe, Params: string; var ResStr: string); 31 | 32 | 33 | 34 | implementation 35 | 36 | const 37 | CR = #$0D; 38 | LF = #$0A; 39 | CRLF = CR + LF; 40 | ENDL = CRLF; 41 | 42 | var 43 | slOut: TStringList; 44 | 45 | 46 | {$region ' --- ExecConsoleApp --- '} 47 | // The author of the original ExecConsoleApp function is Martin Lafferty (http://www.prel.co.uk , http://cc.embarcadero.com/item/14692). 48 | function ExecConsoleApp(const Exe, Parameters: string; OnNewLine: TConsoleEvent; CurrentDir: string = ''): DWORD; 49 | const 50 | TerminationWaitTime = 5000; 51 | var 52 | StartupInfo: TStartupInfo; 53 | ProcessInfo: TProcessInformation; 54 | SecurityAttributes: TSecurityAttributes; 55 | ThreadSecurityAttributes: TSecurityAttributes; 56 | TempHandle, WritePipe1, ReadPipe, WritePipe, WritePipe2: THandle; 57 | ReadBuf: array[0..CON_BUF_SIZE - 1] of AnsiChar; 58 | BytesRead: DWORD; 59 | LineBuf: array[0..CON_BUF_SIZE - 1] of AnsiChar; 60 | LineBufPtr: Integer; 61 | Newline: Boolean; 62 | i: Integer; 63 | CommandLine: string; 64 | //sOut: string; 65 | 66 | procedure OutputLine; 67 | begin 68 | LineBuf[LineBufPtr] := #0; 69 | Newline := False; 70 | LineBufPtr := 0; 71 | if Assigned(OnNewLine) then OnNewLine(ProcessInfo.hProcess, string(LineBuf)); 72 | end; 73 | 74 | begin 75 | Result := 1; 76 | 77 | if CurrentDir = '' then CurrentDir := ExtractFileDir(ParamStr(0)); 78 | if CurrentDir = '' then CurrentDir := 'C:\'; 79 | WritePipe := 0; 80 | 81 | CommandLine := Exe + ' '; 82 | //if Trim(Parameters) <> '' then CommandLine := CommandLine + ' ' + Parameters; 83 | if Parameters <> '' then CommandLine := CommandLine + Parameters; 84 | 85 | 86 | FillChar(StartupInfo, SizeOf(StartupInfo), 0); 87 | FillChar(ReadBuf, SizeOf(ReadBuf), 0); 88 | FillChar(SecurityAttributes, SizeOf(SecurityAttributes), 0); 89 | 90 | LineBufPtr := 0; 91 | Newline := True; 92 | 93 | SecurityAttributes.nLength := SizeOf(SecurityAttributes); 94 | SecurityAttributes.bInheritHandle := True; 95 | SecurityAttributes.lpSecurityDescriptor := nil; 96 | if not CreatePipe(ReadPipe, WritePipe1, @SecurityAttributes, 0) then RaiseLastOSError; 97 | 98 | ThreadSecurityAttributes.nLength := SizeOf(ThreadSecurityAttributes); 99 | ThreadSecurityAttributes.lpSecurityDescriptor := nil; 100 | 101 | try 102 | 103 | if Win32Platform = VER_PLATFORM_WIN32_NT then 104 | if not SetHandleInformation(ReadPipe, HANDLE_FLAG_INHERIT, 0) then RaiseLastOSError 105 | else 106 | begin 107 | if not DuplicateHandle(GetCurrentProcess, ReadPipe, GetCurrentProcess, @TempHandle, 0, True, DUPLICATE_SAME_ACCESS) then RaiseLastOSError; 108 | CloseHandle(ReadPipe); 109 | ReadPipe := TempHandle; 110 | end; 111 | 112 | /////////////////////////////////////////////////////////////////////// 113 | SecurityAttributes.nLength := SizeOf(SecurityAttributes); 114 | SecurityAttributes.bInheritHandle := True; 115 | SecurityAttributes.lpSecurityDescriptor := nil; 116 | CreatePipe(WritePipe2, WritePipe, @SecurityAttributes, 0); 117 | /////////////////////////////////////////////////////////////////////// 118 | 119 | with StartupInfo do 120 | begin 121 | cb := SizeOf(StartupInfo); 122 | dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; 123 | wShowWindow := SW_HIDE; 124 | hStdInput := WritePipe2; 125 | hStdOutput := WritePipe1; 126 | hStdError := WritePipe1; 127 | end; 128 | 129 | if not CreateProcess( 130 | nil, 131 | PChar(CommandLine), 132 | nil, 133 | @ThreadSecurityAttributes, 134 | True, 135 | CREATE_NO_WINDOW or DETACHED_PROCESS, 136 | nil, 137 | PChar(CurrentDir), 138 | StartupInfo, 139 | ProcessInfo 140 | ) 141 | then RaiseLastOSError; 142 | 143 | CloseHandle(WritePipe1); 144 | CloseHandle(WritePipe2); 145 | 146 | try 147 | 148 | while ReadFile(ReadPipe, ReadBuf, SizeOf(ReadBuf), BytesRead, nil) do 149 | for i := 0 to BytesRead - 1 do 150 | begin 151 | 152 | if (ReadBuf[i] = LF) then Newline := True 153 | else 154 | if (ReadBuf[i] = CR) then OutputLine 155 | else 156 | begin 157 | LineBuf[LineBufPtr] := ReadBuf[i]; 158 | Inc(LineBufPtr); 159 | if LineBufPtr >= (SizeOf(LineBuf) - 1) then //line too long - force a break 160 | begin 161 | Newline := True; 162 | OutputLine; 163 | end; 164 | end; 165 | 166 | end; // for i 167 | 168 | WaitForSingleObject(ProcessInfo.hProcess, TerminationWaitTime); 169 | GetExitCodeProcess(ProcessInfo.hProcess, Result); 170 | OutputLine; //flush the line buffer 171 | 172 | finally 173 | CloseHandle(ProcessInfo.hProcess); 174 | CloseHandle(ProcessInfo.hThread); 175 | end 176 | 177 | 178 | finally 179 | CloseHandle(ReadPipe); 180 | CloseHandle(WritePipe); 181 | end; 182 | end; 183 | {$endregion ExecConsoleApp} 184 | 185 | {$region ' --- ConsoleProc --- '} 186 | procedure ConsoleProc(Process: THandle; const OutputLine: string); 187 | begin 188 | //LastLine := OutputLine; 189 | slOut.Add(OutputLine); 190 | end; 191 | {$endregion ConsoleProc} 192 | 193 | 194 | 195 | procedure GetConsoleAppOutput(const Exe, Params: string; var ResStr: string); 196 | var 197 | ExitCode: integer; 198 | begin 199 | if not Assigned(slOut) then slOut := TStringList.Create; 200 | slOut.Clear; 201 | ExitCode := ExecConsoleApp(Exe, Params, @ConsoleProc, ''); 202 | if ExitCode <> 0 then ResStr := '' 203 | else ResStr := Trim(slOut.Text); 204 | end; 205 | 206 | 207 | 208 | initialization 209 | slOut := TStringList.Create; 210 | 211 | finalization 212 | if Assigned(slOut) then slOut.Free; 213 | 214 | 215 | end. 216 | -------------------------------------------------------------------------------- /src/DELI.FormMain.pas: -------------------------------------------------------------------------------- 1 | unit DELI.FormMain; 2 | 3 | interface 4 | 5 | uses 6 | // WinAPI 7 | Winapi.Windows, Winapi.Messages, Winapi.ShellAPI, 8 | 9 | // System 10 | System.SysUtils, System.Variants, System.Classes, System.Actions, System.Generics.Collections, 11 | 12 | // VCL 13 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Graphics, Vcl.ActnList, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ImgList, 14 | Vcl.Clipbrd, Vcl.Buttons, 15 | 16 | // JPLib 17 | JPL.Strings, JPL.TStr, JPL.Conversion, JPL.MemIniFile, JPL.Math, JPL.Delphi.Info, 18 | JPL.Containers.MultiValueList, JPL.Win.System, JPL.Win.FileSystem, JPL.Win.Registry, JPL.Win.FileIcons, 19 | JPL.Win.Dialogs, JPL.Dialogs, 20 | JPL.Hash.Common, JPL.Hash.WE_SHA2_256, 21 | 22 | // JPPack 23 | JPP.Common.Procs, JPP.ComboBoxEx, JPP.SimplePanel, JPP.Edit, JPP.Memo, JPP.EditEx, JPP.Labels, 24 | JPP.MemoEx, JPP.HtmlHint, JPP.DoubleLabel, JPP.BasicPngButtonEx, JPP.ColorSwatch, JPP.LinkLabel, 25 | 26 | // JVCL 27 | JvExComCtrls, JvListView, JvTypes, //JvExExtCtrls, // JvExtComponent, 28 | 29 | // Application 30 | DELI.Types, DELI.PROCS, DELI.FormTextPreview, DELI.ConOut, 31 | 32 | // Other 33 | PngImageList, JvComCtrls, SynEdit; 34 | 35 | 36 | type 37 | TFormMain = class(TForm) 38 | Actions: TActionList; 39 | actEsc: TAction; 40 | pnTop: TJppSimplePanel; 41 | cbDelphiVersion: TJppComboBoxEx; 42 | pcMain: TPageControl; 43 | tsGeneral: TTabSheet; 44 | tsEnvironment: TTabSheet; 45 | pnGeneral: TJppSimplePanel; 46 | edIDEExecutable: TJppEditEx; 47 | tsLibraryPath: TTabSheet; 48 | lvEnvSys: TJvListView; 49 | pnEnvironment: TJppSimplePanel; 50 | pnEnvSystem: TJppSimplePanel; 51 | JppShadowLabel1: TJppShadowLabel; 52 | pnEnvUser: TJppSimplePanel; 53 | JppShadowLabel2: TJppShadowLabel; 54 | Splitter1: TSplitter; 55 | lvEnvUser: TJvListView; 56 | pnEnvSystemBottom: TJppSimplePanel; 57 | Splitter2: TSplitter; 58 | edEnvSystem_SelectedName: TJppEditEx; 59 | meEnvSystem_SelectedValue: TJppMemoEx; 60 | JppSimplePanel1: TJppSimplePanel; 61 | edEnvUser_SelectedName: TJppEditEx; 62 | meEnvUser_SelectedValue: TJppMemoEx; 63 | Splitter3: TSplitter; 64 | pilMain: TPngImageList; 65 | btnExploreInstallDir: TJppBasicPngButtonEx; 66 | actExploreInstallDir: TAction; 67 | btnCopyInstallDir: TJppBasicPngButtonEx; 68 | actCopyInstallDir: TAction; 69 | edInstallDir: TJppEditEx; 70 | btnT: TJppBasicPngButtonEx; 71 | actExploreIDEExecutable: TAction; 72 | actCopyIDEExecutable: TAction; 73 | actShowIDEExecutableProperties: TAction; 74 | btnExploreIDEExecutable: TJppBasicPngButtonEx; 75 | btnCopyIDEExecutable: TJppBasicPngButtonEx; 76 | btnShowIDEExecutableProperties: TJppBasicPngButtonEx; 77 | AppHint: TJppHtmlHint; 78 | dlblIDEExecutableHash: TJppDoubleLabel; 79 | actVirusTotal_IDEExecutable: TAction; 80 | btnVirusTotal_IDEExecutable: TJppBasicPngButtonEx; 81 | edRsVars_BAT: TJppEditEx; 82 | Button1: TButton; 83 | ilDelphi: TImageList; 84 | lvLibPaths_List: TJvListView; 85 | pcLibraryPath: TPageControl; 86 | tsLibraryPath_List: TTabSheet; 87 | tsLibraryPath_Text: TTabSheet; 88 | Splitter4: TSplitter; 89 | lvLibPaths_Targets: TJvListView; 90 | Label1: TLabel; 91 | seLibPaths_Text: TSynEdit; 92 | pnLibPaths_ListBg: TJppSimplePanel; 93 | tsBrowsingPath: TTabSheet; 94 | lvBrowsingPaths_Targets: TJvListView; 95 | Splitter5: TSplitter; 96 | pnBrowsingPaths_ListBg: TJppSimplePanel; 97 | pcBrowsingPath: TPageControl; 98 | tsBrowsingPath_List: TTabSheet; 99 | lvBrowsingPaths_List: TJvListView; 100 | tsBrowsingPath_Text: TTabSheet; 101 | seBrowsingPaths_Text: TSynEdit; 102 | pnBrowsingPaths_Info: TJppSimplePanel; 103 | JppColorSwatchEx1: TJppColorSwatchEx; 104 | JppColorSwatchEx2: TJppColorSwatchEx; 105 | pnLibPaths_Info: TJppSimplePanel; 106 | csExpanded: TJppColorSwatchEx; 107 | csNotExist: TJppColorSwatchEx; 108 | lblRegBaseddd: TLabel; 109 | tsPackages: TTabSheet; 110 | lvPackages_Types: TJvListView; 111 | Splitter6: TSplitter; 112 | Button2: TButton; 113 | lblRegBase: TJppLinkLabel; 114 | actOpenRegistryPath: TAction; 115 | lblRegBaseInfo: TJppLabel; 116 | pnLibPaths_Top: TJppSimplePanel; 117 | lblLibPaths_Target: TJppLabel; 118 | lblReg_LibPath: TJppLinkLabel; 119 | JppSimplePanel2: TJppSimplePanel; 120 | lblBrowsingPaths_Target: TJppLabel; 121 | lblReg_BrowsingPath: TJppLinkLabel; 122 | edCompiler_Win32: TJppEditEx; 123 | edCompiler_Win64: TJppEditEx; 124 | edEnvironmentProj: TJppEditEx; 125 | actShowPreview_Rsvars: TAction; 126 | btnShowPreview_Rsvars: TJppBasicPngButtonEx; 127 | actShowPreview_EnvironmentProj: TAction; 128 | btnShowPreview_EnvironmentProj: TJppBasicPngButtonEx; 129 | btnShowHelp_CompilerWin32: TJppBasicPngButtonEx; 130 | actShowHelp_CompilerWin32: TAction; 131 | actShowHelp_CompilerWin64: TAction; 132 | btnShowHelp_CompilerWin64: TJppBasicPngButtonEx; 133 | tsAll: TTabSheet; 134 | seFull: TSynEdit; 135 | pcPackages: TPageControl; 136 | TabSheet2: TTabSheet; 137 | lvPackages: TJvListView; 138 | JppSimplePanel3: TJppSimplePanel; 139 | JppColorSwatchEx3: TJppColorSwatchEx; 140 | JppColorSwatchEx4: TJppColorSwatchEx; 141 | TabSheet3: TTabSheet; 142 | sePackages: TSynEdit; 143 | procedure FormCreate(Sender: TObject); 144 | procedure FormClose(Sender: TObject; var Action: TCloseAction); 145 | procedure PrepareControls; 146 | procedure GetDelphiIcons; 147 | procedure InitControls; 148 | procedure ClearAll; 149 | procedure GetDelphiInfo; 150 | procedure GetDelphiInfo_Environment(const di: TDelphiInfo); 151 | procedure GetDelphiInfo_LibraryPath(const di: TDelphiInfo); 152 | procedure GetDelphiInfo_BrowsingPath(const di: TDelphiInfo); 153 | procedure GetDelphiInfo_Packages(const di: TDelphiInfo); 154 | procedure GetDelphiInfo_PackageList(const List: TDelphiPackageList); 155 | procedure actEscExecute(Sender: TObject); 156 | procedure SaveSettingsToIni; 157 | procedure LoadSettingsFromIni; 158 | procedure cbDelphiVersionChange(Sender: TObject); 159 | procedure lvEnvSysSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 160 | procedure lvEnvUserSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 161 | procedure lvEnvSysCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 162 | procedure actExploreInstallDirExecute(Sender: TObject); 163 | procedure actCopyInstallDirExecute(Sender: TObject); 164 | procedure actExploreIDEExecutableExecute(Sender: TObject); 165 | procedure actCopyIDEExecutableExecute(Sender: TObject); 166 | procedure actShowIDEExecutablePropertiesExecute(Sender: TObject); 167 | procedure actVirusTotal_IDEExecutableExecute(Sender: TObject); 168 | procedure lvLibPaths_ListCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 169 | procedure lvLibPaths_TargetsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 170 | procedure lvBrowsingPaths_TargetsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 171 | procedure ProcessTargetListSelection(lvTarget: TJVListView; Item: TListItem); 172 | procedure ProcessPackages(const sID: string); 173 | procedure Button2Click(Sender: TObject); 174 | procedure lblRegClickEx(const ACaption, AURL: string; var Handled: Boolean); 175 | procedure actShowPreview_RsvarsExecute(Sender: TObject); 176 | procedure actShowPreview_EnvironmentProjExecute(Sender: TObject); 177 | procedure actShowHelp_CompilerWin32Execute(Sender: TObject); 178 | procedure actShowHelp_CompilerWin64Execute(Sender: TObject); 179 | procedure lvPackages_TypesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 180 | procedure lvPackagesCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 181 | 182 | private 183 | FIniFile: string; 184 | FUpdatingControls: Boolean; 185 | public 186 | end; 187 | 188 | 189 | var 190 | FormMain: TFormMain; 191 | 192 | 193 | implementation 194 | 195 | 196 | {$R *.dfm} 197 | 198 | 199 | 200 | 201 | procedure TFormMain.FormCreate(Sender: TObject); 202 | begin 203 | Caption := APP_FULL_NAME; 204 | Application.Title := APP_FULL_NAME; 205 | Application.HintHidePause := 1000 * 25; 206 | GDelphiIcons := TFileIcons.Create(ilDelphi); 207 | 208 | PrepareControls; 209 | 210 | FIniFile := ChangeFileExt(ParamStr(0), '.ini'); 211 | LoadSettingsFromIni; 212 | 213 | GetDelphiInfo; 214 | end; 215 | 216 | 217 | procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction); 218 | begin 219 | if Assigned(GDelphiIcons) then GDelphiIcons.Free; 220 | SaveSettingsToIni; 221 | end; 222 | 223 | procedure TFormMain.PrepareControls; 224 | begin 225 | FUpdatingControls := True; 226 | try 227 | MonoFontName := GetFontName(['Fira Mono', 'Roboto Mono', 'Consolas', 'Courier New', 'Terminal', 'Fixedsys']); 228 | SemiboldFontName := GetFontName(['Segoe UI Semibold', 'Open Sans Semibold', 'Segoe UI', 'Tahoma']); 229 | pcMain.Align := alClient; 230 | pnGeneral.Align := alClient; 231 | pnEnvironment.Align := alClient; 232 | 233 | seFull.Lines.Clear; 234 | seFull.Align := alClient; 235 | seFull.Font.Name := MonoFontName; 236 | 237 | // Library path 238 | pnLibPaths_ListBg.Align := alClient; 239 | pcLibraryPath.Align := alClient; 240 | lvLibPaths_List.Align := alClient; 241 | //lvLibPaths_List.Font.Name := MonoFontName; 242 | seLibPaths_Text.Align := alClient; 243 | seLibPaths_Text.Font.Name := MonoFontName; 244 | lblLibPaths_Target.Caption := 'Library path'; 245 | lblReg_LibPath.Caption := ''; 246 | 247 | // Browsing path 248 | pnBrowsingPaths_ListBg.Align := alClient; 249 | pcBrowsingPath.Align := alClient; 250 | lvBrowsingPaths_List.Align := alClient; 251 | seBrowsingPaths_Text.Align := alClient; 252 | //seBrowsingPaths_Text.Font.Name := MonoFontName; 253 | lblBrowsingPaths_Target.Caption := 'Browsing path'; 254 | lblReg_BrowsingPath.Caption := ''; 255 | 256 | lvEnvSys.Align := alClient; 257 | lvEnvSys.ExtendedColumns[0].SortMethod := smNumeric; // No 258 | lvEnvSys.ExtendedColumns[1].SortMethod := smNonCaseSensitive; // Variable Name 259 | lvEnvSys.ExtendedColumns[2].SortMethod := smNonCaseSensitive; // Variable value 260 | 261 | pnEnvUser.Align := alClient; 262 | lvEnvUser.Align := alClient; 263 | lvEnvUser.ExtendedColumns[0].SortMethod := smNumeric; // No 264 | lvEnvUser.ExtendedColumns[1].SortMethod := smNonCaseSensitive; // Variable Name 265 | lvEnvUser.ExtendedColumns[2].SortMethod := smNonCaseSensitive; // Variable value 266 | 267 | // packages 268 | pcPackages.Align := alClient; 269 | sePackages.Align := alClient; 270 | sePackages.Font.Name := MonoFontName; 271 | lvPackages.Align := alClient; 272 | 273 | edCompiler_Win32.Font.Name := MonoFontName; 274 | edCompiler_Win64.Font.Name := MonoFontName; 275 | edInstallDir.Font.Name := MonoFontName; 276 | edIDEExecutable.Font.Name := MonoFontName; 277 | edEnvSystem_SelectedName.Font.Name := MonoFontName; 278 | meEnvSystem_SelectedValue.Font.Name := MonoFontName; 279 | edEnvUser_SelectedName.Font.Name := MonoFontName; 280 | meEnvUser_SelectedValue.Font.Name := MonoFontName; 281 | dlblIDEExecutableHash.RightCaptionFont.Name := MonoFontName; 282 | edRsVars_BAT.Font.Name := MonoFontName; 283 | edEnvironmentProj.Font.Name := MonoFontName; 284 | 285 | SetJppBasicPngButtonExFonts(btnT, Font.Name, Font.Size); 286 | btnT.Appearance.ShowCaption := False; 287 | btnExploreInstallDir.Appearance.Assign(btnT.Appearance); 288 | btnCopyInstallDir.Appearance.Assign(btnT.Appearance); 289 | btnExploreIDEExecutable.Appearance.Assign(btnT.Appearance); 290 | btnCopyIDEExecutable.Appearance.Assign(btnT.Appearance); 291 | btnShowIDEExecutableProperties.Appearance.Assign(btnT.Appearance); 292 | btnVirusTotal_IDEExecutable.Appearance.Assign(btnT.Appearance); 293 | btnShowPreview_Rsvars.Appearance.Assign(btnT.Appearance); 294 | btnShowPreview_EnvironmentProj.Appearance.Assign(btnT.Appearance); 295 | btnShowHelp_CompilerWin32.Appearance.Assign(btnT.Appearance); 296 | btnShowHelp_CompilerWin64.Appearance.Assign(btnT.Appearance); 297 | 298 | 299 | SetJppLinkLabelFonts(lblRegBase, MonoFontName, 9); 300 | //SetJppLinkLabelFonts(lblReg_LibPath, MonoFontName, 9); 301 | lblReg_LibPath.AssignFontParams(lblRegBase); 302 | lblReg_BrowsingPath.AssignFontParams(lblRegBase); 303 | 304 | 305 | GetDelphiIcons; 306 | 307 | ClearAll; 308 | finally 309 | FUpdatingControls := False; 310 | end; 311 | end; 312 | 313 | procedure TFormMain.InitControls; 314 | var 315 | b: Boolean; 316 | begin 317 | b := edInstallDir.Text <> ''; 318 | edInstallDir.Enabled := b; 319 | actExploreInstallDir.Enabled := b; 320 | actCopyInstallDir.Enabled := b; 321 | 322 | b := edRsVars_BAT.Text <> ''; 323 | edRsVars_BAT.Enabled := b; 324 | 325 | b := edIDEExecutable.Text <> ''; 326 | edIDEExecutable.Enabled := b; 327 | actExploreIDEExecutable.Enabled := b; 328 | actCopyIDEExecutable.Enabled := b; 329 | actShowIDEExecutableProperties.Enabled := b; 330 | actVirusTotal_IDEExecutable.Enabled := b; 331 | 332 | b := lvEnvSys.Items.Count > 0; 333 | lvEnvSys.Enabled := b; 334 | edEnvSystem_SelectedName.Enabled := b; 335 | meEnvSystem_SelectedValue.Enabled := b; 336 | 337 | b := lvEnvUser.Items.Count > 0; 338 | lvEnvUser.Enabled := b; 339 | edEnvUser_SelectedName.Enabled := b; 340 | meEnvUser_SelectedValue.Enabled := b; 341 | end; 342 | 343 | procedure TFormMain.ClearAll; 344 | begin 345 | edInstallDir.Clear; 346 | edIDEExecutable.Clear; 347 | edRsVars_BAT.Clear; 348 | edCompiler_Win32.Clear; 349 | edCompiler_Win64.Clear; 350 | edEnvironmentProj.Clear; 351 | 352 | seFull.Lines.Clear; 353 | 354 | lvEnvSys.Items.Clear; 355 | edEnvSystem_SelectedName.Clear; 356 | meEnvSystem_SelectedValue.Clear; 357 | 358 | lvEnvUser.Items.Clear; 359 | edEnvUser_SelectedName.Clear; 360 | meEnvUser_SelectedValue.Clear; 361 | 362 | lvLibPaths_Targets.Items.Clear; 363 | lvLibPaths_List.Items.Clear; 364 | seLibPaths_Text.Lines.Clear; 365 | 366 | lvBrowsingPaths_Targets.Items.Clear; 367 | lvBrowsingPaths_List.Items.Clear; 368 | seBrowsingPaths_Text.Lines.Clear; 369 | 370 | sePackages.Lines.Clear; 371 | lvPackages_Types.Items.Clear; 372 | lvPackages.Items.Clear; 373 | 374 | lblRegBase.Caption := ''; 375 | end; 376 | 377 | procedure TFormMain.actExploreIDEExecutableExecute(Sender: TObject); 378 | var 379 | s: string; 380 | begin 381 | s := edIDEExecutable.Text; 382 | if not FileExists(s) then Exit; 383 | ShowFileInExplorer(s, Handle); 384 | end; 385 | 386 | procedure TFormMain.actExploreInstallDirExecute(Sender: TObject); 387 | var 388 | s: string; 389 | begin 390 | s := edInstallDir.Text; 391 | if not DirectoryExists(s) then Exit; 392 | ShellExecute(Handle, 'open', PChar(s), '', PChar(s), SW_SHOW); 393 | 394 | end; 395 | 396 | procedure TFormMain.actShowIDEExecutablePropertiesExecute(Sender: TObject); 397 | var 398 | s: string; 399 | begin 400 | s := edIDEExecutable.Text; 401 | if not FileExists(s) then Exit; 402 | ShowFilePropertiesDialog(Handle, s); 403 | end; 404 | 405 | procedure TFormMain.actShowHelp_CompilerWin32Execute(Sender: TObject); 406 | var 407 | s: string; 408 | begin 409 | s := Trim(edCompiler_Win32.Text); 410 | ShowConsoleAppOutput(s, '', s); 411 | end; 412 | 413 | procedure TFormMain.actShowHelp_CompilerWin64Execute(Sender: TObject); 414 | var 415 | s: string; 416 | begin 417 | s := Trim(edCompiler_Win64.Text); 418 | ShowConsoleAppOutput(s, '', s); 419 | end; 420 | 421 | procedure TFormMain.actShowPreview_EnvironmentProjExecute(Sender: TObject); 422 | var 423 | s: string; 424 | begin 425 | s := Trim(edEnvironmentProj.Text); 426 | ShowTextPreviewFromFile(s, 'Preview: ' + s); 427 | end; 428 | 429 | procedure TFormMain.actShowPreview_RsvarsExecute(Sender: TObject); 430 | var 431 | s: string; 432 | begin 433 | s := Trim(edRsVars_BAT.Text); 434 | ShowTextPreviewFromFile(s, 'Preview: ' + s); 435 | end; 436 | 437 | procedure TFormMain.actVirusTotal_IDEExecutableExecute(Sender: TObject); 438 | var 439 | s: string; 440 | begin 441 | s := dlblIDEExecutableHash.RightCaption; 442 | s := TStr.RemoveSpaces(s); 443 | if s = '' then Exit; 444 | VirusTotal(s, Handle); 445 | end; 446 | 447 | procedure TFormMain.cbDelphiVersionChange(Sender: TObject); 448 | begin 449 | if FUpdatingControls then Exit; 450 | GetDelphiInfo; 451 | end; 452 | 453 | 454 | procedure TFormMain.GetDelphiIcons; 455 | var 456 | di: TDelphiInfo; 457 | i: integer; 458 | begin 459 | cbDelphiVersion.ItemsEx.BeginUpdate; 460 | try 461 | 462 | for i := 0 to cbDelphiVersion.Items.Count - 1 do 463 | begin 464 | di := TDelphiInfo.Create(cbDelphiVersion.Items[i]); 465 | try 466 | if FileExists(di.BdsExecutable) then 467 | cbDelphiVersion.ItemsEx[i].ImageIndex := GDelphiIcons.GetFileIconIndex(di.BdsExecutable); 468 | finally 469 | di.Free; 470 | end; 471 | end; 472 | 473 | finally 474 | cbDelphiVersion.ItemsEx.EndUpdate; 475 | end; 476 | end; 477 | 478 | 479 | {$region ' GetDelphiInfo '} 480 | 481 | 482 | procedure TFormMain.GetDelphiInfo; 483 | var 484 | s: string; 485 | di: TDelphiInfo; 486 | //i: integer; 487 | hrr: THashResultRec; 488 | //pkgItem: TDelphiPackageItem; 489 | begin 490 | ClearAll; 491 | InitControls; 492 | 493 | s := cbDelphiVersion.Items[cbDelphiVersion.ItemIndex]; 494 | Caption := APP_FULL_NAME + ' - ' + s; 495 | 496 | 497 | di := TDelphiInfo.Create(s); 498 | try 499 | 500 | seFull.Text := 501 | di.AsInfoStr( 502 | True, // Reg keys 503 | True, // User vars 504 | True, // IDE vars 505 | True, // Installed updates 506 | True, // IDE packages 507 | True, // IDE Delphi packages 508 | True, // IDE C++Builder packages 509 | True, // Packages 510 | True, // Disabled packages 511 | True, // Disabled IDE packages 512 | True // Personalities 513 | ); 514 | 515 | if di.InstallDir = '' then 516 | begin 517 | Caption := APP_FULL_NAME + ' - ' + DelphiVersionToDelphiFullName(di.DelphiVersion) + ' [NOT INSTALLED]'; 518 | Exit; 519 | end; 520 | 521 | Caption := APP_FULL_NAME + ' - ' + DelphiVersionToDelphiFullName(di.DelphiVersion) + ' ' + di.Edition; 522 | 523 | 524 | //lblRegBase.Caption := 'HKCR\' + di.RegPath_Base; 525 | lblRegBase.Caption := TReg.RootKeyToStr(di.RegRootKey) + '\' + di.RegPath_Base; 526 | edInstallDir.Text := di.InstallDir; 527 | edIDEExecutable.Text := di.BdsExecutable; 528 | edRsVars_BAT.Text := di.RsVars_BAT; 529 | edCompiler_Win32.Text := di.DelphiCompiler_Win32; 530 | edCompiler_Win64.Text := di.DelphiCompiler_Win64; 531 | edEnvironmentProj.Text := di.EnvironmentProjFile; 532 | 533 | if FileExists(di.BdsExecutable) then 534 | begin 535 | if WeGetFileHash_SHA2_256(di.BdsExecutable, hrr) then dlblIDEExecutableHash.RightCaption := InsertNumSep(hrr.StrValueLower, ' ', 4); 536 | end; 537 | 538 | 539 | 540 | GetDelphiInfo_Environment(di); 541 | GetDelphiInfo_LibraryPath(di); 542 | GetDelphiInfo_BrowsingPath(di); 543 | 544 | GetDelphiInfo_Packages(di); 545 | 546 | // Packages 547 | { 548 | Packages 549 | DisabledPackages 550 | 551 | IDEPackages 552 | DisabledIDEPackages 553 | 554 | IDEDelphiPackages 555 | IDECBuilderPackages 556 | } 557 | 558 | // for i := 0 to di.Packages.Count - 1 do 559 | // begin 560 | // pkgItem := di.Packages[i]; 561 | // sePackages.Lines.Add( 562 | // pkgItem.RegistryFileName + ' - ' + pkgItem.Description 563 | // ); 564 | // end; 565 | 566 | 567 | finally 568 | di.Free; 569 | InitControls; 570 | end; 571 | 572 | if lvLibPaths_Targets.Items.Count > 0 then lvLibPaths_Targets.ItemIndex := 0; 573 | if lvBrowsingPaths_Targets.Items.Count > 0 then lvBrowsingPaths_Targets.ItemIndex := 0; 574 | if lvPackages_Types.Items.Count > 0 then lvPackages_Types.ItemIndex := 0; 575 | 576 | end; 577 | 578 | procedure TFormMain.GetDelphiInfo_Packages(const di: TDelphiInfo); 579 | begin 580 | // Packages 581 | // DisabledPackages 582 | // IDEPackages 583 | // DisabledIDEPackages 584 | // IDEDelphiPackages 585 | // IDECBuilderPackages 586 | 587 | sePackages.Lines.Clear; 588 | lvPackages_Types.Items.Clear; 589 | lvPackages_Types.Items.BeginUpdate; 590 | try 591 | 592 | if di.Packages.Count > 0 then 593 | with lvPackages_Types.Items.Add do 594 | begin 595 | Caption := STRID_PACKAGES; 596 | SubItems.Add(itos(di.Packages.Count)); 597 | end; 598 | 599 | if di.DisabledPackages.Count > 0 then 600 | with lvPackages_Types.Items.Add do 601 | begin 602 | Caption := STRID_DISBALED_PACKAGES; 603 | SubItems.Add(itos(di.DisabledPackages.Count)); 604 | end; 605 | 606 | if di.IDEPackages.Count > 0 then 607 | with lvPackages_Types.Items.Add do 608 | begin 609 | Caption := STRID_IDE_PACKAGES; 610 | SubItems.Add(itos(di.IDEPackages.Count)); 611 | end; 612 | 613 | if di.DisabledIDEPackages.Count > 0 then 614 | with lvPackages_Types.Items.Add do 615 | begin 616 | Caption := STRID_DISABLED_IDE_PACKAGES; 617 | SubItems.Add(itos(di.DisabledIDEPackages.Count)); 618 | end; 619 | 620 | if di.IDEDelphiPackages.Count > 0 then 621 | with lvPackages_Types.Items.Add do 622 | begin 623 | Caption := STRID_IDE_DELPHI_PACKAGES; 624 | SubItems.Add(itos(di.IDEDelphiPackages.Count)); 625 | end; 626 | 627 | if di.IDECBuilderPackages.Count > 0 then 628 | with lvPackages_Types.Items.Add do 629 | begin 630 | Caption := STRID_IDE_CBUILDER_PACKAGES; 631 | SubItems.Add(itos(di.IDECBuilderPackages.Count)); 632 | end; 633 | 634 | finally 635 | lvPackages_Types.Items.EndUpdate; 636 | end; 637 | end; 638 | 639 | procedure TFormMain.GetDelphiInfo_Environment(const di: TDelphiInfo); 640 | var 641 | i: integer; 642 | li: TJvListItem; 643 | mv: TMultiValue; 644 | begin 645 | // --------------- System variables ------------------ 646 | lvEnvSys.Items.BeginUpdate; 647 | try 648 | for mv in di.IDEVariables do 649 | begin 650 | li := lvEnvSys.Items.Add; 651 | li.Font.Size := Font.Size; 652 | li.Font.Name := Font.Name; 653 | li.SubItems.Add(mv.Name); 654 | li.SubItems.Add(mv.StrValue); 655 | end; 656 | 657 | for i := 0 to lvEnvSys.Items.Count - 1 do lvEnvSys.Items[i].Caption := itos(i + 1); 658 | 659 | finally 660 | lvEnvSys.Items.EndUpdate; 661 | end; 662 | 663 | // ------------------- User variables -------------------- 664 | lvEnvUser.Items.BeginUpdate; 665 | try 666 | for mv in di.UserVariables do 667 | begin 668 | li := lvEnvUser.Items.Add; 669 | li.Font.Size := Font.Size; 670 | li.Font.Name := Font.Name; 671 | li.SubItems.Add(mv.Name); 672 | li.SubItems.Add(mv.StrValue); 673 | end; 674 | 675 | for i := 0 to lvEnvUser.Items.Count - 1 do lvEnvUser.Items[i].Caption := itos(i + 1); 676 | 677 | finally 678 | lvEnvUser.Items.EndUpdate; 679 | end; 680 | end; 681 | 682 | procedure TFormMain.GetDelphiInfo_LibraryPath(const di: TDelphiInfo); 683 | begin 684 | lvLibPaths_List.Items.Clear; 685 | 686 | lvLibPaths_Targets.Items.BeginUpdate; 687 | try 688 | 689 | lvLibPaths_Targets.Items.Clear; 690 | 691 | if di.LibraryPaths_Win32.LibraryPathItemsCount > 0 then 692 | with lvLibPaths_Targets.Items.Add do 693 | begin 694 | Caption := STRID_TARGET_WIN32; 695 | SubItems.Add(itos(di.LibraryPaths_Win32.LibraryPathItemsCount)); 696 | end; 697 | 698 | if di.LibraryPaths_Win64.LibraryPathItemsCount > 0 then 699 | with lvLibPaths_Targets.Items.Add do 700 | begin 701 | Caption := STRID_TARGET_WIN64; 702 | SubItems.Add(itos(di.LibraryPaths_Win64.LibraryPathItemsCount)); 703 | end; 704 | 705 | if di.LibraryPaths_Android32.LibraryPathItemsCount > 0 then 706 | with lvLibPaths_Targets.Items.Add do 707 | begin 708 | Caption := STRID_TARGET_ANDROID32; 709 | SubItems.Add(itos(di.LibraryPaths_Android32.LibraryPathItemsCount)); 710 | end; 711 | 712 | if di.LibraryPaths_Android64.LibraryPathItemsCount > 0 then 713 | with lvLibPaths_Targets.Items.Add do 714 | begin 715 | Caption := STRID_TARGET_ANDROID64; 716 | SubItems.Add(itos(di.LibraryPaths_Android64.LibraryPathItemsCount)); 717 | end; 718 | 719 | 720 | finally 721 | lvLibPaths_Targets.Items.EndUpdate; 722 | end; 723 | end; 724 | 725 | 726 | procedure TFormMain.GetDelphiInfo_BrowsingPath(const di: TDelphiInfo); 727 | begin 728 | lvBrowsingPaths_List.Items.Clear; 729 | 730 | lvBrowsingPaths_Targets.Items.BeginUpdate; 731 | try 732 | 733 | lvBrowsingPaths_Targets.Items.Clear; 734 | 735 | if di.LibraryPaths_Win32.BrowsingPathItemsCount > 0 then 736 | with lvBrowsingPaths_Targets.Items.Add do 737 | begin 738 | Caption := STRID_TARGET_WIN32; 739 | SubItems.Add(itos(di.LibraryPaths_Win32.BrowsingPathItemsCount)); 740 | end; 741 | 742 | if di.LibraryPaths_Win64.BrowsingPathItemsCount > 0 then 743 | with lvBrowsingPaths_Targets.Items.Add do 744 | begin 745 | Caption := STRID_TARGET_WIN64; 746 | SubItems.Add(itos(di.LibraryPaths_Win64.BrowsingPathItemsCount)); 747 | end; 748 | 749 | if di.LibraryPaths_Android32.BrowsingPathItemsCount > 0 then 750 | with lvBrowsingPaths_Targets.Items.Add do 751 | begin 752 | Caption := STRID_TARGET_ANDROID32; 753 | SubItems.Add(itos(di.LibraryPaths_Android32.BrowsingPathItemsCount)); 754 | end; 755 | 756 | if di.LibraryPaths_Android64.BrowsingPathItemsCount > 0 then 757 | with lvBrowsingPaths_Targets.Items.Add do 758 | begin 759 | Caption := STRID_TARGET_ANDROID64; 760 | SubItems.Add(itos(di.LibraryPaths_Android64.BrowsingPathItemsCount)); 761 | end; 762 | 763 | finally 764 | lvBrowsingPaths_Targets.Items.EndUpdate; 765 | end; 766 | end; 767 | 768 | procedure TFormMain.ProcessTargetListSelection(lvTarget: TJVListView; Item: TListItem); 769 | var 770 | lv: TJVListView; 771 | se: TSynEdit; 772 | sTarget: string; 773 | di: TDelphiInfo; 774 | TargetLibraryPaths: TDelphiTargetLibraryPaths; 775 | PathList: TDelphiPathList; 776 | PathItem: TDelphiPathItem; 777 | i: integer; 778 | begin 779 | if not Assigned(Item) then Exit; 780 | 781 | sTarget := Item.Caption; 782 | if sTarget = '' then Exit; 783 | 784 | if lvTarget = lvLibPaths_Targets then 785 | begin 786 | lv := lvLibPaths_List; 787 | se := seLibPaths_Text; 788 | lblLibPaths_Target.Caption := 'Library path - ' + sTarget; 789 | end 790 | else if lvTarget = lvBrowsingPaths_Targets then 791 | begin 792 | lv := lvBrowsingPaths_List; 793 | se := seBrowsingPaths_Text; 794 | lblBrowsingPaths_Target.Caption := 'Browsing path - ' + sTarget; 795 | end 796 | else Exit; 797 | 798 | lv.Items.Clear; 799 | se.Lines.Clear; 800 | 801 | 802 | se.Lines.BeginUpdate; 803 | lv.Items.BeginUpdate; 804 | di := TDelphiInfo.Create(cbDelphiVersion.Items[cbDelphiVersion.ItemIndex]); 805 | try 806 | 807 | if di.DelphiVersion = dvUnknown then Exit; 808 | 809 | if sTarget = STRID_TARGET_WIN32 then TargetLibraryPaths := di.LibraryPaths_Win32 810 | else if sTarget = STRID_TARGET_WIN64 then TargetLibraryPaths := di.LibraryPaths_Win64 811 | else if sTarget = STRID_TARGET_ANDROID32 then TargetLibraryPaths := di.LibraryPaths_Android32 812 | else if sTarget = STRID_TARGET_ANDROID64 then TargetLibraryPaths := di.LibraryPaths_Android64 813 | else TargetLibraryPaths := nil; 814 | 815 | if not Assigned(TargetLibraryPaths) then Exit; 816 | 817 | if lvTarget = lvLibPaths_Targets then 818 | begin 819 | PathList := TargetLibraryPaths.LibraryPathList; 820 | lblReg_LibPath.Caption := TargetLibraryPaths.RegistryFullPath + REG_KEY_VALUE_SEPARATOR + TargetLibraryPaths.LibraryPathList.RegKeyName;; 821 | end 822 | else if lvTarget = lvBrowsingPaths_Targets then 823 | begin 824 | PathList := TargetLibraryPaths.BrowsingPathList; 825 | lblReg_BrowsingPath.Caption := TargetLibraryPaths.RegistryFullPath + REG_KEY_VALUE_SEPARATOR + TargetLibraryPaths.BrowsingPathList.RegKeyName; 826 | end 827 | else PathList := nil; 828 | 829 | if PathList = nil then Exit; 830 | 831 | for i := 0 to PathList.Count - 1 do 832 | begin 833 | 834 | PathItem := PathList[i]; 835 | se.Lines.Add(PathItem.RegistryPath); 836 | 837 | with lv.Items.Add do 838 | begin 839 | Caption := itos(i + 1); 840 | SubItems.Add(PathItem.RegistryPath); 841 | SubItems.Add(PathItem.ExpandedPath); 842 | Font.Name := MonoFontName; 843 | Font.Size := 9; 844 | end; 845 | 846 | end; 847 | 848 | 849 | finally 850 | di.Free; 851 | se.Lines.EndUpdate; 852 | lv.Items.EndUpdate; 853 | end; 854 | end; 855 | 856 | procedure TFormMain.lvLibPaths_TargetsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 857 | begin 858 | ProcessTargetListSelection(lvLibPaths_Targets, Item); 859 | end; 860 | 861 | procedure TFormMain.lvBrowsingPaths_TargetsSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 862 | begin 863 | ProcessTargetListSelection(lvBrowsingPaths_Targets, Item); 864 | end; 865 | 866 | procedure TFormMain.lvPackagesCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 867 | var 868 | li: TJvListItem; 869 | s: string; 870 | begin 871 | if not (Item is TJvListItem) then Exit; 872 | li := TJvListItem(Item); 873 | 874 | li.Font.Name := MonoFontName; 875 | li.Font.Size := 9; 876 | 877 | if li.SubItems.Count < 3 then Exit; 878 | 879 | s := li.SubItems[1]; 880 | if Pos('$(', s) > 0 then 881 | begin 882 | li.Brush.Color := csExpanded.SelectedColor; 883 | 884 | end; 885 | 886 | s := li.SubItems[2]; 887 | if not FileExists(s) then 888 | begin 889 | li.Brush.Color := csNotExist.SelectedColor; 890 | end; 891 | end; 892 | 893 | procedure TFormMain.lvPackages_TypesSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 894 | begin 895 | if not Assigned(Item) then Exit; 896 | ProcessPackages(Item.Caption); 897 | end; 898 | 899 | procedure TFormMain.GetDelphiInfo_PackageList(const List: TDelphiPackageList); 900 | var 901 | i: integer; 902 | Item: TDelphiPackageItem; 903 | begin 904 | sePackages.Lines.BeginUpdate; 905 | lvPackages.Items.BeginUpdate; 906 | try 907 | 908 | for i := 0 to List.Count - 1 do 909 | begin 910 | Item := List[i]; 911 | 912 | sePackages.Lines.Add({Item.Description + ' : ' +} Item.RegistryFileName); 913 | 914 | with lvPackages.Items.Add do 915 | begin 916 | Caption := itos(lvPackages.Items.Count); 917 | SubItems.Add(Item.Description); 918 | SubItems.Add(Item.RegistryFileName); 919 | SubItems.Add(Item.ExpandedFileName); 920 | end; 921 | end; 922 | 923 | finally 924 | lvPackages.Items.EndUpdate; 925 | sePackages.Lines.EndUpdate; 926 | end; 927 | end; 928 | 929 | procedure TFormMain.ProcessPackages(const sID: string); 930 | var 931 | di: TDelphiInfo; 932 | List: TDelphiPackageList; 933 | begin 934 | sePackages.Lines.Clear; 935 | lvPackages.Items.Clear; 936 | di := TDelphiInfo.Create(cbDelphiVersion.Items[cbDelphiVersion.ItemIndex]); 937 | try 938 | if sID = STRID_PACKAGES then List := di.Packages 939 | else if sID = STRID_DISBALED_PACKAGES then List := di.DisabledPackages 940 | else if sID = STRID_IDE_PACKAGES then List := di.IDEPackages 941 | else if sID = STRID_DISABLED_IDE_PACKAGES then List := di.DisabledIDEPackages 942 | else if sID = STRID_IDE_DELPHI_PACKAGES then List := di.IDEDelphiPackages 943 | else if sID = STRID_IDE_CBUILDER_PACKAGES then List := di.IDECBuilderPackages 944 | else List := nil; 945 | 946 | if List = nil then Exit; 947 | GetDelphiInfo_PackageList(List); 948 | finally 949 | di.Free; 950 | end; 951 | end; 952 | 953 | {$endregion GetDelphiInfo} 954 | 955 | 956 | procedure TFormMain.LoadSettingsFromIni; 957 | var 958 | Ini: TJppMemIniFile; 959 | x: integer; 960 | s: string; 961 | begin 962 | if not FileExists(FIniFile) then Exit; 963 | 964 | FUpdatingControls := True; 965 | try 966 | 967 | Ini := TJppMemIniFile.Create(FIniFile, TEncoding.UTF8); 968 | try 969 | 970 | Ini.CurrentSection := 'MAIN'; 971 | 972 | Ini.ReadFormPos(Self); 973 | 974 | s := Ini.ReadString('CurrentTab', ''); 975 | s := TrimFromStart(s, 'ts'); 976 | s := UpperCase(s); 977 | if s = 'GENERAL' then pcMain.ActivePage := tsGeneral 978 | else if s = 'ENVIRONMENT' then pcMain.ActivePage := tsEnvironment 979 | else if s = 'LIBRARYPATH' then pcMain.ActivePage := tsLibraryPath 980 | else if s = 'BROWSINGPATH' then pcMain.ActivePage := tsBrowsingPath 981 | else if s = 'PACKAGES' then pcMain.ActivePage := tsPackages 982 | else if s = 'ALL' then pcMain.ActivePage := tsAll; 983 | 984 | x := Ini.ReadIntegerInRange(cbDelphiVersion.Name, cbDelphiVersion.ItemIndex, 0, cbDelphiVersion.Items.Count - 1); 985 | if x >= 0 then cbDelphiVersion.ItemIndex := x; 986 | 987 | finally 988 | Ini.Free; 989 | end; 990 | 991 | finally 992 | FUpdatingControls := False; 993 | end; 994 | end; 995 | 996 | procedure TFormMain.SaveSettingsToIni; 997 | var 998 | Ini: TJppMemIniFile; 999 | begin 1000 | Ini := TJppMemIniFile.Create(FIniFile, TEncoding.UTF8); 1001 | try 1002 | 1003 | Ini.CurrentSection := 'MAIN'; 1004 | 1005 | Ini.WriteFormPos(Self); 1006 | Ini.WriteInteger(cbDelphiVersion.Name, cbDelphiVersion.ItemIndex); 1007 | 1008 | Ini.WriteString('CurrentTab', pcMain.ActivePage.Name); 1009 | 1010 | 1011 | Ini.UpdateFile; 1012 | finally 1013 | Ini.Free; 1014 | end; 1015 | end; 1016 | 1017 | procedure TFormMain.lvLibPaths_ListCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 1018 | var 1019 | li: TJvListItem; 1020 | s: string; 1021 | begin 1022 | if not (Item is TJvListItem) then Exit; 1023 | li := TJvListItem(Item); 1024 | 1025 | s := li.SubItems[0]; 1026 | if Pos('$(', s) > 0 then 1027 | begin 1028 | li.Brush.Color := csExpanded.SelectedColor; 1029 | li.Font.Name := MonoFontName; 1030 | end; 1031 | 1032 | s := li.SubItems[1]; 1033 | if not DirectoryExists(s) then 1034 | begin 1035 | li.Brush.Color := csNotExist.SelectedColor; 1036 | end; 1037 | end; 1038 | 1039 | procedure TFormMain.lvEnvSysCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); 1040 | var 1041 | li: TJvListItem; 1042 | s: string; 1043 | begin 1044 | if not (Item is TJvListItem) then Exit; 1045 | li := TJvListItem(Item); 1046 | 1047 | s := li.SubItems[0]; 1048 | if IsDelphiVariable(s) then 1049 | begin 1050 | //li.Font.Color := 10896386; 1051 | li.Brush.Color := 13828095; 1052 | li.Font.Name := SemiboldFontName; 1053 | end; 1054 | end; 1055 | 1056 | procedure TFormMain.lvEnvSysSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 1057 | begin 1058 | edEnvSystem_SelectedName.Clear; 1059 | meEnvSystem_SelectedValue.Clear; 1060 | if not Assigned(Item) then Exit; 1061 | edEnvSystem_SelectedName.Text := Item.SubItems[0]; 1062 | meEnvSystem_SelectedValue.Text := Item.SubItems[1]; 1063 | end; 1064 | 1065 | procedure TFormMain.lvEnvUserSelectItem(Sender: TObject; Item: TListItem; Selected: Boolean); 1066 | begin 1067 | edEnvUser_SelectedName.Clear; 1068 | meEnvUser_SelectedValue.Clear; 1069 | if not Assigned(Item) then Exit; 1070 | edEnvUser_SelectedName.Text := Item.SubItems[0]; 1071 | meEnvUser_SelectedValue.Text := Item.SubItems[1]; 1072 | end; 1073 | 1074 | procedure TFormMain.actCopyIDEExecutableExecute(Sender: TObject); 1075 | begin 1076 | Clipboard.AsText := edIDEExecutable.Text; 1077 | end; 1078 | 1079 | procedure TFormMain.actCopyInstallDirExecute(Sender: TObject); 1080 | begin 1081 | Clipboard.AsText := edInstallDir.Text; 1082 | end; 1083 | 1084 | procedure TFormMain.actEscExecute(Sender: TObject); 1085 | begin 1086 | Close; 1087 | end; 1088 | 1089 | procedure TFormMain.lblRegClickEx(const ACaption, AURL: string; var Handled: Boolean); 1090 | var 1091 | Path: string; 1092 | begin 1093 | Handled := True; 1094 | Path := ACaption; 1095 | Path := TStr.TrimFromStrPosToEnd(Path, REG_KEY_VALUE_SEPARATOR); 1096 | if Path = '' then Exit; 1097 | if not TReg.PathExists(Path) then 1098 | begin 1099 | WinMsgError('Registry path does not exists: ' + ENDL + Path, 'Error', Handle); 1100 | Exit; 1101 | end; 1102 | ShellExecute(Handle, 'open', PChar(RegJumpExe), PChar(Path), '', SW_SHOW); 1103 | end; 1104 | 1105 | 1106 | procedure TFormMain.Button2Click(Sender: TObject); 1107 | var 1108 | sKey: string; 1109 | s: string; 1110 | fTmp: string; 1111 | fName: string; 1112 | begin 1113 | sKey := 'HKEY_CURRENT_USER\SOFTWARE\Embarcadero\BDS\15.0\Library\Android32'; 1114 | 1115 | fName := SearchPathForFile('rmedir.exe', ''); 1116 | fName := 'C:\tools_my\rmedir.exe'; 1117 | if fName = '' then Exit; 1118 | 1119 | fName := 'dcc32.exe'; 1120 | fName := 'E:\Embarcadero\D2010\bin\dcc32.exe'; 1121 | // CProc.ApplicationName := fName; 1122 | // CProc.CommandLine := '-V'; 1123 | // CProc.Run; 1124 | // sleep(800); 1125 | // s := CProc.ConsoleOutput.Text; 1126 | 1127 | s := ''; 1128 | GetConsoleAppOutput(fName, '', s); 1129 | 1130 | 1131 | //s := GetConsoleAppOutput('cmd.exe', ''); 1132 | //WinMsgInfo(s); 1133 | if s <> '' then 1134 | ShowWinStr(s, '', 700, 800, 'Fira Mono', 9); 1135 | 1136 | fTmp := GetTempFileName; 1137 | //SaveStringToFile('jacek', fTmp); 1138 | //WinMsgInfo(GetTempFileName); 1139 | 1140 | // ShellExecute( 1141 | // Handle, 'open', 1142 | // 'cmd.exe', 1143 | // '/c rmedir.exe -V > _aaa.txt', 1144 | // '', SW_SHOW 1145 | // ); 1146 | end; 1147 | 1148 | 1149 | 1150 | end. 1151 | -------------------------------------------------------------------------------- /src/DELI.FormTextPreview.dfm: -------------------------------------------------------------------------------- 1 | object FormTextPreview: TFormTextPreview 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [biSystemMenu] 5 | Caption = 'FormTextPreview' 6 | ClientHeight = 537 7 | ClientWidth = 738 8 | Color = clBtnFace 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -12 12 | Font.Name = 'Segoe UI' 13 | Font.Style = [] 14 | FormStyle = fsStayOnTop 15 | OldCreateOrder = False 16 | Position = poMainFormCenter 17 | OnCreate = FormCreate 18 | PixelsPerInch = 96 19 | TextHeight = 15 20 | object se: TSynEdit 21 | Left = 8 22 | Top = 8 23 | Width = 321 24 | Height = 129 25 | ActiveLineColor = 12382718 26 | Font.Charset = DEFAULT_CHARSET 27 | Font.Color = clWindowText 28 | Font.Height = -12 29 | Font.Name = 'Consolas' 30 | Font.Pitch = fpFixed 31 | Font.Style = [] 32 | TabOrder = 0 33 | CodeFolding.GutterShapeSize = 11 34 | CodeFolding.CollapsedLineColor = clGrayText 35 | CodeFolding.FolderBarLinesColor = clGrayText 36 | CodeFolding.IndentGuidesColor = clGray 37 | CodeFolding.IndentGuides = True 38 | CodeFolding.ShowCollapsedLine = True 39 | CodeFolding.ShowHintMark = True 40 | UseCodeFolding = False 41 | ExtraLineSpacing = 1 42 | Gutter.BorderStyle = gbsRight 43 | Gutter.BorderColor = 13553358 44 | Gutter.Font.Charset = DEFAULT_CHARSET 45 | Gutter.Font.Color = 9540063 46 | Gutter.Font.Height = -11 47 | Gutter.Font.Name = 'Tahoma' 48 | Gutter.Font.Style = [] 49 | Gutter.RightOffset = 4 50 | Gutter.RightMargin = 4 51 | Gutter.ShowLineNumbers = True 52 | Lines.Strings = ( 53 | 'se') 54 | ReadOnly = True 55 | RightEdge = 20000 56 | WordWrap = True 57 | FontSmoothing = fsmNone 58 | end 59 | object Actions: TActionList 60 | Left = 472 61 | Top = 64 62 | object actEsc: TAction 63 | Caption = 'actEsc' 64 | ShortCut = 27 65 | OnExecute = actEscExecute 66 | end 67 | end 68 | object synBat: TSynBatSyn 69 | Options.AutoDetectEnabled = False 70 | Options.AutoDetectLineLimit = 0 71 | Options.Visible = False 72 | CommentAttri.Background = 14671839 73 | CommentAttri.Foreground = clBlack 74 | CommentAttri.Style = [] 75 | NumberAttri.Foreground = clRed 76 | VariableAttri.Foreground = 12213434 77 | Left = 368 78 | Top = 96 79 | end 80 | object synXml: TSynXMLSyn 81 | Options.AutoDetectEnabled = False 82 | Options.AutoDetectLineLimit = 0 83 | Options.Visible = False 84 | ElementAttri.Foreground = 14047781 85 | ElementAttri.Style = [] 86 | AttributeAttri.Foreground = 3973677 87 | AttributeValueAttri.Background = 16575695 88 | AttributeValueAttri.Foreground = 3283715 89 | AttributeValueAttri.Style = [] 90 | TextAttri.Style = [] 91 | CommentAttri.Background = 14671839 92 | CommentAttri.Foreground = clBlack 93 | CommentAttri.Style = [] 94 | SymbolAttri.Foreground = clMaroon 95 | WantBracesParsed = False 96 | Left = 352 97 | Top = 16 98 | end 99 | end 100 | -------------------------------------------------------------------------------- /src/DELI.FormTextPreview.pas: -------------------------------------------------------------------------------- 1 | unit DELI.FormTextPreview; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 7 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Actions, Vcl.ActnList, SynEdit, SynHighlighterXML, SynEditHighlighter, SynHighlighterBat, 8 | 9 | JPL.Strings, JPL.TStr, JPL.Files, DELI.Types; 10 | 11 | type 12 | TFormTextPreview = class(TForm) 13 | se: TSynEdit; 14 | Actions: TActionList; 15 | actEsc: TAction; 16 | synBat: TSynBatSyn; 17 | synXml: TSynXMLSyn; 18 | procedure FormCreate(Sender: TObject); 19 | procedure actEscExecute(Sender: TObject); 20 | procedure ApplyHighlighterFromFileName(fName: string); 21 | end; 22 | 23 | var 24 | FormTextPreview: TFormTextPreview; 25 | 26 | implementation 27 | 28 | {$R *.dfm} 29 | 30 | 31 | 32 | 33 | 34 | procedure TFormTextPreview.FormCreate(Sender: TObject); 35 | begin 36 | se.Lines.Clear; 37 | se.Align := alClient; 38 | se.Font.Name := MonoFontName; 39 | end; 40 | 41 | procedure TFormTextPreview.ApplyHighlighterFromFileName(fName: string); 42 | var 43 | Ext: string; 44 | begin 45 | Ext := GetFileExt(fName, True); 46 | Ext := TrimUp(Ext); 47 | if Ext = 'BAT' then se.Highlighter := synBat 48 | else if (Ext = 'XML') or (Ext = 'PROJ') then se.Highlighter := synXml 49 | else se.Highlighter := nil; 50 | end; 51 | 52 | procedure TFormTextPreview.actEscExecute(Sender: TObject); 53 | begin 54 | Close; 55 | end; 56 | 57 | 58 | 59 | end. 60 | -------------------------------------------------------------------------------- /src/DELI.PROCS.pas: -------------------------------------------------------------------------------- 1 | unit DELI.PROCS; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.ShellAPI, 7 | System.SysUtils, System.Classes, 8 | JPL.Strings, JPL.Strings.Ext, JPL.TStr, JPL.Conversion, JPL.Win.Dialogs, JPL.Win.System, JPL.Files, 9 | DELI.Types, DELI.ConOut; 10 | 11 | 12 | 13 | procedure VirusTotal(Hash: string; AHandle: HWND = 0); 14 | procedure ShowTextPreview(const Text, FormCaption: string); 15 | procedure ShowTextPreviewFromFile(const FileName, FormCaption: string); 16 | procedure ShowConsoleAppOutput(const Exe, Params, FormCaption: string); 17 | function GetTempFileName: string; 18 | 19 | //1 One line comment 20 | /// comment 1 21 | /// comment 2 22 | /// comment 3 23 | function NewFunction(const NewParam: Integer): string; 24 | 25 | 26 | implementation 27 | 28 | uses 29 | DELI.FormMain, 30 | DELI.FormTextPreview; 31 | 32 | procedure VirusTotal(Hash: string; AHandle: HWND = 0); 33 | var 34 | URL: string; 35 | begin 36 | Hash := TStr.RemoveSpaces(Hash); 37 | if Hash = '' then Exit; 38 | URL := TStr.ReplaceFirst(VirusTotalURLTemplate, '', Hash, True); 39 | ShellExecute(AHandle, 'open', PChar(URL), '', '', SW_SHOW); 40 | end; 41 | 42 | procedure ShowTextPreview(const Text, FormCaption: string); 43 | begin 44 | with FormTextPreview do 45 | begin 46 | Caption := FormCaption; 47 | se.Highlighter := nil; 48 | se.Text := Text; 49 | Show; 50 | end; 51 | end; 52 | 53 | procedure ShowTextPreviewFromFile(const FileName, FormCaption: string); 54 | begin 55 | FormTextPreview.Caption := 'Text preview'; 56 | FormTextPreview.se.Clear; 57 | 58 | if Trim(FileName) = '' then Exit; 59 | 60 | if not FileExists(FileName) then 61 | begin 62 | WinMsgError('File "' + FileName + '" does not exists!', 'Error', FormMain.Handle); 63 | Exit; 64 | end; 65 | 66 | 67 | with FormTextPreview do 68 | begin 69 | Caption := FormCaption; 70 | se.Lines.LoadFromFile(FileName); 71 | ApplyHighlighterFromFileName(FileName); 72 | Show; 73 | end; 74 | 75 | end; 76 | 77 | procedure ShowConsoleAppOutput(const Exe, Params, FormCaption: string); 78 | var 79 | sOut: string; 80 | begin 81 | FormTextPreview.Caption := 'Text preview'; 82 | FormTextPreview.se.Clear; 83 | 84 | if Trim(Exe) = '' then Exit; 85 | 86 | if not FileExists(Exe) then 87 | begin 88 | WinMsgError('File "' + Exe + '" does not exists!', 'Error', FormMain.Handle); 89 | Exit; 90 | end; 91 | 92 | sOut := ''; 93 | GetConsoleAppOutput(Exe, Params, sOut); 94 | 95 | with FormTextPreview do 96 | begin 97 | Caption := FormCaption; 98 | se.Text := sOut; 99 | ApplyHighlighterFromFileName('none'); 100 | Show; 101 | end; 102 | 103 | end; 104 | 105 | 106 | function GetTempFileName: string; 107 | begin 108 | Result := rbs(TempDir(ExtractFileDir(ParamStr(0)))) + PathDelim + '_di_tmp_' + GetRandomHexStr(4, '', False) + '.txt'; 109 | end; 110 | 111 | function NewFunction(const NewParam: Integer): string; 112 | begin 113 | // TODO -cMM: NewFunction default body inserted 114 | Result := ''; 115 | end; 116 | 117 | 118 | 119 | 120 | end. 121 | -------------------------------------------------------------------------------- /src/DELI.Types.pas: -------------------------------------------------------------------------------- 1 | unit DELI.Types; 2 | 3 | interface 4 | 5 | uses 6 | JPL.Win.FileIcons; 7 | 8 | const 9 | APP_NAME = 'DelphiInfo'; 10 | APP_VER_STR = '1.0'; 11 | APP_FULL_NAME = APP_NAME + ' ' + APP_VER_STR; 12 | 13 | 14 | STRID_YES = 'Yes'; 15 | STRID_NO = 'No'; 16 | 17 | STRID_TARGET_WIN32 = 'Win32'; 18 | STRID_TARGET_WIN64 = 'Win64'; 19 | STRID_TARGET_ANDROID32 = 'Android32'; 20 | STRID_TARGET_ANDROID64 = 'Android64'; 21 | 22 | STRID_PACKAGES = 'Packages'; 23 | STRID_DISBALED_PACKAGES = 'Disabled Packages'; 24 | STRID_IDE_PACKAGES = 'IDE Packages'; 25 | STRID_DISABLED_IDE_PACKAGES = 'Disabled IDE Packages'; 26 | STRID_IDE_DELPHI_PACKAGES = 'IDE Delphi Packages'; 27 | STRID_IDE_CBUILDER_PACKAGES = 'IDE C++Builder Packages'; 28 | 29 | REG_KEY_VALUE_SEPARATOR = ' : '; 30 | 31 | type 32 | 33 | PVstVariableRec = ^TVstVariableRec; 34 | TVstVariableRec = record 35 | No: integer; 36 | Name: string; 37 | Value: string; 38 | end; 39 | 40 | 41 | 42 | var 43 | MonoFontName: string; 44 | SemiboldFontName: string; 45 | VirusTotalURLTemplate: string = 'https://www.virustotal.com/file//analysis/'; 46 | GDelphiIcons: TFileIcons; 47 | RegJumpExe: string = 'regjump.exe'; 48 | 49 | 50 | 51 | implementation 52 | 53 | end. 54 | -------------------------------------------------------------------------------- /src/DelphiInfo.dpr: -------------------------------------------------------------------------------- 1 | program DelphiInfo; 2 | 3 | // Disable extended RTTI 4 | {$IF CompilerVersion >= 21.0} // >= Delphi 2010 5 | {$WEAKLINKRTTI ON} 6 | {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} 7 | {$IFEND} 8 | 9 | {$SetPEFlags 1} // IMAGE_FILE_RELOCS_STRIPPED 10 | {$SetPEFlags $20} // IMAGE_FILE_LARGE_ADDRESS_AWARE 11 | 12 | uses 13 | Vcl.Forms, 14 | DELI.FormMain in 'DELI.FormMain.pas' {FormMain}, 15 | DELI.Types in 'DELI.Types.pas', 16 | DELI.PROCS in 'DELI.PROCS.pas', 17 | DELI.FormTextPreview in 'DELI.FormTextPreview.pas' {FormTextPreview}, 18 | DELI.ConOut in 'DELI.ConOut.pas'; 19 | 20 | {$R *.res} 21 | 22 | begin 23 | {$IFDEF DEBUG}ReportMemoryLeaksOnShutdown := True;{$ENDIF} 24 | Application.Initialize; 25 | Application.MainFormOnTaskbar := True; 26 | Application.CreateForm(TFormMain, FormMain); 27 | Application.CreateForm(TFormTextPreview, FormTextPreview); 28 | Application.Run; 29 | end. 30 | -------------------------------------------------------------------------------- /src/DelphiInfo.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | True 4 | Application 5 | Release 6 | VCL 7 | DelphiInfo.dpr 8 | Win32 9 | {E8428829-7662-45AF-AF1D-3C76C7CE62A1} 10 | 19.2 11 | 3 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 | true 50 | Cfg_2 51 | true 52 | true 53 | 54 | 55 | DelphiInfo 56 | .\$(Platform)\$(Config) 57 | false 58 | .\$(Platform)\$(Config) 59 | false 60 | false 61 | false 62 | System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) 63 | false 64 | $(BDS)\bin\delphi_PROJECTICON.ico 65 | 66 | 67 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 68 | JvBDE;JvGlobus;FlatStyle;JvMM;NxGrid6Run_dxe3;JvManagedThreads;tmsexdxe3;NxGridDsgn_dxe3;pkCindyDBXDXE3;DBXSqliteDriver;JP.TMS;fmx;JvDlgs;IndySystem;NxGrid6Dsgn_dxe3;TeeDB;JPLib;JvCrypt;vclib;inetdbbde;DBXInterBaseDriver;FrameViewerXE3;DataSnapCommon;ShellFolders_Dsgn;pkCindyPackDXE3;JvNet;JvDotNetCtrls;SynEdit_R;DbxCommonDriver;vclimg;dbxcds;vclshlctrls;MetropolisUILiveTile;NxDBGridDsgn_dxe3;JvXPCtrls;NxLayout6Run_dxe3;vcldb;vcldsnap;jack;tb2k_XE3;KleverComponents;JPRPack;CustomIPTransport;JvCore;NxDBGridRun_dxe3;vclribbon;GR32_D;dsnap;IndyIPServer;fmxase;vcl;IndyCore;CodeSiteExpressPkg;IndyIPCommon;CloudService;FmxTeeUI;JPFlat;tmswizdxe3;JvAppFrm;NxDBGrid6Run_dxe3;JvDB;JvRuntimeDesign;inetdbxpress;webdsnap;JP.Nx5;NxStandard6Run_dxe3;JclDeveloperTools;NxCollectionRun_dxe3;JPEssentials;JP.Nx6;JPPack;IGDIPlusMod;adortl;JvDocking;CnPack_DXE3;JvWizards;NxCollectionDsgn_dxe3;NxGridRun_dxe3;MyIDEExt;NxCommonDsgn_dxe3;NxInspector6Run_dxe3;JvHMI;NxCommonRun_dxe3;bindcompfmx;WindowState;NxStandard6Dsgn_dxe3;vcldbx;JvBands;ImageWork;rtl;dbrtl;DbxClientDriver;JPPegTop;bindcomp;inetdb;GR32_R;JvPluginSystem;Tee;JclContainers;DropFiles_Run;NxAddonsRun_dxe3;JvCmp;JvSystem;xmlrtl;svnui;ibxpress;JvTimeFramework;NxSheetRun_dxe3;JvControls;tmsdxe3;IndyProtocols;DBXMySQLDriver;VersionInfo;vclactnband;bindengine;soaprtl;bindcompdbx;FMXTee;TeeUI;bindcompvcl;DzHTMLText2;JvStdCtrls;Jcl;vclie;JvCustom;JvJans;JvPageComps;JvPrintPreview;vcltouch;DropFiles_Dsgn;DragDropDXE3;websnap;PngComponents;NxDBGrid6Dsgn_dxe3;pkCindyDBCtrlsPackDXE3;VclSmp;Intraweb;NxInspectorRun_dxe3;JPJVCL;dsnapcon;inet;NxCollection6Run_dxe3;fmxobj;JclVcl;JvPascalInterpreter;VCL_Image32;vclx;svn;fmxdae;tmsxlsdxe3;NxInspectorDsgn_dxe3;bdertl;VirtualTreesR;dbexpress;ShellFolders_Run;SpTBXLib;IndyIPClient;$(DCC_UsePackage) 69 | $(BDS)\bin\default_app.manifest 70 | true 71 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 72 | 1033 73 | true 74 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 75 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 76 | 77 | 78 | $(BDS)\bin\default_app.manifest 79 | 1033 80 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 81 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 82 | true 83 | NxGrid6Run_dxe3;tmsexdxe3;NxGridDsgn_dxe3;DBXSqliteDriver;JP.TMS;fmx;IndySystem;TeeDB;JPLib;vclib;DBXInterBaseDriver;DataSnapCommon;DbxCommonDriver;vclimg;dbxcds;NxDBGridDsgn_dxe3;NxLayout6Run_dxe3;vcldb;vcldsnap;CustomIPTransport;NxDBGridRun_dxe3;dsnap;IndyIPServer;fmxase;vcl;IndyCore;IndyIPCommon;NxDBGrid6Run_dxe3;inetdbxpress;webdsnap;NxStandard6Run_dxe3;NxCollectionRun_dxe3;JPEssentials;JPPack;IGDIPlusMod;adortl;NxCollectionDsgn_dxe3;NxGridRun_dxe3;NxCommonDsgn_dxe3;NxInspector6Run_dxe3;NxCommonRun_dxe3;bindcompfmx;rtl;dbrtl;DbxClientDriver;JPPegTop;bindcomp;inetdb;Tee;DropFiles_Run;NxAddonsRun_dxe3;xmlrtl;ibxpress;NxSheetRun_dxe3;tmsdxe3;IndyProtocols;DBXMySQLDriver;vclactnband;bindengine;soaprtl;bindcompdbx;TeeUI;bindcompvcl;vclie;vcltouch;DragDropDXE3;websnap;PngComponents;VclSmp;NxInspectorRun_dxe3;dsnapcon;inet;NxCollection6Run_dxe3;fmxobj;vclx;fmxdae;tmsxlsdxe3;NxInspectorDsgn_dxe3;dbexpress;ShellFolders_Run;SpTBXLib;IndyIPClient;$(DCC_UsePackage) 84 | true 85 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 86 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 87 | 88 | 89 | true 90 | true 91 | DEBUG;$(DCC_Define) 92 | true 93 | false 94 | true 95 | 96 | 97 | ..\dcu32_debug 98 | ..\ 99 | false 100 | 32_debug.exe 101 | true 102 | 1033 103 | 104 | 105 | 0 106 | RELEASE;$(DCC_Define) 107 | false 108 | 0 109 | 110 | 111 | ..\images\Main.ico 112 | false 113 | false 114 | ..\dcu32 115 | ..\ 116 | 32.exe 117 | true 118 | 1033 119 | Debug 120 | 121 | 122 | ..\images\Main.ico 123 | false 124 | false 125 | 1033 126 | ..\ 127 | 64.exe 128 | true 129 | ..\dcu64 130 | Debug 131 | 132 | 133 | 134 | MainSource 135 | 136 | 137 |
FormMain
138 | dfm 139 |
140 | 141 | 142 | 143 |
FormTextPreview
144 | dfm 145 |
146 | 147 | 148 | Cfg_2 149 | Base 150 | 151 | 152 | Base 153 | 154 | 155 | Cfg_1 156 | Base 157 | 158 |
159 | 160 | Delphi.Personality.12 161 | 162 | 163 | 164 | 165 | False 166 | False 167 | 1 168 | 0 169 | 0 170 | 0 171 | False 172 | False 173 | False 174 | False 175 | False 176 | 1033 177 | 1252 178 | 179 | 180 | 181 | 182 | 1.0.0.0 183 | 184 | 185 | 186 | 187 | 188 | 1.0.0.0 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | DelphiInfo.dpr 201 | 202 | 203 | FastReport 4.0 Components 204 | FastReport 4.0 DB Components 205 | FastReport 4.0 Exports 206 | Microsoft Office 2000 Sample Automation Server Wrapper Components 207 | Microsoft Office XP Sample Automation Server Wrapper Components 208 | 209 | 210 | 211 | 212 | 213 | DelphiInfo.exe 214 | true 215 | 216 | 217 | 218 | 219 | res\drawable-normal 220 | 1 221 | 222 | 223 | 224 | 225 | 1 226 | .dylib 227 | 228 | 229 | 0 230 | .dll;.bpl 231 | 232 | 233 | Contents\MacOS 234 | 1 235 | .dylib 236 | 237 | 238 | 1 239 | .dylib 240 | 241 | 242 | 243 | 244 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 245 | 1 246 | 247 | 248 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 249 | 1 250 | 251 | 252 | 253 | 254 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 255 | 1 256 | 257 | 258 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 259 | 1 260 | 261 | 262 | 263 | 264 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 265 | 1 266 | 267 | 268 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 269 | 1 270 | 271 | 272 | 273 | 274 | library\lib\mips 275 | 1 276 | 277 | 278 | 279 | 280 | library\lib\x86 281 | 1 282 | 283 | 284 | 285 | 286 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 287 | 1 288 | 289 | 290 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 291 | 1 292 | 293 | 294 | 295 | 296 | 1 297 | 298 | 299 | 1 300 | 301 | 302 | 303 | 304 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 305 | 1 306 | 307 | 308 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 309 | 1 310 | 311 | 312 | 313 | 314 | res\drawable-xlarge 315 | 1 316 | 317 | 318 | 319 | 320 | res\drawable-xhdpi 321 | 1 322 | 323 | 324 | 325 | 326 | res\drawable-xxhdpi 327 | 1 328 | 329 | 330 | 331 | 332 | res\drawable-xhdpi 333 | 1 334 | 335 | 336 | res\drawable-xhdpi 337 | 1 338 | 339 | 340 | 341 | 342 | 1 343 | 344 | 345 | 1 346 | 347 | 348 | 349 | 350 | Assets 351 | 1 352 | 353 | 354 | Assets 355 | 1 356 | 357 | 358 | 359 | 360 | Assets 361 | 1 362 | 363 | 364 | Assets 365 | 1 366 | 367 | 368 | 369 | 370 | Contents\MacOS 371 | 1 372 | 373 | 374 | 1 375 | 376 | 377 | 0 378 | 379 | 380 | 381 | 382 | Contents\MacOS 383 | 1 384 | .framework 385 | 386 | 387 | 0 388 | 389 | 390 | 391 | 392 | res\drawable-small 393 | 1 394 | 395 | 396 | 397 | 398 | ../ 399 | 1 400 | 401 | 402 | 403 | 404 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 405 | 1 406 | 407 | 408 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 409 | 1 410 | 411 | 412 | 413 | 414 | Contents\MacOS 415 | 1 416 | 417 | 418 | 1 419 | 420 | 421 | Contents\MacOS 422 | 0 423 | 424 | 425 | 426 | 427 | classes 428 | 1 429 | 430 | 431 | 432 | 433 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 434 | 1 435 | 436 | 437 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 438 | 1 439 | 440 | 441 | 442 | 443 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 444 | 1 445 | 446 | 447 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 448 | 1 449 | 450 | 451 | 452 | 453 | res\values 454 | 1 455 | 456 | 457 | res\values 458 | 1 459 | 460 | 461 | 462 | 463 | library\lib\arm64-v8a 464 | 1 465 | 466 | 467 | library\lib\armeabi-v7a 468 | 1 469 | 470 | 471 | 472 | 473 | res\drawable 474 | 1 475 | 476 | 477 | 478 | 479 | res\drawable-xxxhdpi 480 | 1 481 | 482 | 483 | res\drawable-xxxhdpi 484 | 1 485 | 486 | 487 | 488 | 489 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 490 | 1 491 | 492 | 493 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 494 | 1 495 | 496 | 497 | 498 | 499 | 1 500 | 501 | 502 | 1 503 | 504 | 505 | 506 | 507 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 508 | 1 509 | 510 | 511 | 512 | 513 | 1 514 | 515 | 516 | 517 | 518 | Contents\Resources 519 | 1 520 | 521 | 522 | 523 | 524 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 525 | 1 526 | 527 | 528 | 529 | 530 | 0 531 | 532 | 533 | 0 534 | 535 | 536 | 0 537 | 538 | 539 | Contents\MacOS 540 | 0 541 | 542 | 543 | 0 544 | 545 | 546 | 547 | 548 | res\drawable-ldpi 549 | 1 550 | 551 | 552 | 553 | 554 | 1 555 | 556 | 557 | 1 558 | 559 | 560 | 561 | 562 | res\drawable-mdpi 563 | 1 564 | 565 | 566 | 567 | 568 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 569 | 1 570 | 571 | 572 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 573 | 1 574 | 575 | 576 | 577 | 578 | res\drawable-hdpi 579 | 1 580 | 581 | 582 | res\drawable-hdpi 583 | 1 584 | 585 | 586 | 587 | 588 | res\drawable-mdpi 589 | 1 590 | 591 | 592 | res\drawable-mdpi 593 | 1 594 | 595 | 596 | 597 | 598 | 1 599 | .dylib 600 | 601 | 602 | 0 603 | .bpl 604 | 605 | 606 | Contents\MacOS 607 | 1 608 | .dylib 609 | 610 | 611 | 1 612 | .dylib 613 | 614 | 615 | 616 | 617 | 1 618 | 619 | 620 | 1 621 | 622 | 623 | 624 | 625 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 626 | 1 627 | 628 | 629 | 630 | 631 | ..\$(PROJECTNAME).launchscreen 632 | 64 633 | 634 | 635 | ..\$(PROJECTNAME).launchscreen 636 | 64 637 | 638 | 639 | 640 | 641 | Contents 642 | 1 643 | 644 | 645 | 646 | 647 | 1 648 | 649 | 650 | 1 651 | 652 | 653 | 654 | 655 | library\lib\armeabi-v7a 656 | 1 657 | 658 | 659 | 660 | 661 | ../ 662 | 1 663 | 664 | 665 | 666 | 667 | res\values 668 | 1 669 | 670 | 671 | res\values 672 | 1 673 | 674 | 675 | 676 | 677 | 1 678 | 679 | 680 | 1 681 | 682 | 683 | 684 | 685 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 686 | 1 687 | 688 | 689 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 690 | 1 691 | 692 | 693 | 694 | 695 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 696 | 1 697 | 698 | 699 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 700 | 1 701 | 702 | 703 | 704 | 705 | res\drawable 706 | 1 707 | 708 | 709 | 710 | 711 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 712 | 1 713 | 714 | 715 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 716 | 1 717 | 718 | 719 | 720 | 721 | library\lib\armeabi-v7a 722 | 1 723 | 724 | 725 | 726 | 727 | res\values-v21 728 | 1 729 | 730 | 731 | res\values-v21 732 | 1 733 | 734 | 735 | 736 | 737 | library\lib\armeabi-v7a 738 | 1 739 | 740 | 741 | 742 | 743 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 744 | 1 745 | 746 | 747 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 748 | 1 749 | 750 | 751 | 752 | 753 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 754 | 1 755 | 756 | 757 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 758 | 1 759 | 760 | 761 | 762 | 763 | 1 764 | 765 | 766 | 1 767 | 768 | 769 | 770 | 771 | library\lib\armeabi-v7a 772 | 1 773 | 774 | 775 | 776 | 777 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 778 | 1 779 | 780 | 781 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 782 | 1 783 | 784 | 785 | 786 | 787 | 1 788 | 789 | 790 | 1 791 | 792 | 793 | 794 | 795 | library\lib\armeabi 796 | 1 797 | 798 | 799 | 800 | 801 | 1 802 | 803 | 804 | library\lib\armeabi-v7a 805 | 1 806 | 807 | 808 | 0 809 | 810 | 811 | Contents\MacOS 812 | 1 813 | 814 | 815 | 1 816 | 817 | 818 | 819 | 820 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 821 | 1 822 | 823 | 824 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 825 | 1 826 | 827 | 828 | 829 | 830 | res\drawable-large 831 | 1 832 | 833 | 834 | 835 | 836 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 837 | 1 838 | 839 | 840 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 841 | 1 842 | 843 | 844 | 845 | 846 | 1 847 | 848 | 849 | 1 850 | 851 | 852 | 853 | 854 | res\values 855 | 1 856 | 857 | 858 | 859 | 860 | res\xml 861 | 1 862 | 863 | 864 | res\xml 865 | 1 866 | 867 | 868 | 869 | 870 | res\drawable-xxxhdpi 871 | 1 872 | 873 | 874 | res\drawable-xxxhdpi 875 | 1 876 | 877 | 878 | 879 | 880 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 881 | 1 882 | 883 | 884 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 885 | 1 886 | 887 | 888 | 889 | 890 | res\drawable-hdpi 891 | 1 892 | 893 | 894 | 895 | 896 | res\drawable-xxhdpi 897 | 1 898 | 899 | 900 | res\drawable-xxhdpi 901 | 1 902 | 903 | 904 | 905 | 906 | 1 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | True 923 | True 924 | 925 | 926 | 12 927 | 928 | 929 | 930 | 931 |
932 | -------------------------------------------------------------------------------- /src/DelphiInfo.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jackdp/DelphiInfo/d287d9fa603f79296f2172c6038a702e5c3e0bed/src/DelphiInfo.res --------------------------------------------------------------------------------