Browse Source

Merge branch 'msgbox-designer' into main

Martijn Laan 5 years ago
parent
commit
59e04f4029

+ 2 - 0
ISHelp/isetup.xml

@@ -3663,6 +3663,8 @@ Keep the default set of selected tasks, but deselect the "desktopicon" task:<br/
 
 <li>Cristoph Nahr: Code for the .NET version detection (6.0.4).</li>
 
+<li>leserg73: Code for the Compiler IDE's MessageBox Designer (6.1.0).<li>
+
 </ul>
 
 </body>

+ 5 - 0
Projects/CompForm.dfm

@@ -584,6 +584,11 @@ object CompileForm: TCompileForm
         ShortCut = 24647
         OnClick = TGenerateGUIDClick
       end
+      object TInsertMsgBox: TMenuItem
+        Caption = '&MessageBox Designer...'
+        ShortCut = 24653
+        OnClick = TInsertMsgBoxClick
+      end
       object N7: TMenuItem
         Caption = '-'
       end

+ 19 - 2
Projects/CompForm.pas

@@ -179,6 +179,7 @@ type
     PListSelectAll: TMenuItem;
     DebugCallStackList: TListBox;
     VDebugCallStack: TMenuItem;
+    TInsertMsgBox: TMenuItem;
     ToolBarPanel: TPanel;
     HMailingList: TMenuItem;
     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
@@ -266,6 +267,7 @@ type
       State: TOwnerDrawState);
     procedure VDebugCallStackClick(Sender: TObject);
     procedure HMailingListClick(Sender: TObject);
+    procedure TInsertMsgBoxClick(Sender: TObject);
   private
     { Private declarations }
     FCompilerVersion: PCompilerVersionInfo;
@@ -460,7 +462,7 @@ type
 
 var
   CompileForm: TCompileForm;
-
+  MSGTextInsert: TStringList;
   CommandLineFilename, CommandLineWizardName: String;
   CommandLineCompile: Boolean;
   CommandLineWizard: Boolean;
@@ -479,7 +481,7 @@ uses
   PathFunc, CmnFunc, CmnFunc2, FileClass, CompMsgs, TmSchema, BrowseFunc,
   HtmlHelpFunc, TaskbarProgressFunc,
   {$IFDEF STATICCOMPILER} Compile, {$ENDIF}
-  CompOptions, CompStartup, CompWizard, CompSignTools, CompTypes, CompInputQueryCombo;
+  CompOptions, CompStartup, CompWizard, CompSignTools, CompTypes, CompInputQueryCombo, CompMessageBoxDesigner;
 
 {$R *.DFM}
 
@@ -2634,6 +2636,21 @@ begin
     Memo.SelText := GenerateGuid;
 end;
 
+procedure TCompileForm.TInsertMsgBoxClick(Sender: TObject);
+var
+  MsgBoxForm: TMBDForm;
+begin
+  MsgBoxForm := TMBDForm.Create(Application);
+  MSGTextInsert := TStringList.Create;
+  try
+    if MsgBoxForm.ShowModal = mrOk then
+      Memo.SelText := MSGTextInsert.GetText;
+  finally
+    MSGTextInsert.Free;
+    MsgBoxForm.Free;
+  end;
+end;
+
 procedure TCompileForm.TSignToolsClick(Sender: TObject);
 var
   SignToolsForm: TSignToolsForm;

+ 725 - 0
Projects/CompMessageBoxDesigner.dfm

@@ -0,0 +1,725 @@
+object MBDForm: TMBDForm
+  Left = 0
+  Top = 0
+  BorderStyle = bsDialog
+  Caption = 'MessageBox Designer'
+  ClientHeight = 380
+  ClientWidth = 548
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'MS Sans Serif'
+  Font.Style = []
+  OldCreateOrder = False
+  Position = poScreenCenter
+  OnCreate = FormCreate
+  DesignSize = (
+    548
+    380)
+  PixelsPerInch = 96
+  TextHeight = 13
+  object TaskInstructionLabel: TNewStaticText
+    Left = 18
+    Top = 14
+    Width = 50
+    Height = 14
+    Caption = 'Instruction'
+    TabOrder = 11
+  end
+  object TaskInstructionText: TEdit
+    Left = 89
+    Top = 10
+    Width = 449
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 1
+  end
+  object TaskMesssageLabel: TNewStaticText
+    Left = 18
+    Top = 40
+    Width = 49
+    Height = 14
+    Caption = 'Messsage'
+    TabOrder = 12
+  end
+  object TaskMesssageText: TEdit
+    Left = 89
+    Top = 36
+    Width = 449
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 2
+  end
+  object Button1Label: TNewStaticText
+    Left = 18
+    Top = 66
+    Width = 62
+    Height = 14
+    Caption = 'Text Button1'
+    TabOrder = 13
+  end
+  object Button1Text: TEdit
+    Left = 89
+    Top = 62
+    Width = 159
+    Height = 21
+    TabOrder = 3
+  end
+  object Button2Label: TNewStaticText
+    Left = 258
+    Top = 67
+    Width = 62
+    Height = 14
+    Caption = 'Text Button2'
+    TabOrder = 14
+  end
+  object Button2Text: TEdit
+    Left = 334
+    Top = 62
+    Width = 204
+    Height = 21
+    Anchors = [akLeft, akTop, akRight]
+    TabOrder = 4
+  end
+  object GroupBox1: TGroupBox
+    Left = 8
+    Top = 8
+    Width = 532
+    Height = 81
+    Anchors = [akLeft, akTop, akRight]
+    Caption = ' Message '
+    TabOrder = 0
+    DesignSize = (
+      532
+      81)
+    object MSGText: TMemo
+      Left = 7
+      Top = 20
+      Width = 519
+      Height = 53
+      Anchors = [akLeft, akTop, akRight, akBottom]
+      ScrollBars = ssVertical
+      TabOrder = 0
+      OnKeyPress = MSGTextKeyPress
+    end
+  end
+  object GroupBox6: TGroupBox
+    Left = 8
+    Top = 93
+    Width = 240
+    Height = 60
+    Caption = ' Type'
+    TabOrder = 5
+    object cb_Suppressible: TCheckBox
+      Left = 14
+      Top = 24
+      Width = 86
+      Height = 17
+      Caption = 'Suppressible'
+      TabOrder = 0
+      OnClick = cb_SuppressibleClick
+    end
+    object cb_MsgBox: TRadioButton
+      Left = 115
+      Top = 13
+      Width = 115
+      Height = 17
+      Caption = 'MsgBox'
+      Checked = True
+      TabOrder = 1
+      TabStop = True
+      OnClick = cb_MsgBoxClick
+    end
+    object cb_TaskDialogMsgBox: TRadioButton
+      Left = 115
+      Top = 36
+      Width = 115
+      Height = 17
+      Caption = 'TaskDialogMsgBox'
+      TabOrder = 2
+      TabStop = True
+      OnClick = cb_TaskDialogMsgBoxClick
+    end
+  end
+  object GroupBox5: TGroupBox
+    Left = 258
+    Top = 93
+    Width = 282
+    Height = 60
+    Anchors = [akLeft, akTop, akRight]
+    Caption = ' Flags '
+    TabOrder = 6
+    object NewStaticText1: TNewStaticText
+      Left = 14
+      Top = 26
+      Width = 68
+      Height = 14
+      Caption = 'Default button'
+      TabOrder = 3
+    end
+    object NewEdit1: TEdit
+      Left = 97
+      Top = 22
+      Width = 21
+      Height = 21
+      Alignment = taRightJustify
+      NumbersOnly = True
+      ReadOnly = True
+      TabOrder = 0
+      Text = '1'
+    end
+    object UpDown1: TUpDown
+      Left = 118
+      Top = 22
+      Width = 16
+      Height = 21
+      Associate = NewEdit1
+      Min = 1
+      Max = 3
+      Position = 1
+      TabOrder = 1
+      OnChanging = UpDown1Changing
+    end
+    object cb_MB_SETFOREGROUND: TCheckBox
+      Left = 140
+      Top = 24
+      Width = 135
+      Height = 17
+      Caption = 'MB_SETFOREGROUND'
+      TabOrder = 2
+    end
+  end
+  object GroupBox2: TGroupBox
+    Left = 8
+    Top = 157
+    Width = 160
+    Height = 174
+    Anchors = [akLeft, akTop, akBottom]
+    Caption = ' Icon '
+    TabOrder = 7
+    DesignSize = (
+      160
+      174)
+    object IMGmbInformation: TImage
+      Left = 10
+      Top = 23
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF4000003A54944415478DAC5974D4F134118C767BBED
+        F62DC105696340494B4810D0848331DCA0A8C1C4C4183D889E163F01C40F60FC
+        00A67E02DA937A32440FC6042DE8CD48E2453829B5221A0A02625FB6A55D9F67
+        B6BBDD6D77BB03419D64E86CBBECEFBFCFFF99676638F29F1BC77A63E0E25D11
+        3EAE411F851E813ED670CB02F434F445E873F9F9073B4722A0068E23BCEA6B17
+        2B6DDDA41A0C131813C5E5511F52291157719BB87259C2EFADC17807E173D067
+        9C84700EF069F8B8B7DF1E15CBE1B344F104D41F14E35D8AF91AC65CF937F164
+        3F12F76E1AE1F741C4C30309D0DE5A118252E9E408A904C275AA03DCF8050F11
+        11BEBF0341B9A45D34381B780A423C2CF78E43988543C1B521DAE3CD2C1097BC
+        F3012E638D22AC0424002E39C1F9DC06F51C5B35108228859AE09A48AE5AD644
+        2441C094AD00F41CC21E2FF65D767C73F4B8F448A2DF08B713A4DC396409D741
+        1009DF9779B463C698139C018EA15F957B2F882C9E5B0AB0811345BDE00B59E2
+        FDBA881644352B8C021290ED52A97B84C9736A417EA366419854FCA19670AD09
+        3FDE13F7AFB46E05677CFB42FF559175AAF17983007FB89603ADE1EA14CD117F
+        FA851E054D8004899728F64D30C1F18F67132D50F349B885160C3AC2B5812FF3
+        0A13720A042435018972F88C049D79AA3509383EC804A7FFBBB5423C3F97A90D
+        9A80941C1D1F5393CF194E1F8249F8D84280039CDA87C9F8EDCD020888690294
+        C2C00DBDB6B314191A8146010C706C5817FC9F9F1110C0E902F24393CC70DD02
+        A3808E0126B816A5C0A7A75602D8E06A122ED7054CCE36E4406B3865360A289C
+        BE6EB0A0359C5AB0652380014E2D587D6E12909223B17A123AC0A905560218E0
+        D8F8C226F1AE9B9330510EC1340C0D31C1F51C7872A72EA06390094EA3B7BD82
+        DD340DA1108989627482098E0FA4116812E00CC7E65B834254DA351522B514F7
+        5D81521C7484EB1698040C30C1B97D28C59997E652ACD9B07F2C2295BACE3BC2
+        6D0538C071206497887B2F635E8C8C51907B6222CBC262127073D65C076CE07C
+        1193EFADF5725C13310D16C48B914B0D53B2B9C2412DB7166003C7A9E75B7B0D
+        16E4AD3724462BAA5E51927BC6541136E5952FE072BC49C7557FA7BA1F680187
+        37C7C46BBD253358910211C3F2A9518BE2641830786E80B36D4A0D22E2608754
+        3A71AEF6760787A3E7C2C612863D4958B7E50D42D483495B44448F2D774B3653
+        0D8B0D64FBE10E2656D1207834F38A6225D8453D87315138B7FA1008B34BDE25
+        2E58E7F9DC3A86FB688E661642FEFDE1F46FB73FA626C73F4C6061F500000000
+        49454E44AE426082}
+    end
+    object IMGmbConfirmation: TImage
+      Left = 10
+      Top = 60
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF4000004DF4944415478DAC5576D6C5355187E6FEF6E
+        BF966C774A5BB28DD18D05990CB798612689FB0205E38246493031C68E9825FE
+        6341C5F8430331F84170FB4316FDD3256A42FC4118981817B0ED16FDE120D990
+        0F11EBC61873B485756EEB6D6FD7D6F79CBB76F7B6F7B67704F524273DF7F4E4
+        3CCF799FE7BCE71C06FEE7C2E81D68DD7588C79F97B0B66275626DCB1AE2C53A
+        89D587F54CE4FC89F04321B002DC4BC093E6323E515201C9623B601B52064E9A
+        242182213A0786A520B00BD3D80E13F033587B0A11610A801FC49F0F97CBAAF9
+        B87D1BA438ABF4474A3E2AA5FCC636135F042E78158AE62709F81124D1B72602
+        E955A78CC52EB1B2191256FB2A6A017079078B1131FEF50B125A1AD08A06A301
+        EEC11037C66A3A30CC464D708310062629D2FEA499CF48221F4BE4314D79C110
+        0B8FE1677B360935026E04776981E36A800B5C811A6B045AEAAB60E3FA32DA7F
+        F98F19181C0B80E86884A48957448849C6D324069040972601A23986BD375ABB
+        47159C186D3B7B038E773F0FCF346CCA91EED6DD39D87FF41B188D6F4612A58A
+        889148986F9D270BE8917B82918113DA13B19A9DBC96E6ECD25D38DAC2C1FBAF
+        3F07F38B020C5FF6C3AFFE19E8DC510F4F6C2AA76348FF96037D306BEF90C921
+        4DC20A4130DDF61109AAD352C809B8D1ED2EB1A2595373762940096C43B0EEBE
+        EF2064AC84146E4776E10EB89A4AE18B77F6D391EFF60FC2E7A32C9AD796014F
+        17E3EC4528FA7B322305235FBDF0D85E3EDF56632301D82C8C833F5A0262F953
+        8ABF8D8131183DD649233132EE879D9F0C43FC913AA54629C94396C9EF335148
+        1370A1F1DCD1DADD9AE092040160C31339E0A470A1AB70E1BD16EA0D4AE0631F
+        C41F7D3C671C6998A72E104376218181340177DC5EEFC29A779F1323A96D3569
+        522FFCF665376C7494C1B1AF86E0034F0C12165BCE384AF6DE75E0EE5FA332A4
+        097862D51D6D92F9D4C1B3938C7C52CC78D0F3B4193E7BEB45DA53F7C671B861
+        6D96C8668153298919EF0C7B91407B9A404AA87B45B6BA3580DFBF09071AB98C
+        014F9E1E819E6F6F4AE15701A791C4BC60F9F32C2001264320B2F5D5358373A1
+        6BD0F5A43503FEF5D04578B37F1862E53B34C1A5760AACFED36A04F483933CBF
+        6F43084E1D7129C045C776652455C02966360161CBCB2A065307A7DB6E76147E
+        3FF91A35DDB99FAFC0BE135E10D737155C79468289730A029E98B37DD58405C0
+        4931DFF682307898B6F7BCDD0F438BF5BA564E0A2B84C034A334A13B6EC36D68
+        DBAA0B3C9B80A5F3238856EDD2054EFAB9B9EBA42AB6212622DE1DADDEAD0B9C
+        4CE8B8F713CC9E3A2411D8FB29442B5B758153F2D39888C4794522925271ED0B
+        988A8B0B824B93F832FD494CDFA2A3491738B38CA978EA07652A4ECBB05CEA74
+        D1345B009C1463709CDCFD240278F48AB68682E0A4610C5E82A28529E561248F
+        42ACAA9DA7A7581E70C9033E10CE1E5E95A0A2A520381B25E61B513F8E57481C
+        44097AA3CE67B3B6A4129C4C4A245025A0014EB69E79FA479420A27E21914B81
+        572A57ACAA6D2597E7824B128CE18936BF2AC1BA86BCE0B87262BCFC57329914
+        1E24D118DBD0AA79FA29BF410FB8BE4BA98C442FCAE122D98D1EAB0F004E3437
+        062E91B00F80DE6B791611E96152E2E4C9ED46F5B6A4B1D548B241B73FD8C344
+        2D1A409E66269E4F149743D2B28E5EBD534C9134098699F8C180E73CBB3443C2
+        FD709E662A44FEFBC7E9BF5DFE01E32FFB3F42F099B90000000049454E44AE42
+        6082}
+    end
+    object IMGmbError: TImage
+      Left = 10
+      Top = 97
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF40000033A4944415478DAD597DD4E135110C7678556
+        935E5883B12636E982893591160D91822602811B4D84F5014CE0D23B7D02F109
+        F4CE4B487C001645A2494D8BC634944F294DFC82564193E2572536428BA933BB
+        3DBBDDEE6E778950E2C92673F69493FF6FE6CCF967E1609F07F7DF023CB80103
+        18864BAF83D7EFC348CD00509CC7900A0679E97D71314DA11121D2B5021876B9
+        0E0D08423B40B108E2D814E4729B230830B8E70028DE8521D2D9D90CDE130DD2
+        DADADA57987C9EA469374244F71A20E2F1B8BB7A7B5A34EBE167AF2093C94611
+        A07BCF0058F6BDBD2DE039E6D6FC86E212C44EABB0538094D77B94EFBC7446FF
+        23F6C2E48B241EC7B7340234EE3A00BB76427F08B00175E234B011417C18A7A9
+        ED6B690B00C5A9DEA9D37EAFBBB5F5A4BCB16E53235EFC2343CDCE2DC3EB379F
+        B2205FCBEC6E010C399DF5B7FBFB42805101E02E4CC9E22FDB14807C7E1BC61E
+        C529DE4180A17F0660D90703BC3B10F0A91B0FFC06EE625C074015492C7D84C5
+        A50FB6AA600740329D2B975B95EC4944AA402540E938F2856D9878326FCB9C38
+        0B719EB2EF68F74353D371455C39827280ED839ABD2BA90CC4A6DE025858B415
+        C028662F50E7978B5B0314A5471C9FA12A8808706DC7003AD32913AF0E208BD3
+        C8ACFF84702441535373AA06A05A6E85B839802ACE06012088A9451B0230D3A1
+        C63BE27619974E07E0D489D3F891FD05134F17686A684E6600296C3ABE2374CA
+        B83C740BEAB7B40005A7D11F4A4F2CFE0E56D2EB8616AD0340F19B18EE0A7D6D
+        7ACB2D894B1B2D01D4E3C8E5B6407C3C43D35B0871CF1440351D9F3BD0EC3315
+        B706D0F7422289E6945CD5995325806CB957DB54D33110AF0E5034EC857CA100
+        63E37364521A8BE6CAC4790CF386D9EB6E01F5405EBB2201188BB3C544729555
+        E11C33A77200F93B0FCFDE4A9C1ECE5109E0A82ACE8238314B3DA1583457123F
+        4BD94B96DBE8B114973622807A04E7A198775A8AD3C0DB00B1E9F750AAC20203
+        88A0DBA1E9046D89DB03D08BB397703409992F1B9239718AE5F690E51EB625CE
+        00CA17B500E6E214501CC293F25734018C62F68292BD0D71CBF52AE26C100082
+        880410F17A1BBA3A427E703AEA6A224EDF0BB1E96558FBFC3D4A0002AE8D42ED
+        075DC7C17DFFEFF82F44FFE05EBAD2EA730000000049454E44AE426082}
+    end
+    object IMGmbCriticalError: TImage
+      Left = 10
+      Top = 135
+      Width = 32
+      Height = 32
+      AutoSize = True
+      Picture.Data = {
+        0954506E67496D61676589504E470D0A1A0A0000000D49484452000000200000
+        00200806000000737A7AF40000022B4944415478DACD97312C035118C7BFD75E
+        A5AAD14B6B301818DA49824D24A235582C62B5B4BB049B8930D990D8AF8B552C
+        16835624624362626030185468AA15DA9EEF6BEE5D9E7375774D79BEE4E5AECD
+        DDFBFFEEFB7FEFBB770C2407737BE16E22A6E26106C7048E7E1C49CB25791C77
+        388E71ECCF5D179EDB0260086F9278B7C2D4DE0E06D100033C878071F7870E50
+        ACEAF084270FEF3A9D93F83E8E252710E620BE8887D5BEA04F4D847CD0E97397
+        AD4A1DE0BA5C87FBB73A89AF21C4962700FED49D7E961E0AFB201670EDD49728
+        60462E4B75A8D4F46CB36C7C9BD910CF618A8747237E6851DB0CB2E7ECA546B6
+        5CE0CF9415C20E4043F1743BC46D20B20890690A409E63DA37C7D5F6898B1027
+        CF35B26349AC0953C648FD2D3EB92A7ACEC211086D68F0B6BD02B59B2B5762FE
+        F8200417D6A1BC9C01BDF462FE4F358199200B06B815228086D5DE283A31BA76
+        F6401919C3898AF03A3FEB0841E2740F0B7743F5FCB4718F185494B83A4C2B98
+        F8F4935145B52E357142270837D7D2123D7AAA9A59E000692C3C8DBC6F75622F
+        A0540B58901904C872000D1B4D3A1E6ADE697E12F0224E71834D0A1B55C3060E
+        90C3E24B3A351C3B215E276EC5298C62CC23408A03E85331C5D5D2B342340AC9
+        8338052DC9C3421510809900D33D8AB3BA0D048517711E078FFF0D40B605D28B
+        50FA3294DE88E4B6626E83B49791980569AF630342DE8644B442DA964CB042DE
+        A6548090B32DB780C8F930B1CB06C8F834B301F9FB8FD3DF8E4F1B53543FEFB0
+        D5E80000000049454E44AE426082}
+    end
+    object rb_mbInformation: TRadioButton
+      Left = 53
+      Top = 31
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbInformation'
+      Checked = True
+      TabOrder = 0
+      TabStop = True
+    end
+    object rb_mbConfirmation: TRadioButton
+      Left = 53
+      Top = 68
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbConfirmation'
+      TabOrder = 1
+      TabStop = True
+    end
+    object rb_mbError: TRadioButton
+      Left = 53
+      Top = 105
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbError'
+      TabOrder = 2
+      TabStop = True
+    end
+    object rb_mbCriticalError: TRadioButton
+      Left = 53
+      Top = 142
+      Width = 99
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'mbCriticalError'
+      TabOrder = 3
+      TabStop = True
+    end
+  end
+  object GroupBox3: TGroupBox
+    Left = 179
+    Top = 157
+    Width = 169
+    Height = 174
+    Anchors = [akLeft, akTop, akBottom]
+    Caption = ' Buttons '
+    TabOrder = 8
+    DesignSize = (
+      169
+      174)
+    object rbMB_OK: TRadioButton
+      Left = 14
+      Top = 23
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_OK'
+      Checked = True
+      TabOrder = 0
+      TabStop = True
+      OnClick = rbMB_OKClick
+    end
+    object rbMB_OKCANCEL: TRadioButton
+      Left = 14
+      Top = 46
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_OKCANCEL'
+      TabOrder = 1
+      TabStop = True
+      OnClick = rbMB_OKCANCELClick
+    end
+    object rbMB_YESNO: TRadioButton
+      Left = 14
+      Top = 70
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_YESNO'
+      TabOrder = 2
+      TabStop = True
+      OnClick = rbMB_YESNOClick
+    end
+    object rbMB_YESNOCANCEL: TRadioButton
+      Left = 14
+      Top = 94
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_YESNOCANCEL'
+      TabOrder = 3
+      TabStop = True
+      OnClick = rbMB_YESNOCANCELClick
+    end
+    object rbMB_RETRYCANCEL: TRadioButton
+      Left = 14
+      Top = 118
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_RETRYCANCEL'
+      TabOrder = 4
+      TabStop = True
+      OnClick = rbMB_RETRYCANCELClick
+    end
+    object rbMB_ABORTRETRYIGNORE: TRadioButton
+      Left = 14
+      Top = 142
+      Width = 147
+      Height = 17
+      Anchors = [akLeft, akTop, akRight]
+      Caption = 'MB_ABORTRETRYIGNORE'
+      TabOrder = 5
+      TabStop = True
+      OnClick = rbMB_ABORTRETRYIGNOREClick
+    end
+  end
+  object GroupBox4: TGroupBox
+    Left = 359
+    Top = 157
+    Width = 181
+    Height = 174
+    Anchors = [akLeft, akTop, akBottom]
+    Caption = ' Return values '
+    TabOrder = 9
+    object cb_IDOK: TCheckBox
+      Left = 16
+      Top = 23
+      Width = 80
+      Height = 17
+      Caption = 'IDOK'
+      TabOrder = 0
+    end
+    object cb_IDCANCEL: TCheckBox
+      Left = 16
+      Top = 42
+      Width = 80
+      Height = 17
+      Caption = 'IDCANCEL'
+      TabOrder = 1
+    end
+    object cb_IDYES: TCheckBox
+      Left = 16
+      Top = 62
+      Width = 80
+      Height = 17
+      Caption = 'IDYES'
+      TabOrder = 2
+    end
+    object cb_IDNO: TCheckBox
+      Left = 16
+      Top = 82
+      Width = 80
+      Height = 17
+      Caption = 'IDNO'
+      TabOrder = 3
+    end
+    object cb_IDABORT: TCheckBox
+      Left = 16
+      Top = 102
+      Width = 80
+      Height = 17
+      Caption = 'IDABORT'
+      TabOrder = 4
+    end
+    object cb_IDRETRY: TCheckBox
+      Left = 16
+      Top = 122
+      Width = 80
+      Height = 17
+      Caption = 'IDRETRY'
+      TabOrder = 5
+    end
+    object cb_IDIGNORE: TCheckBox
+      Left = 16
+      Top = 142
+      Width = 80
+      Height = 17
+      Caption = 'IDIGNORE'
+      TabOrder = 6
+    end
+    object rb_IDOK: TCheckBox
+      Left = 100
+      Top = 23
+      Width = 16
+      Height = 17
+      TabOrder = 7
+      Visible = False
+      OnClick = rb_IDOKClick
+    end
+    object rb_IDCANCEL: TCheckBox
+      Left = 100
+      Top = 42
+      Width = 16
+      Height = 17
+      TabOrder = 8
+      Visible = False
+      OnClick = rb_IDCANCELClick
+    end
+    object rb_IDYES: TCheckBox
+      Left = 100
+      Top = 62
+      Width = 16
+      Height = 17
+      TabOrder = 9
+      Visible = False
+      OnClick = rb_IDYESClick
+    end
+    object rb_IDNO: TCheckBox
+      Left = 100
+      Top = 82
+      Width = 16
+      Height = 17
+      TabOrder = 10
+      Visible = False
+      OnClick = rb_IDNOClick
+    end
+    object rb_IDABORT: TCheckBox
+      Left = 100
+      Top = 102
+      Width = 16
+      Height = 17
+      TabOrder = 11
+      Visible = False
+      OnClick = rb_IDABORTClick
+    end
+    object rb_IDRETRY: TCheckBox
+      Left = 100
+      Top = 122
+      Width = 16
+      Height = 17
+      TabOrder = 12
+      Visible = False
+      OnClick = rb_IDRETRYClick
+    end
+    object rb_IDIGNORE: TCheckBox
+      Left = 100
+      Top = 142
+      Width = 16
+      Height = 17
+      TabOrder = 13
+      Visible = False
+      OnClick = rb_IDIGNOREClick
+    end
+    object cb_DefIDOK: TRadioButton
+      Left = 147
+      Top = 23
+      Width = 17
+      Height = 17
+      TabOrder = 14
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDCANCEL: TRadioButton
+      Left = 147
+      Top = 42
+      Width = 17
+      Height = 17
+      TabOrder = 15
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDYES: TRadioButton
+      Left = 147
+      Top = 62
+      Width = 17
+      Height = 17
+      TabOrder = 16
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDNO: TRadioButton
+      Left = 147
+      Top = 82
+      Width = 17
+      Height = 17
+      TabOrder = 17
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDABORT: TRadioButton
+      Left = 147
+      Top = 102
+      Width = 17
+      Height = 17
+      TabOrder = 18
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDRETRY: TRadioButton
+      Left = 147
+      Top = 122
+      Width = 17
+      Height = 17
+      TabOrder = 19
+      TabStop = True
+      Visible = False
+    end
+    object cb_DefIDIGNORE: TRadioButton
+      Left = 147
+      Top = 142
+      Width = 17
+      Height = 17
+      TabOrder = 20
+      TabStop = True
+      Visible = False
+    end
+  end
+  object Panel1: TPanel
+    Left = 0
+    Top = 338
+    Width = 548
+    Height = 42
+    Align = alBottom
+    BevelOuter = bvNone
+    TabOrder = 10
+    DesignSize = (
+      548
+      42)
+    object Bevel1: TBevel
+      Left = 0
+      Top = 0
+      Width = 548
+      Height = 3
+      Align = alTop
+      Shape = bsBottomLine
+      ExplicitLeft = 168
+      ExplicitWidth = 50
+    end
+    object MBDButtonPreview: TButton
+      Left = 10
+      Top = 11
+      Width = 80
+      Height = 25
+      Anchors = [akLeft, akBottom]
+      Caption = '&Preview'
+      TabOrder = 0
+      OnClick = MBDButtonPreviewClick
+    end
+    object MBDButtonOK: TButton
+      Left = 379
+      Top = 11
+      Width = 75
+      Height = 25
+      Anchors = [akRight, akBottom]
+      Caption = 'OK'
+      Default = True
+      ModalResult = 1
+      TabOrder = 1
+      OnClick = MBDButtonOKClick
+    end
+    object MBDButtonCancel: TButton
+      Left = 463
+      Top = 11
+      Width = 75
+      Height = 25
+      Anchors = [akRight, akBottom]
+      Cancel = True
+      Caption = 'Cancel'
+      ModalResult = 2
+      TabOrder = 2
+    end
+  end
+end

+ 1260 - 0
Projects/CompMessageBoxDesigner.pas

@@ -0,0 +1,1260 @@
+unit CompMessageBoxDesigner;
+
+{
+  Inno Setup
+  Copyright (C) 1997-2020 Jordan Russell
+  Portions by Martijn Laan
+  For conditions of distribution and use, see LICENSE.TXT.
+
+  MessageBox Designer form
+  
+  Originally contributed by leserg73
+}
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+  UIStateForm, StdCtrls, ExtCtrls, NewStaticText, Vcl.ComCtrls,
+  Vcl.Imaging.pngimage;
+
+type
+  TMBDForm = class(TUIStateForm)
+    IMGmbInformation: TImage;
+    IMGmbConfirmation: TImage;
+    IMGmbError: TImage;
+    IMGmbCriticalError: TImage;
+    Panel1: TPanel;
+    GroupBox1: TGroupBox;
+    GroupBox2: TGroupBox;
+    MSGText: TMemo;
+    rb_mbInformation: TRadioButton;
+    rb_mbConfirmation: TRadioButton;
+    rb_mbError: TRadioButton;
+    rb_mbCriticalError: TRadioButton;
+    GroupBox3: TGroupBox;
+    MBDButtonOK: TButton;
+    MBDButtonCancel: TButton;
+    MBDButtonPreview: TButton;
+    Bevel1: TBevel;
+    rbMB_OK: TRadioButton;
+    rbMB_OKCANCEL: TRadioButton;
+    rbMB_YESNO: TRadioButton;
+    rbMB_YESNOCANCEL: TRadioButton;
+    rbMB_RETRYCANCEL: TRadioButton;
+    rbMB_ABORTRETRYIGNORE: TRadioButton;
+    GroupBox4: TGroupBox;
+    cb_IDOK: TCheckBox;
+    cb_IDCANCEL: TCheckBox;
+    cb_IDYES: TCheckBox;
+    cb_IDNO: TCheckBox;
+    cb_IDABORT: TCheckBox;
+    cb_IDRETRY: TCheckBox;
+    cb_IDIGNORE: TCheckBox;
+    GroupBox5: TGroupBox;
+    cb_MB_SETFOREGROUND: TCheckBox;
+    NewStaticText1: TNewStaticText;
+    NewEdit1: TEdit;
+    UpDown1: TUpDown;
+    GroupBox6: TGroupBox;
+    cb_MsgBox: TRadioButton;
+    cb_TaskDialogMsgBox: TRadioButton;
+    rb_IDOK: TCheckBox;
+    rb_IDCANCEL: TCheckBox;
+    rb_IDYES: TCheckBox;
+    rb_IDNO: TCheckBox;
+    rb_IDABORT: TCheckBox;
+    rb_IDRETRY: TCheckBox;
+    rb_IDIGNORE: TCheckBox;
+    TaskInstructionLabel: TNewStaticText;
+    TaskMesssageLabel: TNewStaticText;
+    TaskInstructionText: TEdit;
+    TaskMesssageText: TEdit;
+    Button1Text: TEdit;
+    Button2Text: TEdit;
+    Button1Label: TNewStaticText;
+    Button2Label: TNewStaticText;
+    cb_Suppressible: TCheckBox;
+    cb_DefIDOK: TRadioButton;
+    cb_DefIDCANCEL: TRadioButton;
+    cb_DefIDYES: TRadioButton;
+    cb_DefIDNO: TRadioButton;
+    cb_DefIDABORT: TRadioButton;
+    cb_DefIDRETRY: TRadioButton;
+    cb_DefIDIGNORE: TRadioButton;
+    procedure FormCreate(Sender: TObject);
+    procedure UpDown1Changing(Sender: TObject; var AllowChange: Boolean);
+    procedure rbMB_OKClick(Sender: TObject);
+    procedure rbMB_OKCANCELClick(Sender: TObject);
+    procedure rbMB_YESNOClick(Sender: TObject);
+    procedure rbMB_RETRYCANCELClick(Sender: TObject);
+    procedure rbMB_YESNOCANCELClick(Sender: TObject);
+    procedure rbMB_ABORTRETRYIGNOREClick(Sender: TObject);
+    procedure MBDButtonPreviewClick(Sender: TObject);
+    procedure cb_TaskDialogMsgBoxClick(Sender: TObject);
+    procedure cb_MsgBoxClick(Sender: TObject);
+    procedure rb_IDOKClick(Sender: TObject);
+    procedure rb_IDCANCELClick(Sender: TObject);
+    procedure rb_IDNOClick(Sender: TObject);
+    procedure rb_IDYESClick(Sender: TObject);
+    procedure rb_IDRETRYClick(Sender: TObject);
+    procedure rb_IDIGNOREClick(Sender: TObject);
+    procedure rb_IDABORTClick(Sender: TObject);
+    procedure MBDButtonOKClick(Sender: TObject);
+    procedure cb_SuppressibleClick(Sender: TObject);
+    procedure MSGTextKeyPress(Sender: TObject; var Key: Char);
+  private
+    procedure CreateScriptMSG;
+  public
+    { Public declarations }
+  end;
+
+implementation
+
+uses
+  CmnFunc, CmnFunc2, CompForm, TaskDialog, Msgs;
+
+{$R *.DFM}
+
+procedure TMBDForm.FormCreate(Sender: TObject);
+begin
+  InitFormFont(Self);
+
+  cb_Suppressible.Checked := True;
+  MSGText.Lines[MSGText.CaretPos.Y] := '<Enter your text here...>';
+  MSGText.SelStart := MSGText.Perform(EM_LINEINDEX, 0, 0);
+  MSGText.SelLength := Length(MSGText.Lines[0]);
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  NewStaticText1.Enabled := False;
+  NewEdit1.Enabled := False;
+  UpDown1.Enabled := False;
+  TaskInstructionLabel.Visible := False;
+  TaskMesssageLabel.Visible := False;
+  TaskInstructionText.Visible := False;
+  TaskMesssageText.Visible := False;
+  Button1Text.Visible := False;
+  Button2Text.Visible := False;
+  Button1Label.Visible := False;
+  Button2Label.Visible := False;
+end;
+
+procedure TMBDForm.rbMB_OKClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  NewStaticText1.Enabled := False;
+  NewEdit1.Enabled := False;
+  NewEdit1.Text := '1';
+  UpDown1.Enabled := False;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := True;
+     rb_IDCANCEL.Enabled := False;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'OK';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := True;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := True;
+     cb_DefIDCANCEL.Enabled := False;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_YESNOClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := True;
+  cb_IDNO.Enabled := True;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 2;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := False;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := True;
+     rb_IDNO.Enabled := True;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Yes';
+     Button2Text.Text := 'No';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := True;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := False;
+     cb_DefIDYES.Enabled := True;
+     cb_DefIDNO.Enabled := True;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_OKCANCELClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := True;
+  cb_IDCANCEL.Enabled := True;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 2;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := True;
+     rb_IDCANCEL.Enabled := True;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'OK';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := True;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := True;
+     cb_DefIDCANCEL.Enabled := True;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_RETRYCANCELClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := True;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := True;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 2;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := True;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := True;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Retry';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := True;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := True;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := True;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_YESNOCANCELClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := True;
+  cb_IDABORT.Enabled := False;
+  cb_IDRETRY.Enabled := False;
+  cb_IDIGNORE.Enabled := False;
+  cb_IDYES.Enabled := True;
+  cb_IDNO.Enabled := True;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 3;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := True;
+     rb_IDABORT.Enabled := False;
+     rb_IDRETRY.Enabled := False;
+     rb_IDIGNORE.Enabled := False;
+     rb_IDYES.Enabled := True;
+     rb_IDNO.Enabled := True;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := True;
+     Button2Label.Enabled := True;
+     Button1Text.Enabled := True;
+     Button1Label.Enabled := True;
+     Button1Text.Text := 'Yes';
+     Button2Text.Text := 'No';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := True;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := True;
+     cb_DefIDYES.Enabled := True;
+     cb_DefIDNO.Enabled := True;
+     cb_DefIDABORT.Enabled := False;
+     cb_DefIDRETRY.Enabled := False;
+     cb_DefIDIGNORE.Enabled := False;
+  end;
+end;
+
+procedure TMBDForm.rbMB_ABORTRETRYIGNOREClick(Sender: TObject);
+begin
+  cb_IDOK.Checked := False;
+  cb_IDCANCEL.Checked := False;
+  cb_IDABORT.Checked := False;
+  cb_IDRETRY.Checked := False;
+  cb_IDIGNORE.Checked := False;
+  cb_IDYES.Checked := False;
+  cb_IDNO.Checked := False;
+  cb_IDOK.Enabled := False;
+  cb_IDCANCEL.Enabled := False;
+  cb_IDABORT.Enabled := True;
+  cb_IDRETRY.Enabled := True;
+  cb_IDIGNORE.Enabled := True;
+  cb_IDYES.Enabled := False;
+  cb_IDNO.Enabled := False;
+  if not cb_TaskDialogMsgBox.Checked then begin
+     NewStaticText1.Enabled := True;
+     NewEdit1.Enabled := True;
+     NewEdit1.Text := '1';
+     UpDown1.Max := 3;
+     UpDown1.Enabled := True;
+  end;
+  if cb_TaskDialogMsgBox.Checked then begin
+     rb_IDOK.Enabled := False;
+     rb_IDCANCEL.Enabled := False;
+     rb_IDABORT.Enabled := True;
+     rb_IDRETRY.Enabled := True;
+     rb_IDIGNORE.Enabled := True;
+     rb_IDYES.Enabled := False;
+     rb_IDNO.Enabled := False;
+     rb_IDOK.Checked := False;
+     rb_IDCANCEL.Checked := False;
+     rb_IDABORT.Checked := False;
+     rb_IDRETRY.Checked := False;
+     rb_IDIGNORE.Checked := False;
+     rb_IDYES.Checked := False;
+     rb_IDNO.Checked := False;
+     Button2Text.Enabled := False;
+     Button2Label.Enabled := False;
+     Button1Text.Enabled := False;
+     Button1Label.Enabled := False;
+     Button1Text.Text := '';
+     Button2Text.Text := '';
+  end;
+  if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := True;
+     cb_DefIDOK.Enabled := False;
+     cb_DefIDCANCEL.Enabled := False;
+     cb_DefIDYES.Enabled := False;
+     cb_DefIDNO.Enabled := False;
+     cb_DefIDABORT.Enabled := True;
+     cb_DefIDRETRY.Enabled := True;
+     cb_DefIDIGNORE.Enabled := True;
+  end;
+end;
+
+procedure TMBDForm.UpDown1Changing(Sender: TObject; var AllowChange: Boolean);
+begin
+   AllowChange := True;
+end;
+
+procedure TMBDForm.cb_MsgBoxClick(Sender: TObject);
+begin
+   IMGmbConfirmation.Visible := True;
+   cb_MB_SETFOREGROUND.Enabled := True;
+   cb_MB_SETFOREGROUND.Checked := False;
+   GroupBox1.Visible := True;
+   if not cb_Suppressible.Checked then begin
+      GroupBox4.Caption := ' Return values ';
+      cb_DefIDOK.Visible := False;
+      cb_DefIDCANCEL.Visible := False;
+      cb_DefIDYES.Visible := False;
+      cb_DefIDNO.Visible := False;
+      cb_DefIDABORT.Visible := False;
+      cb_DefIDRETRY.Visible := False;
+      cb_DefIDIGNORE.Visible := False;
+   end
+   else begin
+     GroupBox4.Caption := ' Return values /  -------- / Default ';
+     cb_DefIDOK.Visible := True;
+     cb_DefIDCANCEL.Visible := True;
+     cb_DefIDYES.Visible := True;
+     cb_DefIDNO.Visible := True;
+     cb_DefIDABORT.Visible := True;
+     cb_DefIDRETRY.Visible := True;
+     cb_DefIDIGNORE.Visible := True;
+   end;
+   cb_IDOK.Checked := False;
+   cb_IDCANCEL.Checked := False;
+   cb_IDABORT.Checked := False;
+   cb_IDRETRY.Checked := False;
+   cb_IDIGNORE.Checked := False;
+   cb_IDYES.Checked := False;
+   cb_IDNO.Checked := False;
+   rb_IDOK.Visible := False;
+   rb_IDCANCEL.Visible := False;
+   rb_IDABORT.Visible := False;
+   rb_IDRETRY.Visible := False;
+   rb_IDIGNORE.Visible := False;
+   rb_IDYES.Visible := False;
+   rb_IDNO.Visible := False;
+   rb_mbInformation.Checked := True;
+   TaskInstructionLabel.Visible := False;
+   TaskMesssageLabel.Visible := False;
+   TaskInstructionText.Visible := False;
+   TaskMesssageText.Visible := False;
+   Button1Text.Visible := False;
+   Button2Text.Visible := False;
+   Button1Label.Visible := False;
+   Button2Label.Visible := False;
+   rbMB_OK.Checked := True;
+   rbMB_OKClick(Self);
+end;
+
+procedure TMBDForm.cb_SuppressibleClick(Sender: TObject);
+begin
+   if cb_Suppressible.Checked then begin
+     cb_DefIDOK.Visible := True;
+     cb_DefIDCANCEL.Visible := True;
+     cb_DefIDYES.Visible := True;
+     cb_DefIDNO.Visible := True;
+     cb_DefIDABORT.Visible := True;
+     cb_DefIDRETRY.Visible := True;
+     cb_DefIDIGNORE.Visible := True;
+     if cb_MsgBox.Checked then
+        GroupBox4.Caption := ' Return values /  -------- / Default ';
+     if cb_TaskDialogMsgBox.Checked then
+        GroupBox4.Caption := ' Return values /  Shield  / Default ';
+   end
+   else begin
+     cb_DefIDOK.Checked := False;
+     cb_DefIDCANCEL.Checked := False;
+     cb_DefIDYES.Checked := False;
+     cb_DefIDNO.Checked := False;
+     cb_DefIDABORT.Checked := False;
+     cb_DefIDRETRY.Checked := False;
+     cb_DefIDIGNORE.Checked := False;
+     cb_DefIDOK.Visible := False;
+     cb_DefIDCANCEL.Visible := False;
+     cb_DefIDYES.Visible := False;
+     cb_DefIDNO.Visible := False;
+     cb_DefIDABORT.Visible := False;
+     cb_DefIDRETRY.Visible := False;
+     cb_DefIDIGNORE.Visible := False;
+     if cb_MsgBox.Checked then
+        GroupBox4.Caption := ' Return values ';
+     if cb_TaskDialogMsgBox.Checked then
+        GroupBox4.Caption := ' Return values /  Shield ';
+   end;
+   if rbMB_OK.Checked then rbMB_OKClick(Self);
+   if rbMB_OKCANCEL.Checked then rbMB_OKCANCELClick(Self);
+   if rbMB_YESNO.Checked then rbMB_YESNOClick(Self);
+   if rbMB_YESNOCANCEL.Checked then rbMB_YESNOCANCELClick(Self);
+   if rbMB_RETRYCANCEL.Checked then rbMB_RETRYCANCELClick(Self);
+   if rbMB_ABORTRETRYIGNORE.Checked then rbMB_ABORTRETRYIGNOREClick(Self);
+end;
+
+procedure TMBDForm.cb_TaskDialogMsgBoxClick(Sender: TObject);
+begin
+   IMGmbConfirmation.Visible := False;
+   cb_MB_SETFOREGROUND.Enabled := False;
+   cb_MB_SETFOREGROUND.Checked := False;
+   GroupBox1.Visible := False;
+   if not cb_Suppressible.Checked then begin
+     GroupBox4.Caption := ' Return values /  Shield ';
+      cb_DefIDOK.Visible := False;
+      cb_DefIDCANCEL.Visible := False;
+      cb_DefIDYES.Visible := False;
+      cb_DefIDNO.Visible := False;
+      cb_DefIDABORT.Visible := False;
+      cb_DefIDRETRY.Visible := False;
+      cb_DefIDIGNORE.Visible := False;
+   end
+   else begin
+     GroupBox4.Caption := ' Return values /  Shield  / Default ';
+     cb_DefIDOK.Visible := True;
+     cb_DefIDCANCEL.Visible := True;
+     cb_DefIDYES.Visible := True;
+     cb_DefIDNO.Visible := True;
+     cb_DefIDABORT.Visible := True;
+     cb_DefIDRETRY.Visible := True;
+     cb_DefIDIGNORE.Visible := True;
+   end;
+   cb_IDOK.Checked := False;
+   cb_IDCANCEL.Checked := False;
+   cb_IDABORT.Checked := False;
+   cb_IDRETRY.Checked := False;
+   cb_IDIGNORE.Checked := False;
+   cb_IDYES.Checked := False;
+   cb_IDNO.Checked := False;
+   rb_IDOK.Checked := False;
+   rb_IDCANCEL.Checked := False;
+   rb_IDABORT.Checked := False;
+   rb_IDRETRY.Checked := False;
+   rb_IDIGNORE.Checked := False;
+   rb_IDYES.Checked := False;
+   rb_IDNO.Checked := False;
+   rb_IDOK.Visible := True;
+   rb_IDCANCEL.Visible := True;
+   rb_IDABORT.Visible := True;
+   rb_IDRETRY.Visible := True;
+   rb_IDIGNORE.Visible := True;
+   rb_IDYES.Visible := True;
+   rb_IDNO.Visible := True;
+   rb_mbInformation.Checked := True;
+   TaskInstructionLabel.Visible := True;
+   TaskMesssageLabel.Visible := True;
+   TaskInstructionText.Visible := True;
+   TaskMesssageText.Visible := True;
+   Button1Text.Visible := True;
+   Button2Text.Visible := True;
+   Button1Label.Visible := True;
+   Button2Label.Visible := True;
+   TaskInstructionText.Text := 'Instruction Text';
+   TaskMesssageText.Text := 'Messsage Text';
+   // Button1Text.Text := '';
+   // Button2Text.Text := '';
+   rbMB_OK.Checked := True;
+   rbMB_OKClick(Self);
+end;
+
+procedure TMBDForm.rb_IDOKClick(Sender: TObject);
+begin
+   if rb_IDOK.Checked then
+      rb_IDCANCEL.Checked := False;
+end;
+
+procedure TMBDForm.rb_IDCANCELClick(Sender: TObject);
+begin
+   if rb_IDCANCEL.Checked then begin
+      rb_IDOK.Checked := False;
+      rb_IDNO.Checked := False;
+      rb_IDYES.Checked := False;
+      rb_IDRETRY.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDYESClick(Sender: TObject);
+begin
+   if rb_IDYES.Checked then begin
+      rb_IDNO.Checked := False;
+      rb_IDCANCEL.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDNOClick(Sender: TObject);
+begin
+   if rb_IDNO.Checked then begin
+      rb_IDYES.Checked := False;
+      rb_IDCANCEL.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDRETRYClick(Sender: TObject);
+begin
+   if rb_IDRETRY.Checked then begin
+      rb_IDCANCEL.Checked := False;
+      rb_IDABORT.Checked := False;
+      rb_IDIGNORE.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDIGNOREClick(Sender: TObject);
+begin
+   if rb_IDIGNORE.Checked then begin
+      rb_IDABORT.Checked := False;
+      rb_IDRETRY.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.rb_IDABORTClick(Sender: TObject);
+begin
+   if rb_IDABORT.Checked then begin
+      rb_IDIGNORE.Checked := False;
+      rb_IDRETRY.Checked := False;
+   end;
+end;
+
+procedure TMBDForm.MBDButtonOKClick(Sender: TObject);
+begin
+  CreateScriptMSG;
+end;
+
+procedure TMBDForm.MBDButtonPreviewClick(Sender: TObject);
+var
+  ButtonsBtn : Cardinal;
+  TypeIcon : TMsgBoxType;
+  CaptionMsg : String;
+  ShieldFlag : Integer;
+  ButtonLabelsArray: TArray<string>;
+begin
+  { default value }
+  ButtonsBtn := MB_OK;
+  TypeIcon := mbInformation;
+  ShieldFlag := 0;
+
+  { icon and caption set }
+  if rb_mbInformation.Checked then begin
+     CaptionMsg := 'Info';
+     TypeIcon := mbInformation;
+  end;
+  if rb_mbConfirmation.Checked then begin
+     CaptionMsg := 'Confirm';
+     TypeIcon := mbConfirmation;
+  end;
+  if rb_mbError.Checked then begin
+     CaptionMsg := 'Error';
+     TypeIcon := mbError;
+  end;
+  if rb_mbCriticalError.Checked then begin
+     CaptionMsg := 'Fatal Error';
+     TypeIcon := mbCriticalError;
+  end;
+
+  { button type set }
+  if rbMB_OK.Checked then ButtonsBtn := MB_OK;
+  if rbMB_OKCANCEL.Checked then ButtonsBtn := MB_OKCANCEL;
+  if rbMB_YESNO.Checked then ButtonsBtn := MB_YESNO;
+  if rbMB_YESNOCANCEL.Checked then ButtonsBtn := MB_YESNOCANCEL;
+  if rbMB_RETRYCANCEL.Checked then ButtonsBtn := MB_RETRYCANCEL;
+  if rbMB_ABORTRETRYIGNORE.Checked then ButtonsBtn := MB_ABORTRETRYIGNORE;
+
+  { MsgBox(Text, Caption, Typ, Buttons); preview }
+  if cb_MsgBox.Checked then begin
+    if MSGText.GetTextLen = 0 then
+       MSGText.Lines.Add('Your message text.');
+    { MessageBox with DefButton }
+    if NewEdit1.Text = '1' then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn);
+    if NewEdit1.Text = '2' then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON2);
+    if NewEdit1.Text = '3' then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON3);
+    { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+    if (NewEdit1.Text = '1') and (cb_MB_SETFOREGROUND.Checked) then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_SETFOREGROUND);
+    if (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON2 or MB_SETFOREGROUND);
+    if (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
+       MsgBox(MSGText.Lines.GetText, CaptionMsg, TypeIcon, ButtonsBtn or MB_DEFBUTTON3 or MB_SETFOREGROUND);
+  end;
+
+  { TaskDialogMsgBox preview}
+  if cb_TaskDialogMsgBox.Checked then begin
+     { create ButtonLabels array }
+     if rbMB_YESNO.Checked or rbMB_YESNOCANCEL.Checked then
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text, Button2Text.Text)
+     else if rbMB_ABORTRETRYIGNORE.Checked then
+        ButtonLabelsArray := TArray<string>.Create('Retry', 'Ignore', 'Abort')
+     else
+        ButtonLabelsArray := TArray<string>.Create(Button1Text.Text);
+
+     { get Shield Flag value }
+     if rbMB_OK.Checked and rb_IDOK.Checked then ShieldFlag := IDOK;
+     if rbMB_OKCANCEL.Checked and rb_IDOK.Checked then ShieldFlag := IDOK;
+     if rbMB_OKCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlag := IDCANCEL;
+     if rbMB_YESNO.Checked and rb_IDYES.Checked then ShieldFlag := IDYES;
+     if rbMB_YESNO.Checked and rb_IDNO.Checked then ShieldFlag := IDNO;
+     if rbMB_YESNOCANCEL.Checked and rb_IDYES.Checked then ShieldFlag := IDYES;
+     if rbMB_YESNOCANCEL.Checked and rb_IDNO.Checked then ShieldFlag := IDNO;
+     if rbMB_YESNOCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlag := IDCANCEL;
+     if rbMB_RETRYCANCEL.Checked and rb_IDRETRY.Checked then ShieldFlag := IDRETRY;
+     if rbMB_RETRYCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlag := IDCANCEL;
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDRETRY.Checked then ShieldFlag := IDRETRY;
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDABORT.Checked then ShieldFlag := IDABORT;
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDIGNORE.Checked then ShieldFlag := IDIGNORE;
+
+     { TaskDialogMsgBox(Icon, Instruction, Text, Caption, Typ, Buttons, ButtonLabels, ShieldButton) }
+     TaskDialogMsgBox('',
+                      TaskInstructionText.Text,
+                      TaskMesssageText.Text,
+                      CaptionMsg,
+                      TypeIcon,
+                      ButtonsBtn,
+                      ButtonLabelsArray,
+                      ShieldFlag);
+  end;
+end;
+
+procedure TMBDForm.MSGTextKeyPress(Sender: TObject; var Key: Char);
+begin
+	if Key = #27 then begin
+  	MBDButtonCancel.Click;
+    Key := #0;
+  end;
+end;
+
+procedure TMBDForm.CreateScriptMSG;
+
+   { MsgBox / SuppressibleMsgBox }
+   function TextMsg(M: Integer; a, b, c, d, e, f: String): String;
+    { (M) - TypeMsg
+      (a) - TextMsgIf
+      (b) - IconTypes
+      (c) - ButtonBtn
+      (d) - IDButton
+      (e) - IDButton2
+      (f) - IDButton3 }
+   var
+      SMsg, TypeMsgBox : String;
+   begin
+     if not cb_Suppressible.Checked then
+        TypeMsgBox := 'MsgBox'
+     else
+        TypeMsgBox := 'SuppressibleMsgBox';
+     SMsg := TypeMsgBox + '(''' + a + ''', ' + b + ', ' + c + ')';
+     case M of
+        0: Result := SMsg + ';';
+        1: Result := 'if ' + SMsg + ' = ' + d + ' then' + SNewLine + 'begin' + SNewLine + #9 + '// user clicked ' + StringReplace(d, 'ID', '', []) + SNewLine + 'end;';
+        2: Result := 'case ' + SMsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + 'end;';
+        3: Result := 'case ' + SMsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + #9 + 'else { user clicked ' + StringReplace(f, 'ID', '', []) + ' };' + SNewLine + 'end;';
+     end;
+   end;
+
+   { TaskDialogMsgBox / SuppressibleTaskDialogMsgBox }
+   function TextTask(N: Integer; a, b, c, r, s, d, e, f: String): String;
+    { (N) - TypeMsg
+      (a) - TextMsgIf (Button1Text.Text and Button2Text.Text)
+      (b) - IconTypes
+      (c) - ButtonBtn
+      (r) - BtnTextArr
+      (s) - ShieldFlg
+      (d) - IDButton
+      (e) - IDButton2
+      (f) - IDButton3 }
+   var
+      STsg, TypeMsgBox : String;
+   begin
+     if not cb_Suppressible.Checked then
+        TypeMsgBox := 'TaskDialogMsgBox'
+     else
+        TypeMsgBox := 'SuppressibleTaskDialogMsgBox';
+     STsg := TypeMsgBox + '(''' + a + ''', ' + b + ', ' + c + ', [''' + r + '''], ' + s + ')';
+     case N of
+        0: Result := STsg + ';';
+        1: Result := 'if ' + STsg + ' = ' + d + ' then' + SNewLine + 'begin' + SNewLine + #9 + '// user clicked ' + StringReplace(d, 'ID', '', []) + SNewLine + 'end;';
+        2: Result := 'case ' + STsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + 'end;';
+        3: Result := 'case ' + STsg + ' of ' + SNewLine + #9 + d +': { user clicked ' + StringReplace(d, 'ID', '', []) + ' };' + SNewLine + #9 + e +': { user clicked ' + StringReplace(e, 'ID', '', []) + ' };' + SNewLine + #9 + 'else { user clicked ' + StringReplace(f, 'ID', '', []) + ' };' + SNewLine + 'end;';
+     end;
+   end;
+
+const
+  remarka = '// Display a message box';
+
+var
+  ButtonBtn, TextMsgIf, IconTypes : String;
+  IDButton, IDButton2, IDButton3 : String;
+  TypeMsg, ModeMsg : Integer;
+  BtnTextArr, ShieldFlg, BtnSupprDef : String;
+
+begin
+  { default value }
+  ButtonBtn := 'MB_OK';
+  IconTypes := 'mbInformation';
+  ShieldFlg := '0';
+  TypeMsg := 0;
+  ModeMsg := 0;
+  BtnSupprDef := '';
+
+  MSGTextInsert.Clear;
+  MSGTextInsert.Add(remarka);
+
+  { make a string with DefBtn for Suppressible }
+  if cb_Suppressible.Checked then begin
+     if cb_DefIDOK.Checked then BtnSupprDef := ', IDOK';
+     if cb_DefIDCANCEL.Checked then BtnSupprDef := ', IDCANCEL';
+     if cb_DefIDYES.Checked then BtnSupprDef := ', IDYES';
+     if cb_DefIDNO.Checked then BtnSupprDef := ', IDNO';
+     if cb_DefIDABORT.Checked then BtnSupprDef := ', IDABORT';
+     if cb_DefIDRETRY.Checked then BtnSupprDef := ', IDRETRY';
+     if cb_DefIDIGNORE.Checked then BtnSupprDef := ', IDIGNORE';
+  end;
+
+  { icon and caption set }
+  if rb_mbInformation.Checked then begin
+     IconTypes := 'mbInformation';
+  end;
+  if rb_mbConfirmation.Checked then begin
+     IconTypes := 'mbConfirmation';
+  end;
+  if rb_mbError.Checked then begin
+     IconTypes := 'mbError';
+  end;
+  if rb_mbCriticalError.Checked then begin
+     IconTypes := 'mbCriticalError';
+  end;
+  { button type set }
+  if rbMB_OK.Checked then ButtonBtn := 'MB_OK';
+  if rbMB_OKCANCEL.Checked then ButtonBtn := 'MB_OKCANCEL';
+  if rbMB_YESNO.Checked then ButtonBtn := 'MB_YESNO';
+  if rbMB_YESNOCANCEL.Checked then ButtonBtn := 'MB_YESNOCANCEL';
+  if rbMB_RETRYCANCEL.Checked then ButtonBtn := 'MB_RETRYCANCEL';
+  if rbMB_ABORTRETRYIGNORE.Checked then ButtonBtn := 'MB_ABORTRETRYIGNORE';
+
+  if cb_MsgBox.Checked then begin
+     { MsgBox(Text, Typ, Buttons); }
+     ModeMsg := 0;
+
+     // rbMB_OK.Checked
+     { MessageBox with DefButton }
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_OK.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_OK or MB_SETFOREGROUND';
+
+     // rbMB_OKCANCEL
+     { MessageBox with DefButton }
+     if (rbMB_OKCANCEL.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_OKCANCEL or MB_DEFBUTTON2';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_OKCANCEL.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_OKCANCEL or MB_SETFOREGROUND';
+     if (rbMB_OKCANCEL.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_OKCANCEL or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+
+     // rbMB_YESNO
+     { MessageBox with DefButton }
+     if (rbMB_YESNO.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_YESNO or MB_DEFBUTTON2';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_YESNO.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNO or MB_SETFOREGROUND';
+     if (rbMB_YESNO.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNO or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+
+     // rbMB_RETRYCANCEL
+     { MessageBox with DefButton }
+     if (rbMB_RETRYCANCEL.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_RETRYCANCEL or MB_DEFBUTTON2';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_RETRYCANCEL.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_RETRYCANCEL or MB_SETFOREGROUND';
+     if (rbMB_RETRYCANCEL.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_RETRYCANCEL or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+
+     // rbMB_YESNOCANCEL
+     { MessageBox with DefButton }
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON2';
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '3') then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON3';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_YESNOCANCEL.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_SETFOREGROUND';
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+     if (rbMB_YESNOCANCEL.Checked) and (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_YESNOCANCEL or MB_DEFBUTTON3 or MB_SETFOREGROUND';
+
+     // rbMB_ABORTRETRYIGNORE
+     { MessageBox with DefButton }
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '2') then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON2';
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '3') then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON3';
+     { MessageBox with DefButton and Flag MB_SETFOREGROUND }
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_SETFOREGROUND';
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '2') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON2 or MB_SETFOREGROUND';
+     if (rbMB_ABORTRETRYIGNORE.Checked) and (NewEdit1.Text = '3') and (cb_MB_SETFOREGROUND.Checked) then
+        ButtonBtn := 'MB_ABORTRETRYIGNORE or MB_DEFBUTTON3 or MB_SETFOREGROUND';
+
+     { Suppressible msg }
+     if cb_Suppressible.Checked then ButtonBtn := ButtonBtn + BtnSupprDef;
+
+     { replace in a message string escape /r/n }
+     TextMsgIf := StringReplace(MSGText.Lines.GetText, SNewLine, '''#13#10''', [rfReplaceAll]);
+  end;
+
+  if cb_TaskDialogMsgBox.Checked then begin
+     { TaskDialogMsgBox(TaskInstructionText.Text, TaskMesssageText.Text, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg) }
+     ModeMsg := 1;
+
+     { create ButtonLabels array }
+     if rbMB_YESNO.Checked or rbMB_YESNOCANCEL.Checked then
+        BtnTextArr :=  Button1Text.Text + ''', ''' + Button2Text.Text
+     else if rbMB_ABORTRETRYIGNORE.Checked then
+        BtnTextArr := 'Retry'', ''Ignore'', ''Abort'
+     else
+        BtnTextArr := Button1Text.Text;
+
+     { get Shield Flag value }
+     if rbMB_OK.Checked and rb_IDOK.Checked then ShieldFlg := 'IDOK';
+     if rbMB_OKCANCEL.Checked and rb_IDOK.Checked then ShieldFlg := 'IDOK';
+     if rbMB_OKCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlg := 'IDCANCEL';
+     if rbMB_YESNO.Checked and rb_IDYES.Checked then ShieldFlg := 'IDYES';
+     if rbMB_YESNO.Checked and rb_IDNO.Checked then ShieldFlg := 'IDNO';
+     if rbMB_YESNOCANCEL.Checked and rb_IDYES.Checked then ShieldFlg := 'IDYES';
+     if rbMB_YESNOCANCEL.Checked and rb_IDNO.Checked then ShieldFlg := 'IDNO';
+     if rbMB_YESNOCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlg := 'IDCANCEL';
+     if rbMB_RETRYCANCEL.Checked and rb_IDRETRY.Checked then ShieldFlg := 'IDRETRY';
+     if rbMB_RETRYCANCEL.Checked and rb_IDCANCEL.Checked then ShieldFlg := 'IDCANCEL';
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDRETRY.Checked then ShieldFlg := 'IDRETRY';
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDABORT.Checked then ShieldFlg := 'IDABORT';
+     if rbMB_ABORTRETRYIGNORE.Checked and rb_IDIGNORE.Checked then ShieldFlg := 'IDIGNORE';
+
+     { Suppressible msg }
+     if cb_Suppressible.Checked then ShieldFlg := ShieldFlg + BtnSupprDef;
+
+     TextMsgIf := TaskInstructionText.Text + ''', ''' + TaskMesssageText.Text;
+  end;
+
+  { selected button OK }
+  if (cb_IDOK.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDOK';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button CANCEL }
+  else if (cb_IDCANCEL.Checked and not cb_IDOK.Checked and not cb_IDRETRY.Checked and not cb_IDYES.Checked and not cb_IDNO.Checked and not cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDCANCEL';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button OK and CANCEL }
+  else if (cb_IDCANCEL.Checked and cb_IDOK.Checked and not cb_IDRETRY.Checked and not cb_IDYES.Checked and not cb_IDNO.Checked) then begin
+     IDButton := 'IDOK';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button YES }
+  else if (cb_IDYES.Checked and not cb_IDNO.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button NO }
+  else if (cb_IDNO.Checked and not cb_IDYES.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDNO';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button YES and NO }
+  else if (cb_IDYES.Checked and cb_IDNO.Checked and not cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     IDButton2 := 'IDNO';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button YES and CANCEL }
+  else if (cb_IDYES.Checked and not cb_IDNO.Checked and cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button NO and CANCEL }
+  else if (cb_IDNO.Checked and not cb_IDYES.Checked and cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDNO';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button YES, NO and CANCEL }
+  else if (cb_IDYES.Checked and cb_IDNO.Checked and cb_IDCANCEL.Checked) then begin
+     IDButton := 'IDYES';
+     IDButton2 := 'IDNO';
+     IDButton3 := 'IDCANCEL';
+     TypeMsg := 3;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, IDButton3);
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, IDButton3);
+     end;
+  end
+
+  { selected button RETRY }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and not cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button RETRY and CANCEL }
+  else if (cb_IDRETRY.Checked and cb_IDCANCEL.Checked and not cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDCANCEL';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button IGNORE }
+  else if (cb_IDIGNORE.Checked and not cb_IDCANCEL.Checked and not cb_IDABORT.Checked and not cb_IDRETRY.Checked) then begin
+     IDButton := 'IDIGNORE';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button ABORT }
+  else if (cb_IDABORT.Checked and not cb_IDCANCEL.Checked and not cb_IDRETRY.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDABORT';
+     TypeMsg := 1;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, '', '');
+     end;
+  end
+
+  { selected button RETRY and IGNORE }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and not cb_IDABORT.Checked and cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDIGNORE';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button RETRY and ABORT }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and cb_IDABORT.Checked and not cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDABORT';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button IGNORE and ABORT }
+  else if (not cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and cb_IDABORT.Checked and cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDIGNORE';
+     IDButton2 := 'IDABORT';
+     TypeMsg := 2;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, '');
+     end;
+  end
+
+  { selected button RETRY, IGNORE and ABORT }
+  else if (cb_IDRETRY.Checked and not cb_IDCANCEL.Checked and cb_IDABORT.Checked and cb_IDIGNORE.Checked) then begin
+     IDButton := 'IDRETRY';
+     IDButton2 := 'IDIGNORE';
+     IDButton3 := 'IDABORT';
+     TypeMsg := 3;
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, IDButton, IDButton2, IDButton3);
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, IDButton, IDButton2, IDButton3);
+     end;
+  end
+
+  { no selected buttons }
+  else begin
+     case ModeMsg of
+        0: TextMsgIf := TextMsg(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, '', '', '');
+        1: TextMsgIf := TextTask(TypeMsg, TextMsgIf, IconTypes, ButtonBtn, BtnTextArr, ShieldFlg, '', '', '');
+     end;
+  end;
+
+  MSGTextInsert.Add(TextMsgIf);
+end;
+
+end.

+ 2 - 1
Projects/Compil32.dpr

@@ -39,7 +39,8 @@ uses
   ScintInt in '..\Components\ScintInt.pas',
   ScintEdit in '..\Components\ScintEdit.pas',
   ScintStylerInnoSetup in '..\Components\ScintStylerInnoSetup.pas',
-  ModernColors in '..\Components\ModernColors.pas';
+  ModernColors in '..\Components\ModernColors.pas',
+  CompMessageBoxDesigner in 'CompMessageBoxDesigner.pas' {MBDForm};
 
 {$R *.res}
 {$R Compil32.manifest.res}

+ 3 - 0
Projects/Compil32.dproj

@@ -80,6 +80,9 @@
 			<DCCReference Include="CompInputQueryCombo.pas">
 				<Form>InputQueryCombo</Form>
 			</DCCReference>
+			<DCCReference Include="CompMessageBoxDesigner.pas">
+				<Form>MBDForm</Form>
+			</DCCReference>
 			<DCCReference Include="..\Components\ScintInt.pas"/>
 			<DCCReference Include="..\Components\ScintEdit.pas"/>
 			<DCCReference Include="..\Components\ScintStylerInnoSetup.pas"/>

+ 2 - 1
whatsnew.htm

@@ -43,6 +43,7 @@ For conditions of distribution and use, see <a href="https://jrsoftware.org/file
 <p>Various improvements have been made to the Compiler IDE:</p>
 <ul>
   <li><a href="https://i.imgur.com/wHoJ3FG.png">Improved highlighting</a> for the [CustomMessages] and [Messages] sections.</li>
+  <li>Added new <a href="https://i.imgur.com/c9wGM3M.png">MessageBox Designer</a> menu item to the Tools menu to design and insert MsgBox or TaskDialogMsgBox calls for the [Code] section.</li>
   <li>Added buttons to the Welcome dialog to <a href="https://jrsoftware.org/isdonate.php">Donate</a> to support Inno Setup (Thank you!) and to <a href="https://jrsoftware.org/ismail.php">Subscribe</a> to the Inno Setup Mailing List to be notified by e-mail of new Inno Setup releases.</li>
   <li>The Run Parameters dialog now shows a list of most recently used parameters.</li>
 </ul>
@@ -77,7 +78,7 @@ For conditions of distribution and use, see <a href="https://jrsoftware.org/file
   <li>Minor tweaks.</li>
 </ul>
 
-<p>Contributions via <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>: Thanks to Gavin Lambert for their contributions.</p>
+<p>Contributions via <a href="https://github.com/jrsoftware/issrc" target="_blank">GitHub</a>: <b>Thanks to Gavin Lambert and leserg73 for their contributions.</b></p>
 
 <p><a href="https://jrsoftware.org/files/is6.0-whatsnew.htm">Inno Setup 6.0 Revision History</a></p >