Răsfoiți Sursa

Merge branch 'is-6' into anchors

Martijn Laan 6 ani în urmă
părinte
comite
7ddec89948

+ 5 - 2
Components/BitmapImage.pas

@@ -2,7 +2,7 @@ unit BitmapImage;
 
 {
   Inno Setup
-  Copyright (C) 1997-2018 Jordan Russell
+  Copyright (C) 1997-2019 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -12,7 +12,7 @@ unit BitmapImage;
 interface
 
 uses
-  Windows, Controls, Graphics, Classes, Resample;
+  Windows, Controls, Graphics, Classes;
 
 type
   TBitmapImage = class(TGraphicControl)
@@ -73,6 +73,9 @@ procedure Register;
 
 implementation
 
+uses
+  Resample;
+
 procedure Register;
 begin
   RegisterComponents('JR', [TBitmapImage]);

+ 5 - 3
ISHelp/isx.xml

@@ -314,10 +314,12 @@ end;
 
 <ul>
 <li>The implementations will be called in order of their definition except that any main implementation (=the implementation without an event attribute) will be called last.</li>
-<li>Event attributes may only be used for event functions which are a procedure or are a function which return a Boolean. In the latter case:</li>
+<li>Event attributes may be used for all event functions. If the event function has a return value then lazy evaluation is performed:</li>
 <ul>
-<li><tt>InitializeSetup</tt>, <tt>BackButtonClick</tt>, <tt>NextButtonClick</tt>, <tt>InitializeUninstall</tt>: All implementations must return True for the event function to be treated as returning True and an implementation returning False does not stop the calls to the other implementations. In other words: the results are 'and'-ed without lazy evaluation.</li>
-<li><tt>CheckPassword</tt>, <tt>CheckSerial</tt>, <tt>ShouldSkipPage</tt>, <tt>NeedRestart</tt>: One implementation must return True for the event function to be treated as returning True and an implementation returning True does not stop the calls to the other implementations. In other words: the results are 'or'-ed without lazy evaluation.</li>
+<li><tt>InitializeSetup</tt>, <tt>BackButtonClick</tt>, <tt>NextButtonClick</tt>, <tt>InitializeUninstall</tt>: All implementations must return True for the event function to be treated as returning True and an implementation returning False stops the calls to the other implementations.</li>
+<li><tt>CheckPassword</tt>, <tt>CheckSerial</tt>, <tt>ShouldSkipPage</tt>, <tt>NeedRestart</tt>: All implementations must return False for the event function to be treated as returning False and an implementation returning True stops the calls to the other implementations.</li>
+<li><tt>UpdateReadyMemo</tt>, <tt>PrepareToInstall</tt>: All implementations must return an empty string for the event function to be treated as returning an empty string and an implementation returning a non empty string stops the calls to the other implementations.</li>
+<li><tt>GetCustomSetupExitCode</tt>: All implementations must return zero for the event function to be treated as returning zero and an implementation returning a non zero number stops the calls to the other implementations.</li>
 </ul>
 <li>Event attributes may only be used on procedures or functions which do not already have the name of an event function.</li>
 <li>If the event function uses <tt>var</tt> parameters then the value will be passed on from implementation to implementation.</li>

+ 610 - 411
Projects/CompForm.dfm

@@ -14,7 +14,7 @@ object CompileForm: TCompileForm
   Menu = MainMenu1
   OldCreateOrder = True
   Position = poDefault
-  Scaled = False
+  OnAfterMonitorDpiChanged = FormAfterMonitorDpiChanged
   OnCloseQuery = FormCloseQuery
   OnKeyDown = FormKeyDown
   OnResize = FormResize
@@ -151,7 +151,7 @@ object CompileForm: TCompileForm
     Margins.Left = 7
     Margins.Top = 4
     Margins.Bottom = 0
-    Images = ImageList1
+    Images = ToolBarVirtualImageList
     ParentShowHint = False
     ShowHint = True
     TabOrder = 2
@@ -647,421 +647,13 @@ object CompileForm: TCompileForm
       OnClick = PListCopyClick
     end
   end
-  object ImageList1: TImageList
-    ColorDepth = cd32Bit
-    Left = 280
-    Top = 48
-    Bitmap = {
-      494C01010B003400D40110001000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600
-      0000000000003600000028000000400000003000000001002000000000000030
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6
-      F600000000000000000000000000000000000000000000000000000000000000
-      00005E5E5E60F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF5E5E
-      5E60000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000F6F6F600F6F6
-      F600C9C9C9007A7A7A004242420042424200424242004242420085858500F5F4
-      F500F6F6F600F6F6F600000000000000000000000000000000001F1F1F20C8C8
-      C8CFF1E1BFFFE8BC5DFFE2A119FFE2A119FFE2A119FFE2A119FFE8BC5DFFF1E1
-      BFFFC8C8C8CF1F1F1F2000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F600F6F6F6009191
-      91004242420042424200424242004242420042424200424242009A999900F1EF
-      F000F3F2F300F6F6F600F6F6F60000000000000000001F1F1F20E6E6E6EFEBC6
-      79FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A1
-      19FFEBC679FFE6E6E6EF1F1F1F20000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F600868686004242
-      420042424200424242004242420042424200424242004D4D4D00E6E4E500F1EF
-      F000F1EFF000F3F2F300F6F6F6000000000000000000C8C8C8CFEAC16BFFE2A1
-      19FFE2A119FFE2A119FFE2A119FFFFFFFFFFFFFFFFFFE2A119FFE2A119FFE2A1
-      19FFE2A119FFEBC679FFC8C8C8CF00000000000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F600C9C9C900424242004242
-      420042424200424242004242420042424200424242009A999900F1EFF000F1EF
-      F000E6E4E5006E6D6E00C9C9C900F6F6F6005E5E5E60F1E1BFFFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFFFFFFFFFFFFFFFFFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFF1E1BFFF5E5E5E60000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F6007A7A7A00424242004242
-      4200424242004D4D4D00C5C4C500F1EFF000F1EFF000F1EFF000F1EFF000BAB9
-      BA004D4D4D00424242007A7A7A00F6F6F600F6F6F6FFE8BC5DFFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE8BC5DFFF6F6F6FF000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F60042424200424242004242
-      420042424200C5C4C500D0CFCF007978780079787800D0CFCF00DBD9DA004242
-      42006E6D6E009A999900C5C4C500F6F6F600F6F6F6FFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFFFFFFFFFFFFFFFFFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFF6F6F6FF000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F60042424200424242004242
-      420042424200F1EFF00084838300E6E4E500E6E4E50079787800F1EFF000F1EF
-      F000F1EFF000F1EFF000F1EFF000F6F6F600F6F6F6FFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFFFFFFFFFFFFFFFFFFFFFFFFFF1D08DFFE2A1
-      19FFE2A119FFE2A119FFE2A119FFF6F6F6FF000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F6000D26A100394DB100E7E9
-      F000F1EFF000F1EFF00084838300B1B7D600475AB60079787800F1EFF0004242
-      4200424242004242420042424200F6F6F600F6F6F6FFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFF1D08DFFFFFFFFFFFFFFFFFFFFFFFFFFE2A1
-      19FFE2A119FFE2A119FFE2A119FFF6F6F6FF000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F600394DB1000D26A1005667
-      BC0042424200DBD9DA009FA8D6001C33A600B7BACA00D0CFCF00C5C4C5004242
-      4200424242004242420042424200F6F6F600F6F6F6FFE2A119FFE2A119FFE2A1
-      19FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFFFFFFFFFFFFFFFFFE2A1
-      19FFE2A119FFE2A119FFE2A119FFF6F6F6FF000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F600E7E9F0006474C1000D26
-      A1006474C100909BD1000D26A100BCC2E100F1EFF000C5C4C5004D4D4D004242
-      420042424200424242007A7A7A00F6F6F600F6F6F6FFE8BC5DFFE2A119FFE2A1
-      19FFE2A119FFFFFFFFFFFFFFFFFFE9B952FFE9B952FFFFFFFFFFFFFFFFFFE2A1
-      19FFE2A119FFE2A119FFE8BC5DFFF6F6F6FF000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F600F6F6F600F6F6F6006474
-      C1000D26A1000D26A100909BD100F6F6F6004242420042424200424242004242
-      42004242420042424200C9C9C900F6F6F6005E5E5E60F1E1BFFFE2A119FFE2A1
-      19FFE2A119FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE2A1
-      19FFE2A119FFE2A119FFF1E1BFFF5E5E5E60000000000000000000000000F6F6
-      F6FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24A1FF0B24
-      A1FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F600F6F6F6006474
-      C1000D26A1000D26A100828ECC00F6F6F6004242420042424200424242004242
-      42004242420091919100F6F6F6000000000000000000C8C8C8CFEBC679FFE2A1
-      19FFE2A119FFEDC46FFFFDF9F1FFFFFFFFFFFFFFFFFFFDF9F1FFEDC46FFFE2A1
-      19FFE2A119FFEBC679FFC8C8C8CF00000000000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F6006474C1000D26
-      A1005667BC009FA8D6001C33A6009FA8D600F6F6F60042424200424242004242
-      420091919100F6F6F600F6F6F60000000000000000001F1F1F20E6E6E6EFEAC1
-      6BFFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A119FFE2A1
-      19FFEBC679FFE6E6E6EF1F1F1F20000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F6000D26A1002A40
-      AC00E7E9F100F6F6F600CACFE600394DB100CACFE600F6F6F6007A7A7A00C9C9
-      C900F6F6F600F6F6F600000000000000000000000000000000001F1F1F20C8C8
-      C8CFF1E1BFFFE8BC5DFFE2A119FFE2A119FFE2A119FFE2A119FFE8BC5DFFF1E1
-      BFFFC8C8C8CF1F1F1F2000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F600CACFE600D9DC
-      EB00F6F6F60000000000F6F6F600E7E9F000D9DCEB00F6F6F600F6F6F600F6F6
-      F600000000000000000000000000000000000000000000000000000000000000
-      00005E5E5E60F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF5E5E
-      5E60000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF000000000000000000000000F6F6
-      F6FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00005E5E5E60F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF5E5E
-      5E6000000000000000000000000000000000F6F6F6FF404040FF404040FF4040
-      40FF404040FF404040FF404040FF404040FF404040FF404040FF404040FF4040
-      40FF404040FF404040FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FF00000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000000000001F1F1F20C8C8
-      C8CFC9C9C9FF787878FF404040FF404040FF404040FF404040FF858585FFF5F4
-      F5FFC8C8C8CF1F1F1F200000000000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF569E5AFFD2E2D2FFF6F6F6FFF6F6F6FF0000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000000000001F1F1F20E6E6E6EF9191
-      91FF404040FF404040FF404040FF404040FF404040FF404040FF9A9999FFF1EF
-      F0FFF3F2F3FFE6E6E6EF1F1F1F2000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF3E9142FFADCEAFFFF6F6F6FFF6F6F6FF00000000000000000000
-      000000000000000000000000000000000000000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FF00000000000000000000000000000000C8C8C8CF868686FF4040
-      40FF404040FF404040FF404040FF404040FF404040FF4B4B4BFFE6E4E5FFF1EF
-      F0FFF1EFF0FFF3F2F3FFC8C8C8CF00000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF7BB37DFFD9DBD9EFF6F6F6FF000000000000
-      000000000000000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF0000000000000000000000005E5E5E60C9C9C9FF404040FF4040
-      40FF404040FF404040FF404040FF404040FF404040FF9A9999FFF1EFF0FFF1EF
-      F0FFE6E4E5FF6C6B6CFFC9C9C9FF5E5E5E60F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF328A36FF569E5AFFD2E2D2FFF6F6F6FFF6F6
-      F6FF00000000000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF000000000000000000000000F6F6F6FF787878FF404040FF4040
-      40FF404040FF4B4B4BFFC5C4C5FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFBAB9
-      BAFF4B4B4BFF404040FF787878FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF4040
-      40FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF4040
-      40FF404040FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF328A36FF328A36FF3E9142FFADCEAFFFF6F6
-      F6FFF6F6F6FF000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF000000000000000000000000F6F6F6FF404040FF404040FF4040
-      40FF404040FFC5C4C5FFD0CFCFFF777676FF777676FFD0CFCFFFDBD9DAFF4040
-      40FF6C6B6CFF9A9999FFC5C4C5FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF4040
-      40FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF4040
-      40FF404040FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF328A36FF328A36FF328A36FF328A36FF7BB3
-      7DFFF6F6F6FFF6F6F6FF0000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF000000000000000000000000F6F6F6FF404040FF404040FF4040
-      40FF404040FFF1EFF0FF848383FFE6E4E5FFE6E4E5FF777676FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FFF1EFF0FFF6F6F6FFF6F6F6FF909BD1FFCACFE6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFD9DCEBFFE7E9F1FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF328A36FF328A36FF328A36FF328A36FF89B9
-      8BFFF6F6F6FFF6F6F6FF0000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF000000000000000000000000F6F6F6FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FF848383FFE6E4E5FFE6E4E5FF777676FFF1EFF0FF4040
-      40FF404040FF404040FF404040FFF6F6F6FFF6F6F6FF0B24A1FF1A31A6FFCACF
-      E6FFF6F6F6FFF6F6F6FFBCC2E1FF4558B6FFE7E9F1FF404040FF404040FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF328A36FF328A36FF3E9142FFB9D4BBFFF6F6
-      F6FFF6F6F6FF000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF000000000000000000000000F6F6F6FFC5C4C5FFA4A3A4FF7776
-      76FF404040FFDBD9DAFFD0CFCFFF848383FF848383FFD0CFCFFFC5C4C5FF4040
-      40FF404040FF404040FF404040FFF6F6F6FFF6F6F6FFBCC2E1FF1A31A6FF0B24
-      A1FF9FA8D6FF9FA8D6FF1A31A6FFD9DCEBFFF6F6F6FF404040FF404040FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF328A36FF569E5AFFDEE9DEFFF6F6F6FFF6F6
-      F6FF00000000000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF000000000000000000000000F6F6F6FF787878FF404040FF4B4B
-      4BFFBAB9BAFFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFC5C4C5FF4B4B4BFF4040
-      40FF404040FF404040FF787878FFF6F6F6FFF6F6F6FFF6F6F6FFE7E9F1FF4558
-      B6FF0B24A1FF0B24A1FFCACFE6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF328A36FF328A36FF89B98BFFF6F6F6FFF6F6F6FF000000000000
-      000000000000000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF0000000000000000000000005E5E5E60C9C9C9FF6C6B6CFFE6E4
-      E5FFF1EFF0FFF1EFF0FF9A9999FF404040FF404040FF404040FF404040FF4040
-      40FF404040FF404040FFC9C9C9FF5E5E5E60F6F6F6FFF6F6F6FFF6F6F6FF6272
-      C1FF0B24A1FF1A31A6FFCACFE6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF4040
-      40FF404040FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF328A36FF3E9142FFB9D4BBFFF6F6F6FFF6F6F6FF00000000000000000000
-      000000000000000000000000000000000000000000000000000000000000F6F6
-      F6FF9C5100FF9C5100FF9C5100FFF6F6F6FFF6F6F6FF9C5100FF9C5100FF9C51
-      00FFF6F6F6FF00000000000000000000000000000000C8C8C8CFF3F2F3FFF1EF
-      F0FFF1EFF0FFE6E4E5FF4B4B4BFF404040FF404040FF404040FF404040FF4040
-      40FF404040FF919191FFC8C8C8CF00000000F6F6F6FFF6F6F6FF6272C1FF0B24
-      A1FF909BD1FFBCC2E1FF283EACFFCACFE6FFF6F6F6FFF6F6F6FFF6F6F6FF4040
-      40FF404040FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FF569E5AFFDEE9DEFFF6F6F6FFF6F6F6FF0000000000000000000000000000
-      000000000000000000000000000000000000000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FF000000000000000000000000000000001F1F1F20E6E6E6EFF3F2
-      F3FFF1EFF0FF9A9999FF404040FF404040FF404040FF404040FF404040FF4040
-      40FF919191FFE6E6E6EF1F1F1F2000000000F6F6F6FFF6F6F6FF0B24A1FF5465
-      BCFFF6F6F6FFF6F6F6FFE7E9F1FF5465BCFFD9DCEBFFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FF00000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00000000000000000000000000000000000000000000000000001F1F1F20C8C8
-      C8CFF5F4F5FF858585FF404040FF404040FF404040FF404040FF787878FFC9C9
-      C9FFC8C8C8CF1F1F1F200000000000000000F6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF000000000000000000000000F6F6
-      F6FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      00005E5E5E60F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF5E5E
-      5E60000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000000000000F0F0F10F6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF0000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000F6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF0000000000000000000000000000
-      000000000000F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FF00000000000000006E6E6E70C8DEECFF78B6
-      DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6
-      DCFF78B6DCFFB6D3E6FF78B6DCFFF6F6F6FF00000000F6F6F600F6F6F600F6F6
-      F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6
-      F600F6F6F600F6F6F600F6F6F60000000000F6F6F6FF404040FF404040FF4040
-      40FF404040FF404040FF404040FF404040FF404040FF404040FF404040FF4040
-      40FF404040FF404040FF404040FFF6F6F6FF0000000000000000000000000000
-      000000000000F6F6F6FF404040FF404040FF404040FF404040FF404040FF4040
-      40FF404040FF404040FFF6F6F6FF0000000000000000D8D8D8DF91C2E1FF78B6
-      DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6
-      DCFF89BDDFFFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF0000000000000000000000000000
-      000000000000F6F6F6FF404040FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FF404040FFF6F6F6FF000000003F3F3F40DFEAF1FF78B6DCFF78B6
-      DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6
-      DCFFD3E1EBFFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF0000000000000000000000000000
-      000000000000F6F6F6FF404040FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FF404040FFF6F6F6FF000000009B9B9B9FA9CEE6FF78B6DCFF78B6
-      DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF9FC8
-      E2FFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF0000000000000000000000000000
-      000000000000F6F6F6FF404040FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FF404040FFF6F6F6FF00000000F6F6F6FF82BADEFF78B6DCFF78B6
-      DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF78B6DCFF81BADDFFE2E8
-      EEFFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF0000000000000000000000000000
-      000000000000F6F6F6FF404040FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FF404040FFF6F6F6FF00000000F6F6F6FFF6F6F6FF81BADDFFF1EF
-      F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FF4040
-      40FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF4040
-      40FF404040FFF6F6F6FF404040FFF6F6F6FF000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FF404040FFF6F6F6FF0000000000000000F6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FF4040
-      40FF404040FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FF4040
-      40FF404040FFF6F6F6FF404040FFF6F6F6FF00000000F6F6F6FFF6F6F6FFF6F6
-      F6FF187BC2FFF6F6F6FFF6F6F6FFF6F6F6FFF1EFF0FFF1EFF0FFF1EFF0FF4040
-      40FF404040FF868686FFE6E6E6EF000000008B8B8B8FE0CDB9FFA25B0DFF9C51
-      00FFF6F6F6FFF6F6F6FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C5300009C5300009C5300009C5300009C5300009C5300009C5300009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FF00000000F6F6F6FF187BC2FFF6F6
-      F6FF187BC2FFF6F6F6FF187BC2FFF6F6F6FFF1EFF0FFF1EFF0FFF1EFF0FF4040
-      40FF868686FFE6E6E6EF2F2F2F3000000000F6F6F6FFA25B0DFFBE905AFFEBE2
-      D7FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C530000F1EFF000F1EFF000F1EFF000F1EFF000F1EFF000F1EFF0009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FF404040FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFD4D4D4FF626262FF626262FFD4D4D4FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FF404040FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF187B
-      C2FF187BC2FF187BC2FFF6F6F6FFF6F6F6FFF6F6F6FF404040FF404040FF8686
-      86FFE6E6E6EF2F2F2F300000000000000000F6F6F6FF9C5100FFE0CDB9FFF6F6
-      F6FFBE905AFF9C5100FFBE905AFFF6F6F6FFF6F6F6FFF1EFF0FFF1EFF0FFF1EF
-      F0FFF1EFF0FFF1EFF0FF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C530000F1EFF000F1EFF000F1EFF000F1EFF000F1EFF000F1EFF0009C53
-      00009C5300009C530000F6F6F60000000000F6F6F6FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFB3B3B3FF4B4B4BFF404040FF404040FF4B4B4BFFB3B3B3FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF187BC2FF187BC2FF187B
-      C2FFF6F6F6FF187BC2FF187BC2FF187BC2FFF6F6F6FFF6F6F6FFF6F6F6FFE6E6
-      E6EF2F2F2F30000000000000000000000000F6F6F6FFA25B0DFFBE905AFFEBE2
-      D7FFF6F6F6FFBE905AFF9C5100FFAD702CFFF6F6F6FF78B6DCFF78B6DCFF78B6
-      DCFF78B6DCFF78B6DCFF78B6DCFFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C530000F1EFF000F1EFF000F1EFF0009C5300009C530000F1EFF0009C53
-      00009C5300009C530000F6F6F60000000000000000000000000000000000F6F6
-      F6FF868686FF404040FF404040FF404040FF404040FF404040FF404040FF8686
-      86FFF6F6F6FF000000000000000000000000F6F6F6FFF6F6F6FFBFD8E9FF187B
-      C2FF187BC2FF187BC2FFBFD8E9FFF6F6F6FFF6F6F6FF00000000000000000000
-      0000000000000000000000000000000000008B8B8B8FDAC3A9FFA25B0DFF9C51
-      00FF9C5100FF9C5100FF9C5100FF9C5100FFCFAF8AFFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF00000000F6F6F6009C5300009C53
-      00009C530000F1EFF000F1EFF000F1EFF0009C5300009C530000F1EFF0009C53
-      00009C530000BE905C00F6F6F60000000000000000000000000000000000F6F6
-      F6FF404040FF404040FF9C9C9CFF404040FF404040FF9C9C9CFF404040FF4040
-      40FFF6F6F6FF00000000000000000000000000000000F6F6F6FF187BC2FFF6F6
-      F6FF187BC2FFF6F6F6FF187BC2FFF6F6F6FF0000000000000000000000000000
-      000000000000000000000000000000000000000000008B8B8B8FF6F6F6FFF6F6
-      F6FFF0ECE7FFAD702CFF9C5100FFBE905AFFE6E6E6EF2F2F2F30000000000000
-      00000000000000000000000000000000000000000000F6F6F6009C5300009C53
-      00009C530000F1EFF000F1EFF000F1EFF0009C5300009C530000F1EFF0009C53
-      0000BE905C00F6F6F600F6F6F60000000000000000000000000000000000F6F6
-      F6FF626262FFD4D4D4FFF6F6F6FF404040FF404040FFF6F6F6FFD4D4D4FF6262
-      62FFF6F6F6FF00000000000000000000000000000000F6F6F6FFF6F6F6FFF6F6
-      F6FF187BC2FFF6F6F6FFF6F6F6FFF6F6F6FF0000000000000000000000000000
-      00000000000000000000000000000000000000000000000000002F2F2F30E6E6
-      E6EFAD702CFF9C5100FFBE905AFFE6E6E6EF2F2F2F3000000000000000000000
-      00000000000000000000000000000000000000000000F6F6F600F6F6F600F6F6
-      F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6F600F6F6
-      F600F6F6F600F6F6F6000000000000000000000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FFF6F6F6FF404040FF404040FFF6F6F6FFF6F6F6FFF6F6
-      F6FFF6F6F6FF000000000000000000000000000000000000000000000000F6F6
-      F6FFF6F6F6FFF6F6F6FF00000000000000000000000000000000000000000000
-      000000000000000000000000000000000000000000002F2F2F30E6E6E6EFF6F6
-      F6FFF6F6F6FFF6F6F6FFE6E6E6EF2F2F2F300000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      0000000000000000000000000000000000000000000000000000000000000000
-      000000000000000000000000000000000000000000000000000000000000F6F6
-      F6FFF6F6F6FF00000000F6F6F6FF404040FF404040FFF6F6F6FF00000000F6F6
-      F6FFF6F6F6FF000000000000000000000000424D3E000000000000003E000000
-      2800000040000000300000000100010000000000800100000000000000000000
-      000000000000000000000000FFFFFF00F00FF00FFFFF0000C003C003FFFF0000
-      80018001FFFF000080018001E007000000000000E007000000000000E0070000
-      00000000E007000000000000E007000000000000E007000000000000E0070000
-      00000000E007000000000000E007000080018001E007000080018001FFFF0000
-      8003C003FFFF0000840FF00FFFFF00000000E7FFFFFFF00F0000E3FFFFFFC003
-      0000E0FFFFFF80010000E07FE00780010000E03FE00700000000E00FE0070000
-      0000E007E00700000000E003E00700000000E003E00700000000E007E0070000
-      0000E00FE00700000000E03FE00700000000E07FE00780010000E0FFE0078001
-      0000E3FFFFFFC0030000E7FFFFFFF00FFFFF8000FFFF0000F801800080010000
-      F801800080010000F801000080010000F801000080010000F801000080010000
-      F801000080010000E00180008001000080010000800100008001000080010000
-      00030000800100000007000080010000007F00008001000080FF803F80010000
-      80FFC07F80030000E3FF80FFFFFF000000000000000000000000000000000000
-      000000000000}
-  end
   object BuildImageList: TImageList
     ColorDepth = cd32Bit
     Height = 17
     Left = 312
     Top = 48
     Bitmap = {
-      494C0101040024002C0010001100FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600
+      494C010104002400040010001100FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600
       0000000000003600000028000000400000002200000001002000000000000022
       0000000000000000000000000000000000000000000000000000000000000000
       0000000000000000000000000000000000000000000000000000000000000000
@@ -1348,4 +940,611 @@ object CompileForm: TCompileForm
       0000000000000000000000000000000000000000000000000000000000000000
       00000000000000000000000000000000000000000000}
   end
+  object ToolBarImageCollection: TImageCollection
+    Images = <
+      item
+        Name = 'NewFile'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000D549444154785ED552B10AC2400CCD89CB757276165C1DFC013B7751
+              47BFC4C1B5AEFD094775E97820383BF801FE43EB726BBC142E1CB9E2894E3E08
+              E105DECB234441006B2D7A92659982041011065EE8C5B7FD04C4EC2D3A835028
+              79D2C06F996E0E2CA24E9C904AA1C820DC36DF3E40F200ADAB85BBCF9D6FE045
+              541C5DCC8AA2E8AAAAAA91A317B77406F2FAD7DD18FB7ADB3CB9F23CC7B22C69
+              DE90092788A2328F618CE124C4FBFE80639F8E67E8C36ABD84BAAE416BAD7C02
+              7E9EE881D27F10E3BF0C8682CB637D6F4057FE040A11E117BC0059958E3215E0
+              240F0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000280000002808060000008CFEB8
+              6D000000097048597300000EC400000EC401952B0E1B0000028049444154785E
+              ED98318813411486FF2C298E081AB0509080952082461B31207A04C42660404C
+              9B58A4B00BE92DAC13636511C4DB3622E46A1B0B215708DE29D8A4F1201C6817
+              05438A83F81ECCF0A6989D217BB378453E78C5C2EECC9737BC3733C9AD562B9C
+              6672F08315913800810CD0534609424D8A7D8AE21A03EE702030799B1C003DD1
+              477ADE86E2D3F34BD0DC7D71048D126B2A51CE6A0B818892E48E977F409429C6
+              4846E4E49B66C84C4636B95FFBEFF0F9E56DFCFDF91DC47D38D072D37107DFDE
+              3E0E2E19D9E478329E882764490F2CC7DFF1BB8125258337A0F87DB8078D5F52
+              E412288710E456D1011083B8521FE0C2CD273649AFDC998BD770FDE97BE4B7CE
+              8238A0D80E22A8245B3E49932FAF1F78E568CC394E486E45A45C3EABDC1AC88F
+              70366A079C459EDC054BDD7AF6615D39DDC27E9048D99B4169C22EA439AFFB7E
+              BBDD8649A15040B7DB45A954023157993CB067F03FB0582CD0EFF7319D4E4114
+              D58EF5C85124D9321C0E759892E8F57A984C265A72CCFDD85124E90A850B830B
+              840BC58F2CB749A3D140B55A85A243CBFD4A96389D9CB54FA665341A218E6328
+              06E60E14E50C00C4AE262CC87320495E6A53B2094564399524EE1006DC5AB80D
+              85964C3C2C0C2C72CE26ECDA7196F359F003EB5728CE5DBEC3825E395392D1DF
+              9CBFFA105BC592ABA25DC56317A4AA8955D5ECE88C1CEDBD1139774FD392A670
+              D80CDA243914B15A7E1BDC7079570822E668D42209A00521F6DD2F66B3194B22
+              232483964CDE1339D95B1324B317B464922200E105FD9773B9CC674F844CD908
+              6E0437821BC13CC2C0A7915397C14310954A05A1A8D56A32B6228774C83F62D9
+              50A7D84D9F41D9AFEB2A93A1E0B15A34F6AE79EDDC54F149F807DAD38FB9E3B9
+              F1AA0000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'OpenFolder'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              610000016249444154785E9D933D48C35014854F4AB492084DB12248B0E0521C
+              2C4251EBA0581C9C5CC4B11D5C3A39A493A01D5DFC0175B493A238B889A03888
+              052BBA88EE8A1429D641D44A092455EA7D0FABF4CFC47E7086C03DE75E4E7802
+              085DD7FB009C9214FCF2460A499274833F7080F81E0A3153307E0429B28B68E2
+              5261A12CDC32808656015C9394E3B931F8BD6EEC9CDDDB0A1198F9E02AA3D130
+              72BA894A96C201CC8CFB500F91C4CD130115F393BDF07A64B6995F409770F363
+              7201B5E81C8DF300BE3932DC5D660ED377221A04C333348B4A9E2F167F2E804B
+              6AC63699BADA6566E22A611A055895B8B6A78D807A404F6CBFCCC8648548BF30
+              46456AD98D29348248E622886C6A196DFDDAFF03403CA55650FC307831F51044
+              27DCFE69389CAEAA0E365B3C3E58C017E4D327354BDC92D501D8C17CB945E1FD
+              A13C804A4C36B576A449B043FEEEB0F202CEBAAC0EC20E9F460E7AE61C254ACF
+              5901F08A06F8022784888D4D52A99A0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000026149444154785EC5974F48146118C67F3B8C2693B1164B45184944DA
+              610B0ACA0E86D0C13A08D525880E7A910E42DB29482F41059D34D893170DBB74
+              2A102A0F9264D01E0ACA0EB514B95907134DEDCFE8FE69275FDC1D868F586798
+              71FAC1CBCCED79E6799FF99889E0C034CD41A083F519320CA393008800846E42
+              3550C94473EF63263F2F50E662CB5E06BA9A1513811908DF84DA8156E0327006
+              858D32117188F701091C846122E2145F32732447D3249FA491FB4AA8263C9201
+              AEAF1A1ED24BB12700DA6E8D49CC7861727A01EFD0000CAE6AA39776CECD076F
+              6DF1F623F574B735D172603B4EBA0652DC9BF84499837BB6327AED24C5C20AF3
+              AF87C9FFFA861B8C9D87A86B6A07E8D34B8593D86DF1FB891300AEC4B754173D
+              890BE6CC9BB2813A1D907DCB00C893571457F79ECF1588C63B70CBDC8BDB38D1
+              50881A559EC42DCBC20FFA9A68B58CA4205D70AE40C4D496CBCE599E9FA2AA6E
+              1F7ED1808700DDA71A11465E7DE57CFF3326DECDF20FECC2E9B5BB098248E935
+              7CAA1C3436E6F005845C368F1FD40EEC6AED45D00CC31807FA0152374ED3732E
+              2EEB202C74805513574CD34C00F49C8DCB10161A0A8BEF4758994B63152DC240
+              8E624B3D246462C7AF8694C07F462FBF5AB3A9A45C9D6DC50FDB0E5F42DB1475
+              95C0B8A6D750136B24487E7E7CE47A05770136D71F2548F23FA6C97DFFB0BE01
+              F9280016AB6A77201324BF33635885ACAB120EADA5708C20F9935D6279E6A52B
+              0377006A62FB913E0489F9E539C5EC52650386616494328656480D1BA58C2115
+              D236E0B18CFE0BA91A705746FF8554525E54FF8C1A8029C2A3D34EC05946369E
+              8C88CBDAFF02511833E7612B8DE20000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'Save'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300000EC300000EC301C76FA8640000001874455874536F667477
+              617265007061696E742E6E657420342E312E3564475852000000534944415438
+              4F63F8FFFF3F4518AB2029184C7CFBF6ED3F89783E0310A018C0103C078E3FBC
+              FF08C7C862203A66C23EB821641900C23043C83600848936001923ABA1AD01C4
+              E0510306A501E4E0FFFFFF330000CD4FBEDF094E38090000000049454E44AE42
+              6082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F80000000467414D410000B18F0BFC6105000000097048597300000EC200000E
+              C20115284A800000001874455874536F667477617265007061696E742E6E6574
+              20342E312E35644758520000008549444154484B63F8FFFF3F4D3156416A62AC
+              82D4C45805A989E18C6FDFBEFDA7101F006214C34118CE002962089E83823FBC
+              FF8881B1C9F3C72CFCCF1FBBE8FFD3571F1E3100014D2C00F1F58AD6822D41F6
+              09552D0061902540B30ED0CC0210069945B605D8F0A8050431D916908B472D20
+              88472D2088472D2088715A404D0C31F73F0300F885242600285C850000000049
+              454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300001D8700001D87018FE5F1650000001874455874536F667477
+              617265007061696E742E6E657420342E312E35644758520000007A4944415458
+              47EDCEC10980301044D1EDD1AB4559806027B6A45E725DD98321C8E4A6932813
+              F8905D4278E6EE4D834B6670C90C2E99E54B4AC95F6EB1E2B40044195105D830
+              C3F6ED80D5DE5DF338AD104103440841054477041D1095882680E87F805AE88F
+              4880EF029E4A00010410400001FA07B0EA04E07602D104F64FEE456282000000
+              0049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'BuildSolution'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000097048597300000EC300000EC301C76FA8640000009249444154785E
+              B590C1090321104553D2D6E0DD2E2C2427ABB00B0BD98BA5A8D7090F82868964
+              20E2C287BFF3FD4FC6C7E7D77BBF6BADD7DB8B730E099E9C8C33F8A528A1D6DA
+              5301C60CFD048410A494220AC08CCC02CC524A69E56D408C91D2526400BE4A5A
+              3967F1DE8F229ED9EAEC786D158C9D115EE77434C0900150AF6EFCEF01CEAD60
+              DD7C14B0BFC23F9A801DBD004F76BB95EF5A23A00000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F8000000097048597300000EC400000EC401952B0E1B0000017A49444154785E
+              DD94BF6AC25014C6BF488D38D94E99A4695FA1A3EE52C8D0A79084465CC43F7B
+              4070EDD010323B7612EA0B282EED0388A075D2DD3F3404D27BA012EBBD041308
+              427FF00D39E7E67C3939274110043865B7DB49A4A3EB6BA640A03FF7886A6520
+              A6C0F4C64C0A3842D3B4834E1FE886CE334518F03C317D32930744F09BFFA0F3
+              FBFD3E9601BADDEEFD76BB1D0378861873B3D98C2DCBBA83986883D168847ABD
+              2ECF66330B02A6D3E90BE5279309121910ABD50A8D460383C100C7F4FB7D349B
+              4DACD76B10710DBE99E68661209BCDC2F77DD8B6CD19509CF2BAAED336CE2140
+              B85A041BD82D80D7C562F1D8EBF5B05C2E714AB15844ABD582AAAAEF000CA6AF
+              7C3ECF1950B10011789E07C771301C0E71A052A9A05AAD2297CB9DF78AC2DDE6
+              916519A669A2D3E9405114B4DB6DD46AB588E261BD0C62502A95E0BA2ECAE532
+              CE258398489204229901FF4B881DE70DD2257D832B08A0AF3671FCF21DF003E7
+              3A8888FFF321271FECE53B0807979E01B59C063F045ABCC2305D1BAF00000000
+              49454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000097048597300000EC400000EC401952B0E1B000001AB49444154785E
+              ED94BD6A02411446CFCA566A481A51085889CF2058A70982E409922206B1B017
+              11ACC562C56E53A4B6B73168676121D8248F904AECFC29377B0B210CBAB3384B
+              40F4C0C0B23373EF9DEF7E331CC2F33CB6DBEDA73FB228F8FF3CCDB853D66725
+              96C43C448CE33C005FFEE6574E4392BF480C89C5116C82B901DEFD404FC05B3C
+              1EFF41004AA5127F190C062412897DE27BC0051ED110231C12E85B4E849E6759
+              BB4F6E5C40ABD562B95C02DC021FE87164ED6AB5A2DD6EB3D96CCC0A582C16D4
+              6A3546A3919893308CC763D9C37C3E47878D1E76BB1DFD7E9FE9744ABD5E2795
+              4A710839B5ACD326D62BA0574365329928A78EA8804AA5826DDBAA1AA8B8AEFB
+              B7DFB2876AB58A7F73CC0A2897CB743A1DD2E93461C9643274BB5DB9AA589645
+              1096BC5EE861BD5EE3380EB3D98C208AC5A2F844DE84683D904C2669369B6A4B
+              54C969341A4AF29005885C32821039D596A892EB50F3C438817C3E4FAFD7A350
+              2888E4F24D2E97E3146C34E85AB25706F8D7027489CD0B50FB391C0EA39C37F0
+              8019D702F41E507B66307FA60A44782BAE263C470F98BBFEFC1510375F9E07D4
+              1E5E9602BFE6F0D79995245EAC0000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'BuildSolution_Cancel'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000010000000100802000000909168
+              36000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300000EC200000EC20115284A800000001874455874536F667477
+              617265007061696E742E6E657420342E312E3564475852000000D54944415438
+              4F63F84622806A58A8C6BB2DCA1DC27E7DE7E6465FCB67E74F41B870E0E4E404
+              24A11A802A807ACEF435DDDEBA7699B1CCB515F321E240005407518AA2E1C38B
+              E7074B52807A20DA208210805D0310C035002D810AA1028406A0F17BD2C3804A
+              817A8008E8248807C0468314410054C3C797CF211E002A8548009D0414018A27
+              272763D100340CA81AA802220A01404F03ED84726000AA0188210E40366FD3A6
+              4DF060050A42C4212448039C0F61E062434884068200BB06201BCE4566030184
+              4DB1063C0045039100AA8104F0ED1B00122235A95E45DE590000000049454E44
+              AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F8000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300000EC300000EC301C76FA8640000001874455874536F667477
+              617265007061696E742E6E657420342E312E3564475852000001B44944415448
+              4B63F8FFFF3FC3B76FDFFED30A63587067DBBAFFF7F76E435104C3EF9F3DFD7F
+              7E7ACFFF2F9F3E629547C64E4E4E601AC582A7674FFC5FA8C60BC6F7F66C45D1
+              F0ECDCC9FFABED35FFDF58B318451C844186C130B2188846B1E0DDE387FF5798
+              C9832D5869A5FCFFFD934760F1EBAB16FE5FA22BFAFF647B15DC00644CB40520
+              FCFCE259B825BB5282FE1F6B2C82B3BF7EF90257878C49B20084912D01E1F59E
+              26FF3FBD7E85A28610C66BC1E7776FFFEF88F5865B70BCB914459E188CD3820F
+              2F9EFDDF1AE60C3618140F6B9DF5C06C50EA4256070B129841E818AB056FEFDF
+              F9BFDEC3186CE03243A9FFCF2E9C0626CD27600B41FC97D72EA1184092052F2E
+              9FFFBFCA460D6CF8626DA1FF0F0FEF812BFEFCFEFDFF7DB931D0B8780D378024
+              0B40691C64F8220DFEFFB736ADC2D0F0EDEBD7FF273BAAFFEFCB8901B331E4D1
+              3086059B026CFF2F54E7FB7F65D10C0CC5C8F8EAD239FF2FCE9988550E196358
+              F00EE8F5F74F1F8305BDBDBDB17ADFC7C7E7FF891327FEBFBC7E19451CA61659
+              3D8C0DB7005D125D03A9E230F6C058400D3C782C0089C33031E2C8F2207A0458
+              402E1E180BA88D512CA00DFEF61F003B3D5CB46A87A4640000000049454E44AE
+              426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200802000000FC18ED
+              A3000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300000EC300000EC301C76FA8640000001874455874536F667477
+              617265007061696E742E6E657420342E312E3564475852000001724944415448
+              4BED93A14E03410044F901FE008DC0A2700D06C50FA0F903F8019A9C257804C1
+              10440D0214860A0421211812020643E130604E33D9995CA77B7B47687BADE9CB
+              8ADD77CDCCED766FA96899D916FC7C0E1E8F8F30B436BE3F06F787DDB7FEB5D6
+              8D6C06381F2940F4E9EA32C6EDC19E54E0FDE1AED759BBD8DE408D54237F1760
+              942FFB747E72B6BE82811A9A08C611379CC74784D7640112B1C456A2BE2A8C23
+              6E388FFFE4A883136C428F53308EB8E13C2E00DE8171B3BFAB0735308EB8E17C
+              0A05559A0ABE5E9FFF7B44556A0B704FCA50D4602BB8FB6C8AAE10238894E17E
+              5810A597571EAF0F83EFC03F02461029C3BD0A700B198D811ABC3B3DC153C8AB
+              9D2DADC728E051303DF941416213F819978C20348EFBE10E105D974E704438BA
+              97CB9ED6F5240AB22CCBF39CF3C94914B8E29CD010A98054402AE086F3450190
+              0AB8E13C5130399E36EF027A2215900A4819EE170540CA703FEF3F793C3C6DA4
+              60BA30795605EDD1724151FC025677F70C44E6AEFC0000000049454E44AE4260
+              82}
+          end>
+      end
+      item
+        Name = 'Run'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000097048597300000EC300000EC301C76FA8640000009B49444154785E
+              B5933D0A836010443D428E6291C2328587B048918B046BB5CA05CC09428A54E2
+              1D12106B8B3412086CF3FD949B548BDD30820BD33EE6EDB2C97242082FE75C9A
+              F06300FD47628CA7D580635BE8F499D47B7F15911D0DC8EABDE69783F663A7A6
+              44022C4D57991209B000250C004A1800944840F9381B8056B83F6FA6402F7178
+              0FF412ADF2FC9DA93382CA18002A6FFF4CFC3BFF00BB7C2896F8E7156B000000
+              0049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F8000000097048597300000EC400000EC401952B0E1B0000018E49444154785E
+              AD95314BC34018865F45288456323804BA54E9DE76E92242C1AD4E228A74D0F4
+              0F28751111512B569C2C8A8B83B1AE22EAA2088285E2E2D27673D22E858C454B
+              8B53CD0B37046FE8F0E581E3B6EFF92EDF7BB991C160003FFD7EDF01B06F1846
+              0B42587B143A36807AAFD7DBF396091914E8E4AE97CCE78FA75D005F9EC40E5C
+              E07EBB387E39C2C6DDBAD96C371C4F42514628D069B4EB28DCAD61E7713BE6FE
+              B8AF9E842B2614E8BC7DD690AB2CE1BC7696E9FE76791A9ECA140A746E9B379C
+              0F2AEF8ECDF96841900A8877020AFC4160E26C91604810622A0814650482A141
+              48FA8320100C0F829A8FA304C1120E85B975003C042A884FC471B17C89D574FE
+              1EC0A46118DC3106392CCAC5AEF32C1CD890AD710B27F3A7145401A4FE17179D
+              6021B18895B4DD898422FCB597A1100B38C4836C098968B2A13E097722174C4F
+              CD6073768B1276BD078554C0822C4C81D6B558908CA650CC1E5252564F690744
+              286041A683C36CA9AEAB508805BC34C5B912AC887505A0A0752D14F0466A9726
+              C837D977D5E5FC01EEE0BF72725AE3C50000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000097048597300000EC300000EC301C76FA864000000D849444154785E
+              E5D72B0EC2401446E12E81A5201048048BA840B091060D2836D0AEA041A01AF6
+              004983AEC0B5E69A79C80BA619853AC91D4193F15FFE331553FCFA42084FE7DC
+              B230FF1240BF47628CFB6C80F978EF1B11596400A4039230C0AE2E7518070549
+              18607D5AE9F6B2D1FBAB034920603EE7EE089210403A300907C0241C00937000
+              4CC201300907C0241C009370004CC201288939E070AB000026B83E5A90005EC2
+              FEDD5B5FC234F92493C16F08260700303900C0C939004ECE0170720E80937300
+              9C9C03C0E4060F13F3A7D97F3D4EAD26FF0044182C5A7358048C000000004945
+              4E44AE426082}
+          end>
+      end
+      item
+        Name = 'Pause'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000097048597300000EC300000EC301C76FA8640000003549444154785E
+              ED92210A00500843BDA3D7F39CABFF63311844B0886CB0B0175E9AEC0A80D769
+              2910B5A8EFC428A020D8FC89B7F20182EB417C2A7BDDD00000000049454E44AE
+              426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000097048597300000EC300000EC301C76FA8640000003E49444154785E
+              EDD6A10D00200C454176643DE6FC16148E048328C9BDA4AA1527DBCA2625992F
+              E75F40EBE3387B7FB92B040000000000000000F013564D5ADD2A05FC1FEB62D1
+              0000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'CD'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000097048597300000EC300000EC301C76FA8640000011949444154785E
+              A5933172833010457D949C859E3BE402A1B6E9A1A724ADB94468D284824A696D
+              B7495AECD88272ED570822C99BC69EF9331AEFFF5F5FCBEE2AFC4DD3F46CAD7D
+              1FC751FE82FFA82DCC58F874231A7BB15214852449E221CF73E9FB5EE0C0BD27
+              1ECEBF67390E27A9EB5744775196A5C0F54C707562F0FDF523699AAA26555509
+              9AF9CD44CB5E328418782934A041BBA239BC8F02B7B66F2D061EBA8F2E4A8406
+              2DF12148B36D64BDDE5094FDEE20C67C3A326738510AB418103904049E043853
+              530DC28266104235206EF4049EC59966D3603868BD2602D74C08C18D34989AD7
+              44F719116AE0466F4648E13EE33C484C986240226F46183A34D1283361FFA658
+              C483B60F8668614F000BC6A285CBF4F03A5F011A4875582BC364E20000000049
+              454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000097048597300000EC300000EC301C76FA8640000026649444154785E
+              C597BD8ED340148579141E619F217D24CA9488D4EC03A45A6951CA452917A563
+              A574A4484536090DA1F56EB9D0024D0A03769272F057DCD12477C6E3B18B8D74
+              A4C8733DE7CCFDF39D174D7F65595EECF7FBAB0A5F0E8783F181356CB095F73A
+              E3783CBEAE0832081291F16E17E297E7A75DAFD766341A997EBF6F7ABDDE0978
+              C6DA6C3633BBDDEEC42BEC95445E11BFAA0873212EFE15E64FFED7DCDE7E80AC
+              11C6E3B12B2467CF14971B50C512628BEF4F3F22C4DA2B9BCDC67A231A1254DA
+              5317427E8ACBB7971024613A9D5A117004638EABEAC8C1FCD31C822E22726F4E
+              902CDAED1ABF7EFE96244C8684032E6FDC499AC16060B65FB7B522AEAFDFB511
+              807038743E489D4F26136B7C73F33E2400818A20A53AA44FD80E27A73F77EDF0
+              CDD064D9834F049E6A2D42BC0037B1BF42C062B108AABEFB7817CB8BA41E0117
+              9C70DBE45BDDAFEA4A8C3588EA84E0AD4602E898361921076731E6444A10CFC4
+              66F979C93AE0BF3CC7C69B7CD8B186ED43F66884570B1068417840C8158988C0
+              C621A37BFAF64C1010EE8690010951C21EDD04501D7502383DA06BE23D01B68D
+              05602CAEA7F140DA2404A049A754022AB26F9278BAC6C3498830C895784ECF5A
+              A8230AAF9421A5C1620CAA3145803D1E84D45F86BA11C52115E19E382C4C7BC5
+              6D446E2B86A02D089B888AC26DC5EEC788312A9D5CE7482D98356468F57D8E25
+              566D3FB7D27842084E46928C0C0D5DBC40C285C871B94DBEBA918CF1A98B08EF
+              405316A51AC98243694711F40745AE5D1F1FCB0947EB9CA0E45CB703F64EBD98
+              9098A9D581689982D5C5A4EDD50C213490D8D50C9B94ABD9F35F4E9FFD7AFE1F
+              D5AA97E65128864D0000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'CD_Cancel'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300000EC200000EC20115284A800000001874455874536F667477
+              617265007061696E742E6E657420342E312E3564475852000001BA4944415438
+              4F6D92314BC3501485F307FC070E4EFE0127D72E4E591D9C840A4E3A3975145A
+              9C848E75292EC1C5C18282228850878A108BA55A2B88A0552B254935ED787DDF
+              350969EC8553D2FBCE3DF7DCFB9E458C46A3AA811878063B61185E44FF1398DC
+              FD783C5ED5826C40D89F9F919395258852AFD7E5EBA92347F6A2F4DC6B711C47
+              0A8582341A0DC45C23341795FE8549069011B9D9DD96EEF1A1380BB3D23EA84A
+              AD56935C2E97A0542AA9D309119378F03F7A72B9B5A622B150ABD512DBB62704
+              40B95C56275ACC5CCD66530683C184002EB2DDD3601CDD8999F9EEE3E559CED7
+              97B51011C008CC3F0C867255BFFAE7849DB06C2BF87CD765C5C5FD7E5F7CDFD7
+              11C873DE6EDFAB485A009831C4A20BC590B981C00FC4F7029D9F25E24C454D6E
+              AA003F8840CAE7F37A0019CB9EE7E9199C9F9F50F36924025965ECBAEE6DF29F
+              EFC74E57BF373736A552D9538E0AB00816129301DD21643B9E9D9E25CB4C96C8
+              55702569812CE8188BBCBDF6D445728D84B1E2F2C2A61503BA52188B7C0FBFB1
+              FFF790089EA54978BCB06902207611154F3E65221271B196DD0928168B129A9B
+              80F3AF381DCCC5720C51B71C831C67112D0ACBFA058D7E87D3045E6D50000000
+              0049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000017352474200AECE1CE90000000467414D410000B18F0BFC61050000
+              00097048597300000EC200000EC20115284A800000001874455874536F667477
+              617265007061696E742E6E657420342E312E3564475852000003B74944415458
+              47BD97CD4B545118C6FD0782FE8016AE5AB40A5AB51337AD06DA29ADA2699B06
+              352EA48565B88C5C5A82339B312292140692540A958C64144451A720482B6631
+              3A333ACBD3F91DEF7B3B77EEB91F5678E0D1997BDE739EE7BC5FF74C47DAD16C
+              362F1F1D1D0D692C1C1F1F2B1798C3065B6FD9E987DEA8536348E3AEC6F956AB
+              7553FF2F6B3849635066ADB76DBAA117751DFEFAA1D69F3F35D0A769D99BCECD
+              CDA97C3EAFF6BE56D4E7278FD4B70FEFD4C6C686CA6432068383836A72725255
+              AB557F0D5ED1423A3D8AF8A1174C405CB878CE60F9E13DB349A3DE5007B543B5
+              BABAAAF6CB9FD4ABAE4BEA4DE6AADAFBB2ABB2D9ACEAEEEE0E616464C41652D3
+              42AE7B34D1A35D00E09408D01BA8CD1713AA78E582014238B18B5C8057E6E7E7
+              7D6F248644933C20049C4E0440C633BC618B1A1D1D7592BA303E3EEE8B88F404
+              71D206358C5C22E4335E989E9E7612C5C1125173E604C982812E21553FAC8744
+              80F7F76FAB7ABDAE7A7A7A9C24499070C0E5D19E0C62C30449D3DBDBABB636B7
+              2205207078F8B1932009E4842466201FF40353E7C4B5582CAA6A653B36043BDB
+              3B4E8234A03AE082D390D3B57880B252A964B2DB264408DEA0EE450C36B95CCE
+              499006E205D331753CE87AAA52A938C9A9751A50B37952863CA70F1CFCDC37BD
+              01EC7DDF576363CF9C642ECCCCCC482E0CF9C947690931400827EFEFEF378B06
+              7203AA56AB193BE64A37AEA966A3E98B00E5F25A88CC05FA87276081F89B2FE2
+              6221C71B857C21B09053D67553620E2F9835DA66F6EDAC2FC2E50992AFEF4E9F
+              99C376ADBC6E38812F404E26E494A26CBAB4B86416E36ABEAF7C5C31A121446B
+              2F0BA61D8B086C6CB29DED5D7F1F1B2101106A971848EF8F0204942B3D81B5BC
+              9078E6B28D424880CB280AD95B272F204E0BF86C0BE0F460EAF594F19E403C08
+              1205602CAEA7F1402A1BE05A3BC6C0CE0362DE3EDF8E9080A5C5654326EE752D
+              625E4820C4166136394028A7174FB50381BE0029C3A457AB8052B3C992803D1E
+              B4BD122843FDC734229A834D14073C61C793CF49C26CAF041A91DD8A5D646941
+              D86C517108B46286FE625E46BC285C9BA7859D235168E8EE09179C869C61BF8E
+              D3647014581BD578041E39EE0FDE8C2419B934B8364F0B12CE450CB84B78E4C1
+              0B09C3BE92717D726D9E16F48F10F91FD7BBAF640CDCE219FD9388F6B66C9187
+              5DDF3E241F00E1F8DB9CA0E40CB9E77610B886C50DCF13261C24E669AB03D1F6
+              559CBD124FDE3E8813C9229B208406421773798567CC6123750ED82332E66986
+              1792B3F9711A37E85AFA34FFF9E77947C76F440289A9451D3FC7000000004945
+              4E44AE426082}
+          end>
+      end
+      item
+        Name = 'StatusHelp'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000097048597300000EC400000EC401952B0E1B0000013649444154785E
+              A593314BC35010C72FA18A26625D9CA25010E7A683B866F00B44509C4C3F838B
+              83B3838B9FA11167BB8BD0ACE2605C5C5CDAAA8B2E69D12875D0FBC3F168C27B
+              51F00FC70BB9FB1D77C9FF5954529EE76D3E228EA0944A3862C7713AD3803505
+              36F8E85EBF7EF99D870FBA7A9E14E82D6F96DAEBF3B4B93C93321072A3BE3450
+              F0EDE1CDDBD245FF93AA842647BE9B31D642135B12DDE3F45DC1BB6B2EDDEF79
+              F4B4BF8AC033DE1184E9500B46EDDC1B8CBEBD78A8C2A0420D18B0982042579D
+              762E5F10DA9C30518D81A0FCC156CE1EE9370913D4A84207CD3AC72255C9AEE0
+              0BF0E9DD9874324DA059C93C4102931840232C4C820631CCA191F2814EC2C436
+              BC0D7B6E37E6E88F5296066B0B109E6C2C64486856305939547F412E468B13E9
+              7950C77EDA9D91430D6A85A17F5FE71F5687A4906F82C1B80000000049454E44
+              AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000140000001408060000008D891D
+              0D000001C249444154785EAD953D48C35010C7AFA17EB5B44811972A04C4A15B
+              1C5C74B1207470290E8E5AD0C549370787B683834BAD93833AD45528228E423B
+              B97489837670097E8083484CA1A815EAFDC33384471A6AF50FC72BBDBB5FDEBB
+              CBBB04C843CD6653E565832DCDA64A6E9DADCAB61F0A850C92149040C3BC64AD
+              567BB36CBC53D9F8A0BAF9456E258683B4A80EB00D52B42F9067684E06BA6195
+              CBA74F6DABD62086928F00A3DDE908CDC7FBB1E324834D3814378C77A4AD5F59
+              0E6C69224CC7C9113A4D8DC2F0DBFE0F420C6291835CB9667BE777663B5EBA77
+              ECF0D66A77127CEE58E432C33EBA8206A06638A65B6B8908B9E4EB1325CA82A5
+              A00968805FCD562B2FB6751272C160A583EC984337658D9D3CD06F0446667268
+              053B54F16AFC5582A1057D8EEA74BA301BEB1AAC90BF3C6147F54667205ED06E
+              55B8B62875F14CB99AE9BB4303D7A93BE01BDDBCB63C7D82A18354E5BB99D9D1
+              45637AEC3633B094B0C3BCB8E89EC0C7E571C7FCEE3518AC3305238861455CF4
+              5E855C31790C4538F2981A3D409D89F333C66CA0183D49AE837E3013C5D3DC35
+              744C3E266291835CF93D74A0FCB462652146DB5A189DF3EC267C88E1581C73CA
+              CE15FAF74FC03745B6F2FCB46017AD0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F8000000097048597300000EC400000EC401952B0E1B0000022149444154785E
+              BD9631481B511880FF1C17A5174C246011A4101007C960B752BAC4410B5DD2C5
+              4E0E0974156A57675773D0B56006A76669DC32F596226E7608198A70A01DB410
+              4C4C4E3421FAFF3FEFC1BB872FB910F4831F1EE4EEFBDF7BFFBBFF2506430882
+              E0230EF218398C0C84F1313C8CAAE3383FC140CC2026E13E4BCDE8C98A98C833
+              2550E5251C7C01E45F7700E5BF3770FCBF078DAB3EA82CCFDAF0662E0E85A517
+              B090B040E062926D430296D3AC0BEDDE3D7CAB072C8F0027D9799D0041199314
+              9504E199937CD36B85669C4DC7E1FD2B07546A6701D49BBDD08A0E722948C663
+              A195C4943DFFF598BCF42E0D1B8B09788CCA6917B67F3743490ED76641B04A35
+              B180E182F2B6A8F2CFCB332C374089F91901BFBB7BD205D56989A39891055549
+              4E592069DF0DE0E8E29682C6FA331276908B9CE4B6C4391F59D0EF8D0E6CD42E
+              29786C4273E56DF111F151D4D9FBD3E21807CD95B3682972FF0CA8DBC175793B
+              3F0D263457C68668B0BCB2FE928FAC82A887190B22F26931A1CBF93BF8814775
+              1863AD4072DEE953A1491E6905BEEC2D1141718009AE4D72D5E5DBA2E516B071
+              A9C599E844914BC05F725534AC9145FEBA92A2E0B109CD55B5C465E163CB1D96
+              04C549197C540DA8EDDB27B79C0AB7D7ADAC13B516A6BDE7B6AD3A3981B8895C
+              6CB5D4724512BD066D195C6089DEAE052E398D170E0675C5C92F1CFD43133FB8
+              18FC82F7214D2FCB15E93326313DA3CA5D723CEBA5FFE47F5B1E00833D02F5C6
+              0653B50000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F4000000097048597300000EC400000EC401952B0E1B000002A649444154785E
+              CD97BF6B144114C7BF37EC9DE6D43506358A095C6365E136A768E306040B53DC
+              056C25877F40208D85855E616123A4B2920B96167A8D4582904B21FE4873D622
+              041241A284239A4BF4027AEFF10686614C6697E4CE0F2CCCDDCEBCEF9B37F366
+              DF64E049BBDD8E0094005C0310C34D03C022807A3E9F6FC2838C87F024802900
+              1192410ECC741D994DEC80081700D4F46C373A7FF062791BEFBF75F061ADC3BF
+              4DC26C06974E6771F954161385C3F4DB8C4AA5EBC8B29703225E12F141127AD8
+              DC64F104B013F7A223DA91963851878572871C2F49FCF597DF187BB5CEE209A1
+              313C966C902DB2C9B62D32F6CC459C673DFB690BFBC1E4F9018E86503623A1EC
+              35DF4D3CCC294C5F3C8EB9F13358BD3D6A3EF41FBDE33E16648B6D0A35D2722D
+              414DC2EE14BF3094C5FCF8705724A4B6EB3DBDA33ED47639612E470D8232D63D
+              A60D7777E9075C3C289EC0C8D1007B407DB8AF03B62DD91393A6198129093D77
+              707165F810DCF8F7D519656A2A39E1229DE7BE4CBF59C7ADF9357AA89D283B64
+              9211692B395E13A7DAF3CF9B78FBF5173DDCF6C5D22A0572B6F309B71B23CF56
+              B01F8816A726692B396AF978ED059656ACCC0D92941BA30378377196CF015F6C
+              AD00421AF1A76327E162F5E70E7C514849B538887F717FA975B00EC881E39CF9
+              9D85EF985BD9822F81F93DF7DF07E9B3446B6994140C5C4CF4024BAB11480D17
+              5325231F0BEF19A785B4844505A0AE2B985E6069D59554AF4D5A97044E705D20
+              B500B73D31EBC526692B309801A06B384F0742B3EDBBF95843A8EA348494CE0D
+              127F543C8603826DCB041B5496D9E7400540EBFAB91CD7707BF1F8E386D9F6AA
+              0BC9B6AE90FFB3A254901715BD1F9E5C0D396429A1B16C438BBBEE060A16B21F
+              CA7A39166E0EA549511A4363CDB097C9765FAF66FDB89C56ED90DBF4FD7AFE17
+              A24C4FDA1DF2D40E0000000049454E44AE426082}
+          end>
+      end
+      item
+        Name = 'Stop'
+        SourceImages = <
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D49484452000000100000001008060000001FF3FF
+              61000000097048597300000EC300000EC301C76FA8640000002C49444154785E
+              EDCC310D00000803C11AC006BE31D9151C34CC854F7E3D9845B2374BA032D447
+              800736C3AB01CBA20074CC59EB6C0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000018000000180806000000E0773D
+              F8000000097048597300000EC400000EC401952B0E1B0000005049444154785E
+              EDD5BB0D002008455130364CE01A2EE3942EE31A4E4089A58D89F157F94E4973
+              0B126033A3971C4D21F098A7015535DA20223C097439065A914AC59211B80A01
+              1CBB7E5BCE7DF0321168783C0F3D710E021A0000000049454E44AE426082}
+          end
+          item
+            Image.Data = {
+              89504E470D0A1A0A0000000D4948445200000020000000200806000000737A7A
+              F40000005A49444154785EEDD7B10D80400846E11F43C304AEE1324EE932AEE1
+              04945C7995D5999C9AF726F842480856559AD9A2C90100E0BA29334B0F1611F6
+              A509F48E6DD548FB79BD7B0700000000000000003E70CFFF31013E2300001AD6
+              EE0F4DA1ECDBEF0000000049454E44AE426082}
+          end>
+      end>
+    Left = 272
+    Top = 48
+  end
+  object ToolBarVirtualImageList: TVirtualImageList
+    AutoFill = True
+    DisabledGrayscale = False
+    DisabledSuffix = '_Disabled'
+    Images = <
+      item
+        CollectionIndex = 0
+        CollectionName = 'NewFile'
+        Disabled = False
+        Name = 'NewFile'
+      end
+      item
+        CollectionIndex = 1
+        CollectionName = 'OpenFolder'
+        Disabled = False
+        Name = 'OpenFolder'
+      end
+      item
+        CollectionIndex = 2
+        CollectionName = 'Save'
+        Disabled = False
+        Name = 'Save'
+      end
+      item
+        CollectionIndex = 3
+        CollectionName = 'BuildSolution'
+        Disabled = False
+        Name = 'BuildSolution'
+      end
+      item
+        CollectionIndex = 4
+        CollectionName = 'BuildSolution_Cancel'
+        Disabled = False
+        Name = 'BuildSolution_Cancel'
+      end
+      item
+        CollectionIndex = 5
+        CollectionName = 'Run'
+        Disabled = False
+        Name = 'Run'
+      end
+      item
+        CollectionIndex = 6
+        CollectionName = 'Pause'
+        Disabled = False
+        Name = 'Pause'
+      end
+      item
+        CollectionIndex = 7
+        CollectionName = 'CD'
+        Disabled = False
+        Name = 'CD'
+      end
+      item
+        CollectionIndex = 8
+        CollectionName = 'CD_Cancel'
+        Disabled = False
+        Name = 'CD_Cancel'
+      end
+      item
+        CollectionIndex = 9
+        CollectionName = 'StatusHelp'
+        Disabled = False
+        Name = 'StatusHelp'
+      end
+      item
+        CollectionIndex = 10
+        CollectionName = 'Stop'
+        Disabled = False
+        Name = 'Stop'
+      end>
+    ImageCollection = ToolBarImageCollection
+    Left = 272
+    Top = 80
+  end
 end

+ 56 - 20
Projects/CompForm.pas

@@ -2,7 +2,7 @@ unit CompForm;
 
 {
   Inno Setup
-  Copyright (C) 1997-2018 Jordan Russell
+  Copyright (C) 1997-2019 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
@@ -25,7 +25,8 @@ uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
   UIStateForm, StdCtrls, ExtCtrls, Menus, Buttons, ComCtrls, CommCtrl,
   ScintInt, ScintEdit, ScintStylerInnoSetup, NewTabSet,
-  DebugStruct, CompInt, UxThemeISX, System.ImageList, Vcl.ImgList, Vcl.ToolWin;
+  DebugStruct, CompInt, UxThemeISX, System.ImageList, ImgList, ToolWin,
+  VirtualImageList, BaseImageCollection, ImageCollection;
 
 const
   WM_StartCommandLineCompile = WM_USER + $1000;
@@ -152,7 +153,6 @@ type
     FSaveEncoding: TMenuItem;
     FSaveEncodingAuto: TMenuItem;
     FSaveEncodingUTF8: TMenuItem;
-    ImageList1: TImageList;
     ToolBar: TToolBar;
     NewButton: TToolButton;
     OpenButton: TToolButton;
@@ -171,6 +171,8 @@ type
     Bevel1: TBevel;
     BuildImageList: TImageList;
     TerminateButton: TToolButton;
+    ToolBarImageCollection: TImageCollection;
+    ToolBarVirtualImageList: TVirtualImageList;
     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
     procedure FExitClick(Sender: TObject);
     procedure FOpenClick(Sender: TObject);
@@ -249,6 +251,8 @@ type
     procedure FSaveEncodingItemClick(Sender: TObject);
     procedure CompilerOutputListDrawItem(Control: TWinControl; Index: Integer;
       Rect: TRect; State: TOwnerDrawState);
+    procedure FormAfterMonitorDpiChanged(Sender: TObject; OldDPI,
+      NewDPI: Integer);
   private
     { Private declarations }
     FCompilerVersion: PCompilerVersionInfo;
@@ -337,6 +341,7 @@ type
     function EvaluateVariableEntry(const DebugEntry: PVariableDebugEntry;
       var Output: String): Integer;
     procedure FindNext;
+    function FromCurrentPPI(const XY: Integer): Integer;
     procedure Go(AStepMode: TStepMode);
     procedure HideError;
     procedure InitializeFindText(Dlg: TFindDialog);
@@ -374,6 +379,7 @@ type
     procedure ShowOpenDialog(const Examples: Boolean);
     procedure StatusMessage(const Kind: TStatusMessageKind; const S: String);
     procedure SyncEditorOptions;
+    function ToCurrentPPI(const XY: Integer): Integer;
     procedure ToggleBreakPoint(Line: Integer);
     procedure UpdateAllLineMarkers;
     procedure UpdateCaption;
@@ -382,6 +388,7 @@ type
     procedure UpdateEditModePanel;
     procedure UpdateLineMarkers(const Line: Integer);
     procedure UpdateNewButtons;
+    procedure UpdateOutputListsItemHeightAndDebugTimeWidth;
     procedure UpdateRunMenu;
     procedure UpdateTargetMenu;
     procedure UpdateThemeData(const Close, Open: Boolean);
@@ -492,12 +499,13 @@ begin
   else
 {$ENDIF}
   begin
-    Metrics.cbSize := SizeOf(Metrics);  { <- won't work on Delphi 2010? }
+    Metrics.cbSize := SizeOf(Metrics);
     if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(Metrics),
        @Metrics, 0) then
       FontName := Metrics.lfMessageFont.lfFaceName;
     { Only allow fonts that we know will fit the text correctly }
-    if CompareText(FontName, 'Microsoft Sans Serif') <> 0 then
+    if not SameText(FontName, 'Microsoft Sans Serif') and
+       not SameText(FontName, 'Segoe UI') then
       FontName := 'Tahoma';
   end;
   Form.Font.Name := FontName;
@@ -567,7 +575,6 @@ begin
   Result := NewFileExists(PathExtractPath(NewParamStr(0)) + 'iscrypt.dll');
 end;
 
-
 { TISScintEdit }
 
 procedure TISScintEdit.CreateWnd;
@@ -790,8 +797,9 @@ constructor TCompileForm.Create(AOwner: TComponent);
         WindowState := wsMaximized;
       { Note: Don't call UpdateStatusPanelHeight here since it clips to the
         current form height, which hasn't been finalized yet }
-      StatusPanel.Height := Ini.ReadInteger('State', 'StatusPanelHeight',
-        (10 * DebugOutputList.ItemHeight + 4) + TabSet.Height);
+
+      StatusPanel.Height := ToCurrentPPI(Ini.ReadInteger('State', 'StatusPanelHeight',
+        (10 * FromCurrentPPI(DebugOutputList.ItemHeight) + 4) + FromCurrentPPI(TabSet.Height)));
     finally
       Ini.Free;
     end;
@@ -853,6 +861,13 @@ begin
     editor's autocompletion list } 
   SetFakeShortCut(BStopCompile, VK_ESCAPE, []);
 
+{$IFNDEF IS_D103RIO}
+  { TStatusBar needs manual scaling before Delphi 10.3 Rio }
+  StatusBar.Height := ToPPI(StatusBar.Height);
+  for I := 0 to StatusBar.Panels.Count-1 do
+    StatusBar.Panels[I].Width := ToPPI(StatusBar.Panels[I].Width);
+{$ENDIF}
+
   MemoStyler := TInnoSetupStyler.Create(Self);
   MemoStyler.IsppInstalled := IsppInstalled;
 
@@ -882,13 +897,7 @@ begin
 
   FBreakPoints := TList.Create;
 
-  CompilerOutputList.Canvas.Font.Assign(CompilerOutputList.Font);
-  CompilerOutputList.ItemHeight := CompilerOutputList.Canvas.TextHeight('0');
-
-  DebugOutputList.Canvas.Font.Assign(DebugOutputList.Font);
-  FDebugLogListTimeWidth := DebugOutputList.Canvas.TextWidth(Format(
-    '[00%s00%s00%s000]   ', [{$IFDEF IS_DXE}FormatSettings.{$ENDIF}TimeSeparator, {$IFDEF IS_DXE}FormatSettings.{$ENDIF}TimeSeparator, {$IFDEF IS_DXE}FormatSettings.{$ENDIF}DecimalSeparator]));
-  DebugOutputList.ItemHeight := DebugOutputList.Canvas.TextHeight('0');
+  UpdateOutputListsItemHeightAndDebugTimeWidth;
 
   Application.HintShortPause := 0;
   Application.OnException := AppOnException;
@@ -949,7 +958,7 @@ destructor TCompileForm.Destroy;
       Ini.WriteInteger('State', 'WindowRight', WindowPlacement.rcNormalPosition.Right);
       Ini.WriteInteger('State', 'WindowBottom', WindowPlacement.rcNormalPosition.Bottom);
       Ini.WriteBool('State', 'WindowMaximized', WindowState = wsMaximized);
-      Ini.WriteInteger('State', 'StatusPanelHeight', StatusPanel.Height);
+      Ini.WriteInteger('State', 'StatusPanelHeight', FromCurrentPPI(StatusPanel.Height));
       
       { Zoom state }
       Ini.WriteInteger('Options', 'Zoom', Memo.Zoom);
@@ -981,6 +990,13 @@ begin
     MB_OK or MB_ICONSTOP);
 end;
 
+procedure TCompileForm.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI,
+  NewDPI: Integer);
+begin
+  UpdateOutputListsItemHeightAndDebugTimeWidth;
+  UpdateStatusPanelHeight(StatusPanel.Height);
+end;
+
 procedure TCompileForm.FormCloseQuery(Sender: TObject;
   var CanClose: Boolean);
 begin
@@ -2418,13 +2434,23 @@ procedure TCompileForm.UpdateStatusPanelHeight(H: Integer);
 var
   MinHeight, MaxHeight: Integer;
 begin
-  MinHeight := (3 * DebugOutputList.ItemHeight + 4) + TabSet.Height;
-  MaxHeight := BodyPanel.ClientHeight - 48 - SplitPanel.Height;
+  MinHeight := (3 * DebugOutputList.ItemHeight + ToCurrentPPI(4)) + TabSet.Height;
+  MaxHeight := BodyPanel.ClientHeight - ToCurrentPPI(48) - SplitPanel.Height;
   if H > MaxHeight then H := MaxHeight;
   if H < MinHeight then H := MinHeight;
   StatusPanel.Height := H;
 end;
 
+procedure TCompileForm.UpdateOutputListsItemHeightAndDebugTimeWidth;
+begin
+  CompilerOutputList.Canvas.Font.Assign(CompilerOutputList.Font);
+  CompilerOutputList.ItemHeight := CompilerOutputList.Canvas.TextHeight('0');
+
+  DebugOutputList.Canvas.Font.Assign(DebugOutputList.Font);
+  FDebugLogListTimeWidth := DebugOutputList.Canvas.TextWidth(Format('[00%s00%s00%s000]   ', [FormatSettings.TimeSeparator, FormatSettings.TimeSeparator, FormatSettings.DecimalSeparator]));
+  DebugOutputList.ItemHeight := DebugOutputList.Canvas.TextHeight('0');
+end;
+
 procedure TCompileForm.SplitPanelMouseMove(Sender: TObject;
   Shift: TShiftState; X, Y: Integer);
 begin
@@ -3816,8 +3842,8 @@ begin
     spCompileIcon:
       if FCompiling then begin
         ImageList_Draw(BuildImageList.Handle, FBuildAnimationFrame, StatusBar.Canvas.Handle,
-          Rect.Left + ((Rect.Right - Rect.Left) - 16) div 2,
-          Rect.Top + ((Rect.Bottom - Rect.Top) - 17) div 2, ILD_NORMAL);
+          Rect.Left + ((Rect.Right - Rect.Left) - BuildImageList.Width) div 2,
+          Rect.Top + ((Rect.Bottom - Rect.Top) - BuildImageList.Height) div 2, ILD_NORMAL);
       end;
     spCompileProgress:
       if FCompiling and (FProgressMax > 0) then begin
@@ -4195,6 +4221,16 @@ begin
   ToggleBreakPoint(Memo.CaretLine);
 end;
 
+function TCompileForm.ToCurrentPPI(const XY: Integer): Integer;
+begin
+  Result := MulDiv(XY, CurrentPPI, 96);
+end;
+
+function TCompileForm.FromCurrentPPI(const XY: Integer): Integer;
+begin
+  Result := MulDiv(XY, 96, CurrentPPI);
+end;
+
 {$IFNDEF UNICODE}
 var
   Compil32LeadBytes: TLeadByteSet;

+ 1 - 72
Projects/CompStartup.dfm

@@ -14,6 +14,7 @@ object StartupForm: TStartupForm
   Font.Style = []
   OldCreateOrder = True
   Position = poScreenCenter
+  OnAfterMonitorDpiChanged = FormAfterMonitorDpiChanged
   OnCreate = FormCreate
   PixelsPerInch = 96
   TextHeight = 13
@@ -51,42 +52,6 @@ object StartupForm: TStartupForm
       Width = 16
       Height = 16
       AutoSize = True
-      Picture.Data = {
-        07544269746D617036040000424D360400000000000036000000280000001000
-        000010000000010020000000000000040000C40E0000C40E0000000000000000
-        0000000000000000000000000000000000000000000000000000000000000000
-        0000000000000000000000000000000000000000000000000000000000000000
-        00000000000000000000000000000000000000000000F6F6F6FFF6F6F6FFF6F6
-        F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FF0000
-        00000000000000000000000000000000000000000000F6F6F6FF424242FF4242
-        42FF424242FF424242FF424242FF424242FF424242FF424242FFF6F6F6FF0000
-        00000000000000000000000000000000000000000000F6F6F6FF424242FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF424242FFF6F6F6FF0000
-        00000000000000000000000000000000000000000000F6F6F6FF424242FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF424242FFF6F6F6FF0000
-        00000000000000000000000000000000000000000000F6F6F6FF424242FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF424242FFF6F6F6FF0000
-        00000000000000000000000000000000000000000000F6F6F6FF424242FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF424242FFF6F6F6FF0000
-        0000000000000000000000000000F6F6F6FFF6F6F6FFF6F6F6FF424242FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF424242FFF6F6F6FF0000
-        000000000000F6F6F6FFF6F6F6FFF6F6F6FF1A7DC2FFF6F6F6FFF6F6F6FFF6F6
-        F6FFF1EFF0FFF1EFF0FFF1EFF0FF424242FF424242FF868686FFF6F6F6EF0000
-        000000000000F6F6F6FF1A7DC2FFF6F6F6FF1A7DC2FFF6F6F6FF1A7DC2FFF6F6
-        F6FFF1EFF0FFF1EFF0FFF1EFF0FF424242FF868686FFF6F6F6EFF6F6F6300000
-        0000F6F6F6FFF6F6F6FFF6F6F6FF1A7DC2FF1A7DC2FF1A7DC2FFF6F6F6FFF6F6
-        F6FFF6F6F6FF424242FF424242FF868686FFF6F6F6EFF6F6F630000000000000
-        0000F6F6F6FF1A7DC2FF1A7DC2FF1A7DC2FFF6F6F6FF1A7DC2FF1A7DC2FF1A7D
-        C2FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6EFF6F6F63000000000000000000000
-        0000F6F6F6FFF6F6F6FFBFD8E9FF1A7DC2FF1A7DC2FF1A7DC2FFBFD8E9FFF6F6
-        F6FFF6F6F6FF0000000000000000000000000000000000000000000000000000
-        000000000000F6F6F6FF1A7DC2FFF6F6F6FF1A7DC2FFF6F6F6FF1A7DC2FFF6F6
-        F6FF000000000000000000000000000000000000000000000000000000000000
-        000000000000F6F6F6FFF6F6F6FFF6F6F6FF1A7DC2FFF6F6F6FFF6F6F6FFF6F6
-        F6FF000000000000000000000000000000000000000000000000000000000000
-        0000000000000000000000000000F6F6F6FFF6F6F6FFF6F6F6FF000000000000
-        0000000000000000000000000000000000000000000000000000000000000000
-        0000}
       Transparent = True
     end
     object EmptyRadioButton: TRadioButton
@@ -123,42 +88,6 @@ object StartupForm: TStartupForm
       Width = 16
       Height = 16
       AutoSize = True
-      Picture.Data = {
-        07544269746D617036040000424D360400000000000036000000280000001000
-        000010000000010020000000000000040000C40E0000C40E0000000000000000
-        000000000000F6F6F610F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-        F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-        F6FF00000000F6F6F670C8DEECFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6
-        DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFFB6D3E6FF7AB6DCFFF6F6
-        F6FF00000000F6F6F6DF91C2E1FF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6
-        DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF89BDDFFFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F640DFEAF1FF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6
-        DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFFD3E1EBFFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F69FA9CEE6FF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6
-        DCFF7AB6DCFF7AB6DCFF7AB6DCFF9FC8E2FFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F6FF82BADEFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6
-        DCFF7AB6DCFF7AB6DCFF81BADDFFE2E8EEFFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F6FFF6F6F6FF81BADDFFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FF00000000F6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF1EFF0FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F68FE0CDB9FFA25D0FFF9C5300FFF6F6F6FFF6F6F6FFF1EFF0FFF1EF
-        F0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F6FFA25D0FFFBE905CFFEBE2D7FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-        F6FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F6FF9C5300FFE0CDB9FFF6F6F6FFBE905CFF9C5300FFBE905CFFF6F6
-        F6FFF6F6F6FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FFF1EFF0FF7AB6DCFFF6F6
-        F6FFF6F6F6FFA25D0FFFBE905CFFEBE2D7FFF6F6F6FFBE905CFF9C5300FFAD72
-        2EFFF6F6F6FF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFF7AB6DCFFF6F6
-        F6FFF6F6F68FDAC3A9FFA25D0FFF9C5300FF9C5300FF9C5300FF9C5300FF9C53
-        00FFCFAF8AFFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6FFF6F6
-        F6FF00000000F6F6F68FF6F6F6FFF6F6F6FFF0ECE7FFAD722EFF9C5300FFBE90
-        5CFFF6F6F6EFF6F6F63000000000000000000000000000000000000000000000
-        00000000000000000000F6F6F630F6F6F6EFAD722EFF9C5300FFBE905CFFF6F6
-        F6EFF6F6F6300000000000000000000000000000000000000000000000000000
-        000000000000F6F6F630F6F6F6EFF6F6F6FFF6F6F6FFF6F6F6FFF6F6F6EFF6F6
-        F630000000000000000000000000000000000000000000000000000000000000
-        0000}
       Transparent = True
     end
     object OpenRadioButton: TRadioButton

+ 28 - 1
Projects/CompStartup.pas

@@ -38,10 +38,13 @@ type
     procedure DblClick_(Sender: TObject);
     procedure OpenListBoxClick(Sender: TObject);
     procedure OKButtonClick(Sender: TObject);
+    procedure FormAfterMonitorDpiChanged(Sender: TObject; OldDPI,
+      NewDPI: Integer);
   private
     FResult: TStartupFormResult;
     FResultFileName: TFileName;
     procedure SetMRUList(const MRUList: TStringList);
+    procedure UpdateImages;
   public
     property MRUList: TStringList write SetMRUList;
     property Result: TStartupFormResult read FResult;
@@ -51,7 +54,7 @@ type
 implementation
 
 uses
-  CompMsgs, CmnFunc, CmnFunc2, CompForm;
+  CompMsgs, CmnFunc, CmnFunc2, CompForm, ComCtrls;
 
 {$R *.DFM}
 
@@ -64,12 +67,36 @@ begin
   UpdateHorizontalExtent(OpenListBox);
 end;
 
+procedure TStartupForm.UpdateImages;
+
+  function GetBitmap(const Button: TToolButton; const WH: Integer): TBitmap;
+  begin
+    Result := CompileForm.ToolBarImageCollection.GetBitmap(Button.ImageIndex, WH, WH)
+  end;
+
+var
+  WH: Integer;
+begin
+ { After a DPI change the button's Width and Height isn't yet updated, so calculate it ourselves }
+  WH := MulDiv(16, CurrentPPI, 96);
+  NewImage.Picture.Bitmap := GetBitmap(CompileForm.NewButton, WH);
+  OpenImage.Picture.Bitmap := GetBitmap(CompileForm.OpenButton, WH);
+end;
+
+procedure TStartupForm.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI,
+  NewDPI: Integer);
+begin
+  UpdateImages;
+end;
+
 procedure TStartupForm.FormCreate(Sender: TObject);
 begin
   FResult := srNone;
 
   InitFormFont(Self);
 
+  UpdateImages;
+
   OpenListBox.Items.Add(SCompilerExampleScripts);
   OpenListBox.Items.Add(SCompilerMoreFiles);
   OpenListBox.ItemIndex := 0;

+ 3 - 0
Projects/CompWizard.dfm

@@ -891,6 +891,7 @@ object WizardForm: TWizardForm
           CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
           CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
           CCCCCCCCCCCCCCCC0000}
+        Stretch = True
       end
       object WelcomeLabel1: TNewStaticText
         Left = 176
@@ -1699,6 +1700,7 @@ object WizardForm: TWizardForm
             4433333444444444444444444440444444444444444444444444444444444444
             4444444444444444444044444444444444444444444444444444444444444444
             444444444440}
+          Stretch = True
         end
         object PageNameLabel: TNewStaticText
           Left = 24
@@ -1731,6 +1733,7 @@ object WizardForm: TWizardForm
         Top = 0
         Width = 164
         Height = 314
+        Stretch = True
       end
       object FinishedLabel: TNewStaticText
         Left = 176

BIN
Projects/Compil32.manifest.res


+ 6 - 0
Projects/Compil32.manifest.txt

@@ -25,6 +25,12 @@
         </requestedPrivileges>
     </security>
 </trustInfo>
+<application xmlns="urn:schemas-microsoft-com:asm.v3">
+    <windowsSettings>
+      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
+      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+    </windowsSettings>
+</application>
 <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
     <application>
         <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>

+ 5 - 8
Projects/Compile.pas

@@ -7540,7 +7540,7 @@ begin
       AddStatus(SCompilerStatusCompilingCode);
 
     //don't forget highlighter!
-    //setup + allownamingattribute (=all procedures and boolean functions)
+    //setup
     CodeCompiler.AddExport('InitializeSetup', 'Boolean', True, False, '', 0);
     CodeCompiler.AddExport('DeinitializeSetup', '0', True, False, '', 0);
     CodeCompiler.AddExport('CurStepChanged', '0 @TSetupStep', True, False, '', 0);
@@ -7556,13 +7556,10 @@ begin
     CodeCompiler.AddExport('InitializeWizard', '0', True, False, '', 0);
     CodeCompiler.AddExport('RegisterExtraCloseApplicationsResources', '0', True, False, '', 0);
     CodeCompiler.AddExport('CurInstallProgressChanged', '0 @LongInt @LongInt', True, False, '', 0);
-
-    //setup + !allownamingattribute (=non boolean functions)
-    CodeCompiler.AddExport('UpdateReadyMemo', 'String @String @String @String @String @String @String @String @String', False, False, '', 0);
-    CodeCompiler.AddExport('GetCustomSetupExitCode', 'LongInt', False, False, '', 0);
-    CodeCompiler.AddExport('PrepareToInstall', 'String !Boolean', False, False, '', 0);
-
-    //uninstall + allownamingattribute (=all procedures and boolean functions)
+    CodeCompiler.AddExport('UpdateReadyMemo', 'String @String @String @String @String @String @String @String @String', True, False, '', 0);
+    CodeCompiler.AddExport('GetCustomSetupExitCode', 'LongInt', True, False, '', 0);
+    CodeCompiler.AddExport('PrepareToInstall', 'String !Boolean', True, False, '', 0);
+    //uninstall
     CodeCompiler.AddExport('InitializeUninstall', 'Boolean', True, False, '', 0);
     CodeCompiler.AddExport('DeinitializeUninstall', '0', True, False, '', 0);
     CodeCompiler.AddExport('CurUninstallStepChanged', '0 @TUninstallStep', True, False, '', 0);

+ 1 - 1
Projects/Install.pas

@@ -2920,7 +2920,7 @@ var
     if (CodeRunner <> nil) and CodeRunner.FunctionExists('NeedRestart', True) then begin
       if not NeedsRestart then begin
         try
-          if CodeRunner.RunBooleanFunctions('NeedRestart', [''], False, False, False) then begin
+          if CodeRunner.RunBooleanFunctions('NeedRestart', [''], bcTrue, False, False) then begin
             NeedsRestart := True;
             Log('Will restart because NeedRestart returned True.');
           end;

+ 4 - 4
Projects/Main.pas

@@ -2706,7 +2706,7 @@ var
       if shPassword in SetupHeader.Options then
         PasswordOk := TestPassword(S);
       if not PasswordOk and (CodeRunner <> nil) then
-        PasswordOk := CodeRunner.RunBooleanFunctions('CheckPassword', [S], False, False, PasswordOk);
+        PasswordOk := CodeRunner.RunBooleanFunctions('CheckPassword', [S], bcTrue, False, PasswordOk);
 
       if PasswordOk then begin
         Result := False;
@@ -3313,7 +3313,7 @@ begin
       raise;
     end;
     try
-      Res := CodeRunner.RunBooleanFunctions('InitializeSetup', [''], True, False, True);
+      Res := CodeRunner.RunBooleanFunctions('InitializeSetup', [''], bcFalse, False, True);
     except
       Log('InitializeSetup raised an exception (fatal).');
       raise;
@@ -3489,8 +3489,8 @@ begin
   if Assigned(CodeRunner) then begin
     if AllowCustomSetupExitCode then begin
       try
-        SetupExitCode := CodeRunner.RunIntegerFunction('GetCustomSetupExitCode',
-          [''], False, SetupExitCode);
+        SetupExitCode := CodeRunner.RunIntegerFunctions('GetCustomSetupExitCode',
+          [''], bcNonZero, False, SetupExitCode);
       except
         Log('GetCustomSetupExitCode raised an exception.');
         Application.HandleException(nil);

+ 0 - 3
Projects/ScriptCompiler.pas

@@ -391,9 +391,6 @@ var
   ScriptExport: TScriptExport;
   I: Integer;
 begin
-  if AllowNamingAttribute and not ((Pos('0', Decl) = 1) or (Pos('Boolean', Decl) = 1)) then
-    raise Exception.Create('Naming attributes only supported on procedures and boolean functions.');
-
   I := FindExport(Name, Decl, -1);
   if I <> -1 then begin
     ScriptExport := FExports[I];

+ 114 - 63
Projects/ScriptRunner.pas

@@ -2,13 +2,11 @@ unit ScriptRunner;
 
 {
   Inno Setup
-  Copyright (C) 1997-2011 Jordan Russell
+  Copyright (C) 1997-2019 Jordan Russell
   Portions by Martijn Laan
   For conditions of distribution and use, see LICENSE.TXT.
 
   Script runner
-
-  $jrsoftware: issrc/Projects/ScriptRunner.pas,v 1.34 2011/01/11 05:30:39 jr Exp $
 }
 
 interface
@@ -24,6 +22,8 @@ type
   TScriptRunnerOnDebugIntermediate = function(const Position: LongInt; var ContinueStepOver: Boolean): Boolean;
   TScriptRunnerOnException = procedure(const Exception: AnsiString; const Position: LongInt);
 
+  TBreakCondition = (bcNone, bcTrue, bcFalse, bcNonZero, bcNonEmpty);
+
   TScriptRunner = class
     private
       FNamingAttribute: String;
@@ -37,13 +37,14 @@ type
       FOnException: TScriptRunnerOnException;
       function GetProcNos(const Name: AnsiString; const CheckNamingAttribute: Boolean; const ProcNos: TPSList): Integer;
       procedure InternalRunProcedure(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute, MustExist: Boolean);
-      function InternalRunBooleanFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute, CheckNamingAttributeAndResults, MustExist, Default: Boolean): Boolean;
+      function InternalRunBooleanFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute: Boolean; const BreakCondition: TBreakCondition; const MustExist, Default: Boolean): Boolean;
+      function InternalRunIntegerFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute: Boolean; const BreakCondition: TBreakCondition; const MustExist: Boolean; const Default: Integer): Integer;
+      function InternalRunStringFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute: Boolean; const BreakCondition: TBreakCondition; const MustExist: Boolean; const Default: String): String;
       procedure Log(const S: String);
       procedure LogFmt(const S: String; const Args: array of const);
       procedure RaisePSExecException;
       procedure SetPSExecParameters(const Parameters: array of Const; Params: TPSList);
       procedure SetPSExecReturnValue(Params: TPSList; BaseType: TPSBaseType; var Res: PPSVariant);
-      procedure ShowPSExecError(const Error: TPSError);
     public
       constructor Create;
       destructor Destroy; override;
@@ -52,9 +53,11 @@ type
       procedure RunProcedure(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean);
       procedure RunProcedures(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean);
       function RunBooleanFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist, Default: Boolean): Boolean;
-      function RunBooleanFunctions(const Name: AnsiString; const Parameters: array of Const; const AndResults, MustExist, Default: Boolean): Boolean;
+      function RunBooleanFunctions(const Name: AnsiString; const Parameters: array of Const; const BreakCondition: TBreakCondition; const MustExist, Default: Boolean): Boolean;
       function RunIntegerFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean; const Default: Integer): Integer;
+      function RunIntegerFunctions(const Name: AnsiString; const Parameters: array of Const; const BreakCondition: TBreakCondition; const MustExist: Boolean; Default: Integer): Integer;
       function RunStringFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean; const Default: String): String;
+      function RunStringFunctions(const Name: AnsiString; const Parameters: array of Const; const BreakCondition: TBreakCondition; const MustExist: Boolean; Default: String): String;
       function EvaluateUsedVariable(const Param1, Param2, Param3: LongInt; const Param4: AnsiString): String;
       property NamingAttribute: String write FNamingAttribute;
       property OnLog: TScriptRunnerOnLog read FOnLog write FOnLog;
@@ -96,9 +99,14 @@ begin
     FOnLogFmt(S, Args);
 end;
 
-procedure TScriptRunner.ShowPSExecError(const Error: TPSError);
+procedure ShowError(const Error: String);
+begin
+  raise Exception.Create(Error);
+end;
+
+procedure ShowPSExecError(const Error: TPSError);
 begin
-  raise Exception.Create('Script error: ' + PSErrorToString(Error, ''));
+  ShowError('Script error: ' + PSErrorToString(Error, ''));
 end;
 
 procedure TScriptRunner.RaisePSExecException;
@@ -112,14 +120,14 @@ begin
       'Exception' objects raised from other modules (which we mustn't modify) }
     E := ExceptObject;
     if E is Exception then begin
-      Exception(E).Message := Format('Runtime Error (at %d:%d):'#13#10#13#10,
+      Exception(E).Message := Format('Runtime error (at %d:%d):'#13#10#13#10,
         [FPSExec.ExceptionProcNo, FPSExec.ExceptionPos]) + Exception(E).Message;
       raise;
     end
     else begin
       { If we don't see it as an Exception, it was likely raised by another
         module }
-      raise Exception.CreateFmt('Runtime Error (at %d:%d):'#13#10#13#10 +
+      raise Exception.CreateFmt('Runtime error (at %d:%d):'#13#10#13#10 +
         'Exception "%s" at address %p',
         [FPSExec.ExceptionProcNo, FPSExec.ExceptionPos, E.ClassName, ExceptAddr]);
     end;
@@ -455,16 +463,18 @@ begin
   InternalRunProcedure(Name, Parameters, True, MustExist);
 end;
 
-function TScriptRunner.InternalRunBooleanFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute, CheckNamingAttributeAndResults, MustExist, Default: Boolean): Boolean;
+function TScriptRunner.InternalRunBooleanFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute: Boolean; const BreakCondition: TBreakCondition; const MustExist, Default: Boolean): Boolean;
 var
   ProcNos, Params: TPSList;
   Res: PPSVariant;
-  ProcResult: Boolean;
   I: Integer;
 begin
   ProcNos := TPSList.Create;
   try
     if GetProcNos(Name, CheckNamingAttribute, ProcNos) <> 0 then begin
+      if not (BreakCondition in [bcNone, bcTrue, bcFalse]) or
+         ((BreakCondition = bcNone) and (ProcNos.Count > 1)) then
+        ShowError('Internal error: InternalRunBooleanFunction: invalid BreakCondition');
       Result := True; { Silence compiler }
       for I := 0 to ProcNos.Count-1 do begin
         Params := TPSList.Create();
@@ -475,13 +485,10 @@ begin
           WriteBackParameters(Parameters, Params);
 
           RaisePSExecException;
-          ProcResult := PPSVariantU8(Res).Data = 1;
-          if I = 0 then
-            Result := ProcResult
-          else if CheckNamingAttributeAndResults then
-            Result := Result and ProcResult { Don't break on Result = False: need to call all procs always. }
-          else
-            Result := Result or ProcResult { Don't break on Result = True: need to call all procs always. }
+          Result := PPSVariantU8(Res).Data = 1;
+          if (Result and (BreakCondition = bcTrue)) or
+             (not Result and (BreakCondition = bcFalse)) then
+            Exit;
         finally
           FreePSVariantList(Params);
         end;
@@ -498,76 +505,120 @@ end;
 
 function TScriptRunner.RunBooleanFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist, Default: Boolean): Boolean;
 begin
-  Result := InternalRunBooleanFunction(Name, Parameters, False, False, MustExist, Default);
+  Result := InternalRunBooleanFunction(Name, Parameters, False, bcNone, MustExist, Default);
 end;
 
-function TScriptRunner.RunBooleanFunctions(const Name: AnsiString; const Parameters: array of Const; const AndResults, MustExist, Default: Boolean): Boolean;
+function TScriptRunner.RunBooleanFunctions(const Name: AnsiString; const Parameters: array of Const; const BreakCondition: TBreakCondition; const MustExist, Default: Boolean): Boolean;
 begin
-  Result := InternalRunBooleanFunction(Name, Parameters, True, AndResults, MustExist, Default);
+  Result := InternalRunBooleanFunction(Name, Parameters, True, BreakCondition, MustExist, Default);
 end;
 
-function TScriptRunner.RunIntegerFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean; const Default: Integer): Integer;
+function TScriptRunner.InternalRunIntegerFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute: Boolean; const BreakCondition: TBreakCondition; const MustExist: Boolean; const Default: Integer): Integer;
 var
-  ProcNo: Cardinal;
-  Params: TPSList;
+  ProcNos, Params: TPSList;
   Res: PPSVariant;
+  I: Integer;
 begin
-  ProcNo := FPSExec.GetProc(Name);
-  if ProcNo <> Cardinal(-1) then begin
-    Params := TPSList.Create();
-    try
-      SetPSExecParameters(Parameters, Params);
-      SetPSExecReturnValue(Params, btS32, Res);
-      FPSExec.RunProc(Params, ProcNo);
-      WriteBackParameters(Parameters, Params);
-
-      RaisePSExecException;
-      Result := PPSVariantS32(Res).Data;
-    finally
-      FreePSVariantList(Params);
+  ProcNos := TPSList.Create;
+  try
+    if GetProcNos(Name, CheckNamingAttribute, ProcNos) <> 0 then begin
+      if not (BreakCondition in [bcNone, bcNonZero]) or
+         ((BreakCondition = bcNone) and (ProcNos.Count > 1)) then
+        ShowError('Internal error: InternalRunIntegerFunction: invalid BreakCondition');
+      Result := 0; { Silence compiler }
+      for I := 0 to ProcNos.Count-1 do begin
+        Params := TPSList.Create();
+        try
+          SetPSExecParameters(Parameters, Params);
+          SetPSExecReturnValue(Params, btS32, Res);
+          FPSExec.RunProc(Params, Cardinal(ProcNos[I]));
+          WriteBackParameters(Parameters, Params);
+
+          RaisePSExecException;
+          Result := PPSVariantS32(Res).Data;
+          if (Result <> 0) and (BreakCondition = bcNonZero) then
+            Exit;
+        finally
+          FreePSVariantList(Params);
+        end;
+      end;
+    end else begin
+      if MustExist then
+        ShowPSExecError(erCouldNotCallProc);
+      Result := Default;
     end;
-  end else begin
-    if MustExist then
-      ShowPSExecError(erCouldNotCallProc);
-    Result := Default;
+  finally
+    ProcNos.Free;
   end;
 end;
 
-function TScriptRunner.RunStringFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean; const Default: String): String;
+function TScriptRunner.RunIntegerFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean; const Default: Integer): Integer;
+begin
+  Result := InternalRunIntegerFunction(Name, Parameters, False, bcNone, MustExist, Default);
+end;
+
+function TScriptRunner.RunIntegerFunctions(const Name: AnsiString; const Parameters: array of Const; const BreakCondition: TBreakCondition; const MustExist: Boolean; Default: Integer): Integer;
+begin
+  Result := InternalRunIntegerFunction(Name, Parameters, True, BreakCondition, MustExist, Default);
+end;
+
+function TScriptRunner.InternalRunStringFunction(const Name: AnsiString; const Parameters: array of Const; const CheckNamingAttribute: Boolean; const BreakCondition: TBreakCondition; const MustExist: Boolean; const Default: String): String;
 var
-  ProcNo: Cardinal;
-  Params: TPSList;
+  ProcNos, Params: TPSList;
   Res: PPSVariant;
+  I: Integer;
 begin
-  ProcNo := FPSExec.GetProc(Name);
-  if ProcNo <> Cardinal(-1) then begin
-    Params := TPSList.Create();
-    try
-      SetPSExecParameters(Parameters, Params);
+  ProcNos := TPSList.Create;
+  try
+    if GetProcNos(Name, CheckNamingAttribute, ProcNos) <> 0 then begin
+      if not (BreakCondition in [bcNone, bcNonEmpty]) or
+         ((BreakCondition = bcNone) and (ProcNos.Count > 1)) then
+        ShowError('Internal error: InternalRunStringFunction: invalid BreakCondition');
+      Result := ''; { Silence compiler }
+      for I := 0 to ProcNos.Count-1 do begin
+        Params := TPSList.Create();
+        try
+          SetPSExecParameters(Parameters, Params);
 {$IFDEF UNICODE}
-      SetPSExecReturnValue(Params, btUnicodeString, Res);
+          SetPSExecReturnValue(Params, btUnicodeString, Res);
 {$ELSE}
-      SetPSExecReturnValue(Params, btString, Res);
+          SetPSExecReturnValue(Params, btString, Res);
 {$ENDIF}
-      FPSExec.RunProc(Params, ProcNo);
-      WriteBackParameters(Parameters, Params);
+          FPSExec.RunProc(Params, Cardinal(ProcNos[I]));
+          WriteBackParameters(Parameters, Params);
 
-      RaisePSExecException;
+          RaisePSExecException;
 {$IFDEF UNICODE}
-      Result := PPSVariantUString(Res).Data;
+          Result := PPSVariantUString(Res).Data;
 {$ELSE}
-      Result := PPSVariantAString(Res).Data;
+          Result := PPSVariantAString(Res).Data;
 {$ENDIF}
-    finally
-      FreePSVariantList(Params);
+          if (Result <> '') and (BreakCondition = bcNonEmpty) then
+            Exit;
+        finally
+          FreePSVariantList(Params);
+        end;
+      end;
+    end else begin
+      if MustExist then
+        ShowPSExecError(erCouldNotCallProc);
+      Result := Default;
     end;
-  end else begin
-    if MustExist then
-      ShowPSExecError(erCouldNotCallProc);
-    Result := Default;
+  finally
+    ProcNos.Free;
   end;
 end;
 
+function TScriptRunner.RunStringFunction(const Name: AnsiString; const Parameters: array of Const; const MustExist: Boolean; const Default: String): String;
+begin
+  Result := InternalRunStringFunction(Name, Parameters, False, bcNone, MustExist, Default);
+end;
+
+function TScriptRunner.RunStringFunctions(const Name: AnsiString; const Parameters: array of Const; const BreakCondition: TBreakCondition; const MustExist: Boolean; Default: String): String;
+begin
+  Result := InternalRunStringFunction(Name, Parameters, True, BreakCondition, MustExist, Default);
+end;
+
 function TScriptRunner.EvaluateUsedVariable(const Param1, Param2, Param3: LongInt; const Param4: AnsiString): String;
 
   function VariantToString(const p: TPSVariantIFC; const ClassProperties: AnsiString): String;

+ 2 - 2
Projects/Uninstall.pas

@@ -603,7 +603,7 @@ begin
       try
         if CodeRunner <> nil then begin
           try
-            Res := CodeRunner.RunBooleanFunctions('InitializeUninstall', [''], True, False, True);
+            Res := CodeRunner.RunBooleanFunctions('InitializeUninstall', [''], bcFalse, False, True);
           except
             Log('InitializeUninstall raised an exception (fatal).');
             raise;
@@ -657,7 +657,7 @@ begin
         if (CodeRunner <> nil) and CodeRunner.FunctionExists('UninstallNeedRestart', True) then begin
           if not UninstallNeedsRestart then begin
             try
-              if CodeRunner.RunBooleanFunctions('UninstallNeedRestart', [''], False, False, False) then begin
+              if CodeRunner.RunBooleanFunctions('UninstallNeedRestart', [''], bcTrue, False, False) then begin
                 UninstallNeedsRestart := True;
                 Log('Will restart because UninstallNeedRestart returned True.');
               end;

+ 11 - 11
Projects/Wizard.pas

@@ -256,7 +256,7 @@ implementation
 
 uses
   ShellApi, ShlObj, Types, Msgs, Main, PathFunc, CmnFunc, CmnFunc2,
-  MD5, InstFunc, SelFolderForm, Extract, Logging, RestartManager;
+  MD5, InstFunc, SelFolderForm, Extract, Logging, RestartManager, ScriptRunner;
 
 {$R *.DFM}
 
@@ -437,7 +437,7 @@ begin
     WizardUserInfoName := UserInfoNameEdit.Text;
     WizardUserInfoOrg := UserInfoOrgEdit.Text;
     WizardUserInfoSerial := UserInfoSerialEdit.Text;
-    Result := CodeRunner.RunBooleanFunctions('CheckSerial', [UserInfoSerialEdit.Text], False, True, False)
+    Result := CodeRunner.RunBooleanFunctions('CheckSerial', [UserInfoSerialEdit.Text], bcTrue, True, False)
   end else
     Result := True;
 end;
@@ -1719,7 +1719,7 @@ begin
   if not PreviousInstallCompleted(WizardComponents, WizardTasks) then begin
     Result := ExpandSetupMessage(msgPreviousInstallNotCompleted);
     PrepareToInstallNeedsRestart := True;
-  end else if (CodeRunner <> nil) and CodeRunner.FunctionExists('PrepareToInstall', False) then begin
+  end else if (CodeRunner <> nil) and CodeRunner.FunctionExists('PrepareToInstall', True) then begin
     SetCurPage(wpPreparing);
     BackButton.Visible := False;
     NextButton.Visible := False;
@@ -1731,7 +1731,7 @@ begin
     WindowDisabler := TWindowDisabler.Create;
     try
       CodeNeedsRestart := False;
-      Result := CodeRunner.RunStringFunction('PrepareToInstall', [@CodeNeedsRestart], True, '');
+      Result := CodeRunner.RunStringFunctions('PrepareToInstall', [@CodeNeedsRestart], bcNonEmpty, True, '');
       PrepareToInstallNeedsRestart := (Result <> '') and CodeNeedsRestart;
     finally
       WindowDisabler.Free;
@@ -1923,11 +1923,11 @@ procedure TWizardForm.UpdatePage(const PageID: Integer);
         MemoTasksInfo := '';
       SelectedTasks.Free();
 
-      if (CodeRunner <> nil) and CodeRunner.FunctionExists('UpdateReadyMemo', False) then begin
+      if (CodeRunner <> nil) and CodeRunner.FunctionExists('UpdateReadyMemo', True) then begin
         try
-          ReadyMemo.Lines.Text := CodeRunner.RunStringFunction('UpdateReadyMemo',
+          ReadyMemo.Lines.Text := CodeRunner.RunStringFunctions('UpdateReadyMemo',
             [Space, SNewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo,
-             MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo], True, '');
+             MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo], bcNonEmpty, True, '');
         except
           Application.HandleException(Self);
         end;
@@ -2128,7 +2128,7 @@ begin
     if not Result then begin
       try
         if CodeRunner <> nil then
-          Result := CodeRunner.RunBooleanFunctions('ShouldSkipPage', [PageID], False, False, Result);
+          Result := CodeRunner.RunBooleanFunctions('ShouldSkipPage', [PageID], bcTrue, False, Result);
       except
         Application.HandleException(Self);
       end;
@@ -2149,7 +2149,7 @@ procedure TWizardForm.NextButtonClick(Sender: TObject);
     if shPassword in SetupHeader.Options then
       Result := TestPassword(S);
     if not Result and (CodeRunner <> nil) then
-      Result := CodeRunner.RunBooleanFunctions('CheckPassword', [S], False, False, Result);
+      Result := CodeRunner.RunBooleanFunctions('CheckPassword', [S], bcTrue, False, Result);
 
     if Result then begin
       NeedPassword := False;
@@ -2314,7 +2314,7 @@ begin
     Exit;
 
   if CodeRunner <> nil then
-    if CodeRunner.RunBooleanFunctions('NextButtonClick', [CurPageID], True, False, True) = False then
+    if CodeRunner.RunBooleanFunctions( 'NextButtonClick', [CurPageID], bcFalse, False, True) = False then
       Exit;
 
   { Go to the next page, or close wizard if it was on the last page }
@@ -2414,7 +2414,7 @@ begin
     Exit;
 
   if CodeRunner <> nil then
-    if CodeRunner.RunBooleanFunctions('BackButtonClick', [CurPageID], True, False, True) = False then
+    if CodeRunner.RunBooleanFunctions('BackButtonClick', [CurPageID], bcFalse, False, True) = False then
       Exit;
 
   PrevPageID := GetPreviousPageID;

+ 7 - 4
README.md

@@ -161,7 +161,7 @@ How do the projects link together?
 
 - All of the forms in the Setup project, with the exception of Main.dfm, have
   Scaled set to False. This is because they dynamically scale themselves at
-  run-time by calling a function named SetFormFont.
+  run-time by calling a function named InitializeFont.
 
 - A note for those curious: The Setup Compiler creates single EXE Setups by
   first creating the SETUP.EXE as usual, then concatenating the SETUP.0 and
@@ -169,7 +169,7 @@ How do the projects link together?
   data block in SETUP.EXE so it knows it's in "single EXE" form.
 
 - For compiler debugging purposes define ``STATICCOMPILER`` in CompForm.pas
-  and ``STATICPREPROC`` in Compile.pas. The latter requires Unicode Inno Setup.
+  and ``STATICPREPROC`` in Compile.pas.
 
 5. Precompiled executables and libraries
 ----------------------------------------
@@ -203,8 +203,11 @@ See Projects\lzma2\Decoder\compiling.txt.
 
 **ishelp\ISHelpGen\ISHelpGen.exe** - See ishelp\ISHelpGen\compile.bat
 
-**Examples\MyProg.exe**, **Examples\MyProg-x64.exe** -
-Compiled by Visual Studio 2005 from the Examples\MyProg directory.
+**Examples\MyProg.exe**, **Examples\MyProg-x64.exe** - Compiled by Visual Studio
+2005 from the Examples\MyProg directory.
+
+**Examples\MyProg-ARM64.exe** - Compiled by Visual Studio 2017 from the
+Examples\MyProg directory.
 
 6. Inno Setup-specific editing guidelines for the help files
 ------------------------------------------------------------

+ 2 - 2
compile.bat

@@ -1,7 +1,7 @@
 @echo off
 
 rem  Inno Setup
-rem  Copyright (C) 1997-2018 Jordan Russell
+rem  Copyright (C) 1997-2019 Jordan Russell
 rem  Portions by Martijn Laan
 rem  For conditions of distribution and use, see LICENSE.TXT.
 rem
@@ -14,7 +14,7 @@ if exist compilesettings.bat goto compilesettingsfound
 echo compilesettings.bat is missing or incomplete. It needs to be created
 echo with the following line, adjusted for your system:
 echo.
-echo   set DELPHIXEROOT=C:\Program Files\Embarcadero\RAD Studio\19.0 [Path to Delphi 10.2 Tokyo (or later)]
+echo   set DELPHIXEROOT=C:\Program Files\Embarcadero\RAD Studio\20.0 [Path to Delphi 10.3 Rio (or later)]
 goto failed2
 
 :compilesettingsfound

+ 2 - 1
whatsnew.htm

@@ -106,6 +106,7 @@ For conditions of distribution and use, see <a href="http://www.jrsoftware.org/f
   <li>Compiler IDE changes:
   <ul>
     <li>Updated all icons and flattened the interface for a more modern look.</li>
+    <li>The Compiler IDE now uses per-monitor DPI awareness mode and also allows the "Segoe UI" font for its interface elements.</li>
     <li>Options button <i>Associate .iss files with this compiler</i> can now associate for the current user instead of displaying an error if administrative privileges are not available.</li>
     <li>Options <i>Allow Undo after save</i> and <i>Show indentation guides</i> are now on by default for new installations.</li>
     <li>The "Compiler Output" view is now colorized. This can be turned off in the options.</li>
@@ -139,7 +140,7 @@ For conditions of distribution and use, see <a href="http://www.jrsoftware.org/f
   <li>Added new <i>AllPagesExample.iss</i> example script which shows all the wizard pages Setup may potentially display.</li>
   <li>Other documentation and examples improvements.</li>
   <li>Added official Icelandic translation.</li>
-  <li>Delphi compiler updated from Delphi 2009 to Delphi 10.2 Tokyo. This change increases the size of Setup but decreases development, testing and deployment times. It also makes it easier to compile Inno Setup yourself using the free Delphi Community Edition.</li>
+  <li>Delphi compiler updated from Delphi 2009 to Delphi 10.3 Rio. This change increases the size of Setup but decreases development, testing and deployment times. It also makes it easier to compile Inno Setup yourself using the free Delphi Community Edition.</li>
   <li>Minor tweaks.</li>
 </ul>