diff --git a/Documentation/Changes.txt b/Documentation/Changes.txt index 64d1acd..275efcb 100755 --- a/Documentation/Changes.txt +++ b/Documentation/Changes.txt @@ -1,7 +1,7 @@ Changes History --------------- -Original version begun life on 6th December 2018. +The original concept started out life within Repton Map Display. It became a project in it's own right on 6th December 2018. 1.05 8th December 2020 ---------------------- @@ -922,14 +922,31 @@ Bug fixes * On ADFS New Map, the smallest possible space to contain a fragment ID and the stop bit was not taken into consideration, meaning that a file stored could then not be retrieved. * Some ADFS New and Big directory object's attributes, that only had a single attribute, where having '00' appended to the end. -1.45 -------------------------- +1.45 - 3rd March 2023 +--------------------- New or improved features * Removed the file type filter from the 'Add Files' dialogue box. * Rewrote the function to reconsolidate the ADFS Old Map Free Space Map, sorting entries into order and removing unused ones. +* Styled the application more towards RISC OS style. +* Changed the toolbar on the main window to tabbed toolbars, as the 'coolbars' were not scaling correctly. +* Now creates an 'inf' file for the root directory when extracting to the host system. +* The 'inf' file created for directories now includes an extra field for the directory title. +* Made the scroll bars for the directories display now automatic. Now, they only appear when required. Bug fixes * Adding files to an ADFS Old Map would sometimes result in a 'Bad FS Map' when read by the MOS. +* When displaying an ADFS disc, the root directory title would be replaced with the disc name instead. +* When displaying BBC BASIC files, line numbers (after GOTO, RESTORE, GOSUB, etc.) were not getting displayed. +* Ignored the attribute setting, from an 'inf' file, when importing directories. +* Defrag would lose all the sub-directory's entries. +* Updating the free space map of an old map ADFS would blank off the root directory's 'StartSeq' number thereby causing a Broken Directory for the root. +* Deleting objects, from Old Map ADFS, did not update the Free Space Map correctly all the time. This was mostly noticable on Defrag when many files got lost because of lack of space. +* Deleting a directory, in ADFS, did not remove the reference from the internal array. The resultant image was usually unaffected. +* After a defrag, the application would sometimes crash for no apparent reason. +* The modified icon on the Image Details status bar was not being scaled correctly. +* The Image Details status bar was not getting fully repainted after a non-saved image was closed. +* The application would crash if an ADFS image had zero free space. +* Creating a 640KB ADFS L image, then adding a DOS partition would not result in the partition being visible. Platform History ---------------- diff --git a/Documentation/ToDo.txt b/Documentation/ToDo.txt index 033042e..c16cdf3 100644 --- a/Documentation/ToDo.txt +++ b/Documentation/ToDo.txt @@ -30,6 +30,7 @@ General - Ideas which are maybe possible * AFS: AFS0 images do not get created correctly (in particular the free space allocation maps) - AWAITING MORE INFO ON AFS FORMATS. * AFS: Add option to new Level 3 images for pre-1988 or post-1988 format - AWAITING MORE INFO ON AFS FORMATS. * AFS: When extracting the AFS partition, remove the ADFS partition and re-address all the objects, instead of just blanking out the ADFS part - IN PROGRESS. +* AFS: Consolidate the JesMap fragments which are concurrent (as per Old Map ADFS). * Amiga: Add in support for Rigid Disks (multi-partition hard discs) - NEED TO IMPLEMENT MULTI-PARTITION SUPPORT FIRST. * Amiga: Add in support for Professional File System - AWAITING FORMAT DETAILS AND SAMPLE(S). * Amiga: Add in support for Smart File System - AWAITING SAMPLE(S). @@ -38,4 +39,5 @@ General - Ideas which are maybe possible * DOS: Add in support for partitioned hard drive images - NEED TO IMPLEMENT MULTI_PARTITION SUPPORT FIRST. * Have different TImageList components for each format. * File Viewer: ability to export contents in a different format (e.g. BASIC -> Text, or Sprite -> PNG). -* Function to check every file and directory on a volume and produce a report detailing number of files with error (CRC32) and number of broken directories (ADFS), and list them, with option to save to a text file. \ No newline at end of file +* Function (and button) to check every file and directory on a volume and produce a report detailing number of files with error (CRC32) and number of broken directories (ADFS), and list them, with option to save to a text file. +* Function (and button) to consolidate the free space map for ADFS and AFS (using the functions built into the class). \ No newline at end of file diff --git a/Graphics/Misc/RISC OS Border Lowered.png b/Graphics/Misc/RISC OS Border Lowered.png new file mode 100644 index 0000000..e1bf2d8 Binary files /dev/null and b/Graphics/Misc/RISC OS Border Lowered.png differ diff --git a/Graphics/Misc/RISC OS Border Raised.png b/Graphics/Misc/RISC OS Border Raised.png new file mode 100644 index 0000000..2caa642 Binary files /dev/null and b/Graphics/Misc/RISC OS Border Raised.png differ diff --git a/LazarusSource/AFSPartitionUnit.lfm b/LazarusSource/AFSPartitionUnit.lfm index 338960d..26109a9 100644 --- a/LazarusSource/AFSPartitionUnit.lfm +++ b/LazarusSource/AFSPartitionUnit.lfm @@ -3,104 +3,23 @@ object AFSPartitionForm: TAFSPartitionForm Height = 156 Top = 272 Width = 355 - BorderIcons = [biSystemMenu] + BorderIcons = [] BorderStyle = bsDialog Caption = 'Partition Size' ClientHeight = 156 ClientWidth = 355 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint Position = poMainFormCenter LCLVersion = '2.2.0.4' - object PartitionSize: TTrackBar - Left = 0 - Height = 37 - Top = 0 - Width = 355 - OnChange = PartitionSizeChange - Position = 0 - TickMarks = tmBoth - TickStyle = tsNone - Align = alTop - TabOrder = 0 - end object PartitionSizeLabel: TLabel Left = 0 Height = 16 - Top = 37 + Top = 0 Width = 355 Align = alTop Alignment = taCenter Caption = 'PartitionSizeLabel' end - object CancelButton: TBitBtn - Left = 128 - Height = 30 - Top = 120 - Width = 100 - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 1 - end - object OKBtnBack: TPanel - Left = 244 - Height = 30 - Top = 120 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 2 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - ModalResult = 1 - TabOrder = 0 - end - end - object rad_type: TRadioGroup - Left = 0 - Height = 56 - Top = 53 - Width = 355 - Align = alTop - AutoFill = True - Caption = 'Partition Type' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 37 - ClientWidth = 345 - ItemIndex = 0 - Items.Strings = ( - 'Acorn File Server' - 'DOS Plus' - ) - OnClick = rad_typeClick - TabOrder = 3 - end - object FromFileButton: TBitBtn - Left = 8 - Height = 30 - Top = 120 - Width = 100 - Caption = 'From File...' - Color = 15527148 - Enabled = False - TabOrder = 4 - end end diff --git a/LazarusSource/AFSPartitionUnit.pas b/LazarusSource/AFSPartitionUnit.pas index 7fe40eb..441a0eb 100644 --- a/LazarusSource/AFSPartitionUnit.pas +++ b/LazarusSource/AFSPartitionUnit.pas @@ -6,20 +6,21 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, - Buttons, ExtCtrls; + ExtCtrls, GJHCustomComponents; type { TAFSPartitionForm } TAFSPartitionForm = class(TForm) - CancelButton: TBitBtn; - FromFileButton: TBitBtn; - OKBtnBack: TPanel; - OKButton: TBitBtn; PartitionSizeLabel: TLabel; - PartitionSize: TTrackBar; - rad_type: TRadioGroup; + PartitionSize: TGJHSlider; + rad_typeAFS, + rad_typeDOS: TGJHRadioBox; + FromFileButton, + OKButton, + CancelButton: TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure PartitionSizeChange(Sender: TObject); procedure rad_typeClick(Sender: TObject); @@ -54,8 +55,8 @@ procedure TAFSPartitionForm.PartitionSizeChange(Sender: TObject); {------------------------------------------------------------------------------} procedure TAFSPartitionForm.rad_typeClick(Sender: TObject); begin - if rad_type.ItemIndex=0 then PartitionSize.Max:=maxAFSSize; - if rad_type.ItemIndex=1 then PartitionSize.Max:=maxDOSSize; + if rad_typeAFS.Ticked then PartitionSize.Max:=maxAFSSize; + if rad_typeDOS.Ticked then PartitionSize.Max:=maxDOSSize; end; {------------------------------------------------------------------------------} @@ -66,5 +67,58 @@ procedure TAFSPartitionForm.FormPaint(Sender: TObject); MainForm.FileInfoPanelPaint(Sender); end; +{------------------------------------------------------------------------------} +//Create the form +{------------------------------------------------------------------------------} +procedure TAFSPartitionForm.FormCreate(Sender: TObject); +function CreateRadioBox(text: String): TGJHRadioBox; +begin + Result:=TGJHRadioBox.Create(AFSPartitionForm as TControl); + Result.Parent:=AFSPartitionForm as TWinControl; + Result.Top:=PartitionSize.Top+PartitionSize.Height; + Result.Visible:=True; + Result.Caption:=text; + Result.OnClick:=@rad_typeClick; +end; +var + ratio : Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + //Create the slider + PartitionSize:=TGJHSlider.Create(AFSPartitionForm as TControl); + PartitionSize.Parent:=AFSPartitionForm as TWinControl; + PartitionSize.Top:=PartitionSizeLabel.Height; + PartitionSize.Align:=alTop; + PartitionSize.Orientation:=csHorizontal; + PartitionSize.Height:=Round(30*ratio); + PartitionSize.Min:=0; + PartitionSize.Max:=10; + PartitionSize.Pointers:=False; + PartitionSize.Outline:=csOutInner; + PartitionSize.OnChange:=@PartitionSizeChange; + //Create the radio boxes + rad_typeAFS:=CreateRadioBox('Acorn File Server'); + rad_typeDOS:=CreateRadioBox('DOS Plus'); + //Create the buttons + FromFileButton:=MainForm.CreateButton(AFSPartitionForm as TControl, + 'From File...',False,Round(8*ratio), + rad_typeAFS.Top+rad_typeAFS.Height+Round(8*ratio), + mrNone); + FromFileButton.Enabled:=False; + CancelButton:=MainForm.CreateButton(AFSPartitionForm as TControl,'Cancel', + False, + FromFileButton.Left+FromFileButton.Width+Round(8*ratio), + FromFileButton.Top,mrCancel); + OKButton:=MainForm.CreateButton(AFSPartitionForm as TControl,'OK',True, + CancelButton.Left+CancelButton.Width+Round(8*ratio), + FromFileButton.Top-Round(4*ratio),mrOK); + Width:=OKButton.Left+OKButton.Width+8; + //Adjust the radio button positions + rad_typeAFS.Left:=Round(8*ratio); + rad_typeDOS.Left:=Width div 2; + //Adjust the form height + Height:=OKButton.Top+OKButton.Height+Round(8*ratio); +end; + end. diff --git a/LazarusSource/AboutUnit.pas b/LazarusSource/AboutUnit.pas index 5968449..e4562d7 100755 --- a/LazarusSource/AboutUnit.pas +++ b/LazarusSource/AboutUnit.pas @@ -1,7 +1,7 @@ unit AboutUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free diff --git a/LazarusSource/CSVPrefUnit.lfm b/LazarusSource/CSVPrefUnit.lfm index e1f13df..3437f7c 100644 --- a/LazarusSource/CSVPrefUnit.lfm +++ b/LazarusSource/CSVPrefUnit.lfm @@ -8,164 +8,32 @@ object CSVPrefForm: TCSVPrefForm Caption = 'CSV Preferences' ClientHeight = 309 ClientWidth = 225 + OnCreate = FormCreate OnPaint = FormPaint Position = poMainFormCenter LCLVersion = '2.2.0.4' - object cb_IncDir: TCheckBox - Left = 40 - Height = 18 - Top = 32 - Width = 129 - Caption = 'Include Directories' - TabOrder = 0 - end - object cb_Parent: TCheckBox - Left = 40 - Height = 18 - Top = 112 - Width = 59 - Caption = 'Parent' - Checked = True - State = cbChecked - TabOrder = 3 - end - object Label1: TLabel + object ColumnsLabel: TLabel Left = 32 Height = 16 Top = 88 - Width = 53 - Caption = 'Columns' - end - object cb_Filename: TCheckBox - Left = 40 - Height = 18 - Top = 130 - Width = 73 - Caption = 'Filename' - Checked = True - State = cbChecked - TabOrder = 4 - end - object cb_LoadAddr: TCheckBox - Left = 40 - Height = 18 - Top = 148 - Width = 100 - Caption = 'Load Address' - Checked = True - State = cbChecked - TabOrder = 5 - end - object cb_ExecAddr: TCheckBox - Left = 40 - Height = 18 - Top = 166 - Width = 127 - Caption = 'Execution Address' - Checked = True - State = cbChecked - TabOrder = 6 - end - object cb_Length: TCheckBox - Left = 40 - Height = 18 - Top = 184 - Width = 62 - Caption = 'Length' - Checked = True - State = cbChecked - TabOrder = 7 - end - object cb_Attributes: TCheckBox - Left = 40 - Height = 18 - Top = 202 - Width = 78 - Caption = 'Attributes' - Checked = True - State = cbChecked - TabOrder = 8 - end - object cb_Address: TCheckBox - Left = 40 - Height = 18 - Top = 220 - Width = 69 - Caption = 'Address' - TabOrder = 9 - end - object cb_CRC32: TCheckBox - Left = 40 - Height = 18 - Top = 238 - Width = 62 - Caption = 'CRC32' - Checked = True - State = cbChecked - TabOrder = 10 - end - object Label2: TLabel + Width = 63 + Caption = ' Columns' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end + object OptionsLabel: TLabel Left = 32 Height = 16 Top = 8 - Width = 47 - Caption = 'Options' - end - object CancelButton: TBitBtn - Left = 8 - Height = 30 - Top = 272 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 11 - end - object OKBtnBack: TPanel - Left = 112 - Height = 30 - Top = 272 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 12 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - Default = True - ModalResult = 1 - TabOrder = 0 - end - end - object cb_IncFilename: TCheckBox - Left = 40 - Height = 18 - Top = 50 - Width = 118 - Caption = 'Include Filename' - Checked = True - State = cbChecked - TabOrder = 1 - end - object cb_IncReport: TCheckBox - Left = 40 - Height = 18 - Top = 68 - Width = 143 - Caption = 'Include Image Report' - Checked = True - State = cbChecked - TabOrder = 2 + Width = 57 + Caption = ' Options' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end end diff --git a/LazarusSource/CSVPrefUnit.pas b/LazarusSource/CSVPrefUnit.pas index d70d9eb..d4557dd 100644 --- a/LazarusSource/CSVPrefUnit.pas +++ b/LazarusSource/CSVPrefUnit.pas @@ -5,30 +5,30 @@ interface uses - Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons, - ExtCtrls; + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, + ExtCtrls, GJHCustomComponents; type { TCSVPrefForm } TCSVPrefForm = class(TForm) - CancelButton: TBitBtn; - cb_IncDir: TCheckBox; - cb_Parent: TCheckBox; - cb_Filename: TCheckBox; - cb_LoadAddr: TCheckBox; - cb_ExecAddr: TCheckBox; - cb_Length: TCheckBox; - cb_Attributes: TCheckBox; - cb_Address: TCheckBox; - cb_CRC32: TCheckBox; - cb_IncFilename: TCheckBox; - cb_IncReport: TCheckBox; - Label1: TLabel; - Label2: TLabel; - OKBtnBack: TPanel; - OKButton: TBitBtn; + ColumnsLabel: TLabel; + OptionsLabel: TLabel; + cb_IncDir, + cb_Parent, + cb_Filename, + cb_LoadAddr, + cb_ExecAddr, + cb_Length, + cb_Attributes, + cb_Address, + cb_CRC32, + cb_IncFilename, + cb_IncReport : TGJHTickBox; + OKButton, + CancelButton : TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); private @@ -55,5 +55,73 @@ procedure TCSVPrefForm.FormPaint(Sender: TObject); MainForm.FileInfoPanelPaint(Sender); end; +{------------------------------------------------------------------------------} +//Create the form +{------------------------------------------------------------------------------} +procedure TCSVPrefForm.FormCreate(Sender: TObject); +var + pos,wid: Integer; + ratio : Real; + function CreateTickBox(Ltitle: String; Ltop: Integer): TGJHTickBox; + begin + Result:=TGJHTickBox.Create(CSVPrefForm as TComponent); + Result.Parent:=CSVPrefForm as TWinControl; + Result.Left:=Round(8*ratio); + Result.Visible:=True; + Result.Top:=Ltop; + Result.Caption:=Ltitle; + end; +begin + ratio:=PixelsPerInch/DesignTimePPI; + OptionsLabel.Top:=0; + OptionsLabel.Left:=0; + //Create each tickbox and adjust the position, as it could be scaled + pos:=OptionsLabel.Top+OptionsLabel.Height+Round(4*ratio);//This is the anchor for the rest + cb_IncDir :=CreateTickBox('Include Directories',pos); + inc(pos,cb_IncDir.Height+Round(4*ratio)); + cb_IncFilename:=CreateTickBox('Include Filename',pos); + inc(pos,cb_IncFilename.Height+Round(4*ratio)); + cb_IncReport :=CreateTickBox('Include Image Report',pos); + inc(pos,cb_IncReport.Height+Round(4*ratio)); + ColumnsLabel.Top:=pos; //Need to reposition the labels too + ColumnsLabel.Left:=0; + inc(pos,ColumnsLabel.Height+Round(4*ratio)); + cb_Parent :=CreateTickBox('Parent',pos); + inc(pos,cb_Parent.Height+Round(4*ratio)); + cb_Filename :=CreateTickBox('Filename',pos); + inc(pos,cb_Filename.Height+Round(4*ratio)); + cb_LoadAddr :=CreateTickBox('Load Address',pos); + inc(pos,cb_LoadAddr.Height+Round(4*ratio)); + cb_ExecAddr :=CreateTickBox('Execution Address',pos); + inc(pos,cb_ExecAddr.Height+Round(4*ratio)); + cb_Length :=CreateTickBox('Length',pos); + inc(pos,cb_Length.Height+Round(4*ratio)); + cb_Attributes :=CreateTickBox('Attributes',pos); + inc(pos,cb_Attributes.Height+Round(4*ratio)); + cb_Address :=CreateTickBox('Address',pos); + inc(pos,cb_Address.Height+Round(4*ratio)); + cb_CRC32 :=CreateTickBox('CRC32',pos); + inc(pos,cb_CRC32.Height+Round(4*ratio)); + //Create the buttons + CancelButton:=MainForm.CreateButton(CSVPrefForm as TControl,'Cancel',False, + Round(8*ratio),pos+Round(4*ratio),mrCancel); + OKButton:=MainForm.CreateButton(CSVPrefForm as TControl,'OK',True, + CancelButton.Left+CancelButton.Width+Round(8*ratio), + pos,mrOK); + //Re-adjust the form height + Height:=pos+OKButton.Height+Round(8*ratio); + //Work out the widest control + pos:=OptionsLabel.Left; + for wid:=0 to ComponentCount-1 do + if TControl(Components[wid]).Width+TControl(Components[wid]).Left+Round(8*ratio)>pos then + pos:=TControl(Components[wid]).Width+TControl(Components[wid]).Left+Round(8*ratio); + //Adjust the form width + Width:=pos; + OptionsLabel.AutoSize:=False; + OptionsLabel.Width:=pos; + ColumnsLabel.AutoSize:=False; + ColumnsLabel.Width:=pos; +end; + end. diff --git a/LazarusSource/ChangeInterleaveUnit.lfm b/LazarusSource/ChangeInterleaveUnit.lfm index 1bd3b9a..6892763 100644 --- a/LazarusSource/ChangeInterleaveUnit.lfm +++ b/LazarusSource/ChangeInterleaveUnit.lfm @@ -9,46 +9,10 @@ object ChangeInterleaveForm: TChangeInterleaveForm ClientHeight = 124 ClientWidth = 234 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint Position = poMainFormCenter LCLVersion = '2.2.0.4' - object CancelButton: TBitBtn - Left = 8 - Height = 30 - Top = 80 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 0 - end - object OKBtnBack: TPanel - Left = 124 - Height = 30 - Top = 80 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 1 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - Default = True - ModalResult = 1 - TabOrder = 0 - end - end object CurrentLabel: TLabel Left = 0 Height = 16 @@ -63,7 +27,7 @@ object ChangeInterleaveForm: TChangeInterleaveForm end object lb_Current: TLabel Left = 0 - Height = 16 + Height = 15 Top = 16 Width = 234 Align = alTop @@ -75,7 +39,7 @@ object ChangeInterleaveForm: TChangeInterleaveForm object NewLabel: TLabel Left = 0 Height = 16 - Top = 32 + Top = 31 Width = 234 Align = alTop Alignment = taCenter @@ -86,14 +50,14 @@ object ChangeInterleaveForm: TChangeInterleaveForm end object cb_NewMethod: TComboBox Left = 0 - Height = 26 - Top = 48 + Height = 20 + Top = 47 Width = 234 Align = alTop Color = 15527148 Font.Color = clBlack Font.Name = 'Courier New' - ItemHeight = 0 + ItemHeight = 26 ItemIndex = 0 Items.Strings = ( 'Sequential' @@ -102,7 +66,7 @@ object ChangeInterleaveForm: TChangeInterleaveForm ) ParentFont = False Style = csDropDownList - TabOrder = 2 + TabOrder = 0 Text = 'Sequential' end end diff --git a/LazarusSource/ChangeInterleaveUnit.pas b/LazarusSource/ChangeInterleaveUnit.pas index 1f1e98b..1694d02 100644 --- a/LazarusSource/ChangeInterleaveUnit.pas +++ b/LazarusSource/ChangeInterleaveUnit.pas @@ -5,21 +5,21 @@ interface uses - Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Buttons, ExtCtrls, - StdCtrls; + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, GJHCustomComponents, + ExtCtrls, StdCtrls; type { TChangeInterleaveForm } TChangeInterleaveForm = class(TForm) - CancelButton: TBitBtn; cb_NewMethod: TComboBox; CurrentLabel: TLabel; NewLabel: TLabel; lb_Current: TLabel; - OKBtnBack: TPanel; - OKButton: TBitBtn; + OKButton, + CancelButton: TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); private @@ -46,5 +46,27 @@ procedure TChangeInterleaveForm.FormPaint(Sender: TObject); MainForm.FileInfoPanelPaint(Sender); end; +{------------------------------------------------------------------------------} +//Create the form +{------------------------------------------------------------------------------} +procedure TChangeInterleaveForm.FormCreate(Sender: TObject); +var + ratio : Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + //Create the buttons + CancelButton:=MainForm.CreateButton(ChangeInterleaveForm as TControl, + 'Cancel',False,Round(8*ratio), + cb_NewMethod.Top+cb_NewMethod.Height+Round(16*ratio), + mrCancel); + OKButton:=MainForm.CreateButton(ChangeInterleaveForm as TControl,'OK',True, + CancelButton.Left+CancelButton.Width+Round(8*ratio), + cb_NewMethod.Top+cb_NewMethod.Height+Round(12*ratio), + mrOK); + //Re-adjust the form size + Height:=OKButton.Top+OKButton.Height+Round(8*ratio); + Width:=OKButton.Left+OKButton.Width+Round(8*ratio); +end; + end. diff --git a/LazarusSource/CustomDialogueUnit.lfm b/LazarusSource/CustomDialogueUnit.lfm index 81a44ef..7aaca70 100644 --- a/LazarusSource/CustomDialogueUnit.lfm +++ b/LazarusSource/CustomDialogueUnit.lfm @@ -9,6 +9,7 @@ object CustomDialogue: TCustomDialogue ClientHeight = 195 ClientWidth = 360 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint Position = poMainFormCenter LCLVersion = '2.2.0.4' @@ -209,13 +210,13 @@ object CustomDialogue: TCustomDialogue BevelOuter = bvNone ClientHeight = 128 ClientWidth = 288 - TabOrder = 3 + TabOrder = 0 OnPaint = FormPaint object MessageLabel: TLabel Left = 0 Height = 48 Top = 40 - Width = 286 + Width = 288 Alignment = taCenter Caption = 'The file has been detected as an image.'#10'Would you like to import the contents or add to the open image?' Constraints.MaxWidth = 288 @@ -228,51 +229,4 @@ object CustomDialogue: TCustomDialogue Top = 144 Width = 360 end - object CancelButton: TBitBtn - Left = 130 - Height = 30 - Top = 156 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 1 - end - object IgnoreButton: TBitBtn - Left = 16 - Height = 30 - Top = 156 - Width = 100 - Caption = '&Ignore' - Color = 15527148 - ModalResult = 5 - TabOrder = 2 - end - object OKBtnBack: TPanel - Left = 244 - Height = 30 - Top = 156 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 0 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - Default = True - ModalResult = 1 - TabOrder = 0 - end - end end diff --git a/LazarusSource/CustomDialogueUnit.pas b/LazarusSource/CustomDialogueUnit.pas index 3e65fe4..a955af5 100644 --- a/LazarusSource/CustomDialogueUnit.pas +++ b/LazarusSource/CustomDialogueUnit.pas @@ -1,7 +1,7 @@ unit CustomDialogueUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -25,23 +25,23 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, - Buttons; + GJHCustomComponents; type { TCustomDialogue } TCustomDialogue = class(TForm) - IgnoreButton: TBitBtn; - CancelButton: TBitBtn; - OKButton: TBitBtn; MainBevel: TBevel; ErrorImg: TImage; MessageLabel: TLabel; MessagePanel: TPanel; - OKBtnBack: TPanel; QuestionImg: TImage; InfoImg: TImage; + IgnoreButton, + CancelButton, + OKButton: TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure ShowError(msg,BtnTxt: String); procedure ShowConfirm(msg,OKBtnTxt,CancelBtnTxt,IgnoreBtnTxt: String); @@ -72,6 +72,35 @@ procedure TCustomDialogue.FormPaint(Sender: TObject); MainForm.FileInfoPanelPaint(Sender); end; +{------------------------------------------------------------------------------} +//Create the buttons and move things around for scaling +{------------------------------------------------------------------------------} +procedure TCustomDialogue.FormCreate(Sender: TObject); +var + ratio: Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + //Set width: buttons width + gap either side + gap between buttons + Width:=Round((120*3+8*4)*ratio); + MainBevel.Width:=Width; + MessagePanel.Width:=Width-MessagePanel.Left-Round(8*ratio); + //Create the buttons + IgnoreButton:=MainForm.CreateButton(CustomDialogue as TControl,'Ignore',False, + Round(8*ratio), + MainBevel.Top+MainBevel.Height+Round(12*ratio), + mrIgnore); + CancelButton:=MainForm.CreateButton(CustomDialogue as TControl,'Cancel',False, + 0,MainBevel.Top+MainBevel.Height+Round(12*ratio), + mrCancel); + CancelButton.Left:=(Width-CancelButton.Width)div 2; + OKButton:=MainForm.CreateButton(CustomDialogue as TControl,'OK',True,0, + MainBevel.Top+MainBevel.Height+Round(8*ratio), + mrOK); + OKButton.Left:=Width-OKButton.Width-Round(8*ratio); + //Adjust the form height + Height:=OKButton.Top+OKButton.Height+Round(8*ratio); +end; + {------------------------------------------------------------------------------} //Show an error message {------------------------------------------------------------------------------} diff --git a/LazarusSource/DiscImageManager.lpi b/LazarusSource/DiscImageManager.lpi index 9fca2be..d7a6c66 100644 --- a/LazarusSource/DiscImageManager.lpi +++ b/LazarusSource/DiscImageManager.lpi @@ -68,6 +68,7 @@ + @@ -95,6 +96,7 @@ + @@ -124,6 +126,7 @@ + @@ -153,6 +156,7 @@ + @@ -185,6 +189,7 @@ + @@ -220,6 +225,7 @@ + @@ -249,6 +255,7 @@ + @@ -278,6 +285,7 @@ + @@ -480,7 +488,7 @@ - + diff --git a/LazarusSource/DiscImageManager.lps b/LazarusSource/DiscImageManager.lps index 12a2ee4..74dd4f4 100644 --- a/LazarusSource/DiscImageManager.lps +++ b/LazarusSource/DiscImageManager.lps @@ -4,7 +4,7 @@ - + @@ -19,9 +19,10 @@ + - - + + @@ -30,7 +31,8 @@ - + + @@ -41,7 +43,7 @@ - + @@ -52,9 +54,9 @@ - - - + + + @@ -65,9 +67,9 @@ - - - + + + @@ -75,9 +77,9 @@ - - + + @@ -85,7 +87,7 @@ - + @@ -95,9 +97,8 @@ - - - + + @@ -108,9 +109,9 @@ - - - + + + @@ -130,7 +131,7 @@ - + @@ -142,8 +143,8 @@ - - + + @@ -155,8 +156,8 @@ - - + + @@ -167,9 +168,9 @@ - - - + + + @@ -181,7 +182,6 @@ - @@ -194,8 +194,8 @@ - - + + @@ -207,8 +207,8 @@ - - + + @@ -220,8 +220,8 @@ - - + + @@ -233,8 +233,8 @@ - - + + @@ -246,8 +246,8 @@ - - + + @@ -255,10 +255,9 @@ - + - @@ -267,8 +266,8 @@ - - + + @@ -280,8 +279,7 @@ - - + @@ -290,21 +288,21 @@ - + - - + + - - + + @@ -326,7 +324,7 @@ - + @@ -334,22 +332,21 @@ - + - + - - + @@ -365,164 +362,224 @@ - - + + - - + + - - - + + + - - - + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -535,15 +592,24 @@ - + + - + - - + + + + + + + + + + diff --git a/LazarusSource/DiscImageUtils.pas b/LazarusSource/DiscImageUtils.pas index fea5530..98d36d2 100644 --- a/LazarusSource/DiscImageUtils.pas +++ b/LazarusSource/DiscImageUtils.pas @@ -315,22 +315,22 @@ function GetAttributes(attr: String;format: Byte):String; begin //Yes attr2:=StrToInt('$'+attr); attr1:=''; - end; - //Read each attribute and build the string - if(format>>4=diAcornDFS) - or(format>>4=diAcornADFS) - or(format>>4=diAcornUEF) then //ADFS, DFS and CFS - if (Pos('L',attr1)>0)OR(attr2 AND$08=$08) then Result:=Result+'L'; - if format=diAcornADFS then //ADFS only - begin - if (Pos('R',attr1)>0)OR(attr2 AND$01=$01) then Result:=Result+'R'; - if (Pos('W',attr1)>0)OR(attr2 AND$02=$02) then Result:=Result+'W'; - if (Pos('E',attr1)>0)OR(attr2 AND$04=$04) then Result:=Result+'E';//Also P - if (Pos('r',attr1)>0)OR(attr2 AND$10=$10) then Result:=Result+'r'; - if (Pos('w',attr1)>0)OR(attr2 AND$20=$20) then Result:=Result+'w'; - if (Pos('e',attr1)>0)OR(attr2 AND$40=$40) then Result:=Result+'e'; - if (Pos('l',attr1)>0)OR(attr2 AND$80=$80) then Result:=Result+'l'; - end; + //Read each attribute and build the string + if(format>>4=diAcornDFS) + or(format>>4=diAcornADFS) + or(format>>4=diAcornUEF) then //ADFS, DFS and CFS + if (Pos('L',attr1)>0)OR(attr2 AND$08=$08) then Result:=Result+'L'; + if format=diAcornADFS then //ADFS only + begin + if (Pos('R',attr1)>0)OR(attr2 AND$01=$01) then Result:=Result+'R'; + if (Pos('W',attr1)>0)OR(attr2 AND$02=$02) then Result:=Result+'W'; + if (Pos('E',attr1)>0)OR(attr2 AND$04=$04) then Result:=Result+'E';//Also P + if (Pos('r',attr1)>0)OR(attr2 AND$10=$10) then Result:=Result+'r'; + if (Pos('w',attr1)>0)OR(attr2 AND$20=$20) then Result:=Result+'w'; + if (Pos('e',attr1)>0)OR(attr2 AND$40=$40) then Result:=Result+'e'; + if (Pos('l',attr1)>0)OR(attr2 AND$80=$80) then Result:=Result+'l'; + end; + end else Result:=attr; //Not a hex, so just return what was passed end; {------------------------------------------------------------------------------} diff --git a/LazarusSource/DiscImage_ADFS.pas b/LazarusSource/DiscImage_ADFS.pas index 681ac40..66da317 100644 --- a/LazarusSource/DiscImage_ADFS.pas +++ b/LazarusSource/DiscImage_ADFS.pas @@ -1151,17 +1151,18 @@ procedure TDiscImage.ADFSFreeSpaceMap; SetLength(free_space_map,1); //Number of tracks SetLength(free_space_map[0],disc_size[0]div(secspertrack*secsize)); - for c:=0 to Length(free_space_map[0])-1 do - begin - //Number of sectors per track - if FMap then - SetLength(free_space_map[0,c],(secspertrack*secsize)DIV bpmb) - else - SetLength(free_space_map[0,c],secspertrack{*(secsize div $100)}); - //Set them all to be uesd, for now. - for d:=0 to Length(free_space_map[0,c])-1 do - free_space_map[0,c,d]:=$FF; - end; + if Length(free_space_map[0])>0 then + for c:=0 to Length(free_space_map[0])-1 do + begin + //Number of sectors per track + if FMap then + SetLength(free_space_map[0,c],(secspertrack*secsize)DIV bpmb) + else + SetLength(free_space_map[0,c],secspertrack{*(secsize div $100)}); + //Set them all to be uesd, for now. + for d:=0 to Length(free_space_map[0,c])-1 do + free_space_map[0,c,d]:=$FF; + end; //Update progress // UpdateProgress('Reading ADFS Free Space Map..'); end; @@ -2355,7 +2356,7 @@ function TDiscImage.ADFSAllocateFreeSpace(filelen,freeptr: Cardinal): Boolean; //Then decrease the FreeEnd dec(ptr,3); //and write back - Write24b(ptr,$1FE); + WriteByte(ptr,$1FE); end; //Update the checksums WriteByte(ByteCheckSum($0000,$100,False),$0FF); @@ -3119,7 +3120,7 @@ procedure TDiscImage.ConsolidateADFSFreeSpaceMap; changed : Boolean; begin if not FMap then //Old map only - begin + begin //Bug here - deleting multiple files does not update the FSM SetLength(fslinks,0); //Just make sure the current FS Map is in order, not fragmented and FreeEnd is correct //Total number of entries @@ -3133,10 +3134,10 @@ procedure TDiscImage.ConsolidateADFSFreeSpaceMap; start:=Read24b($000+ref); //FreeLen len :=Read24b($100+ref); - //Add a new entry, in order using insertion sort - SetLength(fslinks,Length(fslinks)+1); if len>0 then //Only if the length isn't zero begin + //Add a new entry, in order using insertion sort + SetLength(fslinks,Length(fslinks)+1); pos:=Length(fslinks)-1; if pos>0 then for i:=pos-1 downto 0 do @@ -3161,20 +3162,21 @@ procedure TDiscImage.ConsolidateADFSFreeSpaceMap; if fslinks[i].Offset+fslinks[i].Length=fslinks[i+1].Offset then begin //Add them together - inc(fslinks[i].Length,fslinks[i+1].Length); + inc(fslinks[i+1].Length,fslinks[i].Length); + fslinks[i+1].Offset:=fslinks[i].Offset; //And remove the next entry - end; - if i=size then @@ -1689,6 +1690,8 @@ function TDiscImage.AddDOSPartition(size: Cardinal): Boolean; //Adjust the ADFS free space map fsptr:=GetADFSMaxLength(True); Write24b(Read24b($100+fsptr)-(size div secsize),$100+fsptr); //Just adjust the length + //Adjust the disc size for 640K + if disc_size[0]=$A0000 then WriteByte($A0,$FC); //Update our disc sizes disc_size[0]:=fsst; SetLength(disc_size,2); @@ -1712,9 +1715,8 @@ function TDiscImage.AddDOSPartition(size: Cardinal): Boolean; for index:=doshead to GetDataLength-1 do WriteByte(0,index); //Create the partition WriteDOSHeader(doshead,size,diMaster512,False); - //Update the checksums - WriteByte(ByteCheckSum($0000,$100,False),$0FF);//Checksum sector 0 - WriteByte(ByteCheckSum($0100,$100,False),$1FF);//Checksum sector 1 + //Sort out the FSM + ConsolidateADFSFreeSpaceMap; //Now we re-ID and re-read the data oldfilename:=imagefilename; IDImage; @@ -1870,14 +1872,15 @@ procedure TDiscImage.WriteDOSHeader(offset, size: QWord;fat: Byte; //Total Blocks totBlocks:=size div sectorSize; //JMP Instruction for Boot sector - WriteByte($EB,offset+$00,buffer); if master512 then begin - WriteByte($FE,offset+$01,buffer); - WriteByte($91,offset+$02,buffer); + WriteByte($FF,offset+$00,buffer);// $EB + WriteByte($FF,offset+$01,buffer);// $FE + WriteByte($FF,offset+$02,buffer);// $91 end else begin + WriteByte($EB,offset+$00,buffer); WriteByte($3C,offset+$01,buffer); WriteByte($90,offset+$02,buffer); end; diff --git a/LazarusSource/DiscImage_Published.pas b/LazarusSource/DiscImage_Published.pas index 293e189..756474f 100644 --- a/LazarusSource/DiscImage_Published.pas +++ b/LazarusSource/DiscImage_Published.pas @@ -44,6 +44,16 @@ constructor TDiscImage.Create(Clone: TDiscImage); FSparkAsFS :=Clone.SparkAsFS; //Allow DFS images which report number of sectors as zero FDFSzerosecs :=Clone.AllowDFSZeroSectors; + //Allow files to go beyond the edge of the disc + FDFSBeyondEdge:=Clone.DFSBeyondEdge; + //Allow blank filenames in DFS + FDFSAllowBlank:=Clone.DFSAllowBlanks; + //Scan sub directories in ADFS, Amiga, DOS, Spark + FScanSubDirs :=Clone.ScanSubDirs; + //Use short filenames in DOS even if long filenames exist + FDOSUseSFN :=Clone.FDOSUseSFN; + //Open DOS Partitions on ADFS + FOpenDOSPart :=Clone.OpenDOSPartitions; //Filename FFilename :=Clone.Filename; //Just read the data in @@ -1488,38 +1498,40 @@ function TDiscImage.ReadDirectory(dirname: String): Integer; ResetDir(NewDir); //Is it a valid directory? if FileExists(dirname,dir,entry) then //Does it exist? (and grab the references) - if FDisc[dir].Entries[entry].DirRef>-1 then //Valid directory - if not FDisc[FDisc[dir].Entries[entry].DirRef].BeenRead then //Hasn't already been read? - begin - sector:=FDisc[dir].Entries[entry].Sector; - //Divert to the appropriate function - case GetMajorFormatNumber of - diAcornADFS: NewDir:=ReadADFSDir(dirname,sector); - diAcornFS : NewDir:=ReadAFSDirectory(dirname,sector); - diAmiga : NewDir:=ReadAmigaDir(dirname,sector); - diDOSPlus : NewDir:=ReadDOSDirectory(dirname,sector,len); - end; - //Did it return something? - if NewDir.Directory<>'' then - begin - //Return an index (the previously saved directory reference - Result:=FDisc[dir].Entries[entry].DirRef; - //Then add it to the list - FDisc[Result]:=NewDir; - FDisc[Result].Parent:=dir; - FDisc[Result].BeenRead:=True; - //Now go through the entries and see if there are any sub dirs - if Length(FDisc[Result].Entries)>0 then //Make sure we have some entries - for f:=0 to Length(FDisc[Result].Entries)-1 do - if(Pos('D',FDisc[Result].Entries[f].Attributes)>0) //Found a directory - or(Pos('F',FDisc[Result].Entries[f].Attributes)>0)then - //D is for ADFS, AFS and DOS Plus, F is for Amiga - begin - SetLength(FDisc,Length(FDisc)+1); //Make space for it - FDisc[Result].Entries[f].DirRef:=Length(FDisc)-1; //And set the directory reference - end; - end; - end; + if dir-1 then //Valid directory + if not FDisc[FDisc[dir].Entries[entry].DirRef].BeenRead then //Hasn't already been read? + begin + sector:=FDisc[dir].Entries[entry].Sector; + //Divert to the appropriate function + case GetMajorFormatNumber of + diAcornADFS: NewDir:=ReadADFSDir(dirname,sector); + diAcornFS : NewDir:=ReadAFSDirectory(dirname,sector); + diAmiga : NewDir:=ReadAmigaDir(dirname,sector); + diDOSPlus : NewDir:=ReadDOSDirectory(dirname,sector,len); + end; + //Did it return something? + if NewDir.Directory<>'' then + begin + //Return an index (the previously saved directory reference + Result:=FDisc[dir].Entries[entry].DirRef; + //Then add it to the list + FDisc[Result]:=NewDir; + FDisc[Result].Parent:=dir; + FDisc[Result].BeenRead:=True; + //Now go through the entries and see if there are any sub dirs + if Length(FDisc[Result].Entries)>0 then //Make sure we have some entries + for f:=0 to Length(FDisc[Result].Entries)-1 do + if(Pos('D',FDisc[Result].Entries[f].Attributes)>0) //Found a directory + or(Pos('F',FDisc[Result].Entries[f].Attributes)>0)then + //D is for ADFS, AFS and DOS Plus, F is for Amiga + begin + SetLength(FDisc,Length(FDisc)+1); //Make space for it + FDisc[Result].Entries[f].DirRef:=Length(FDisc)-1; //And set the directory reference + end; + end; + end; end; {------------------------------------------------------------------------------- diff --git a/LazarusSource/ErrorLogUnit.pas b/LazarusSource/ErrorLogUnit.pas index 586fd8b..c0518cc 100644 --- a/LazarusSource/ErrorLogUnit.pas +++ b/LazarusSource/ErrorLogUnit.pas @@ -1,7 +1,7 @@ unit ErrorLogUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free diff --git a/LazarusSource/GJHRegistryClass.pas b/LazarusSource/GJHRegistryClass.pas deleted file mode 100644 index 530c368..0000000 --- a/LazarusSource/GJHRegistryClass.pas +++ /dev/null @@ -1,224 +0,0 @@ -unit GJHRegistryClass; - -{ -TGJHRegistry class V1.00 -Copyright (C) 2022 Gerald Holdsworth gerald@hollypops.co.uk - -This source is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public Licence as published by the Free -Software Foundation; either version 3 of the Licence, or (at your option) -any later version. - -This code is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public Licence for more -details. - -A copy of the GNU General Public Licence is available on the World Wide Web -at . You can also obtain it by writing -to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, -Boston, MA 02110-1335, USA. -} - -{$mode ObjFPC}{$H+} - -interface - -uses - Classes, Registry; - -{$M+} - -type - TGJHRegistry = class - private - FRegistry : TRegistry; - FRegKey : String; - procedure OpenReg(key: String); - function ExtractKey(var V: String):String; - published - constructor Create(RegKey: String); - function DeleteKey(key: String): Boolean; - function GetRegValS(V: String;D: String): String; - procedure GetRegValA(V: String;var D: array of Byte); - function GetRegValI(V: String;D: Cardinal): Cardinal; - function GetRegValB(V: String;D: Boolean): Boolean; - procedure SetRegValS(V: String;D: String); - procedure SetRegValA(V: String;var D: array of Byte); - procedure SetRegValI(V: String;D: Cardinal); - procedure SetRegValB(V: String;D: Boolean); - function DoesKeyExist(V: String):Boolean; - public - destructor Destroy; override; - end; - -implementation - -{------------------------------------------------------------------------------- -Class creator - initialises the global variables --------------------------------------------------------------------------------} -constructor TGJHRegistry.Create(RegKey: String); -begin - inherited Create; - FRegKey:=RegKey; -end; - -{------------------------------------------------------------------------------- -Class destructor --------------------------------------------------------------------------------} -destructor TGJHRegistry.Destroy; -begin - inherited; -end; - -{------------------------------------------------------------------------------- -Open the registry key --------------------------------------------------------------------------------} -procedure TGJHRegistry.OpenReg(key: String); -begin - FRegistry:=TRegistry.Create; - if key<>'' then key:='\'+key; - FRegistry.OpenKey(FRegKey+key,true); -end; - -{------------------------------------------------------------------------------- -Function to delete a key from the registry --------------------------------------------------------------------------------} -function TGJHRegistry.DeleteKey(key: String): Boolean; -var - x: Boolean; -begin - x:=True; - OpenReg(ExtractKey(key)); - if FRegistry.ValueExists(key) then x:=FRegistry.DeleteValue(key); - FRegistry.Free; - Result:=x; -end; - -{------------------------------------------------------------------------------- -Function to read a string from the registry, or create it if it doesn't exist --------------------------------------------------------------------------------} -function TGJHRegistry.GetRegValS(V: String;D: String): String; -var - X: String; -begin - OpenReg(ExtractKey(V)); - If FRegistry.ValueExists(V)then X:=FRegistry.ReadString(V) - else begin X:=D;FRegistry.WriteString(V,X);end; - FRegistry.Free; - Result:=X; -end; - -{------------------------------------------------------------------------------- -Function to read an array from the registry, or create it if it doesn't exist --------------------------------------------------------------------------------} -procedure TGJHRegistry.GetRegValA(V: String;var D: array of Byte); -var - s: Integer; -begin - OpenReg(ExtractKey(V)); - If FRegistry.ValueExists(V)then - begin - s:=FRegistry.GetDataSize(V); - FRegistry.ReadBinaryData(V,D,s); - end - else - begin - FRegistry.WriteBinaryData(V,D,SizeOf(D)); - end; - FRegistry.Free; -end; - -{------------------------------------------------------------------------------- -Function to read an integer from the registry, or create it if it doesn't exist --------------------------------------------------------------------------------} -function TGJHRegistry.GetRegValI(V: String;D: Cardinal): Cardinal; -var - X: Cardinal; -begin - OpenReg(ExtractKey(V)); - If FRegistry.ValueExists(V)then X:=FRegistry.ReadInteger(V) - else begin X:=D;FRegistry.WriteInteger(V,X);end; - FRegistry.Free; - Result:=X; -end; - -{------------------------------------------------------------------------------- -Function to read a boolean from the registry, or create it if it doesn't exist --------------------------------------------------------------------------------} -function TGJHRegistry.GetRegValB(V: String;D: Boolean): Boolean; -var - X: Boolean; -begin - OpenReg(ExtractKey(V)); - If FRegistry.ValueExists(V)then X:=FRegistry.ReadBool(V) - else begin X:=D;FRegistry.WriteBool(V,X);end; - FRegistry.Free; - Result:=X; -end; - -{------------------------------------------------------------------------------- -Does the specified key exist? --------------------------------------------------------------------------------} -function TGJHRegistry.DoesKeyExist(V: String):Boolean; -begin - OpenReg(ExtractKey(V)); - Result:=FRegistry.ValueExists(V); - FRegistry.Free; -end; - -{------------------------------------------------------------------------------- -Function to save a string to the registry --------------------------------------------------------------------------------} -procedure TGJHRegistry.SetRegValS(V: String;D: String); -begin - OpenReg(ExtractKey(V)); - FRegistry.WriteString(V,D); - FRegistry.Free; -end; - -{------------------------------------------------------------------------------- -Function to save an array to the registry --------------------------------------------------------------------------------} -procedure TGJHRegistry.SetRegValA(V: String;var D: array of Byte); -begin - OpenReg(ExtractKey(V)); - FRegistry.WriteBinaryData(V,D,SizeOf(D)); - FRegistry.Free; -end; - -{------------------------------------------------------------------------------- -Function to save an integer to the registry --------------------------------------------------------------------------------} -procedure TGJHRegistry.SetRegValI(V: String;D: Cardinal); -begin - OpenReg(ExtractKey(V)); - FRegistry.WriteInteger(V,D); - FRegistry.Free; -end; - -{------------------------------------------------------------------------------- -Function to save a boolean to the registry --------------------------------------------------------------------------------} -procedure TGJHRegistry.SetRegValB(V: String;D: Boolean); -begin - OpenReg(ExtractKey(V)); - FRegistry.WriteBool(V,D); - FRegistry.Free; -end; - -{------------------------------------------------------------------------------- -Function to extract key part of string --------------------------------------------------------------------------------} -function TGJHRegistry.ExtractKey(var V: String):String; -begin - Result:=''; - if Pos('\',V)>0 then - begin - Result:=Copy(V,1,Pos('\',V)-1); - V:=Copy(V,Pos('\',V)+1); - end; -end; - -end. - diff --git a/LazarusSource/Global.pas b/LazarusSource/Global.pas index c0f2042..ea9664b 100644 --- a/LazarusSource/Global.pas +++ b/LazarusSource/Global.pas @@ -1,7 +1,7 @@ unit Global; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free diff --git a/LazarusSource/HardDriveUnit.lfm b/LazarusSource/HardDriveUnit.lfm index 81b8e1e..28152b6 100644 --- a/LazarusSource/HardDriveUnit.lfm +++ b/LazarusSource/HardDriveUnit.lfm @@ -9,48 +9,12 @@ object HardDriveForm: THardDriveForm ClientHeight = 118 ClientWidth = 490 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint OnShow = FormShow Position = poMainFormCenter LCLVersion = '2.2.0.4' - object OKBtnBack: TPanel - Left = 382 - Height = 30 - Top = 80 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 0 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = 'Create' - Color = 15527148 - Default = True - ModalResult = 1 - TabOrder = 0 - end - end - object CancelButton: TBitBtn - Left = 276 - Height = 30 - Top = 80 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 1 - end - object Image1: TImage + object HDDImage: TImage Left = 8 Height = 68 Top = 8 @@ -120,70 +84,13 @@ object HardDriveForm: THardDriveForm 426082 } end - object CapacitySlider: TTrackBar - Left = 80 - Height = 37 - Top = 24 - Width = 328 - Max = 203 - Min = 4 - OnChange = CapacitySliderChange - Position = 4 - TickStyle = tsNone - TabOrder = 2 - end object CapacityHeaderLabel: TLabel - Left = 96 + Left = 80 Height = 16 Top = 8 Width = 120 Caption = 'Hard Disc Capacity:' end - object CapacityLabel: TLabel - Left = 416 - Height = 16 - Top = 28 - Width = 34 - Caption = '10MB' - end - object DOSControls: TPanel - Left = 80 - Height = 20 - Top = 56 - Width = 402 - BevelOuter = bvNone - ClientHeight = 20 - ClientWidth = 402 - TabOrder = 4 - OnPaint = FormPaint - object rb_FAT12: TRadioButton - Left = 27 - Height = 18 - Top = 0 - Width = 56 - Caption = 'FAT12' - OnChange = rb_FAT12Change - TabOrder = 0 - end - object rb_FAT16: TRadioButton - Left = 136 - Height = 18 - Top = 0 - Width = 57 - Caption = 'FAT16' - OnChange = rb_FAT16Change - TabOrder = 1 - end - object rb_FAT32: TRadioButton - Left = 256 - Height = 18 - Top = 0 - Width = 58 - Caption = 'FAT32' - OnChange = rb_FAT32Change - TabOrder = 2 - end - end object ADFSControls: TPanel Left = 80 Height = 20 @@ -192,17 +99,8 @@ object HardDriveForm: THardDriveForm BevelOuter = bvNone ClientHeight = 20 ClientWidth = 402 - TabOrder = 3 + TabOrder = 0 OnPaint = FormPaint - object cb_NewMap: TCheckBox - Left = 0 - Height = 18 - Top = 0 - Width = 75 - Caption = 'New Map' - OnChange = cb_NewMapChange - TabOrder = 0 - end object DirectoryLabel: TLabel Left = 216 Height = 16 @@ -210,49 +108,14 @@ object HardDriveForm: THardDriveForm Width = 60 Caption = 'Directory:' end - object rb_OldDir: TRadioButton - Left = 276 - Height = 18 - Top = 0 - Width = 42 - Caption = 'Old' - Checked = True - TabOrder = 1 - TabStop = True - end - object rb_NewDir: TRadioButton - Left = 318 - Height = 18 - Top = 0 - Width = 48 - Caption = 'New' - TabOrder = 2 - end - object rb_BigDir: TRadioButton - Left = 365 - Height = 18 - Top = 0 - Width = 41 - Caption = 'Big' - TabOrder = 3 - end - object cb_IDE: TCheckBox - Left = 76 - Height = 18 - Top = 0 - Width = 42 - Caption = 'IDE' - Checked = True - State = cbChecked - TabOrder = 4 - end - object cb_AddHeader: TCheckBox - Left = 120 - Height = 18 - Top = 0 - Width = 76 - Caption = 'Emulator' - TabOrder = 5 - end + end + object DOSControls: TPanel + Left = 80 + Height = 20 + Top = 56 + Width = 402 + BevelOuter = bvNone + TabOrder = 1 + OnPaint = FormPaint end end diff --git a/LazarusSource/HardDriveUnit.pas b/LazarusSource/HardDriveUnit.pas index a4a9c79..70be883 100644 --- a/LazarusSource/HardDriveUnit.pas +++ b/LazarusSource/HardDriveUnit.pas @@ -1,7 +1,7 @@ unit HardDriveUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -24,34 +24,33 @@ interface uses - Classes,SysUtils,Forms,Controls,Graphics,Dialogs,Buttons,ExtCtrls,ComCtrls, - StdCtrls; + Classes,SysUtils,Forms,Controls,Graphics,Dialogs,ExtCtrls,ComCtrls, + StdCtrls, GJHCustomComponents; type { THardDriveForm } THardDriveForm = class(TForm) - cb_NewMap: TCheckBox; - cb_AddHeader: TCheckBox; - cb_IDE: TCheckBox; - Image1: TImage; + HDDImage: TImage; CapacityHeaderLabel: TLabel; - CapacityLabel: TLabel; DirectoryLabel: TLabel; - OKBtnBack: TPanel; - OKButton: TBitBtn; - CancelButton: TBitBtn; - CapacitySlider: TTrackBar; ADFSControls: TPanel; DOSControls: TPanel; - rb_FAT12: TRadioButton; - rb_BigDir: TRadioButton; - rb_FAT16: TRadioButton; - rb_FAT32: TRadioButton; - rb_NewDir: TRadioButton; - rb_OldDir: TRadioButton; + CapacitySlider: TGJHSlider; + cb_NewMap, + cb_AddHeader, + cb_IDE: TGJHTickBox; + rb_FAT12, + rb_FAT16, + rb_FAT32, + rb_BigDir, + rb_NewDir, + rb_OldDir: TGJHRadioBox; + OKButton, + CancelButton: TGJHButton; procedure cb_NewMapChange(Sender: TObject); + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure CapacitySliderChange(Sender: TObject); procedure FormShow(Sender: TObject); @@ -93,20 +92,103 @@ procedure THardDriveForm.FormPaint(Sender: TObject); procedure THardDriveForm.cb_NewMapChange(Sender: TObject); begin //Enable/disable the appropriate radio boxes - rb_BigDir.Enabled:=cb_NewMap.Checked; - rb_OldDir.Enabled:=not cb_NewMap.Checked; - cb_IDE.Enabled:=cb_NewMap.Checked; + rb_BigDir.Enabled:=cb_NewMap.Ticked; + rb_OldDir.Enabled:=not cb_NewMap.Ticked; + cb_IDE.Enabled:=cb_NewMap.Ticked; //If Old map is selected - if not cb_NewMap.Checked then + if not cb_NewMap.Ticked then begin //Ensure the hard drive capactiy is <512MB if CapacitySlider.Position*MB>OldMapLimit then CapacitySlider.Position:=OldMapLimit div MB; //And Big Dir is not selected - if rb_BigDir.Checked then rb_NewDir.Checked:=True; + if rb_BigDir.Ticked then rb_NewDir.Ticked:=True; end; //If New map is selected, ensure Old Dir is not - if(cb_NewMap.Checked)and(rb_OldDir.Checked)then rb_NewDir.Checked:=True; + if(cb_NewMap.Ticked)and(rb_OldDir.Ticked)then rb_NewDir.Ticked:=True; +end; + +{------------------------------------------------------------------------------- +Form creation +-------------------------------------------------------------------------------} +procedure THardDriveForm.FormCreate(Sender: TObject); +function CreateTickBox(text: String; LPanel: TPanel): TGJHTickBox; +begin + Result:=TGJHTickBox.Create(LPanel as TControl); + Result.Parent:=LPanel as TWinControl; + Result.Visible:=True; + Result.Caption:=text; + Result.Top:=0; +end; +function CreateRadioBox(text: String; LPanel: TPanel): TGJHRadioBox; +begin + Result:=TGJHRadioBox.Create(LPanel as TControl); + Result.Parent:=LPanel as TWinControl; + Result.Visible:=True; + Result.Caption:=text; + Result.Top:=0; +end; +var ratio: Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + //Create the slider + CapacitySlider:=TGJHSlider.Create(HardDriveForm as TControl); + CapacitySlider.Parent:=HardDriveForm as TWinControl; + CapacitySlider.Visible:=True; + CapacitySlider.Min:=4; + CapacitySlider.Max:=203; + CapacitySlider.Position:=4; + CapacitySlider.Outline:=csOutInner; + CapacitySlider.Height:=Round(30*ratio); + CapacitySlider.Orientation:=csHorizontal; + CapacitySlider.ShowValue:=True; + CapacitySlider.Pointers:=False; + CapacitySlider.Top:=CapacityHeaderLabel.Top+CapacityHeaderLabel.Height; + CapacitySlider.Left:=HDDImage.Left+HDDImage.Width; + CapacitySlider.Suffix:='MB'; + CapacitySlider.OnChange:=@CapacitySliderChange; + //Create the ADFS Tick boxes + cb_NewMap:=CreateTickBox('New Map',ADFSControls); + cb_NewMap.Left:=0; + cb_NewMap.OnChange:=@cb_NewMapChange; + cb_IDE:=CreateTickBox('IDE',ADFSControls); + cb_IDE.Left:=cb_NewMap.Left+cb_NewMap.Width+4; + cb_AddHeader:=CreateTickBox('Emulator',ADFSControls); + cb_AddHeader.Left:=cb_IDE.Left+cb_IDE.Width+4; + //Move the label + DirectoryLabel.Left:=cb_AddHeader.Left+cb_AddHeader.Width+Round(12*ratio); + //Create the ADFS Radio boxes + rb_OldDir:=CreateRadioBox('Old',ADFSControls); + rb_OldDir.Left:=DirectoryLabel.Left+DirectoryLabel.Width+Round(4*ratio); + rb_NewDir:=CreateRadioBox('New',ADFSControls); + rb_NewDir.Left:=rb_OldDir.Left+rb_OldDir.Width+Round(4*ratio); + rb_BigDir:=CreateRadioBox('Big',ADFSControls); + rb_BigDir.Left:=rb_NewDir.Left+rb_NewDir.Width+Round(4*ratio); + ADFSControls.Height:=rb_BigDir.Top+rb_BigDir.Height+Round(8*ratio); + //Change the widths + ADFSControls.Width:=rb_BigDir.Left+rb_BigDir.Width+Round(8*ratio); + Width:=ADFSControls.Left+ADFSControls.Width; + CapacitySlider.Width:=Width-CapacitySlider.Left; + //Create the DOS Tick boxes + rb_FAT12:=CreateRadioBox('FAT12',DOSControls); + rb_FAT12.OnChange:=@rb_FAT12Change; + rb_FAT12.Left:=0; + rb_FAT16:=CreateRadioBox('FAT16',DOSControls); + rb_FAT16.OnChange:=@rb_FAT16Change; + rb_FAT16.Left:=rb_FAT12.Left+rb_FAT12.Width+Round(4*ratio); + rb_FAT32:=CreateRadioBox('FAT32',DOSControls); + rb_FAT32.OnChange:=@rb_FAT32Change; + rb_FAT32.Left:=rb_FAT16.Left+rb_FAT16.Width+Round(4*ratio); + //Create the buttons + OKButton:=MainForm.CreateButton(HardDriveForm as TControl,'Create',True,0, + ADFSControls.Height+ADFSControls.Top+Round(4*ratio), + mrOK); + OKButton.Left:=Width-OKButton.Width-Round(8*ratio); + CancelButton:=MainForm.CreateButton(HardDriveForm as TControl,'Cancel',False,0, + OKButton.Top+Round(4*ratio),mrCancel); + CancelButton.Left:=OKButton.Left-Round(8*ratio)-CancelButton.Width; + //Adjust the form height + Height:=OKButton.Top+OKButton.Height+Round(8*ratio); end; {------------------------------------------------------------------------------- @@ -114,11 +196,9 @@ procedure THardDriveForm.cb_NewMapChange(Sender: TObject); -------------------------------------------------------------------------------} procedure THardDriveForm.CapacitySliderChange(Sender: TObject); begin - //Update the label - CapacityLabel.Caption:=IntToStr(CapacitySlider.Position)+'MB'; if ADFSHDD then if CapacitySlider.Position*MB>OldMapLimit then - cb_NewMap.Checked:=True; + cb_NewMap.Ticked:=True; end; {------------------------------------------------------------------------------- @@ -138,17 +218,17 @@ procedure THardDriveForm.FormShow(Sender: TObject); Caption:='Create ADFS Hard Drive'; end; //Set directory type to 'Old' - rb_OldDir.Checked:=True; - rb_NewDir.Checked:=False; - rb_BigDir.Checked:=False; + rb_OldDir.Ticked:=True; + rb_NewDir.Ticked:=False; + rb_BigDir.Ticked:=False; //Enable/Disable the appropriate radio boxes rb_OldDir.Enabled:=True; rb_BigDir.Enabled:=False; //Other options - cb_NewMap.Checked:=False; - cb_AddHeader.Checked:=False; - cb_IDE.Checked:=True; - cb_IDE.Enabled:=cb_NewMap.Checked; + cb_NewMap.Ticked:=False; + cb_AddHeader.Ticked:=False; + cb_IDE.Ticked:=True; + cb_IDE.Enabled:=cb_NewMap.Ticked; if AmigaHDD then begin //Set capacity to 40MB @@ -173,9 +253,9 @@ procedure THardDriveForm.FormShow(Sender: TObject); DOSControls.Visible:=True; Caption:='Create DOS Hard Drive'; end; - rb_FAT12.Checked:=True; - rb_FAT16.Checked:=False; - rb_FAT32.Checked:=False; + rb_FAT12.Ticked:=True; + rb_FAT16.Ticked:=False; + rb_FAT32.Ticked:=False; end; {------------------------------------------------------------------------------- diff --git a/LazarusSource/HexDumpUnit.pas b/LazarusSource/HexDumpUnit.pas index c642600..6cfca30 100644 --- a/LazarusSource/HexDumpUnit.pas +++ b/LazarusSource/HexDumpUnit.pas @@ -1,7 +1,7 @@ unit HexDumpUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -135,18 +135,18 @@ procedure THexDumpForm.FormShow(Sender: TObject); HexDumpDisplay.RowCount :=1; HexDumpDisplay.Font.Size:=Round(8*Screen.PixelsPerInch/DesignTimePPI); //Header - HexDumpDisplay.ColWidths[0] :=80; + HexDumpDisplay.ColWidths[0] :=Round(80*Screen.PixelsPerInch/DesignTimePPI); HexDumpDisplay.Cells[0,0] :='Address'; - HexDumpDisplay.ColWidths[17]:=120; + HexDumpDisplay.ColWidths[17]:=Round(120*Screen.PixelsPerInch/DesignTimePPI); HexDumpDisplay.Cells[17,0] :='ASCII'; for c:=1 to 16 do begin - HexDumpDisplay.ColWidths[c]:=25; + HexDumpDisplay.ColWidths[c]:=Round(25*Screen.PixelsPerInch/DesignTimePPI); HexDumpDisplay.Cells[c,0] :=IntToHex(c-1,2); end; ResetApplication; //Set up the form - Width:=635; + Width:=Round(635*Screen.PixelsPerInch/DesignTimePPI); //Show the hex display DisplayHex(0); //Setup the scrollbar @@ -801,7 +801,19 @@ procedure THexDumpForm.DecodeBasicFile; if(c<$C6)or(c>$C8)then begin if c-$80<=High(tokens) then - linetxt:=linetxt+''+tokens[c-$80]+''; + if c-$80<>$D then + linetxt:=linetxt+''+tokens[c-$80]+'' + else + begin //Line number + linetxt:=linetxt+'' + +IntToStr( + ((buffer[ptr+lineptr ]XOR$54)AND$30)<< 2 + OR((buffer[ptr+lineptr ]XOR$54)AND$03)<<14 + OR (buffer[ptr+lineptr+1] AND$3F) + OR (buffer[ptr+lineptr+2] AND$3F)<< 8) + +''; + inc(lineptr,3); + end; end else //Extended tokens (BASIC V) begin diff --git a/LazarusSource/ImageDetailUnit.lfm b/LazarusSource/ImageDetailUnit.lfm index 13c394f..b1d765f 100755 --- a/LazarusSource/ImageDetailUnit.lfm +++ b/LazarusSource/ImageDetailUnit.lfm @@ -10,6 +10,7 @@ object ImageDetailForm: TImageDetailForm ClientWidth = 612 Color = 15527148 Font.Height = -11 + OnCreate = FormCreate Position = poMainFormCenter LCLVersion = '2.2.0.4' object Legend: TPanel @@ -79,7 +80,7 @@ object ImageDetailForm: TImageDetailForm Width = 15 Brush.Color = clAqua end - object Label5: TLabel + object LegendLabel: TLabel Left = 0 Height = 16 Top = 520 @@ -87,177 +88,23 @@ object ImageDetailForm: TImageDetailForm Alignment = taCenter AutoSize = False Caption = 'Legend' + Color = 7829367 + Font.Color = clWhite Font.Style = [fsBold] ParentFont = False - end - object pnSide0: TGroupBox - Left = 0 - Height = 94 - Top = 0 - Width = 200 - Align = alTop - Caption = 'Side 0' - ClientHeight = 75 - ClientWidth = 190 - TabOrder = 0 - object DiscName0Label: TLabel - Left = 0 - Height = 16 - Top = 0 - Width = 190 - Align = alTop - Alignment = taCenter - AutoSize = False - Caption = 'Disc Name' - Font.Color = clBlue - Font.Style = [fsBold] - ParentFont = False - end - object edDiscTitle0: TEdit - Left = 0 - Height = 18 - Top = 16 - Width = 190 - Align = alTop - Alignment = taCenter - AutoSize = False - BorderStyle = bsNone - Font.Height = -11 - Font.Name = 'Courier New' - ParentColor = True - ParentFont = False - TabOrder = 0 - Text = 'edDiscTitle0' - end - object lbBootOption0: TLabel - Left = 0 - Height = 16 - Top = 34 - Width = 190 - Align = alTop - Alignment = taCenter - AutoSize = False - Caption = 'Boot Option' - Font.Color = clBlue - Font.Style = [fsBold] - ParentFont = False - end - object cbBootOption0: TComboBox - Left = 0 - Height = 20 - Top = 50 - Width = 190 - Align = alTop - AutoSize = False - DropDownCount = 4 - Font.Color = clBlack - Font.Height = -11 - Font.Name = 'Courier New' - ItemHeight = 26 - ItemIndex = 0 - Items.Strings = ( - 'None' - 'Load' - 'Run' - 'Execute' - ) - ParentColor = True - ParentFont = False - Style = csDropDownList - TabOrder = 1 - Text = 'None' - end - end - object pnSide1: TGroupBox - Left = 0 - Height = 94 - Top = 94 - Width = 200 - Align = alTop - Caption = 'Side 1' - ClientHeight = 75 - ClientWidth = 190 - TabOrder = 1 - object DiscName1Label: TLabel - Left = 0 - Height = 16 - Top = 0 - Width = 190 - Align = alTop - Alignment = taCenter - AutoSize = False - Caption = 'Disc Name' - Font.Color = clBlue - Font.Style = [fsBold] - ParentFont = False - end - object edDiscTitle1: TEdit - Left = 0 - Height = 18 - Top = 16 - Width = 190 - Align = alTop - Alignment = taCenter - AutoSize = False - BorderStyle = bsNone - Font.Height = -11 - Font.Name = 'Courier New' - MaxLength = 12 - ParentColor = True - ParentFont = False - TabOrder = 0 - Text = 'edDiscTitle0' - end - object lbBootOption1: TLabel - Left = 0 - Height = 16 - Top = 34 - Width = 190 - Align = alTop - Alignment = taCenter - AutoSize = False - Caption = 'Boot Option' - Font.Color = clBlue - Font.Style = [fsBold] - ParentFont = False - end - object cbBootOption1: TComboBox - Left = 0 - Height = 20 - Top = 50 - Width = 190 - Align = alTop - AutoSize = False - DropDownCount = 4 - Font.Color = clBlack - Font.Height = -11 - Font.Name = 'Courier New' - ItemHeight = 26 - ItemIndex = 0 - Items.Strings = ( - 'None' - 'Load' - 'Run' - 'Execute' - ) - ParentColor = True - ParentFont = False - Style = csDropDownList - TabOrder = 1 - Text = 'None' - end + Transparent = False end object CRCPanel: TPanel Left = 0 Height = 32 - Top = 188 + Top = 166 Width = 200 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 32 ClientWidth = 200 - TabOrder = 2 + TabOrder = 0 OnPaint = LegendPaint object lbCRC32: TLabel Left = 0 @@ -289,14 +136,14 @@ object ImageDetailForm: TImageDetailForm object FormatPanel: TPanel Left = 0 Height = 32 - Top = 220 + Top = 198 Width = 200 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 32 ClientWidth = 200 - TabOrder = 3 + TabOrder = 1 OnPaint = LegendPaint object lbImgFormat: TLabel Left = 0 @@ -328,14 +175,14 @@ object ImageDetailForm: TImageDetailForm object MapPanel: TPanel Left = 0 Height = 32 - Top = 252 + Top = 230 Width = 200 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 32 ClientWidth = 200 - TabOrder = 4 + TabOrder = 2 OnPaint = LegendPaint object lbMap: TLabel Left = 0 @@ -367,14 +214,14 @@ object ImageDetailForm: TImageDetailForm object DirPanel: TPanel Left = 0 Height = 32 - Top = 284 + Top = 262 Width = 200 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 32 ClientWidth = 200 - TabOrder = 5 + TabOrder = 3 OnPaint = LegendPaint object lbDirType: TLabel Left = 0 @@ -403,43 +250,6 @@ object ImageDetailForm: TImageDetailForm ParentFont = False end end - object OKBtnBack: TPanel - Left = 10 - Height = 30 - Top = 485 - Width = 75 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 75 - Color = clYellow - ParentColor = False - TabOrder = 6 - object btn_OK: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 75 - Caption = 'Update' - Color = 15527148 - Default = True - ModalResult = 1 - TabOrder = 0 - end - end - object btn_Cancel: TBitBtn - Left = 115 - Height = 30 - Top = 485 - Width = 75 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 7 - end object AcornLogo: TImage Left = 0 Height = 66 @@ -107808,14 +107618,14 @@ object ImageDetailForm: TImageDetailForm object InterleavePanel: TPanel Left = 0 Height = 32 - Top = 316 + Top = 294 Width = 200 Align = alTop AutoSize = True BevelOuter = bvNone ClientHeight = 32 ClientWidth = 200 - TabOrder = 8 + TabOrder = 4 OnPaint = LegendPaint object lbInterleave: TLabel Left = 0 @@ -118410,5 +118220,194 @@ object ImageDetailForm: TImageDetailForm Transparent = True Visible = False end + object pnSide0: TPanel + Left = 0 + Height = 83 + Top = 0 + Width = 200 + Align = alTop + AutoSize = True + BevelOuter = bvNone + ClientHeight = 83 + ClientWidth = 200 + TabOrder = 5 + OnPaint = LegendPaint + object DiscName0Label: TLabel + Left = 0 + Height = 16 + Top = 13 + Width = 200 + Align = alTop + Alignment = taCenter + AutoSize = False + Caption = 'Disc Name' + Font.Color = clBlue + Font.Style = [fsBold] + ParentFont = False + end + object edDiscTitle0: TEdit + Left = 0 + Height = 18 + Top = 29 + Width = 200 + Align = alTop + Alignment = taCenter + AutoSize = False + BorderStyle = bsNone + Color = 15527148 + Font.Height = -11 + Font.Name = 'Courier New' + ParentFont = False + TabOrder = 0 + Text = 'edDiscTitle0' + end + object lbBootOption0: TLabel + Left = 0 + Height = 16 + Top = 47 + Width = 200 + Align = alTop + Alignment = taCenter + AutoSize = False + Caption = 'Boot Option' + Font.Color = clBlue + Font.Style = [fsBold] + ParentFont = False + end + object cbBootOption0: TComboBox + Left = 0 + Height = 20 + Top = 63 + Width = 200 + Align = alTop + AutoSize = False + DropDownCount = 4 + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Courier New' + ItemHeight = 26 + ItemIndex = 0 + Items.Strings = ( + 'None' + 'Load' + 'Run' + 'Execute' + ) + ParentColor = True + ParentFont = False + Style = csDropDownList + TabOrder = 1 + Text = 'None' + end + object pnSide0Caption: TLabel + Left = 0 + Height = 13 + Top = 0 + Width = 200 + Align = alTop + Caption = ' Side 0 Details' + Color = 7829367 + Font.Color = clWhite + Font.Height = -11 + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end + end + object pnSide1: TPanel + Left = 0 + Height = 83 + Top = 83 + Width = 200 + Align = alTop + AutoSize = True + BevelOuter = bvNone + ClientHeight = 83 + ClientWidth = 200 + TabOrder = 6 + OnPaint = LegendPaint + object pnSide1Caption: TLabel + Left = 0 + Height = 13 + Top = 0 + Width = 200 + Align = alTop + Caption = ' Side 2 Details' + Color = 7829367 + Font.Color = clWhite + Font.Height = -11 + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end + object DiscName1Label: TLabel + Left = 0 + Height = 16 + Top = 13 + Width = 200 + Align = alTop + Alignment = taCenter + AutoSize = False + Caption = 'Disc Name' + Font.Color = clBlue + Font.Style = [fsBold] + ParentFont = False + end + object edDiscTitle1: TEdit + Left = 0 + Height = 18 + Top = 29 + Width = 200 + Align = alTop + Alignment = taCenter + AutoSize = False + BorderStyle = bsNone + Font.Height = -11 + Font.Name = 'Courier New' + MaxLength = 12 + ParentColor = True + ParentFont = False + TabOrder = 0 + Text = 'edDiscTitle0' + end + object lbBootOption1: TLabel + Left = 0 + Height = 16 + Top = 47 + Width = 200 + Align = alTop + Alignment = taCenter + AutoSize = False + Caption = 'Boot Option' + Font.Color = clBlue + Font.Style = [fsBold] + ParentFont = False + end + object cbBootOption1: TComboBox + Left = 0 + Height = 20 + Top = 63 + Width = 200 + Align = alTop + AutoSize = False + DropDownCount = 4 + Font.Color = clBlack + Font.Height = -11 + Font.Name = 'Courier New' + ItemHeight = 26 + ItemIndex = 0 + Items.Strings = ( + 'None' + 'Load' + 'Run' + 'Execute' + ) + ParentColor = True + ParentFont = False + Style = csDropDownList + TabOrder = 1 + Text = 'None' + end + end end end diff --git a/LazarusSource/ImageDetailUnit.pas b/LazarusSource/ImageDetailUnit.pas index 65c57fb..e180ace 100755 --- a/LazarusSource/ImageDetailUnit.pas +++ b/LazarusSource/ImageDetailUnit.pas @@ -1,7 +1,7 @@ unit ImageDetailUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -25,16 +25,16 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, - Buttons; + GJHCustomComponents; type { TImageDetailForm } TImageDetailForm = class(TForm) + pnSide1: TPanel; + pnSide0Caption: TLabel; MicrosoftLogo: TImage; - btn_Cancel: TBitBtn; - btn_OK: TBitBtn; cbBootOption0: TComboBox; cbBootOption1: TComboBox; DirLabel: TLabel; @@ -45,6 +45,8 @@ TImageDetailForm = class(TForm) lbInterleave: TLabel; InterleaveLabel: TLabel; InterleavePanel: TPanel; + pnSide0: TPanel; + pnSide1Caption: TLabel; SinclairLogo: TImage; lbDirType: TLabel; MapLabel: TLabel; @@ -62,20 +64,20 @@ TImageDetailForm = class(TForm) CRCPanel: TPanel; lbMap: TLabel; lbImgFormat: TLabel; - OKBtnBack: TPanel; - pnSide0: TGroupBox; FreeLabel: TLabel; BBCMasterLogo: TImage; SystemLabel: TLabel; DirectoryLabel: TLabel; FileLabel: TLabel; - Label5: TLabel; + LegendLabel: TLabel; Legend: TPanel; colFree: TShape; colSystem: TShape; colDir: TShape; colFile: TShape; - pnSide1: TGroupBox; + btn_OK, + btn_Cancel: TGJHButton; + procedure FormCreate(Sender: TObject); procedure LegendPaint(Sender: TObject); private @@ -99,4 +101,19 @@ procedure TImageDetailForm.LegendPaint(Sender: TObject); MainForm.FileInfoPanelPaint(Sender); end; +procedure TImageDetailForm.FormCreate(Sender: TObject); +var + ratio: Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + btn_OK:=MainForm.CreateButton(Legend as TControl,'Update',True,0,0,mrOK); + btn_Cancel:=MainForm.CreateButton(Legend as TControl,'Cancel',False,0,0,mrCancel); + btn_OK.Width:=(Legend.ClientWidth div 2)-Round(16*ratio); + btn_Cancel.Width:=btn_OK.Width-Round(8*ratio); + btn_OK.Top:=LegendLabel.Top-Round(8*ratio)-btn_OK.Height; + btn_OK.Left:=Legend.ClientWidth-Round(8*ratio)-btn_OK.Width; + btn_Cancel.Top:=btn_OK.Top+Round(4*ratio); + btn_Cancel.Left:=Round(8*ratio); +end; + end. diff --git a/LazarusSource/ImportSelectorUnit.lfm b/LazarusSource/ImportSelectorUnit.lfm index b96798a..6c6cc47 100644 --- a/LazarusSource/ImportSelectorUnit.lfm +++ b/LazarusSource/ImportSelectorUnit.lfm @@ -10,6 +10,7 @@ object ImportSelectorForm: TImportSelectorForm Color = 15527148 Constraints.MinHeight = 456 Constraints.MinWidth = 400 + OnCreate = FormCreate OnPaint = FormPaint OnShow = FormShow Position = poMainFormCenter @@ -40,57 +41,16 @@ object ImportSelectorForm: TImportSelectorForm Options = [tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoShowButtons, tvoShowRoot, tvoToolTips, tvoThemedDraw] TreeLineColor = clNone end - object Panel1: TPanel + object ButtonPanel: TPanel Left = 0 Height = 40 Top = 416 Width = 400 Align = alBottom BevelOuter = bvNone - ClientHeight = 40 - ClientWidth = 400 TabOrder = 1 OnPaint = FormPaint - OnResize = Panel1Resize - object OKBtnBack: TPanel - Left = 120 - Height = 30 - Top = 4 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 0 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - Default = True - ModalResult = 1 - OnClick = OKButtonClick - TabOrder = 0 - end - end - object CancelButton: TBitBtn - Left = 4 - Height = 30 - Top = 4 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - OnClick = CancelButtonClick - TabOrder = 1 - end + OnResize = ButtonPanelResize end object TickIcons: TImageList Height = 44 diff --git a/LazarusSource/ImportSelectorUnit.pas b/LazarusSource/ImportSelectorUnit.pas index c6120c9..ab612ce 100644 --- a/LazarusSource/ImportSelectorUnit.pas +++ b/LazarusSource/ImportSelectorUnit.pas @@ -1,7 +1,7 @@ unit ImportSelectorUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -25,21 +25,20 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls, - LCLIntf, Buttons,DiscImage; + LCLIntf, GJHCustomComponents,DiscImage; type { TImportSelectorForm } TImportSelectorForm = class(TForm) - CancelButton: TBitBtn; - OKBtnBack: TPanel; - OKButton: TBitBtn; TickIcons: TImageList; ImageList2: TImageList; - Panel1: TPanel; + ButtonPanel: TPanel; ImportDirList: TTreeView; - procedure CancelButtonClick(Sender: TObject); + OKButton, + CancelButton: TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormShow(Sender: TObject); procedure ImportDirListCreateNodeClass(Sender: TCustomTreeView; @@ -47,14 +46,14 @@ TImportSelectorForm = class(TForm) procedure ImportDirListCustomDraw(Sender: TCustomTreeView; const ARect: TRect; var DefaultDraw: Boolean); procedure ImportDirListGetImageIndex(Sender: TObject; Node: TTreeNode); - procedure OKButtonClick(Sender: TObject); - procedure Panel1Resize(Sender: TObject); + procedure ButtonPanelResize(Sender: TObject); procedure TickNode(Node: TTreeNode; Ticked: Boolean); procedure ToggleTreeViewTickBoxes(Node: TTreeNode); function IsNodeTicked(ANode:TTreeNode): Boolean; function IsNodeTicked(dir,entry: Integer): Boolean; overload; procedure TreeView1Click(Sender: TObject); private + ratio : Real; const //Tick, Untick or Indeterminate graphics ImgIndexTicked = 0; @@ -147,24 +146,23 @@ procedure TImportSelectorForm.ImportDirListCustomDraw(Sender: TCustomTreeView; procedure TImportSelectorForm.ImportDirListGetImageIndex(Sender: TObject; Node: TTreeNode); begin + MainForm.WriteToDebug('Selector Form -> ImportDirList'); + if Visible then MainForm.WriteToDebug('Selector Form Visible') + else MainForm.WriteToDebug('Selector Form not Visible'); MainForm.GetImageIndex(Node,FImage); end; -{------------------------------------------------------------------------------} -//OK has been clicked -{------------------------------------------------------------------------------} -procedure TImportSelectorForm.OKButtonClick(Sender: TObject); -begin - ModalResult:=mrOK; -end; - {------------------------------------------------------------------------------} //The button panel is being resized {------------------------------------------------------------------------------} -procedure TImportSelectorForm.Panel1Resize(Sender: TObject); +procedure TImportSelectorForm.ButtonPanelResize(Sender: TObject); begin - OKBtnBack.Left:=Panel1.ClientWidth-OKBtnBack.Width-4; - CancelButton.Left:=OKBtnBack.Left-CancelButton.Width-16; + if ButtonPanel.ClientWidth - EdgeInner = esNone - EdgeOuter = esNone - HorizontalSpacing = 0 - ShowText = False - VerticalSpacing = 0 - OnChange = ToolBarContainerChange - object ToolsToolBar: TToolBar - AnchorSideLeft.Control = ToolBarContainer - AnchorSideTop.Control = ToolBarContainer - Left = 208 - Height = 37 - Top = 39 - Width = 186 - Align = alNone - AutoSize = True - BorderSpacing.Left = 208 - BorderSpacing.Top = 39 - ButtonHeight = 37 - ButtonWidth = 37 - Caption = 'Tools' - EdgeBorders = [] - EdgeInner = esNone - EdgeOuter = esNone - Images = ToolBarImages - ImagesWidth = 32 - TabOrder = 0 - Transparent = True - Wrapable = False - object btn_FixADFS: TToolButton - Left = 1 - Hint = 'Repair ADFS Broken Directories' - Top = 0 - AutoSize = True - Enabled = False - ImageIndex = 12 - OnClick = btn_FixADFSClick - end - object btn_Settings: TToolButton - Left = 112 - Hint = 'Preferences' - Top = 0 - ImageIndex = 16 - OnClick = btn_SettingsClick - end - object btn_About: TToolButton - Left = 149 - Hint = 'About Disc Image Manager' - Top = 0 - AutoSize = True - ImageIndex = 0 - OnClick = btn_AboutClick - end - object btn_ChangeInterleave: TToolButton - Left = 38 - Hint = 'Change Interleave' - Top = 0 - Enabled = False - ImageIndex = 13 - OnClick = btn_ChangeInterleaveClick - end - object btn_Defrag: TToolButton - Left = 75 - Hint = 'Perform a Defrag (Compact)' - Top = 0 - Enabled = False - ImageIndex = 23 - OnClick = btn_DefragClick - end - end - object ImageToolBar: TToolBar - AnchorSideLeft.Control = ToolBarContainer - AnchorSideTop.Control = ToolBarContainer - Left = 12 - Height = 37 - Top = 0 - Width = 297 - Align = alNone + TabIndex = 0 + TabOrder = 5 + object ImageToolBarPage: TTabSheet AutoSize = True - BorderSpacing.Left = 12 - ButtonHeight = 37 - ButtonWidth = 37 Caption = 'Image' - EdgeBorders = [] - EdgeInner = esNone - EdgeOuter = esNone - Images = ToolBarImages - ImagesWidth = 32 - TabOrder = 1 - Transparent = True - Wrapable = False - object btn_NewImage: TToolButton - Left = 1 - Hint = 'New Image' - Top = 0 - AutoSize = True - ImageIndex = 7 - OnClick = btn_NewImageClick - end - object btn_OpenImage: TToolButton - Left = 38 - Hint = 'Open Existing Image' - Top = 0 - AutoSize = True - ImageIndex = 2 - OnClick = btn_OpenImageClick - end - object btn_CloseImage: TToolButton - Left = 75 - Hint = 'Close Image File' - Top = 0 - AutoSize = True - ImageIndex = 10 - OnClick = btn_CloseImageClick - end - object btn_SaveImage: TToolButton - Left = 112 - Hint = 'Save Image As' - Top = 0 - AutoSize = True - ImageIndex = 3 - OnClick = btn_SaveImageClick - end - object btn_SaveAsCSV: TToolButton - Left = 149 - Hint = 'Save File Details as CSV' - Top = 0 - AutoSize = True - Caption = 'Save Details As CSV' - Enabled = False - ImageIndex = 11 - OnClick = btn_SaveAsCSVClick - end - object btn_ImageDetails: TToolButton - Left = 186 - Hint = 'View/Edit Image Details' - Top = 0 - AutoSize = True - Caption = 'btn_ImageDetails' - ImageIndex = 15 - OnClick = btn_ImageDetailsClick - end - object btn_FileSearch: TToolButton - Left = 223 - Hint = 'Open File Search Window' - Top = 0 - AutoSize = True - ImageIndex = 8 - OnClick = btn_FileSearchClick - end - object btn_ShowReport: TToolButton - Left = 260 - Hint = 'Show Image Report' + ClientHeight = 32 + ClientWidth = 739 + object ImageToolBar: TToolBar + Left = 0 Top = 0 + Width = 739 AutoSize = True - ImageIndex = 24 - OnClick = btn_ShowReportClick + ButtonHeight = 32 + ButtonWidth = 32 + EdgeBorders = [] + EdgeInner = esNone + EdgeOuter = esNone + Images = ToolBarImages + ImagesWidth = 32 + TabOrder = 0 + OnPaint = FileInfoPanelPaint + object btn_NewImage: TToolButton + Left = 1 + Hint = 'New Image' + Top = 0 + Caption = 'btn_NewImage' + ImageIndex = 7 + OnClick = btn_NewImageClick + end + object btn_OpenImage: TToolButton + Left = 37 + Hint = 'Open Existing Image' + Top = 0 + Caption = 'btn_OpenImage' + ImageIndex = 2 + OnClick = btn_OpenImageClick + end + object btn_CloseImage: TToolButton + Left = 73 + Hint = 'Close Image File' + Top = 0 + Caption = 'btn_CloseImage' + Enabled = False + ImageIndex = 10 + OnClick = btn_CloseImageClick + end + object btn_SaveImage: TToolButton + Left = 109 + Hint = 'Save Image As' + Top = 0 + Caption = 'btn_SaveImage' + Enabled = False + ImageIndex = 3 + OnClick = btn_SaveImageClick + end + object btn_SaveAsCSV: TToolButton + Left = 145 + Hint = 'Save File Details as CSV' + Top = 0 + Caption = 'btn_SaveAsCSV' + Enabled = False + ImageIndex = 11 + OnClick = btn_SaveAsCSVClick + end + object btn_ImageDetails: TToolButton + Left = 181 + Hint = 'View/Edit Image Details' + Top = 0 + Caption = 'btn_ImageDetails' + Enabled = False + ImageIndex = 15 + OnClick = btn_ImageDetailsClick + end + object btn_FileSearch: TToolButton + Left = 217 + Hint = 'Open File Search Window' + Top = 0 + Caption = 'btn_FileSearch' + Enabled = False + ImageIndex = 8 + OnClick = btn_FileSearchClick + end + object btn_ShowReport: TToolButton + Left = 253 + Hint = 'Show Image Report' + Top = 0 + Caption = 'btn_ShowReport' + Enabled = False + ImageIndex = 24 + OnClick = btn_ShowReportClick + end end end - object FilesToolBar: TToolBar - AnchorSideLeft.Control = ToolBarContainer - AnchorSideTop.Control = ToolBarContainer - Left = 323 - Height = 37 - Top = 0 - Width = 260 - Align = alNone - BorderSpacing.Left = 323 - ButtonHeight = 37 - ButtonWidth = 37 + object FIlesToolBarPage: TTabSheet + AutoSize = True Caption = 'Files' - EdgeBorders = [] - EdgeInner = esNone - EdgeOuter = esNone - Images = ToolBarImages - ImagesWidth = 32 - TabOrder = 2 - Transparent = True - Wrapable = False - object btn_DuplicateFile: TToolButton - Left = 223 - Hint = 'Duplicate File' - Top = 0 - Enabled = False - ImageIndex = 17 - OnClick = DuplicateFile1Click - end - object btn_Delete: TToolButton - Left = 186 - Hint = 'Delete File(s)' - Top = 0 - AutoSize = True - ImageIndex = 4 - OnClick = DeleteFile1Click - end - object btn_NewDirectory: TToolButton - Left = 149 - Hint = 'New Directory' - Top = 0 - AutoSize = True - Caption = 'btn_NewDirectory' - Enabled = False - ImageIndex = 9 - OnClick = btn_NewDirectoryClick - end - object btn_HexDump: TToolButton - Left = 112 - Hint = 'Show File Viewer' - Top = 0 - AutoSize = True - Enabled = False - ImageIndex = 14 - OnClick = DirListDblClick - end - object btn_Rename: TToolButton - Left = 75 - Hint = 'Rename File' - Top = 0 - AutoSize = True - ImageIndex = 5 - OnClick = RenameFile1Click - end - object btn_AddFiles: TToolButton - Left = 38 - Hint = 'Add File(s)' - Top = 0 - AutoSize = True - Caption = 'btn_AddFiles' - ImageIndex = 6 - OnClick = AddFile1Click - end - object btn_download: TToolButton - Left = 1 - Hint = 'Download File(s)' + ClientHeight = 32 + ClientWidth = 739 + object FilesToolBar: TToolBar + Left = 0 Top = 0 + Width = 739 AutoSize = True - ImageIndex = 1 - OnClick = btn_downloadClick + ButtonHeight = 32 + ButtonWidth = 32 + Caption = 'FilesToolBar' + EdgeBorders = [] + EdgeInner = esNone + EdgeOuter = esNone + Images = ToolBarImages + ImagesWidth = 32 + TabOrder = 0 + OnPaint = FileInfoPanelPaint + object btn_download: TToolButton + Left = 1 + Hint = 'Download File(s)' + Top = 0 + Caption = 'btn_download' + Enabled = False + ImageIndex = 1 + OnClick = btn_downloadClick + end + object btn_AddFiles: TToolButton + Left = 37 + Hint = 'Add File(s)' + Top = 0 + Caption = 'btn_AddFiles' + Enabled = False + ImageIndex = 6 + OnClick = AddFile1Click + end + object btn_Rename: TToolButton + Left = 73 + Hint = 'Rename File' + Top = 0 + Caption = 'btn_Rename' + Enabled = False + ImageIndex = 5 + OnClick = RenameFile1Click + end + object btn_HexDump: TToolButton + Left = 109 + Hint = 'Show File Viewer' + Top = 0 + Caption = 'btn_HexDump' + Enabled = False + ImageIndex = 14 + OnClick = DirListDblClick + end + object btn_NewDirectory: TToolButton + Left = 145 + Hint = 'New Directory' + Top = 0 + Caption = 'btn_NewDirectory' + Enabled = False + ImageIndex = 9 + OnClick = btn_NewDirectoryClick + end + object btn_Delete: TToolButton + Left = 181 + Hint = 'Delete File(s)' + Top = 0 + Caption = 'btn_Delete' + Enabled = False + ImageIndex = 4 + OnClick = DeleteFile1Click + end + object btn_DuplicateFile: TToolButton + Left = 217 + Hint = 'Duplicate File' + Top = 0 + Caption = 'btn_DuplicateFile' + Enabled = False + ImageIndex = 17 + OnClick = DuplicateFile1Click + end end end - object PartitionToolBar: TToolBar - AnchorSideLeft.Control = ToolBarContainer - AnchorSideTop.Control = ToolBarContainer - Left = 12 - Height = 37 - Top = 39 - Width = 182 - Align = alNone - BorderSpacing.Left = 12 - BorderSpacing.Top = 39 - ButtonHeight = 37 - ButtonWidth = 37 + object PartitionToolBarPage: TTabSheet + AutoSize = True Caption = 'Partition' - EdgeBorders = [] - EdgeInner = esNone - EdgeOuter = esNone - Images = ToolBarImages - ImagesWidth = 32 - TabOrder = 3 - Transparent = True - Wrapable = False - object btn_AddPassword: TToolButton - Left = 1 - Hint = 'Add Password File' - Top = 0 - Enabled = False - ImageIndex = 18 - OnClick = btn_AddPasswordClick - end - object btn_EditPassword: TToolButton - Left = 38 - Hint = 'Edit Password File' - Top = 0 - Enabled = False - ImageIndex = 20 - OnClick = btn_EditPasswordClick - end - object btn_DeletePartition: TToolButton - Left = 112 - Hint = 'Delete Partition' - Top = 0 - Enabled = False - ImageIndex = 19 - OnClick = btn_DeletePartitionClick - end - object btn_SavePartition: TToolButton - Left = 75 - Hint = 'Save Partition As' + ClientHeight = 32 + ClientWidth = 739 + object PartitionToolBar: TToolBar + Left = 0 Top = 0 - Enabled = False - ImageIndex = 21 - OnClick = btn_SavePartitionClick + Width = 739 + AutoSize = True + ButtonHeight = 32 + ButtonWidth = 32 + Caption = 'PartitionToolBar' + EdgeBorders = [] + EdgeInner = esNone + EdgeOuter = esNone + Images = ToolBarImages + ImagesWidth = 32 + TabOrder = 0 + OnPaint = FileInfoPanelPaint + object btn_AddPassword: TToolButton + Left = 1 + Hint = 'Add Password File' + Top = 0 + Caption = 'btn_AddPassword' + Enabled = False + ImageIndex = 18 + OnClick = btn_AddPasswordClick + end + object btn_EditPassword: TToolButton + Left = 37 + Hint = 'Edit Password File' + Top = 0 + Caption = 'btn_EditPassword' + Enabled = False + ImageIndex = 20 + OnClick = btn_EditPasswordClick + end + object btn_SavePartition: TToolButton + Left = 73 + Hint = 'Save Partition As' + Top = 0 + Caption = 'btn_SavePartition' + Enabled = False + ImageIndex = 21 + OnClick = btn_SavePartitionClick + end + object btn_DeletePartition: TToolButton + Left = 109 + Hint = 'Delete Partition' + Top = 0 + Caption = 'btn_DeletePartition' + Enabled = False + ImageIndex = 19 + OnClick = btn_DeletePartitionClick + end + object btn_AddPartition: TToolButton + Left = 145 + Hint = 'Add Partition' + Top = 0 + Caption = 'btn_AddPartition' + Enabled = False + ImageIndex = 22 + OnClick = btn_AddPartitionClick + end end - object btn_AddPartition: TToolButton - Left = 149 - Hint = 'Add Partition' + end + object ToolsToolBarPage: TTabSheet + AutoSize = True + Caption = 'Tools' + ClientHeight = 32 + ClientWidth = 739 + object ToolsToolBar: TToolBar + Left = 0 Top = 0 - Enabled = False - ImageIndex = 22 - OnClick = btn_AddPartitionClick + Width = 739 + AutoSize = True + ButtonHeight = 32 + ButtonWidth = 32 + Caption = 'ToolsToolBar' + EdgeBorders = [] + EdgeInner = esNone + EdgeOuter = esNone + Images = ToolBarImages + ImagesWidth = 32 + TabOrder = 0 + OnPaint = FileInfoPanelPaint + object btn_FixADFS: TToolButton + Left = 1 + Hint = 'Repair ADFS Broken Directories' + Top = 0 + Caption = 'btn_FixADFS' + Enabled = False + ImageIndex = 12 + OnClick = btn_FixADFSClick + end + object btn_ChangeInterleave: TToolButton + Left = 37 + Hint = 'Change Interleave' + Top = 0 + Caption = 'btn_ChangeInterleave' + Enabled = False + ImageIndex = 13 + OnClick = btn_ChangeInterleaveClick + end + object btn_Defrag: TToolButton + Left = 73 + Hint = 'Perform a Defrag (Compact)' + Top = 0 + Caption = 'btn_Defrag' + Enabled = False + ImageIndex = 23 + OnClick = btn_DefragClick + end + object btn_Settings: TToolButton + Left = 109 + Hint = 'Preferences' + Top = 0 + Caption = 'btn_Settings' + ImageIndex = 16 + OnClick = btn_SettingsClick + end + object btn_About: TToolButton + Left = 145 + Hint = 'About Disc Image Manager' + Top = 0 + Caption = 'btn_About' + ImageIndex = 0 + OnClick = btn_AboutClick + end end end end @@ -32604,12 +32100,14 @@ object MainForm: TMainForm object CopyToClipboard: TAction Category = 'Clipboard' Caption = 'CopyToClipboard' + Enabled = False OnExecute = CopyToClipboardExecute ShortCut = 16451 end object PasteFromClipboard: TAction Category = 'Clipboard' Caption = 'PasteFromClipboard' + Enabled = False OnExecute = PasteFromClipboardExecute ShortCut = 16470 end diff --git a/LazarusSource/MainUnit.pas b/LazarusSource/MainUnit.pas index d68a583..1e7e051 100755 --- a/LazarusSource/MainUnit.pas +++ b/LazarusSource/MainUnit.pas @@ -35,7 +35,7 @@ interface SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, DiscImage, Global, DiscImageUtils, ExtCtrls, Buttons, ComCtrls, Menus, DateUtils, ImgList, StrUtils, Clipbrd, HexDumpUnit, Spark, FPImage, IntfGraphics, - ActnList, GraphType, DateTimePicker, Types, GJHRegistryClass; + ActnList, GraphType, DateTimePicker, Types, GJHCustomComponents; type //We need a custom TTreeNode, as we want to tag on some extra information @@ -64,34 +64,9 @@ TMyTreeNode = class(TTreeNode) TMainForm = class(TForm) AmigaAttrPanel: TPanel; AFSAttrPanel: TPanel; - cb_Amiga_othd: TCheckBox; - cb_Amiga_arch: TCheckBox; - cb_Amiga_othe: TCheckBox; - cb_Amiga_pure: TCheckBox; - cb_Amiga_hold: TCheckBox; - cb_Amiga_scri: TCheckBox; - cb_Amiga_ownr: TCheckBox; - cb_Amiga_othr: TCheckBox; - cb_Amiga_ownw: TCheckBox; - cb_Amiga_owne: TCheckBox; - cb_Amiga_ownd: TCheckBox; - cb_Amiga_othw: TCheckBox; - cb_Amiga_pubw: TCheckBox; - cb_Amiga_pubr: TCheckBox; - cb_Amiga_pubd: TCheckBox; - cb_Amiga_pube: TCheckBox; DOSAttributeLabel: TLabel; - cb_DOS_archive: TCheckBox; DOSAttrPanel: TPanel; CancelDragDrop: TAction; - cb_AFS_ownl: TCheckBox; - cb_DOS_system: TCheckBox; - cb_AFS_ownr: TCheckBox; - cb_DOS_read: TCheckBox; - cb_AFS_ownw: TCheckBox; - cb_DOS_hidden: TCheckBox; - cb_AFS_pubr: TCheckBox; - cb_AFS_pubw: TCheckBox; menuFixADFS: TMenuItem; menuDefrag: TMenuItem; menuChangeInterleave: TMenuItem; @@ -101,18 +76,44 @@ TMainForm = class(TForm) MiscAttrLabelAmiga: TLabel; PubAttrLabelAmiga: TLabel; HoverTimer: TTimer; - ToolBarContainer: TCoolBar; + ImageToolBarPage: TTabSheet; + FIlesToolBarPage: TTabSheet; + PartitionToolBarPage: TTabSheet; + btn_FixADFS: TToolButton; + btn_ChangeInterleave: TToolButton; + btn_Defrag: TToolButton; + btn_Settings: TToolButton; + btn_About: TToolButton; + ToolsToolBar: TToolBar; + ToolsToolBarPage: TTabSheet; + ImageToolBar: TToolBar; FilesToolBar: TToolBar; + PartitionToolBar: TToolBar; menuImage: TMenuItem; menuFiles: TMenuItem; menuTools: TMenuItem; menuPartition: TMenuItem; - btn_AddPartition: TToolButton; - btn_ChangeInterleave: TToolButton; - btn_Defrag: TToolButton; + ToolBarContainer: TPageControl; + btn_NewImage: TToolButton; + btn_OpenImage: TToolButton; + btn_CloseImage: TToolButton; + btn_SaveImage: TToolButton; + btn_SaveAsCSV: TToolButton; + btn_ImageDetails: TToolButton; + btn_FileSearch: TToolButton; btn_ShowReport: TToolButton; - ToolsToolBar: TToolBar; - PartitionToolBar: TToolBar; + btn_download: TToolButton; + btn_AddFiles: TToolButton; + btn_Rename: TToolButton; + btn_HexDump: TToolButton; + btn_NewDirectory: TToolButton; + btn_Delete: TToolButton; + btn_DuplicateFile: TToolButton; + btn_AddPassword: TToolButton; + btn_EditPassword: TToolButton; + btn_SavePartition: TToolButton; + btn_DeletePartition: TToolButton; + btn_AddPartition: TToolButton; DuplicateFile1: TMenuItem; IyonixTextureTile: TImage; menuAddPasswordFile: TMenuItem; @@ -122,7 +123,6 @@ TMainForm = class(TForm) menuViewStatus: TMenuItem; menuViewToolBar: TMenuItem; TextureTiles: TPanel; - ImageToolBar: TToolBar; ViewMenu: TMenuItem; menuSavePartition: TMenuItem; menuDeletePartition: TMenuItem; @@ -136,17 +136,6 @@ TMainForm = class(TForm) PasteFromClipboard: TAction; CopyToClipboard: TAction; KeyboardShortcuts: TActionList; - cb_C64_c: TCheckBox; - cb_C64_l: TCheckBox; - cb_DFS_l: TCheckBox; - cb_ADFS_pubp: TCheckBox; - cb_ADFS_ownw: TCheckBox; - cb_ADFS_ownr: TCheckBox; - cb_ADFS_ownl: TCheckBox; - cb_ADFS_owne: TCheckBox; - cb_ADFS_pubr: TCheckBox; - cb_ADFS_pubw: TCheckBox; - cb_ADFS_pube: TCheckBox; C64AttributeLabel: TLabel; ed_timestamp: TDateTimePicker; ed_loadaddr: TEdit; @@ -172,12 +161,6 @@ TMainForm = class(TForm) DirTitlePanel: TPanel; LocationPanel: TPanel; CRC32Panel: TPanel; - btn_Settings: TToolButton; - btn_DuplicateFile: TToolButton; - btn_AddPassword: TToolButton; - btn_EditPassword: TToolButton; - btn_DeletePartition: TToolButton; - btn_SavePartition: TToolButton; ToolSplitter: TSplitter; TimeStampPanel: TPanel; ParentPanel: TPanel; @@ -194,7 +177,6 @@ TMainForm = class(TForm) HexDumpMenu: TMenuItem; HexDump1: TMenuItem; menuHexDump: TMenuItem; - btn_FileSearch: TToolButton; menuSaveAsCSV: TMenuItem; menuRenameFile: TMenuItem; menuNewDir: TMenuItem; @@ -212,20 +194,6 @@ TMainForm = class(TForm) ToolBarImages: TImageList; AddNewFile: TOpenDialog; SaveImage: TSaveDialog; - btn_OpenImage: TToolButton; - btn_SaveImage: TToolButton; - btn_Delete: TToolButton; - btn_Rename: TToolButton; - btn_AddFiles: TToolButton; - btn_NewImage: TToolButton; - btn_ImageDetails: TToolButton; - btn_NewDirectory: TToolButton; - btn_CloseImage: TToolButton; - btn_SaveAsCSV: TToolButton; - btn_FixADFS: TToolButton; - btn_HexDump: TToolButton; - btn_download: TToolButton; - btn_About: TToolButton; OpenImageFile: TOpenDialog; DirList: TTreeView; FileInfoPanel: TPanel; @@ -256,6 +224,43 @@ TMainForm = class(TForm) ImageDetails: TStatusBar; AddFile1: TMenuItem; NewDirectory1: TMenuItem; + //Dynamically created tickboxes + cb_C64_c, //Commodore 64 + cb_C64_l, + cb_DFS_l, //Acorn DFS + cb_ADFS_pubp, //Acorn ADFS + cb_ADFS_ownw, + cb_ADFS_ownr, + cb_ADFS_ownl, + cb_ADFS_owne, + cb_ADFS_pubr, + cb_ADFS_pubw, + cb_ADFS_pube, + cb_AFS_ownl, //Acorn FS + cb_AFS_ownr, + cb_AFS_ownw, + cb_AFS_pubr, + cb_AFS_pubw, + cb_DOS_system, //DOS + cb_DOS_read, + cb_DOS_hidden, + cb_DOS_archive, + cb_Amiga_othd, //Amiga + cb_Amiga_arch, + cb_Amiga_othe, + cb_Amiga_pure, + cb_Amiga_hold, + cb_Amiga_scri, + cb_Amiga_ownr, + cb_Amiga_othr, + cb_Amiga_ownw, + cb_Amiga_owne, + cb_Amiga_ownd, + cb_Amiga_othw, + cb_Amiga_pubw, + cb_Amiga_pubr, + cb_Amiga_pubd, + cb_Amiga_pube: TGJHTickBox; //Events - mouse clicks procedure btn_AddPartitionClick(Sender: TObject); procedure btn_AddPasswordClick(Sender: TObject); @@ -359,9 +364,12 @@ TMainForm = class(TForm) function AskConfirm(confim,okbtn,cancelbtn,ignorebtn: String): TModalResult; procedure CloseAllHexDumps; function ConvertToKMG(size: Int64): String; + function CreateButton(Lparent: TControl; Lcaption: String;LDef: Boolean; + LLeft,LTop: Integer; LModal: TModalResult): TGJHButton; function CreateDirectory(dirname,attr: String): TTreeNode; procedure CreateFileTypeDialogue; procedure CreateINFFile(dir,entry: Integer; path: String;filename: String=''); + procedure CreateRootInf(filename: String; dir: Integer); procedure Defrag(side: Byte); procedure DeleteFile(confirm: Boolean); procedure DisableControls; @@ -390,6 +398,7 @@ TMainForm = class(TForm) procedure ReportError(error: String); procedure ResetFileFields; procedure SaveConfigSettings; + procedure Scaling; procedure SelectNode(filename: String;casesens:Boolean=True); procedure ShowErrorLog; procedure ShowInfo(info: String); @@ -471,6 +480,7 @@ TMainForm = class(TForm) arch :String; //Registry DIMReg :TGJHRegistry; + AppIsClosing :Boolean; const //These point to certain icons used when no filetype is found, or non-ADFS //The numbers are indexes into the TImageList component 'FileImages'. @@ -564,7 +574,6 @@ TMainForm = class(TForm) //Current platform and architecture (compile time directive) TargetOS = {$I %FPCTARGETOS%}; TargetCPU = {$I %FPCTARGETCPU%}; - procedure AfterConstruction; override; end; var @@ -580,39 +589,6 @@ implementation PWordEditorUnit,AFSPartitionUnit,ChangeInterleaveUnit,CSVPrefUnit, ImageReportUnit; -{------------------------------------------------------------------------------} -//Rescale the form -{------------------------------------------------------------------------------} -procedure TMainForm.AfterConstruction; -var - i,ppi: Integer; - ratio: Real; -begin - inherited; - ppi:=Screen.PixelsPerInch;//Can use TMonitor.PixelsPerInch to scale to a big monitor - if ppi<>DesignedDPI then - begin - ratio:=ppi/DesignedDPI; - //Status Bar - ImageDetails.Height :=Round(ImageDetails.Height*ratio); - ImageDetails.Panels[0].Width :=ImageDetails.Height; - for i:=0 to -1+ImageDetails.Panels.Count do - ImageDetails.Panels[i].Width :=Round(ImageDetails.Panels[i].Width*ratio); - //Tool bars - ImageToolBar.ImagesWidth :=Round(ImageToolBar.ImagesWidth*ratio); - FilesToolBar.ImagesWidth :=Round(FilesToolBar.ImagesWidth*ratio); - PartitionToolBar.ImagesWidth :=Round(PartitionToolBar.ImagesWidth*ratio); - ToolsToolBar.ImagesWidth :=Round(ToolsToolBar.ImagesWidth*ratio); - //Toolbar bands - ToolBarContainer.Bands[0].Width:=ImageToolBar.Width+Round(14*ratio); - ToolBarContainer.Bands[1].Width:=FilesToolBar.Width+Round(14*ratio); - ToolBarContainer.Bands[2].Width:=PartitionToolBar.Width+Round(14*ratio); - ToolBarContainer.Bands[3].Width:=ToolsToolBar.Width+Round(14*ratio); - //Directory Listing - DirList.ImagesWidth :=Round(DirList.ImagesWidth*ratio); - end; -end; - {------------------------------------------------------------------------------} //Add a new file to the disc image {------------------------------------------------------------------------------} @@ -644,12 +620,16 @@ procedure TMainForm.AddDirectoryToImage(dirname: String); NewNode : TTreeNode; inffile, attr, + dirtitle, + disctitle, importname : String; F : TFileStream; chr : Char; fields : array of String; Dir : TSearchRec; + Index : Integer; begin + //Need to make this compatible with AmigaDOS too. ***************************** Image.ProgressIndicator:=nil; ProgressForm.Show; //First, if there is no selection, make one, or if multiple, select the root @@ -664,6 +644,8 @@ procedure TMainForm.AddDirectoryToImage(dirname: String); begin importname:=ExtractFilename(dirname); attr :='DLR'; + disctitle :=''; + dirtitle :=''; //Is there an inf file? if FileExists(dirname+'.inf') then begin @@ -677,14 +659,43 @@ procedure TMainForm.AddDirectoryToImage(dirname: String); F.Free; fields:=BreakDownInf(inffile); //Then extract the fields - if Length(fields)>0 then importname:=fields[0]; - if Length(fields)>4 then attr :=fields[4]; + if Length(fields)>0 then importname:=fields[0];//Filename + if Length(fields)>1 then + for Index:=0 to Length(fields)-1 do + begin + //Get the tagged fields + if LeftStr(fields[Index],4)='OPT=' then + Image.UpdateBootOption(StrToIntDef(RightStr(fields[Index],2),0) + ,Image.Disc[TMyTreeNode(OriginalNode).DirRef].Partition); + if LeftStr(fields[Index],9)='DIRTITLE=' then + dirtitle:=Copy(fields[Index],10); + if LeftStr(fields[Index],6)='TITLE=' then //Can be disc or dir title + if importname='$' then //If root, it will be disc title + disctitle:=Copy(fields[Index],7) + else //Otherwise it will be dir title + dirtitle:=Copy(fields[Index],7); + end; + if Length(fields)>4 then attr:=fields[4];//Attributes + //Convert the attributes from hex to letters, if necessary + attr:=GetAttributes(attr,Image.MajorFormatNumber); + //Remove any quotes from the titles + if Length(dirtitle)>1 then + if(dirtitle[1]='"')and(dirtitle[Length(dirtitle)]='"')then + dirtitle:=Copy(dirtitle,2,Length(dirtitle)-2); + if Length(disctitle)>1 then + if(disctitle[1]='"')and(disctitle[Length(disctitle)]='"')then + disctitle:=Copy(disctitle,2,Length(disctitle)-2); + //Update the disc title, only on the root + if(disctitle<>'')and(importname='$')then + Image.UpdateDiscTitle(LeftStr(disctitle,10) + ,Image.Disc[TMyTreeNode(OriginalNode).DirRef].Partition); except //Could not load end; end; //Convert a Windows filename to a BBC filename - WinToBBC(importname); + if(TMyTreeNode(OriginalNode).Parent=nil) + and(importname=OriginalNode.Text)then else WinToBBC(importname); //Remove spaces for non-big directories, and ensure is 10 chars or less if Image.DirectoryType<>2 then begin @@ -692,12 +703,25 @@ procedure TMainForm.AddDirectoryToImage(dirname: String); importname:=LeftStr(importname,10); end; //Create the directory - NewNode:=CreateDirectory(importname,attr); + if importname<>'$' then + NewNode:=CreateDirectory(importname,attr) + else + NewNode:=OriginalNode; if NewNode<>nil then //Success begin //And select it DirList.ClearSelection; NewNode.Selected:=True; + //Update the directory title + if dirtitle<>'' then + if(TMyTreeNode(NewNode).DirRef>=0) + and(TMyTreeNode(NewNode).DirRef=0 then + disctitle:=Image.GetParent(TMyTreeNode(NewNode).DirRef) + else disctitle:=importname; + Image.RetitleDirectory(disctitle,dirtitle); + end; //Now we import everything inside this FindFirst(dirname+pathdelim+'*',faDirectory,Dir); repeat @@ -1338,6 +1362,7 @@ procedure TMainForm.ExtractFiles(ShowDialogue: Boolean); if(saver)and(selectroot)then //Root was selected, so create the directory begin CreateDir(SaveImage.FileName); + CreateRootInf(SaveImage.FileName,Image.Disc[dir].Partition); SaveImage.Filename:=SaveImage.Filename+PathDelim+'root'; end; end; @@ -1458,6 +1483,7 @@ procedure TMainForm.DownLoadFile(dir,entry: Integer;path: String;filename: Strin procedure TMainForm.CreateINFFile(dir,entry: Integer; path: String;filename: String=''); var F : TFileStream; + title, inffile, imagefilename, windowsfilename: String; @@ -1506,6 +1532,13 @@ procedure TMainForm.CreateINFFile(dir,entry: Integer; path: String;filename: Str Image.GetDirSep(Image.Disc[dir].Partition)+ Image.Disc[dir].Entries[entry].Filename, entry); + //Directory? + if Image.Disc[dir].Entries[entry].DirRef<>-1 then + begin + title:=Image.Disc[Image.Disc[dir].Entries[entry].DirRef].Title; + if Pos(' ',title)>0 then title:='"'+title+'"'; + inffile:=inffile+' DIRTITLE='+PadRight(LeftStr(title,21),21); + end; //Create the inf file try F:=TFileStream.Create(path+windowsfilename+'.inf',fmCreate OR fmShareDenyNone); @@ -1519,6 +1552,35 @@ procedure TMainForm.CreateINFFile(dir,entry: Integer; path: String;filename: Str end; end; +{------------------------------------------------------------------------------} +//Create an inf file for a root +{------------------------------------------------------------------------------} +procedure TMainForm.CreateRootInf(filename: String; dir: Integer); +var + F : TFileStream; + title, + dirtitle, + inffile : String; +begin + title:=Image.Title(Image.Disc[dir].Partition); + if Pos(' ',title)>0 then title:='"'+title+'"'; + dirtitle:=Image.Disc[dir].Title; + if Pos(' ',dirtitle)>0 then dirtitle:='"'+dirtitle+'"'; + inffile:=PadRight(LeftStr(Image.Disc[dir].Directory,12),12) + +' OPT='+IntToHex(Image.BootOpt[Image.Disc[dir].Partition],2) + +' TITLE='+PadRight(LeftStr(title,12),12) + +' DIRTITLE='+PadRight(LeftStr(dirtitle,21),21); + //Create the inf file + try + F:=TFileStream.Create(filename+'.inf',fmCreate OR fmShareDenyNone); + F.Position:=0; + F.Write(inffile[1],Length(inffile)); + F.Free; + except + //Could not create + end; +end; + {------------------------------------------------------------------------------} //Download an entire directory {------------------------------------------------------------------------------} @@ -1773,7 +1835,7 @@ procedure TMainForm.AddImageToTree(Tree: TTreeView;ImageToUse: TDiscImage); //Finished on this directory structure, so increase the highdir inc(highdir); //and continue until we have everything on the disc. This will, in effect, - //add the second root for double sided discs. + //add the roots for multi-partition images. until highdir=Length(ImageToUse.Disc); TMyTreeNode(Tree.Items[0]).ParentDir:=-1; //Expand the top level of the tree (but not MMB) @@ -1810,6 +1872,7 @@ procedure TMainForm.UpdateImageInfo(partition: Cardinal=0); ImageDetails.Panels[1].Text:=Image.FormatString; //Disc name title:=Image.Title(partition); + if title='' then title:=' '; RemoveTopBit(title);//Ensure top bit not set ImageDetails.Panels[2].Text:=title; if(lb_title.Visible)and(DirTitleLabel.Caption='Disc Title')then @@ -1865,12 +1928,12 @@ procedure ArrangeComponent(c,p: TControl;l: TLabel); if DirList.SelectionCount=1 then begin //And it is not the root - if DirList.Selected.Parent<>nil then + if DirList.Selections[0].Parent<>nil then begin //Set the flag to show the attributes attr:=True; //And make a note of the AFS and DOS flags, for ADFS - dir:=TMyTreeNode(DirList.Selected.Parent).DirRef; //Directory reference of the parent + dir:=TMyTreeNode(DirList.Selections[0].Parent).DirRef; //Directory reference of the parent if(dir>=0)and(dir0; + cb_DFS_l.Ticked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; //ADFS and SparkFS if((Image.MajorFormatNumber=diAcornADFS) or(Image.MajorFormatNumber=diSpark)) and(not afspart)and(not dospart)then begin //Tick/untick them - cb_ADFS_ownw.Checked:=Pos('W',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_ownr.Checked:=Pos('R',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_ownl.Checked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_owne.Checked:=Pos('E',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_pubw.Checked:=Pos('w',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_pubr.Checked:=Pos('r',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_pube.Checked:=Pos('e',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_ADFS_pubp.Checked:=Pos('P',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_ownw.Ticked:=Pos('W',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_ownr.Ticked:=Pos('R',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_ownl.Ticked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_owne.Ticked:=Pos('E',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_pubw.Ticked:=Pos('w',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_pubr.Ticked:=Pos('r',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_pube.Ticked:=Pos('e',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_ADFS_pubp.Ticked:=Pos('P',Image.Disc[dir].Entries[entry].Attributes)>0; end; //Acorn FS if(Image.MajorFormatNumber=diAcornFS) @@ -2312,11 +2375,11 @@ procedure TMainForm.DirListChange(Sender: TObject; Node: TTreeNode); and(afspart))then begin //Tick/untick them - cb_AFS_ownw.Checked:=Pos('W',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_AFS_ownr.Checked:=Pos('R',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_AFS_ownl.Checked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_AFS_pubw.Checked:=Pos('w',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_AFS_pubr.Checked:=Pos('r',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_AFS_ownw.Ticked:=Pos('W',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_AFS_ownr.Ticked:=Pos('R',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_AFS_ownl.Ticked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_AFS_pubw.Ticked:=Pos('w',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_AFS_pubr.Ticked:=Pos('r',Image.Disc[dir].Entries[entry].Attributes)>0; end; //DOS Plus if(Image.MajorFormatNumber=diDOSPlus) @@ -2324,38 +2387,38 @@ procedure TMainForm.DirListChange(Sender: TObject; Node: TTreeNode); and(dospart))then begin //Tick/untick them - cb_DOS_hidden.Checked :=Pos('H',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_DOS_read.Checked :=Pos('R',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_DOS_system.Checked :=Pos('S',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_DOS_archive.Checked:=Pos('A',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_DOS_hidden.Ticked :=Pos('H',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_DOS_read.Ticked :=Pos('R',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_DOS_system.Ticked :=Pos('S',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_DOS_archive.Ticked:=Pos('A',Image.Disc[dir].Entries[entry].Attributes)>0; end; //Commodore 64 if Image.MajorFormatNumber=diCommodore then begin //Tick/untick them - cb_C64_l.Checked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_C64_c.Checked:=Pos('C',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_C64_l.Ticked:=Pos('L',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_C64_c.Ticked:=Pos('C',Image.Disc[dir].Entries[entry].Attributes)>0; end; //Amiga if Image.MajorFormatNumber=diAmiga then begin //Tick/untick them - cb_Amiga_ownw.Checked:=Pos('W',Image.Disc[dir].Entries[entry].Attributes)=0; - cb_Amiga_ownr.Checked:=Pos('R',Image.Disc[dir].Entries[entry].Attributes)=0; - cb_Amiga_ownd.Checked:=Pos('D',Image.Disc[dir].Entries[entry].Attributes)=0; - cb_Amiga_owne.Checked:=Pos('E',Image.Disc[dir].Entries[entry].Attributes)=0; - cb_Amiga_pubw.Checked:=Pos('w',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_pubr.Checked:=Pos('r',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_pubd.Checked:=Pos('d',Image.Disc[dir].Entries[entry].Attributes)=0; - cb_Amiga_pube.Checked:=Pos('e',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_othw.Checked:=Pos('i',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_othr.Checked:=Pos('a',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_othd.Checked:=Pos('l',Image.Disc[dir].Entries[entry].Attributes)=0; - cb_Amiga_othe.Checked:=Pos('x',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_arch.Checked:=Pos('A',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_pure.Checked:=Pos('P',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_scri.Checked:=Pos('S',Image.Disc[dir].Entries[entry].Attributes)>0; - cb_Amiga_hold.Checked:=Pos('H',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_ownw.Ticked:=Pos('W',Image.Disc[dir].Entries[entry].Attributes)=0; + cb_Amiga_ownr.Ticked:=Pos('R',Image.Disc[dir].Entries[entry].Attributes)=0; + cb_Amiga_ownd.Ticked:=Pos('D',Image.Disc[dir].Entries[entry].Attributes)=0; + cb_Amiga_owne.Ticked:=Pos('E',Image.Disc[dir].Entries[entry].Attributes)=0; + cb_Amiga_pubw.Ticked:=Pos('w',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_pubr.Ticked:=Pos('r',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_pubd.Ticked:=Pos('d',Image.Disc[dir].Entries[entry].Attributes)=0; + cb_Amiga_pube.Ticked:=Pos('e',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_othw.Ticked:=Pos('i',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_othr.Ticked:=Pos('a',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_othd.Ticked:=Pos('l',Image.Disc[dir].Entries[entry].Attributes)=0; + cb_Amiga_othe.Ticked:=Pos('x',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_arch.Ticked:=Pos('A',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_pure.Ticked:=Pos('P',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_scri.Ticked:=Pos('S',Image.Disc[dir].Entries[entry].Attributes)>0; + cb_Amiga_hold.Ticked:=Pos('H',Image.Disc[dir].Entries[entry].Attributes)>0; end; DoNotUpdate :=False; //Re-enable the event firing //Filetype @@ -2411,6 +2474,7 @@ procedure TMainForm.DirListChange(Sender: TObject; Node: TTreeNode); //Title of the subdirectory title:=Image.Disc[Image.Disc[dir].Entries[entry].DirRef].Title; RemoveTopBit(title); + if title='' then title:=' '; DirTitleLabel.Caption:='Directory Title'; lb_title.Caption:=title; ed_title.Enabled:=True; //Can be edited @@ -2422,7 +2486,11 @@ procedure TMainForm.DirListChange(Sender: TObject; Node: TTreeNode); filetype:='Root Directory'; title:=Image.Disc[dr].Title; RemoveTopBit(title); - DirTitleLabel.Caption:='Disc Title';//Also see UpdateImageInfo + if title='' then title:=' '; + if Image.MajorFormatNumber=diAcornADFS then + DirTitleLabel.Caption:='Directory Title' + else + DirTitleLabel.Caption:='Disc Name';//Also see UpdateImageInfo lb_title.Caption:=title; //Title ed_title.Enabled:=True; //Can be edited //Report if directory is broken and include the error code @@ -2595,6 +2663,7 @@ procedure TMainForm.DirListChange(Sender: TObject; Node: TTreeNode); {------------------------------------------------------------------------------} procedure TMainForm.DirListGetImageIndex(Sender: TObject; Node: TTreeNode); begin + WriteToDebug('DirListGetImageIndex'); SetImageIndex(Node,Image); end; @@ -2610,6 +2679,11 @@ function TMainForm.GetImageIndex(Node: TTreeNode;ImageToUse: TDiscImage): Intege afspart, dospart : Boolean; begin + Result:=0; + if AppIsClosing then exit; + if(not Assigned(ImageToUse))or(ImageToUse=nil)then exit; + if(not Assigned(ImageToUse.Disc))or(ImageToUse.Disc=nil)then exit; + if Node=nil then exit; filetype:=''; WriteToDebug('Image index for '+Node.Text+' requested'); //The directory and entry references, as always @@ -2714,6 +2788,7 @@ procedure TMainForm.SetImageIndex(Node: TTreeNode;ImageToUse: TDiscImage); var ft: Integer; begin + WriteToDebug('SetImageIndex'); //Tell the system what the ImageList reference is ft:=GetImageIndex(Node,ImageToUse); Node.ImageIndex:=ft; @@ -2748,6 +2823,7 @@ procedure TMainForm.FormShow(Sender: TObject); var i: Integer; begin + Scaling; //Keep the application open KeepOpen:=True; //Initial width and height of form @@ -2771,16 +2847,16 @@ procedure TMainForm.FormShow(Sender: TObject); ImageDetails.Visible:=menuViewStatus.Checked; //Image Toolbar menuImage.Checked:=ViewOptions AND $10=$10; - ToolBarContainer.Bands[0].Visible:=menuImage.Checked; + ImageToolBarPage.TabVisible:=menuImage.Checked; //Files Toolbar menuFiles.Checked:=ViewOptions AND $20=$20; - ToolBarContainer.Bands[1].Visible:=menuFiles.Checked; + FilesToolBarPage.TabVisible:=menuFiles.Checked; //Partition Toolbar menuPartition.Checked:=ViewOptions AND $40=$40; - ToolBarContainer.Bands[2].Visible:=menuPartition.Checked; + PartitionToolBarPage.TabVisible:=menuPartition.Checked; //Tools Toolbar menuTools.Checked:=ViewOptions AND $80=$80; - ToolBarContainer.Bands[3].Visible:=menuTools.Checked; + ToolsToolBarPage.TabVisible:=menuTools.Checked; //Reset the tracking variables PathBeforeEdit :=''; NameBeforeEdit :=''; @@ -2895,6 +2971,7 @@ procedure TMainForm.ParseCommandLine(cmd: String); $120 ,$130 ,$140 ,$150 ,$160 ,$170 ,$200 ,$210 ,$220 ,$400, $410 ,$500 ,$A00 ,$A01 ,$A02 ,$A03 ,$A04 ,$A05); begin + WriteToDebug('Command Line: '+cmd); SetLength(fields,0); //Collate the parameters option:=cmd; @@ -3258,23 +3335,123 @@ procedure TMainForm.ParseCommandLine(cmd: String); KeepOpen:=True; end; +{------------------------------------------------------------------------------} +//Rescale all the components +{------------------------------------------------------------------------------} +procedure TMainForm.Scaling; +var + ppi : Integer; + ratio: Real; +begin + //Scaling for large DPI + ppi:=Screen.PixelsPerInch;//Can use TMonitor.PixelsPerInch to scale to a big monitor + ratio:=ppi/DesignedDPI; + //Form Size + Width:=Round(745*ratio); + Height:=Round(599*ratio); + //Status Bar + //ImageDetails.Height :=Round( 18*ratio); + ImageDetails.Panels[0].Width :=ImageDetails.Height;//Round( 20*ratio); + ImageDetails.Panels[1].Width :=Round(175*ratio); + ImageDetails.Panels[2].Width :=Round(150*ratio); + ImageDetails.Panels[3].Width :=Round(200*ratio); + ImageDetails.Panels[4].Width :=Round(200*ratio); + ImageDetails.Panels[5].Width :=Round(100*ratio); + ImageDetails.Panels[6].Width :=Round(100*ratio); + ImageDetails.Panels[7].Width :=Round(130*ratio); + ImageDetails.Panels[8].Width :=Round( 50*ratio); + //Directory Listing + DirList.ImagesWidth :=Round( 17*ratio); + //Toolbars + ImageToolBar.ImagesWidth :=Round( 32*ratio); + ImageToolBar.ButtonHeight :=Round( 32*ratio); + ImageToolBar.ButtonWidth :=Round( 32*ratio); + FilesToolBar.ImagesWidth :=Round( 32*ratio); + FilesToolBar.ButtonHeight :=Round( 32*ratio); + FilesToolBar.ButtonWidth :=Round( 32*ratio); + PartitionToolBar.ImagesWidth :=Round( 32*ratio); + PartitionToolBar.ButtonHeight :=Round( 32*ratio); + PartitionToolBar.ButtonWidth :=Round( 32*ratio); + ToolsToolBar.ImagesWidth :=Round( 32*ratio); + ToolsToolBar.ButtonHeight :=Round( 32*ratio); + ToolsToolBar.ButtonWidth :=Round( 32*ratio); + //File Info Panel + FileInfoPanel.Width :=Round(355*ratio); +end; + {------------------------------------------------------------------------------} //This is called when the form is created - i.e. when the application is created {------------------------------------------------------------------------------} procedure TMainForm.FormCreate(Sender: TObject); + function CreateTickBox(LCaption: String; LParent: TPanel): TGJHTickBox; + begin + Result:=TGJHTickBox.Create(LParent as TComponent); + Result.Parent:=LParent as TWinControl; + Result.Visible:=True; + Result.Font.Name:='Courier New'; + Result.Font.Style:=[fsBold]; + Result.Caption:=LCaption; + Result.OnClick:=@AttributeChangeClick; + end; begin + AppIsClosing:=False; + //Default Toolbar + ToolBarContainer.ActivePage:=ImageToolBarPage; + //Create the attribute panel tick boxes (ADFS) + cb_ADFS_ownw:=CreateTickBox('Write',ADFSAttrPanel); + cb_ADFS_ownr:=CreateTickBox('Read',ADFSAttrPanel); + cb_ADFS_ownl:=CreateTickBox('Locked',ADFSAttrPanel); + cb_ADFS_owne:=CreateTickBox('Execute',ADFSAttrPanel); + cb_ADFS_pubw:=CreateTickBox('Write',ADFSAttrPanel); + cb_ADFS_pubr:=CreateTickBox('Read',ADFSAttrPanel); + cb_ADFS_pubp:=CreateTickBox('Private',ADFSAttrPanel); + cb_ADFS_pube:=CreateTickBox('Execute',ADFSAttrPanel); + //Create the attribute panel tick boxes (DFS) + cb_DFS_l:=CreateTickBox('Locked',DFSAttrPanel); + //Create the attribute panel tick boxes (C64) + cb_C64_c:=CreateTickBox('Closed',C64AttrPanel); + cb_C64_l:=CreateTickBox('Locked',C64AttrPanel); + //Create the attribute panel tick boxes (AFS) + cb_AFS_ownw:=CreateTickBox('Write',AFSAttrPanel); + cb_AFS_ownr:=CreateTickBox('Read',AFSAttrPanel); + cb_AFS_ownl:=CreateTickBox('Locked',AFSAttrPanel); + cb_AFS_pubr:=CreateTickBox('Read',AFSAttrPanel); + cb_AFS_pubw:=CreateTickBox('Write',AFSAttrPanel); + //Create the attribute panel tick boxes (DOS) + cb_DOS_hidden:=CreateTickBox('Hidden',DOSAttrPanel); + cb_DOS_read:=CreateTickBox('Read',DOSAttrPanel); + cb_DOS_system:=CreateTickBox('System',DOSAttrPanel); + cb_DOS_archive:=CreateTickBox('Archive',DOSAttrPanel); + //Create the attribute panel tick boxes (Amiga) + cb_Amiga_ownw:=CreateTickBox('Write',AmigaAttrPanel); + cb_Amiga_ownr:=CreateTickBox('Read',AmigaAttrPanel); + cb_Amiga_ownd:=CreateTickBox('Delete',AmigaAttrPanel); + cb_Amiga_owne:=CreateTickBox('Execute',AmigaAttrPanel); + cb_Amiga_pubw:=CreateTickBox('Write',AmigaAttrPanel); + cb_Amiga_pubr:=CreateTickBox('Read',AmigaAttrPanel); + cb_Amiga_pubd:=CreateTickBox('Delete',AmigaAttrPanel); + cb_Amiga_pube:=CreateTickBox('Execute',AmigaAttrPanel); + cb_Amiga_othw:=CreateTickBox('Write',AmigaAttrPanel); + cb_Amiga_othr:=CreateTickBox('Read',AmigaAttrPanel); + cb_Amiga_othd:=CreateTickBox('Delete',AmigaAttrPanel); + cb_Amiga_othe:=CreateTickBox('Execute',AmigaAttrPanel); + cb_Amiga_hold:=CreateTickBox('Hold',AmigaAttrPanel); + cb_Amiga_scri:=CreateTickBox('Script',AmigaAttrPanel); + cb_Amiga_pure:=CreateTickBox('Pure',AmigaAttrPanel); + cb_Amiga_arch:=CreateTickBox('Archived',AmigaAttrPanel); + //Platform Details platform:='OS?'; arch:='CPU?'; //Platform details - OS - if TargetOS='Darwin' then platform:= 'macOS'; //Apple Mac OS X + if TargetOS='Darwin' then {%H-}platform:= 'macOS'; //Apple Mac OS X if(TargetOS='Win64') - or(TargetOS='Win32') then platform:= 'Windows'; //Microsoft Windows - if TargetOS='Linux' then platform:= 'Linux'; //Linux + or(TargetOS='Win32') then {%H-}platform:= 'Windows'; //Microsoft Windows + if TargetOS='Linux' then {%H-}platform:= 'Linux'; //Linux //Platform details - CPU - if TargetCPU='aarch64' then arch := 'ARM 64 bit'; - if TargetCPU='arm' then arch := 'ARM 32 bit'; - if TargetCPU='i386' then arch := 'Intel 32 bit'; - if TargetCPU='x86_64' then arch := 'Intel 64 bit'; + if TargetCPU='aarch64' then {%H-}arch := 'ARM 64 bit'; + if TargetCPU='arm' then {%H-}arch := 'ARM 32 bit'; + if TargetCPU='i386' then {%H-}arch := 'Intel 32 bit'; + if TargetCPU='x86_64' then {%H-}arch := 'Intel 64 bit'; //Just updates the title bar Caption:=ApplicationTitle; //Create the image instance @@ -3442,6 +3619,7 @@ function TMainForm.QueryUnsaved: Boolean; Result:=True; if HasChanged then begin + WriteToDebug('Close unsaved file requested'); Result:=AskConfirm('You have unsaved changes. Do you wish to continue?', 'Yes','No','')=mrOK; end; @@ -3452,7 +3630,9 @@ function TMainForm.QueryUnsaved: Boolean; {------------------------------------------------------------------------------} procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean); begin + WriteToDebug('Application close requested'); CanClose:=QueryUnsaved; + AppIsClosing:=CanClose; end; {------------------------------------------------------------------------------} @@ -3853,6 +4033,8 @@ procedure TMainForm.ImportFiles(NewImage: TDiscImage;Dialogue: Boolean=True); ProgressForm.Hide; end; end; + //Clear the Import Selector Form List, otherwise this could cause issues later + ImportSelectorForm.ImportDirList.Items.Clear; end; {------------------------------------------------------------------------------} @@ -3946,6 +4128,7 @@ procedure TMainForm.SwapLabelEdit(editcont:TEdit;labelcont:TLabel;dir,hex:Boolea begin //Then show it editcont.Visible :=True; edittext:=labelcont.Caption; + if edittext=' ' then edittext:=''; //For hex number, remove the intial '0x' if(hex)and(LeftStr(edittext,2)='0x')then edittext:=Copy(edittext,3); editcont.Text :=edittext; @@ -3984,9 +4167,9 @@ procedure TMainForm.ShowHideToolbar(Sender: TObject); TMenuItem(Sender).Checked:=not TMenuItem(Sender).Checked; //Make the appropriate element visible or not case Item of - 0 : FileInfoPanel.Visible :=TMenuItem(Sender).Checked; - 1 : ImageDetails.Visible :=TMenuItem(Sender).Checked; - 4,5,6,7: ToolBarContainer.Bands[Item-4].Visible:=TMenuItem(Sender).Checked; + 0 : FileInfoPanel.Visible :=TMenuItem(Sender).Checked; + 1 : ImageDetails.Visible :=TMenuItem(Sender).Checked; + 4,5,6,7: ToolBarContainer.Page[Item-4].TabVisible:=TMenuItem(Sender).Checked; end; //And the tool splitter, if the file info panel is visible or not ToolSplitter.Visible:=FileInfoPanel.Visible; @@ -4214,6 +4397,7 @@ procedure TMainForm.btn_ImageDetailsClick(Sender: TObject); titles : array[0..1] of TEdit; boots : array[0..1] of TComboBox; bootlbs : array[0..1] of TLabel; + partstr, title : String; numsides, skip : Byte; @@ -4270,7 +4454,7 @@ procedure TMainForm.btn_ImageDetailsClick(Sender: TObject); end; //Logo t:=ImageDetailForm.DirPanel.Top+ImageDetailForm.DirPanel.Height; - s:=ImageDetailForm.OKBtnBack.Top-t; + s:=ImageDetailForm.btn_OK.Top-t; //Centralise vertical ImageDetailForm.AcornLogo.Top :=t+((s-ImageDetailForm.AcornLogo.Height)div 2); ImageDetailForm.CommodoreLogo.Top:=ImageDetailForm.AcornLogo.Top; @@ -4310,9 +4494,9 @@ procedure TMainForm.btn_ImageDetailsClick(Sender: TObject); end; //Should we label the top box? if Image.DoubleSided then - ImageDetailForm.pnSide0.Caption:='Side 0' + ImageDetailForm.pnSide0Caption.Caption:=' Side 0 Details' else - ImageDetailForm.pnSide0.Caption:=''; + ImageDetailForm.pnSide0Caption.Caption:=' Side Details'; //How many sides numsides:=Length(Image.FreeSpaceMap); //Show the Free Space Map graphic @@ -4336,13 +4520,17 @@ procedure TMainForm.btn_ImageDetailsClick(Sender: TObject); //Position it FSMlabel[side].Top:=0; FSMlabel[side].Left:=4+(204*side); + //Style it + FSMlabel[side].Color:=$777777; + FSMlabel[side].Font.Color:=$FFFFFF; + FSMlabel[side].Font.Style:=[fsBold]; //We'll stretch it later FSM[side].Stretch:=False; //Work out what tracks to skip (images over 100000 pixels high will crash) skip:=(Length(Image.FreeSpaceMap[0])div 100000)+1; //Set the graphic size t:=Length(Image.FreeSpaceMap[side]); - s:=Length(Image.FreeSpaceMap[side,0]); + if t>0 then s:=Length(Image.FreeSpaceMap[side,0]) else s:=0; FSM[side].Height:=t div skip; FSM[side].Width:=s; //Initiate the canvas @@ -4351,21 +4539,22 @@ procedure TMainForm.btn_ImageDetailsClick(Sender: TObject); //Colour in the free space img.FillPixels(ConvertColour(ImageDetailForm.colFree.Brush.Color)); //Now draw all the sectors in tracks - for t:=0 to Length(Image.FreeSpaceMap[side])-1 do - if t mod skip=0 then - for s:=0 to Length(Image.FreeSpaceMap[side,t])-1 do - if Image.FreeSpaceMap[side,t,s]>$FC then - begin - //Other colours - if Image.FreeSpaceMap[side,t,s]=$FF then - col:=ImageDetailForm.colFile.Brush.Color; //Unknown/Files - if Image.FreeSpaceMap[side,t,s]=$FE then - col:=ImageDetailForm.colSystem.Brush.Color; //System - if Image.FreeSpaceMap[side,t,s]=$FD then - col:=ImageDetailForm.colDir.Brush.Color; //Directories - //Set the colour - img.Colors[s,t div skip]:=ConvertColour(col); - end; + if Length(Image.FreeSpaceMap[side])>0 then + for t:=0 to Length(Image.FreeSpaceMap[side])-1 do + if(t mod skip=0)and(Length(Image.FreeSpaceMap[side,t])>0)then + for s:=0 to Length(Image.FreeSpaceMap[side,t])-1 do + if Image.FreeSpaceMap[side,t,s]>$FC then + begin + //Other colours + if Image.FreeSpaceMap[side,t,s]=$FF then + col:=ImageDetailForm.colFile.Brush.Color; //Unknown/Files + if Image.FreeSpaceMap[side,t,s]=$FE then + col:=ImageDetailForm.colSystem.Brush.Color; //System + if Image.FreeSpaceMap[side,t,s]=$FD then + col:=ImageDetailForm.colDir.Brush.Color; //Directories + //Set the colour + img.Colors[s,t div skip]:=ConvertColour(col); + end; //Copy the graphic to the display FSM[side].Picture.PNG.PixelFormat:=pf32bit; FSM[side].Picture.PNG.LoadFromIntfImage(img); @@ -4412,17 +4601,19 @@ procedure TMainForm.btn_ImageDetailsClick(Sender: TObject); boots[side].Visible:=False; bootlbs[side].Visible:=boots[side].Visible; end; - //Is this an ADFS/AFS Hybrid? - if(Image.MajorFormatNumber=diAcornADFS)and(Image.AFSPresent)then - begin - FSMlabel[0].Caption:=FSMlabel[0].Caption+' ADFS Partition'; - FSMlabel[1].Caption:=FSMlabel[1].Caption+' Acorn FS Partition'; - end; - //Is this an ADFS/DOS Hybrid? - if(Image.MajorFormatNumber=diAcornADFS)and(Image.DOSPresent)then + //Is this an ADFS Hybrid? + if(Image.MajorFormatNumber=diAcornADFS) + and((Image.AFSPresent)or(Image.DOSPresent))then begin - FSMlabel[0].Caption:=FSMlabel[0].Caption+' ADFS Partition'; - FSMlabel[1].Caption:=FSMlabel[1].Caption+' DOS Plus Partition'; + partstr:='ADFS Partition'; + FSMlabel[0].Caption:=FSMlabel[0].Caption+' '+partstr; + ImageDetailForm.pnSide0Caption.Caption:=' '+partstr+' Details'; + //AFS + if Image.AFSPresent then partstr:='Acorn FS Partition'; + //DOS + if Image.DOSPresent then partstr:='DOS Partition'; + FSMlabel[1].Caption:=FSMlabel[1].Caption+' '+partstr; + ImageDetailForm.pnSide1Caption.Caption:=' '+partstr+' Details'; end; //Change the dialogue box width ImageDetailForm.ClientWidth:=(Length(Image.FreeSpaceMap)*204) @@ -4463,6 +4654,7 @@ procedure TMainForm.btn_CloseImageClick(Sender: TObject); ShowNewImage(''); UpdateImageInfo; DisableControls; + ImageDetails.Invalidate; end; end; @@ -4619,14 +4811,23 @@ procedure TMainForm.btn_DefragClick(Sender: TObject); procedure TMainForm.Defrag(side: Byte); var NewImage : TDiscImage; + oldscan, + olddos, ok : Boolean; sidecount, index,root: Integer; +// Node : TTreeNode; begin if Length(Image.Disc)>0 then begin //Create a new image, cloning the old one + oldscan:=Image.ScanSubDirs; + olddos :=Image.OpenDOSPartitions; + Image.ScanSubDirs:=True; + Image.OpenDOSPartitions:=False; NewImage:=TDiscImage.Create(Image); + Image.ScanSubDirs:=oldscan; + Image.OpenDOSPartitions:=olddos; //We need to work out the root reference root:=0; if DirList.Items.Count>0 then @@ -4639,7 +4840,7 @@ procedure TMainForm.Defrag(side: Byte); inc(sidecount); end; end; - //Delete all the existing files in the root + //Delete all the existing objects in the root while Length(Image.Disc[root].Entries)>0 do begin SelectNode(Image.Disc[root].Entries[0].Parent @@ -4688,13 +4889,14 @@ procedure TMainForm.btn_AddPartitionClick(Sender: TObject); AFSPartitionForm.PartitionSize.Max :=AFSPartitionForm.maxAFSSize; //Max partition size AFSPartitionForm.PartitionSize.Position:=AFSPartitionForm.maxAFSSize; //Current size AFSPartitionForm.PartitionSizeChange(Sender); //Update the label - AFSPartitionForm.rad_type.ItemIndex:=0; //Set to Acorn FS by default + AFSPartitionForm.rad_typeAFS.Ticked:=True; //Set to Acorn FS by default //Display the form if AFSPartitionForm.ShowModal=mrOK then //If OK was clicked, then continue begin //Get the specifications partsize:=AFSPartitionForm.PartitionSize.Position*$100; - parttype:=AFSPartitionForm.rad_type.ItemIndex; + if AFSPartitionForm.rad_typeAFS.Ticked then parttype:=0; + if AFSPartitionForm.rad_typeDOS.Ticked then parttype:=1; //Send to the class if Image.AddPartition(partsize,parttype) then begin @@ -4809,33 +5011,33 @@ procedure TMainForm.btn_SaveAsCSVClick(Sender: TObject); report : TStringList; begin //Get the last used settings from the registry - CSVPrefForm.cb_IncDir.Checked :=DIMReg.GetRegValB('CSVIncDir' ,False); - CSVPrefForm.cb_IncFilename.Checked:=DIMReg.GetRegValB('CSVIncFilename',True); - CSVPrefForm.cb_IncReport.Checked :=DIMReg.GetRegValB('CSVIncReport' ,True); - CSVPrefForm.cb_Parent.Checked :=DIMReg.GetRegValB('CSVParent' ,True); - CSVPrefForm.cb_Filename.Checked :=DIMReg.GetRegValB('CSVFilename' ,True); - CSVPrefForm.cb_LoadAddr.Checked :=DIMReg.GetRegValB('CSVLoadAddr' ,True); - CSVPrefForm.cb_ExecAddr.Checked :=DIMReg.GetRegValB('CSVExecAddr' ,True); - CSVPrefForm.cb_Length.Checked :=DIMReg.GetRegValB('CSVLength' ,True); - CSVPrefForm.cb_Attributes.Checked :=DIMReg.GetRegValB('CSVAttributes' ,True); - CSVPrefForm.cb_Address.Checked :=DIMReg.GetRegValB('CSVAddress' ,False); - CSVPrefForm.cb_CRC32.Checked :=DIMReg.GetRegValB('CSVCRC32' ,True); + CSVPrefForm.cb_IncDir.Ticked :=DIMReg.GetRegValB('CSVIncDir' ,False); + CSVPrefForm.cb_IncFilename.Ticked:=DIMReg.GetRegValB('CSVIncFilename',True); + CSVPrefForm.cb_IncReport.Ticked :=DIMReg.GetRegValB('CSVIncReport' ,True); + CSVPrefForm.cb_Parent.Ticked :=DIMReg.GetRegValB('CSVParent' ,True); + CSVPrefForm.cb_Filename.Ticked :=DIMReg.GetRegValB('CSVFilename' ,True); + CSVPrefForm.cb_LoadAddr.Ticked :=DIMReg.GetRegValB('CSVLoadAddr' ,True); + CSVPrefForm.cb_ExecAddr.Ticked :=DIMReg.GetRegValB('CSVExecAddr' ,True); + CSVPrefForm.cb_Length.Ticked :=DIMReg.GetRegValB('CSVLength' ,True); + CSVPrefForm.cb_Attributes.Ticked :=DIMReg.GetRegValB('CSVAttributes' ,True); + CSVPrefForm.cb_Address.Ticked :=DIMReg.GetRegValB('CSVAddress' ,False); + CSVPrefForm.cb_CRC32.Ticked :=DIMReg.GetRegValB('CSVCRC32' ,True); //Ask user what they want in the CSV file CSVPrefForm.ShowModal; if CSVPrefForm.ModalResult=mrOK then //Unless they clicked Cancel begin //Save the settings to the registry - DIMReg.SetRegValB('CSVIncDir' ,CSVPrefForm.cb_IncDir.Checked); - DIMReg.SetRegValB('CSVIncFilename',CSVPrefForm.cb_IncFilename.Checked); - DIMReg.SetRegValB('CSVIncReport' ,CSVPrefForm.cb_IncReport.Checked); - DIMReg.SetRegValB('CSVParent' ,CSVPrefForm.cb_Parent.Checked); - DIMReg.SetRegValB('CSVFilename' ,CSVPrefForm.cb_Filename.Checked); - DIMReg.SetRegValB('CSVLoadAddr' ,CSVPrefForm.cb_LoadAddr.Checked); - DIMReg.SetRegValB('CSVExecAddr' ,CSVPrefForm.cb_ExecAddr.Checked); - DIMReg.SetRegValB('CSVLength' ,CSVPrefForm.cb_Length.Checked); - DIMReg.SetRegValB('CSVAttributes' ,CSVPrefForm.cb_Attributes.Checked); - DIMReg.SetRegValB('CSVAddress' ,CSVPrefForm.cb_Address.Checked); - DIMReg.SetRegValB('CSVCRC32' ,CSVPrefForm.cb_CRC32.Checked); + DIMReg.SetRegValB('CSVIncDir' ,CSVPrefForm.cb_IncDir.Ticked); + DIMReg.SetRegValB('CSVIncFilename',CSVPrefForm.cb_IncFilename.Ticked); + DIMReg.SetRegValB('CSVIncReport' ,CSVPrefForm.cb_IncReport.Ticked); + DIMReg.SetRegValB('CSVParent' ,CSVPrefForm.cb_Parent.Ticked); + DIMReg.SetRegValB('CSVFilename' ,CSVPrefForm.cb_Filename.Ticked); + DIMReg.SetRegValB('CSVLoadAddr' ,CSVPrefForm.cb_LoadAddr.Ticked); + DIMReg.SetRegValB('CSVExecAddr' ,CSVPrefForm.cb_ExecAddr.Ticked); + DIMReg.SetRegValB('CSVLength' ,CSVPrefForm.cb_Length.Ticked); + DIMReg.SetRegValB('CSVAttributes' ,CSVPrefForm.cb_Attributes.Ticked); + DIMReg.SetRegValB('CSVAddress' ,CSVPrefForm.cb_Address.Ticked); + DIMReg.SetRegValB('CSVCRC32' ,CSVPrefForm.cb_CRC32.Ticked); //Remove the existing part of the original filename filename:=ExtractFileName(Image.Filename); ext:=ExtractFileExt(filename); @@ -4860,10 +5062,10 @@ procedure TMainForm.btn_SaveAsCSVClick(Sender: TObject); //Open a new file F:=TFileStream.Create(SaveImage.FileName,fmCreate OR fmShareDenyNone); //Write the image details - if CSVPrefForm.cb_IncFilename.Checked then + if CSVPrefForm.cb_IncFilename.Ticked then WriteLine(F,'"'+Image.Filename+'","0x'+Image.CRC32+'"'); //Write the report - if CSVPrefForm.cb_IncReport.Checked then + if CSVPrefForm.cb_IncReport.Ticked then begin report:=Image.ImageReport(True); if report.Count>0 then @@ -4872,14 +5074,14 @@ procedure TMainForm.btn_SaveAsCSVClick(Sender: TObject); end; //Write the headers line:=''; - if CSVPrefForm.cb_Parent.Checked then line:=line+'"Parent",'; - if CSVPrefForm.cb_Filename.Checked then line:=line+'"Filename",'; - if CSVPrefForm.cb_LoadAddr.Checked then line:=line+'"Load Address",'; - if CSVPrefForm.cb_ExecAddr.Checked then line:=line+'"Execution Address",'; - if CSVPrefForm.cb_Length.Checked then line:=line+'"Length",'; - if CSVPrefForm.cb_Attributes.Checked then line:=line+'"Attributes",'; - if CSVPrefForm.cb_Address.Checked then line:=line+'"Address",'; - if CSVPrefForm.cb_CRC32.Checked then line:=line+'"CRC32,"'; + if CSVPrefForm.cb_Parent.Ticked then line:=line+'"Parent",'; + if CSVPrefForm.cb_Filename.Ticked then line:=line+'"Filename",'; + if CSVPrefForm.cb_LoadAddr.Ticked then line:=line+'"Load Address",'; + if CSVPrefForm.cb_ExecAddr.Ticked then line:=line+'"Execution Address",'; + if CSVPrefForm.cb_Length.Ticked then line:=line+'"Length",'; + if CSVPrefForm.cb_Attributes.Ticked then line:=line+'"Attributes",'; + if CSVPrefForm.cb_Address.Ticked then line:=line+'"Address",'; + if CSVPrefForm.cb_CRC32.Ticked then line:=line+'"CRC32,"'; line:=LeftStr(line,Length(line)-1); WriteLine(F,line); //Go through each directory @@ -4888,24 +5090,24 @@ procedure TMainForm.btn_SaveAsCSVClick(Sender: TObject); for entry:=0 to Length(Image.Disc[dir].Entries)-1 do //write out each entry if(Image.Disc[dir].Entries[entry].DirRef=-1) //Exclude directories? - or(CSVPrefForm.cb_IncDir.Checked)then //Or include them? + or(CSVPrefForm.cb_IncDir.Ticked)then //Or include them? begin line:=''; - if CSVPrefForm.cb_Parent.Checked then + if CSVPrefForm.cb_Parent.Ticked then line:=line+'"'+Image.GetParent(dir)+'",'; - if CSVPrefForm.cb_Filename.Checked then + if CSVPrefForm.cb_Filename.Ticked then line:=line+'"'+Image.Disc[dir].Entries[entry].Filename+'",'; - if CSVPrefForm.cb_LoadAddr.Checked then + if CSVPrefForm.cb_LoadAddr.Ticked then line:=line+'"0x'+IntToHex(Image.Disc[dir].Entries[entry].LoadAddr,hexlen)+'",'; - if CSVPrefForm.cb_ExecAddr.Checked then + if CSVPrefForm.cb_ExecAddr.Ticked then line:=line+'"0x'+IntToHex(Image.Disc[dir].Entries[entry].ExecAddr,hexlen)+'",'; - if CSVPrefForm.cb_Length.Checked then + if CSVPrefForm.cb_Length.Ticked then line:=line+'"0x'+IntToHex(Image.Disc[dir].Entries[entry].Length,hexlen)+'",'; - if CSVPrefForm.cb_Attributes.Checked then + if CSVPrefForm.cb_Attributes.Ticked then line:=line+'"'+Image.Disc[dir].Entries[entry].Attributes+'",'; - if CSVPrefForm.cb_Address.Checked then + if CSVPrefForm.cb_Address.Ticked then line:=line+'"0x'+IntToHex(Image.Disc[dir].Entries[entry].Sector,hexlen)+'",'; - if CSVPrefForm.cb_CRC32.Checked then + if CSVPrefForm.cb_CRC32.Ticked then line:=line+'"0x'+Image.GetFileCRC(Image.GetParent(dir) +Image.GetDirSep(Image.Disc[dir].Partition) +Image.Disc[dir].Entries[entry].Filename)+',"'; @@ -4931,51 +5133,59 @@ procedure TMainForm.btn_SaveAsCSVClick(Sender: TObject); procedure TMainForm.btn_SettingsClick(Sender: TObject); begin //Set the preferences - Texture - SettingsForm.NoTile.Checked :=False; - SettingsForm.TileRO5.Checked :=False; - SettingsForm.TileRO4.Checked :=False; - SettingsForm.TileRO3.Checked :=False; - SettingsForm.TileIyonix.Checked:=False; - SettingsForm.TileROPi.Checked :=False; + SettingsForm.NoTile.Ticked :=False; + SettingsForm.TileRO5.Ticked :=False; + SettingsForm.TileRO4.Ticked :=False; + SettingsForm.TileRO3.Ticked :=False; + SettingsForm.TileIyonix.Ticked:=False; + SettingsForm.TileROPi.Ticked :=False; case TextureType of - 0: SettingsForm.NoTile.Checked :=True; - 1: SettingsForm.TileRO5.Checked :=True; - 2: SettingsForm.TileRO4.Checked :=True; - 3: SettingsForm.TileRO3.Checked :=True; - 4: SettingsForm.TileIyonix.Checked:=True; - 5: SettingsForm.TileROPi.Checked :=True; + 0: SettingsForm.NoTile.Ticked :=True; + 1: SettingsForm.TileRO5.Ticked :=True; + 2: SettingsForm.TileRO4.Ticked :=True; + 3: SettingsForm.TileRO3.Ticked :=True; + 4: SettingsForm.TileIyonix.Ticked:=True; + 5: SettingsForm.TileROPi.Ticked :=True; end; //ADFS Interleaving - SettingsForm.InterleaveGroup.ItemIndex:=ADFSInterleave; + case ADFSInterleave of + 0: SettingsForm.ilAuto.Ticked :=True; + 1: SettingsForm.ilSeq.Ticked :=True; + 2: SettingsForm.ilInter.Ticked :=True; + 3: SettingsForm.ilMPX.Ticked :=True; + end; //Miscellaneous - SettingsForm.CreateINF.Checked :=DoCreateInf; - SettingsForm.WriteDebug.Checked :=Fdebug; - SettingsForm.AllowDFSZeroSecs.Checked :=FDFSZeroSecs; - SettingsForm.DFSBeyondEdge.Checked :=FDFSBeyondEdge; - SettingsForm.AllowDFSBlankFilenames.Checked:=FDFSAllowBlank; - SettingsForm.CompressUEF.Checked :=FUEFCompress; - SettingsForm.ScanSubDirs.Checked :=FScanSubDirs; - SettingsForm.OpenDOS.Checked :=FOpenDOS; + SettingsForm.CreateINF.Ticked :=DoCreateInf; + SettingsForm.WriteDebug.Ticked :=Fdebug; + SettingsForm.AllowDFSZeroSecs.Ticked :=FDFSZeroSecs; + SettingsForm.DFSBeyondEdge.Ticked :=FDFSBeyondEdge; + SettingsForm.AllowDFSBlankFilenames.Ticked:=FDFSAllowBlank; + SettingsForm.CompressUEF.Ticked :=FUEFCompress; + SettingsForm.ScanSubDirs.Ticked :=FScanSubDirs; + SettingsForm.OpenDOS.Ticked :=FOpenDOS; //Show the form, modally SettingsForm.ShowModal; if SettingsForm.ModalResult=mrOK then begin //Get the preferences - if SettingsForm.NoTile.Checked then TextureType:=0; - if SettingsForm.TileRO5.Checked then TextureType:=1; - if SettingsForm.TileRO4.Checked then TextureType:=2; - if SettingsForm.TileRO3.Checked then TextureType:=3; - if SettingsForm.TileIyonix.Checked then TextureType:=4; - if SettingsForm.TileROPi.Checked then TextureType:=5; - ADFSInterleave:=SettingsForm.InterleaveGroup.ItemIndex; - DoCreateInf :=SettingsForm.CreateINF.Checked; - Fdebug :=SettingsForm.WriteDebug.Checked; - FDFSZeroSecs :=SettingsForm.AllowDFSZeroSecs.Checked; - FDFSBeyondEdge:=SettingsForm.DFSBeyondEdge.Checked; - FDFSAllowBlank:=SettingsForm.AllowDFSBlankFilenames.Checked; - FUEFCompress :=SettingsForm.CompressUEF.Checked; - FScanSubDirs :=SettingsForm.ScanSubDirs.Checked; - FOpenDOS :=SettingsForm.OpenDOS.Checked; + if SettingsForm.NoTile.Ticked then TextureType:=0; + if SettingsForm.TileRO5.Ticked then TextureType:=1; + if SettingsForm.TileRO4.Ticked then TextureType:=2; + if SettingsForm.TileRO3.Ticked then TextureType:=3; + if SettingsForm.TileIyonix.Ticked then TextureType:=4; + if SettingsForm.TileROPi.Ticked then TextureType:=5; + if SettingsForm.ilAuto.Ticked then ADFSInterleave:=0; + if SettingsForm.ilSeq.Ticked then ADFSInterleave:=1; + if SettingsForm.ilInter.Ticked then ADFSInterleave:=2; + if SettingsForm.ilMPX.Ticked then ADFSInterleave:=3; + DoCreateInf :=SettingsForm.CreateINF.Ticked; + Fdebug :=SettingsForm.WriteDebug.Ticked; + FDFSZeroSecs :=SettingsForm.AllowDFSZeroSecs.Ticked; + FDFSBeyondEdge:=SettingsForm.DFSBeyondEdge.Ticked; + FDFSAllowBlank:=SettingsForm.AllowDFSBlankFilenames.Ticked; + FUEFCompress :=SettingsForm.CompressUEF.Ticked; + FScanSubDirs :=SettingsForm.ScanSubDirs.Ticked; + FOpenDOS :=SettingsForm.OpenDOS.Ticked; //Save the settings SaveConfigSettings; //Change the tile under the filetype @@ -5148,6 +5358,7 @@ procedure TMainForm.DirListCustomDrawItem(Sender: TCustomTreeView; imgidx : Integer; TV : TTreeView; begin + WriteToDebug('DirListCustomDrawItem'); if Sender is TTreeView then begin TV:=TTreeView(Sender); @@ -5193,6 +5404,7 @@ procedure TMainForm.DirListCustomDrawItem(Sender: TCustomTreeView; NodeRect.Height:=NodeRect.Width; //Get the correct image imgidx:=Node.ImageIndex; + WriteToDebug('DirListCustomDrawItem: imgidx='+IntToStr(imgidx)); if imgidx=-1 then imgidx:=GetImageIndex(Node,Image); TImageList(TV.Images).StretchDraw(TV.Canvas,imgidx,NodeRect); //Write out the text @@ -5247,16 +5459,11 @@ procedure TMainForm.FileInfoPanelResize(Sender: TObject); {------------------------------------------------------------------------------} procedure TMainForm.FileInfoPanelPaint(Sender: TObject); begin - if Sender is TPanel then - TileCanvas(TPanel(Sender).Canvas); //for a TPanel - if Sender is TToolBar then - TileCanvas(TToolBar(Sender).Canvas); //for a TToolBar - if Sender is TForm then - TileCanvas(TForm(Sender).Canvas); //For a TForm - if Sender is TScrollBox then - TileCanvas(TScrollBox(Sender).Canvas); //For a TScrollBox - if Sender is TControlBar then - TileCanvas(TControlBar(Sender).Canvas); //For a TControlBar + if Sender is TPanel then TileCanvas(TPanel(Sender).Canvas); + if Sender is TToolBar then TileCanvas(TToolBar(Sender).Canvas); + if Sender is TForm then TileCanvas(TForm(Sender).Canvas); + if Sender is TScrollBox then TileCanvas(TScrollBox(Sender).Canvas); + if Sender is TControlBar then TileCanvas(TControlBar(Sender).Canvas); end; {------------------------------------------------------------------------------} @@ -5799,6 +6006,13 @@ procedure TMainForm.CancelDragDropExecute(Sender: TObject); //Create a new blank image {------------------------------------------------------------------------------} procedure TMainForm.btn_NewImageClick(Sender: TObject); +function SelectMinor(LOptions: array of TGJHRadioBox): Byte; +var Index: Byte; +begin + Result:=0; + for Index:=0 to Length(LOptions)-1 do + if LOptions[index].Ticked then Result:=Index; +end; var major : Word; minor, @@ -5817,33 +6031,36 @@ procedure TMainForm.btn_NewImageClick(Sender: TObject); CloseAllHexDumps; //From this point, all loaded data will be dumped //Get the main format major:=$FFF; - case NewImageForm.MainFormat.ItemIndex of - 0: major:=diAcornDFS; - 1: major:=diAcornADFS; - 2: major:=diCommodore; - 3: major:=diSinclair; - 4: major:=diAmiga; - 5: major:=diAcornUEF; - 6: major:=diSpark; - 7: major:=diAcornFS; - 8: major:=diDOSPlus; - end; + if NewImageForm.SystemOptions[0].Ticked then major:=diAcornDFS; + if NewImageForm.SystemOptions[1].Ticked then major:=diAcornADFS; + if NewImageForm.SystemOptions[2].Ticked then major:=diCommodore; + if NewImageForm.SystemOptions[3].Ticked then major:=diSinclair; + if NewImageForm.SystemOptions[4].Ticked then major:=diAmiga; + if NewImageForm.SystemOptions[5].Ticked then major:=diAcornUEF; + if NewImageForm.SystemOptions[6].Ticked then major:=diSpark; + if NewImageForm.SystemOptions[7].Ticked then major:=diAcornFS; + if NewImageForm.SystemOptions[8].Ticked then major:=diDOSPlus; //Get the sub-format minor:=$F; - case NewImageForm.MainFormat.ItemIndex of - 0: minor:=NewImageForm.DFS.ItemIndex; - 1: minor:=NewImageForm.ADFS.ItemIndex; - 2: minor:=NewImageForm.C64.ItemIndex; - 3: minor:=NewImageForm.Spectrum.ItemIndex; - 4: minor:=NewImageForm.Amiga.ItemIndex; - 5: minor:=$0; - 7: minor:=NewImageForm.AFS.ItemIndex; - 8: minor:=NewImageForm.DOS.ItemIndex; - end; + if NewImageForm.SystemOptions[0].Ticked then //DFS + minor:=SelectMinor(NewImageForm.DFSOptions); + if NewImageForm.SystemOptions[1].Ticked then //ADFS + minor:=SelectMinor(NewImageForm.ADFSOptions); + if NewImageForm.SystemOptions[2].Ticked then //C64 + minor:=SelectMinor(NewImageForm.C64Options); + if NewImageForm.SystemOptions[3].Ticked then //Spectrum + minor:=SelectMinor(NewImageForm.SpecOptions); + if NewImageForm.SystemOptions[4].Ticked then //Amiga + minor:=SelectMinor(NewImageForm.AmigaOptions); + if NewImageForm.SystemOptions[5].Ticked then minor:=$0;//CFS + if NewImageForm.SystemOptions[6].Ticked then minor:=$0;//!Spark + if NewImageForm.SystemOptions[7].Ticked then //AFS + minor:=SelectMinor(NewImageForm.AFSOptions); + if NewImageForm.SystemOptions[8].Ticked then //DOS + minor:=SelectMinor(NewImageForm.DOSOptions); tracks:=0; //Default //Number of tracks (DFS only) - if major=diAcornDFS then - tracks:=NewImageForm.DFSTracks.ItemIndex; + if major=diAcornDFS then tracks:=SelectMinor(NewImageForm.DFSTOptions); //Now create the image ok:=False; //Get the filename for a new Spark @@ -5884,7 +6101,7 @@ procedure TMainForm.btn_NewImageClick(Sender: TObject); ok:=Image.FormatHDD(diAcornFS, NewImageForm.AFSImageSize.Position*10*1024, True,False,minor+2,False); - if(ok)and(NewImageForm.cb_AFScreatepword.Checked)then + if(ok)and(NewImageForm.cb_AFScreatepword.Ticked)then //Create blank password file for AFS if Image.CreatePasswordFile(nil)<0 then //If fails, report an error ReportError('Failed to create a password file'); @@ -5952,65 +6169,65 @@ procedure TMainForm.AttributeChangeClick(Sender: TObject); //Attributes - DFS and UEF if(Image.MajorFormatNumber=diAcornDFS) or(Image.MajorFormatNumber=diAcornUEF)then - if cb_DFS_l.Checked then att:=att+'L'; + if cb_DFS_l.Ticked then att:=att+'L'; //Attributes - ADFS if((Image.MajorFormatNumber=diAcornADFS) or(Image.MajorFormatNumber=diSpark)) and(not afs)and(not dos)then begin - if cb_ADFS_ownw.Checked then att:=att+'W'; - if cb_ADFS_ownr.Checked then att:=att+'R'; - if cb_ADFS_ownl.Checked then att:=att+'L'; - if cb_ADFS_owne.Checked then att:=att+'E'; - if cb_ADFS_pubw.Checked then att:=att+'w'; - if cb_ADFS_pubr.Checked then att:=att+'r'; - if cb_ADFS_pube.Checked then att:=att+'e'; - if cb_ADFS_pubp.Checked then att:=att+'P'; + if cb_ADFS_ownw.Ticked then att:=att+'W'; + if cb_ADFS_ownr.Ticked then att:=att+'R'; + if cb_ADFS_ownl.Ticked then att:=att+'L'; + if cb_ADFS_owne.Ticked then att:=att+'E'; + if cb_ADFS_pubw.Ticked then att:=att+'w'; + if cb_ADFS_pubr.Ticked then att:=att+'r'; + if cb_ADFS_pube.Ticked then att:=att+'e'; + if cb_ADFS_pubp.Ticked then att:=att+'P'; end; //Attributes - AFS if(Image.MajorFormatNumber=diAcornFS) or((Image.MajorFormatNumber=diAcornADFS)and(afs))then begin - if cb_AFS_ownw.Checked then att:=att+'W'; - if cb_AFS_ownr.Checked then att:=att+'R'; - if cb_AFS_ownl.Checked then att:=att+'L'; - if cb_AFS_pubw.Checked then att:=att+'w'; - if cb_AFS_pubr.Checked then att:=att+'r'; + if cb_AFS_ownw.Ticked then att:=att+'W'; + if cb_AFS_ownr.Ticked then att:=att+'R'; + if cb_AFS_ownl.Ticked then att:=att+'L'; + if cb_AFS_pubw.Ticked then att:=att+'w'; + if cb_AFS_pubr.Ticked then att:=att+'r'; end; //Attributes - Commodore 64 if Image.MajorFormatNumber=diCommodore then begin - if cb_C64_c.Checked then att:=att+'C'; - if cb_C64_l.Checked then att:=att+'L'; + if cb_C64_c.Ticked then att:=att+'C'; + if cb_C64_l.Ticked then att:=att+'L'; end; //Attributes - DOS Plus if(Image.MajorFormatNumber=diDOSPlus) or((Image.MajorFormatNumber=diAcornADFS)and(dos))then begin - if cb_DOS_hidden.Checked then att:=att+'H'; - if cb_DOS_read.Checked then att:=att+'R'; - if cb_DOS_system.Checked then att:=att+'S'; - if cb_DOS_archive.Checked then att:=att+'A'; + if cb_DOS_hidden.Ticked then att:=att+'H'; + if cb_DOS_read.Ticked then att:=att+'R'; + if cb_DOS_system.Ticked then att:=att+'S'; + if cb_DOS_archive.Ticked then att:=att+'A'; end; //Attributes - Amiga if Image.MajorFormatNumber=diAmiga then begin - if not cb_Amiga_ownd.Checked then att:=att+'D'; - if not cb_Amiga_owne.Checked then att:=att+'E'; - if not cb_Amiga_ownw.Checked then att:=att+'W'; - if not cb_Amiga_ownr.Checked then att:=att+'R'; - if cb_Amiga_arch.Checked then att:=att+'A'; - if cb_Amiga_pure.Checked then att:=att+'P'; - if cb_Amiga_scri.Checked then att:=att+'S'; - if cb_Amiga_hold.Checked then att:=att+'H'; - if not cb_Amiga_pubd.Checked then att:=att+'d'; - if cb_Amiga_pube.Checked then att:=att+'e'; - if cb_Amiga_pubw.Checked then att:=att+'w'; - if cb_Amiga_pubr.Checked then att:=att+'r'; - if not cb_Amiga_othd.Checked then att:=att+'l'; - if cb_Amiga_othe.Checked then att:=att+'x'; - if cb_Amiga_othw.Checked then att:=att+'i'; - if cb_Amiga_othr.Checked then att:=att+'a'; + if not cb_Amiga_ownd.Ticked then att:=att+'D'; + if not cb_Amiga_owne.Ticked then att:=att+'E'; + if not cb_Amiga_ownw.Ticked then att:=att+'W'; + if not cb_Amiga_ownr.Ticked then att:=att+'R'; + if cb_Amiga_arch.Ticked then att:=att+'A'; + if cb_Amiga_pure.Ticked then att:=att+'P'; + if cb_Amiga_scri.Ticked then att:=att+'S'; + if cb_Amiga_hold.Ticked then att:=att+'H'; + if not cb_Amiga_pubd.Ticked then att:=att+'d'; + if cb_Amiga_pube.Ticked then att:=att+'e'; + if cb_Amiga_pubw.Ticked then att:=att+'w'; + if cb_Amiga_pubr.Ticked then att:=att+'r'; + if not cb_Amiga_othd.Ticked then att:=att+'l'; + if cb_Amiga_othe.Ticked then att:=att+'x'; + if cb_Amiga_othw.Ticked then att:=att+'i'; + if cb_Amiga_othr.Ticked then att:=att+'a'; end; //Add the directory attribute if TMyTreeNode(DirList.Selected).IsDir then @@ -6467,17 +6684,17 @@ procedure TMainForm.ResetFileFields; DOSAttrPanel.Visible :=False; AmigaAttrPanel.Visible:=False; //And untick them - cb_ADFS_ownw.Checked:=False; - cb_ADFS_ownr.Checked:=False; - cb_ADFS_ownl.Checked:=False; - cb_ADFS_owne.Checked:=False; - cb_ADFS_pubw.Checked:=False; - cb_ADFS_pubr.Checked:=False; - cb_ADFS_pube.Checked:=False; - cb_ADFS_pubp.Checked:=False; - cb_DFS_l.Checked :=False; - cb_C64_l.Checked :=False; - cb_C64_c.Checked :=False; + cb_ADFS_ownw.Ticked:=False; + cb_ADFS_ownr.Ticked:=False; + cb_ADFS_ownl.Ticked:=False; + cb_ADFS_owne.Ticked:=False; + cb_ADFS_pubw.Ticked:=False; + cb_ADFS_pubr.Ticked:=False; + cb_ADFS_pube.Ticked:=False; + cb_ADFS_pubp.Ticked:=False; + cb_DFS_l.Ticked :=False; + cb_C64_l.Ticked :=False; + cb_C64_c.Ticked :=False; //Allow the OnChange to fire again DoNotUpdate :=False; //Hide all the labels @@ -6543,15 +6760,15 @@ function TMainForm.IntToStrComma(size: Int64): String; end; {------------------------------------------------------------------------------} -//Order of the toolbars has changed +//Order of the ToolBarContainer has changed {------------------------------------------------------------------------------} procedure TMainForm.ToolBarContainerChange(Sender: TObject); -var - index: Integer; +{var + index: Integer;} begin - for index:=0 to ToolBarContainer.Bands.Count-1 do +{ for index:=0 to ToolBarContainer.Bands.Count-1 do DIMReg.SetRegValS('ToolBar'+IntToStr(index) - ,ToolBarContainer.Bands[index].Control.Name); + ,ToolBarContainer.Bands[index].Control.Name);} end; {------------------------------------------------------------------------------} @@ -6812,4 +7029,19 @@ procedure TMainForm.WriteToDebug(line: String); end; end; +{------------------------------------------------------------------------------} +//Create a RISC OS button +{------------------------------------------------------------------------------} +function TMainForm.CreateButton(Lparent: TControl; Lcaption: String;LDef: Boolean; + LLeft,LTop: Integer; LModal: TModalResult): TGJHButton; +begin + Result:=TGJHButton.Create(Lparent as TControl); + Result.Parent:=Lparent as TWinControl; + Result.Default:=LDef; + Result.Caption:=Lcaption; + Result.Left:=LLeft; + Result.Top:=LTop; + Result.ModalResult:=LModal; +end; + end. diff --git a/LazarusSource/NewImageUnit.lfm b/LazarusSource/NewImageUnit.lfm index 5aeb12a..4a9330d 100755 --- a/LazarusSource/NewImageUnit.lfm +++ b/LazarusSource/NewImageUnit.lfm @@ -9,325 +9,258 @@ object NewImageForm: TNewImageForm ClientHeight = 230 ClientWidth = 532 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint OnShow = FormShow Position = poMainFormCenter LCLVersion = '2.2.0.4' - object MainFormat: TRadioGroup + object MainFormatPanel: TPanel Left = 0 - Height = 181 + Height = 178 Top = 0 - Width = 260 - AutoFill = True - Caption = 'System' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 162 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - 'Disc Filing System (DFS)' - 'Advanced Disc Filing System (ADFS)' - 'Commodore 64/128' - 'Sinclair Spectrum +3/Amstrad' - 'Commodore Amiga' - 'Cassette Filing System (CFS)' - '!Spark archive' - 'Acorn File Server (AFS0)' - 'DOS Plus/DOS' - ) - OnClick = MainFormatClick + Width = 264 + BevelOuter = bvNone + ClientHeight = 178 + ClientWidth = 264 TabOrder = 0 + OnPaint = FormPaint + object SystemLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 264 + Align = alTop + Caption = ' System' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object DFS: TRadioGroup - Left = 268 - Height = 91 + object DFS: TPanel + Left = 264 + Height = 112 Top = 0 - Width = 260 - AutoFill = True - Caption = 'Disc Filing System' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 72 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - 'Acorn single sided' - 'Acorn double sided' - 'Watford single sided' - 'Watford double sided' - ) + Width = 266 + BevelOuter = bvNone + ClientHeight = 112 + ClientWidth = 266 TabOrder = 1 + OnPaint = FormPaint + object DFSLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 266 + Align = alTop + Caption = ' Disc Filing System' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object ADFS: TRadioGroup - Left = 268 - Height = 181 - Top = 0 - Width = 260 - AutoFill = True - Caption = 'Advanced Disc Filing System' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 162 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - 'S (160K, Old Map, Old Directory)' - 'M (320K, Old Map, Old Directory)' - 'L (640K, Old Map, Old Directory)' - 'D (800K, Old Map, New Directory)' - 'E (800K, New Map, New Directory)' - 'E+ (800K, New Map, Big Directory)' - 'F (1.6M, New Map, New Directory)' - 'F+ (1.6M, New Map, Big Directory)' - 'Hard Disc' - ) + object DFSTracks: TPanel + Left = 264 + Height = 50 + Top = 112 + Width = 266 + BevelOuter = bvNone + ClientHeight = 50 + ClientWidth = 266 TabOrder = 2 - Visible = False + OnPaint = FormPaint + object DFSTracksLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 266 + Align = alTop + Caption = ' Tracks' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object C64: TRadioGroup - Left = 268 - Height = 73 + object ADFS: TPanel + Left = 264 + Height = 162 Top = 0 - Width = 260 - AutoFill = True - Caption = 'Commodore 64/128' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 54 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - '1541' - '1571' - '1581' - ) + Width = 264 + BevelOuter = bvNone + ClientHeight = 162 + ClientWidth = 264 TabOrder = 3 - Visible = False + OnPaint = FormPaint + object ADFSLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 264 + Align = alTop + Caption = ' Advanced Disc Filing System' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object Spectrum: TRadioGroup - Left = 268 - Height = 55 + object C64: TPanel + Left = 264 + Height = 138 Top = 0 - Width = 260 - AutoFill = True - Caption = 'Sinclair Spectrum +3/Amstrad' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 36 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - 'DSK' - 'Extended DSK' - ) + Width = 268 + BevelOuter = bvNone + ClientHeight = 138 + ClientWidth = 268 TabOrder = 4 - Visible = False + OnPaint = FormPaint + object C64Label: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 268 + Align = alTop + Caption = ' Commodore 64/128' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object Amiga: TRadioGroup - Left = 268 - Height = 73 + object Spectrum: TPanel + Left = 264 + Height = 138 Top = 0 - Width = 260 - AutoFill = True - Caption = 'Commodore Amiga' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 54 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - 'AmigaDOS DD' - 'AmigaDOS HD' - 'AmigaDOS Hard Disc' - ) + Width = 268 + BevelOuter = bvNone + ClientHeight = 138 + ClientWidth = 268 TabOrder = 5 - Visible = False + OnPaint = FormPaint + object SpectrumLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 268 + Align = alTop + Caption = ' Sinclair Spectrum +3/Amstrad' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object DFSTracks: TRadioGroup - Left = 268 - Height = 55 - Top = 105 - Width = 260 - AutoFill = True - Caption = 'Tracks' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 36 - ClientWidth = 250 - ItemIndex = 1 - Items.Strings = ( - '40 Track' - '80 Track' - ) + object Amiga: TPanel + Left = 264 + Height = 138 + Top = 0 + Width = 268 + BevelOuter = bvNone + ClientHeight = 138 + ClientWidth = 268 TabOrder = 6 + OnPaint = FormPaint + object AmigaLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 268 + Align = alTop + Caption = ' Commodore Amiga' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object OKBtnBack: TPanel - Left = 420 - Height = 30 - Top = 192 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False + object DOS: TPanel + Left = 264 + Height = 138 + Top = 0 + Width = 268 + BevelOuter = bvNone + ClientHeight = 138 + ClientWidth = 268 TabOrder = 7 - object btn_OK: TBitBtn + OnPaint = FormPaint + object DOSLabel: TLabel Left = 0 - Height = 30 + Height = 16 Top = 0 - Width = 100 - Caption = 'Create' - Color = 15527148 - Default = True - OnClick = btn_OKClick - TabOrder = 0 + Width = 268 + Align = alTop + Caption = ' DOS Plus/DOS' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end end - object btn_Cancel: TBitBtn - Left = 8 - Height = 30 - Top = 192 - Width = 100 - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 + object AFS: TPanel + Left = 264 + Height = 138 + Top = 0 + Width = 268 + BevelOuter = bvNone + ClientHeight = 138 + ClientWidth = 268 TabOrder = 8 + OnPaint = FormPaint + object AFSLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 268 + Align = alTop + Caption = ' Acorn File Server' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False + end end - object AFSSize: TGroupBox - Left = 268 - Height = 104 + object AFSSize: TPanel + Left = 264 + Height = 98 Top = 64 - Width = 260 - Caption = 'Acorn FS Image Size' - ClientHeight = 85 - ClientWidth = 250 - TabOrder = 10 - Visible = False - object AFSImageSize: TTrackBar - Left = 8 - Height = 32 - Top = 8 - Width = 236 - Max = 52428 - Min = 40 - OnChange = AFSImageSizeChange - Position = 40 - TickStyle = tsNone - TabOrder = 0 - end - object cb_AFScreatepword: TCheckBox - Left = 8 - Height = 18 - Top = 56 - Width = 138 - Caption = 'Create password file' - TabOrder = 1 + Width = 268 + BevelOuter = bvNone + ClientHeight = 98 + ClientWidth = 268 + TabOrder = 9 + OnPaint = FormPaint + object AFSSizeLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 268 + Align = alTop + Caption = ' Image Size' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end object AFSImageSizeLabel: TLabel - Left = 8 + Left = 0 Height = 16 - Top = 40 - Width = 232 + Top = 16 + Width = 268 + Align = alTop Alignment = taCenter - AutoSize = False Caption = 'AFSImageSizeLabel' end end - object DOS: TRadioGroup - Left = 268 - Height = 144 - Top = 0 - Width = 260 - AutoFill = True - Caption = 'DOS and DOS Plus' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 125 - ClientWidth = 250 - ItemIndex = 0 - Items.Strings = ( - '640KB ADFS/DOS Plus' - '800KB DOS Plus' - '360KB' - '720KB' - '1.44MB' - '2.88MB' - 'DOS Hard Drive' - ) - TabOrder = 11 - Visible = False - end - object AFS: TRadioGroup - Left = 268 - Height = 55 - Top = 0 - Width = 260 - AutoFill = True - Caption = 'Acorn File Server' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclTopToBottomThenLeftToRight - ChildSizing.ControlsPerLine = 2 - ClientHeight = 36 - ClientWidth = 250 - ColumnLayout = clVerticalThenHorizontal - Columns = 2 - ItemIndex = 0 - Items.Strings = ( - 'Level 2' - 'Level 3 (<1988)' - 'Level 3 (>1988)' - ) - OnClick = AFSClick - TabOrder = 9 - Visible = False - end end diff --git a/LazarusSource/NewImageUnit.pas b/LazarusSource/NewImageUnit.pas index e1dfd0b..3464b76 100755 --- a/LazarusSource/NewImageUnit.pas +++ b/LazarusSource/NewImageUnit.pas @@ -1,7 +1,7 @@ unit NewImageUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -24,37 +24,85 @@ interface uses - Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, Buttons, - StdCtrls, ComCtrls, DiscImageUtils,Math; + Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, + StdCtrls, ComCtrls, DiscImageUtils,Math,GJHCustomComponents; type { TNewImageForm } TNewImageForm = class(TForm) - DOS: TRadioGroup; - btn_Cancel: TBitBtn; - AFS: TRadioGroup; - AFSSize: TGroupBox; + ADFSLabel: TLabel; + AFSSize: TPanel; + AFSSizeLabel: TLabel; + DOS: TPanel; + AFS: TPanel; + DOSLabel: TLabel; + AFSLabel: TLabel; + C64Label: TLabel; + AmigaLabel: TLabel; + Amiga: TPanel; AFSImageSizeLabel: TLabel; - cb_AFScreatepword: TCheckBox; - MainFormat: TRadioGroup; - DFS: TRadioGroup; - ADFS: TRadioGroup; - C64: TRadioGroup; - Amiga: TRadioGroup; - DFSTracks: TRadioGroup; - OKBtnBack: TPanel; - btn_OK: TBitBtn; - Spectrum: TRadioGroup; - AFSImageSize: TTrackBar; + SpectrumLabel: TLabel; + Spectrum: TPanel; + DFSTracksLabel: TLabel; + DFS: TPanel; + DFSTracks: TPanel; + ADFS: TPanel; + C64: TPanel; + SystemLabel: TLabel; + MainFormatPanel: TPanel; + DFSLabel: TLabel; + AFSImageSize: TGJHSlider; + cb_AFScreatepword: TGJHTickBox; + btn_OK, + btn_Cancel: TGJHButton; procedure AFSClick(Sender: TObject); procedure AFSImageSizeChange(Sender: TObject); procedure btn_OKClick(Sender: TObject); + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormShow(Sender: TObject); procedure MainFormatClick(Sender: TObject); private - + const + FFormats: array[0..8] of String= ('Disc Filing System (DFS)', + 'Advanced Disc Filing System (ADFS)', + 'Commodore 64/128', + 'Sinclair Spectrum +3/Amstrad', + 'Commodore Amiga', + 'Cassette Filing System (CFS)', + '!Spark archive', + 'Acorn File Server (AFS0)', + 'DOS Plus/DOS'); + DFSFormats: array[0..3] of String= ('Acorn single sided', + 'Acorn double sided', + 'Watford single sided', + 'Watford double sided'); + DFSTrackStrings: array[0..1] of String=('40 Track','80 Track'); + ADFSFormats: array[0..8] of String= ('S (160K, Old Map, Old Directory)', + 'M (320K, Old Map, Old Directory)', + 'L (640K, Old Map, Old Directory)', + 'D (800K, Old Map, New Directory)', + 'E (800K, New Map, New Directory)', + 'E+ (800K, New Map, Big Directory)', + 'F (1.6M, New Map, New Directory)', + 'F+ (1.6M, New Map, Big Directory)', + 'Hard Disc'); + C64Formats: array[0..2] of String= ('1541','1571','1581'); + SpectrumFormats: array[0..1] of String=('DSK','Extended DSK'); + AmigaFormats: array[0..2] of String= ('AmigaDOS DD', + 'AmigaDOS HD', + 'AmigaDOS Hard Disc'); + DOSFormats: array[0..6] of String= ('640KB ADFS/DOS Plus', + '800KB DOS Plus', + '360KB', + '720KB', + '1.44MB', + '2.88MB', + 'DOS Hard Drive'); + AFSFormats: array[0..2] of String= ('Level 2', + 'Level 3 (<1988)', + 'Level 3 (>1988)'); public harddrivesize : Cardinal; newmap, @@ -62,6 +110,15 @@ TNewImageForm = class(TForm) ide : Boolean; dirtype, fat : Byte; + SystemOptions, + DFSOptions, + DFSTOptions, + ADFSOptions, + C64Options, + SpecOptions, + AmigaOptions, + DOSOptions, + AFSOptions : array of TGJHRadioBox; end; var @@ -80,35 +137,26 @@ implementation -------------------------------------------------------------------------------} procedure TNewImageForm.MainFormatClick(Sender: TObject); begin - //First, hide all the sub options - DFS.Visible :=False; - ADFS.Visible :=False; - C64.Visible :=False; - Spectrum.Visible :=False; - Amiga.Visible :=False; - AFS.Visible :=False; - DOS.Visible :=False; - //Now enable the appropriate one, based on the main option - case MainFormat.ItemIndex of - 0: DFS.Visible :=True; - 1: ADFS.Visible :=True; - 2: C64.Visible :=True; - 3: Spectrum.Visible :=True; - 4: Amiga.Visible :=True; - 7: AFS.Visible :=True; - 8: DOS.Visible :=True; - end; + //Show or hide the appropriate secondary panels + DFS.Visible :=SystemOptions[0].Ticked; + ADFS.Visible :=SystemOptions[1].Ticked; + C64.Visible :=SystemOptions[2].Ticked; + Spectrum.Visible :=SystemOptions[3].Ticked; + Amiga.Visible :=SystemOptions[4].Ticked; + AFS.Visible :=SystemOptions[7].Ticked; + DOS.Visible :=SystemOptions[8].Ticked; + //And tertiary panels DFSTracks.Visible :=DFS.Visible; AFSSize.Visible :=AFS.Visible; //Currently, only certain types of format can be created - btn_OK.Enabled:=(MainFormat.ItemIndex=0) //DFS - OR(MainFormat.ItemIndex=1) //ADFS - OR(MainFormat.ItemIndex=2) //C64 - OR(MainFormat.ItemIndex=4) //Amiga - OR(MainFormat.ItemIndex=5) //CFS - OR(MainFormat.ItemIndex=6) //Spark - OR(MainFormat.ItemIndex=7) //AFS - OR(MainFormat.ItemIndex=8);//DOS + btn_OK.Enabled:=(SystemOptions[0].Ticked) //DFS + OR(SystemOptions[1].Ticked) //ADFS + OR(SystemOptions[2].Ticked) //C64 + OR(SystemOptions[4].Ticked) //Amiga + OR(SystemOptions[5].Ticked) //CFS + OR(SystemOptions[6].Ticked) //Spark + OR(SystemOptions[7].Ticked) //AFS + OR(SystemOptions[8].Ticked);//DOS end; {------------------------------------------------------------------------------- @@ -117,16 +165,16 @@ procedure TNewImageForm.MainFormatClick(Sender: TObject); procedure TNewImageForm.FormShow(Sender: TObject); begin //Reset to the default options - MainFormat.ItemIndex:=0; - DFS.ItemIndex :=0; - DFSTracks.ItemIndex :=1; - ADFS.ItemIndex :=0; - C64.ItemIndex :=0; - Spectrum.ItemIndex :=0; - Amiga.ItemIndex :=0; - AFS.ItemIndex :=0; - DOS.ItemIndex :=0; - cb_AFScreatepword.Checked:=False; + SystemOptions[0].Ticked:=True; + DFSOptions[0].Ticked :=True; + DFSTOptions[0].Ticked :=True; + ADFSOptions[0].Ticked :=True; + C64Options[0].Ticked :=True; + SpecOptions[0].Ticked :=True; + AmigaOptions[0].Ticked :=True; + AFSOptions[0].Ticked :=True; + DOSOptions[0].Ticked :=True; + cb_AFScreatepword.Ticked:=False; AFSImageSize.Position:=AFSImageSize.Min; AFSClick(Sender); AFSImageSizeChange(Sender); @@ -153,47 +201,191 @@ procedure TNewImageForm.btn_OKClick(Sender: TObject); begin ok:=True; //Are we creating a hard drive? - if((MainFormat.ItemIndex=1)AND(ADFS.ItemIndex=8)) //ADFS - or((MainFormat.ItemIndex=8)AND(DOS.ItemIndex=6)) //DOS - or((MainFormat.ItemIndex=4)AND(Amiga.ItemIndex=2))then//Amiga + if((SystemOptions[1].Ticked)AND(ADFSOptions[8].Ticked)) //ADFS + or((SystemOptions[8].Ticked)AND(DOSOptions[6].Ticked)) //DOS + or((SystemOptions[4].Ticked)AND(AmigaOptions[2].Ticked))then//Amiga begin //Then we need to open the additional dialogue to configure this - HardDriveForm.ADFSHDD :=MainFormat.ItemIndex=1; //Set to ADFS - HardDriveForm.DOSHDD :=MainFormat.ItemIndex=8; //Set to DOS - HardDriveForm.AmigaHDD:=MainFormat.ItemIndex=4; //Set to Amiga + HardDriveForm.ADFSHDD :=SystemOptions[1].Ticked; //Set to ADFS + HardDriveForm.DOSHDD :=SystemOptions[8].Ticked; //Set to DOS + HardDriveForm.AmigaHDD:=SystemOptions[4].Ticked; //Set to Amiga HardDriveForm.ShowModal; ok:=HardDriveForm.ModalResult=mrOK; if ok then begin //Selected hard drive size in MB harddrivesize:=HardDriveForm.CapacitySlider.Position*1024*1024; - addheader:=HardDriveForm.cb_AddHeader.Checked; - ide:=HardDriveForm.cb_IDE.Checked; - if MainFormat.ItemIndex=1 then //ADFS Specific + addheader:=HardDriveForm.cb_AddHeader.Ticked; + ide:=HardDriveForm.cb_IDE.Ticked; + if SystemOptions[1].Ticked then //ADFS Specific begin //New or old map - newmap:=HardDriveForm.cb_NewMap.Checked; + newmap:=HardDriveForm.cb_NewMap.Ticked; //Directory type dirtype:=diADFSOldDir; - if HardDriveForm.rb_NewDir.Checked then dirtype:=diADFSNewDir; - if HardDriveForm.rb_BigDir.Checked then dirtype:=diADFSBigDir; + if HardDriveForm.rb_NewDir.Ticked then dirtype:=diADFSNewDir; + if HardDriveForm.rb_BigDir.Ticked then dirtype:=diADFSBigDir; end; - if MainFormat.ItemIndex=4 then //Amiga Specific + if SystemOptions[4].Ticked then //Amiga Specific begin {fat:=diFAT12; if HardDriveForm.rb_FAT16.Checked then fat:=diFAT16; if HardDriveForm.rb_FAT32.Checked then fat:=diFAT32;} end; - if MainFormat.ItemIndex=8 then //DOS Specific + if SystemOptions[8].Ticked then //DOS Specific begin fat:=diFAT12; - if HardDriveForm.rb_FAT16.Checked then fat:=diFAT16; - if HardDriveForm.rb_FAT32.Checked then fat:=diFAT32; + if HardDriveForm.rb_FAT16.Ticked then fat:=diFAT16; + if HardDriveForm.rb_FAT32.Ticked then fat:=diFAT32; end; end; end; //Return to the calling form - if ok then ModalResult:=mrOK; + if ok then btn_OK.ModalResult:=mrOK else btn_OK.ModalResult:=mrNone; +end; + +{------------------------------------------------------------------------------- +Form creation +-------------------------------------------------------------------------------} +procedure TNewImageForm.FormCreate(Sender: TObject); +var + Index, + LWid: Integer; + ratio: Real; +procedure CreateRadioBoxes(var LLabel: TLabel; var LPanel: TPanel; + var LOptions: array of TGJHRadioBox;var LStrings: array of String); +var + LH, + Index: Integer; +begin + //Keep track of the Y position + LH:=LLabel.Top+LLabel.Height+4; + //Create each control + for Index:=0 to Length(LStrings)-1 do + begin + LOptions[Index]:=TGJHRadioBox.Create(LPanel as TControl); + LOptions[Index].Parent:=LPanel as TWinControl; + LOptions[Index].Left:=8; + LOptions[Index].Top:=LH; + LOptions[Index].Caption:=LStrings[Index]; + LOptions[Index].Tag:=Index; + inc(LH,LOptions[Index].Height+4); + if LOptions[Index].Width>LWid then LWid:=LOptions[Index].Width; + end; + //Align the panel + LPanel.Height:=LH-LLabel.Top; +end; +procedure RepositionPanel(LPanel: TPanel); +begin + LPanel.Width:=LWid; + LPanel.Top:=0; + LPanel.Left:=LWid; +end; +begin + ratio:=PixelsPerInch/DesignTimePPI; + LWid:=0;//Find the widest string + //System Format --------------------------------------------------------------- + //Set up the control array + SetLength(SystemOptions,Length(FFormats)); + //Create the controls + CreateRadioBoxes(SystemLabel,MainFormatPanel,SystemOptions,FFormats); + //Set the OnChange + for Index:=0 to Length(FFormats)-1 do + SystemOptions[Index].OnChange:=@MainFormatClick; + //DFS Format ------------------------------------------------------------------ + //Set up the control array + SetLength(DFSOptions,Length(DFSFormats)); + //Create the controls + CreateRadioBoxes(DFSLabel,DFS,DFSOptions,DFSFormats); + //DFS Tracks ------------------------------------------------------------------ + //Set up the control array + SetLength(DFSTOptions,Length(DFSTrackStrings)); + //Create the controls + CreateRadioBoxes(DFSTracksLabel,DFSTracks,DFSTOptions,DFSTrackStrings); + //ADFS Format ----------------------------------------------------------------- + //Set up the control array + SetLength(ADFSOptions,Length(ADFSFormats)); + //Create the controls + CreateRadioBoxes(ADFSLabel,ADFS,ADFSOptions,ADFSFormats); + //C64 Format ------------------------------------------------------------------ + //Set up the control array + SetLength(C64Options,Length(C64Formats)); + //Create the controls + CreateRadioBoxes(C64Label,C64,C64Options,C64Formats); + //Spectrum Format ------------------------------------------------------------- + //Set up the control array + SetLength(SpecOptions,Length(SpectrumFormats)); + //Create the controls + CreateRadioBoxes(SpectrumLabel,Spectrum,SpecOptions,SpectrumFormats); + //Amiga Format ---------------------------------------------------------------- + //Set up the control array + SetLength(AmigaOptions,Length(AmigaFormats)); + //Create the controls + CreateRadioBoxes(AmigaLabel,Amiga,AmigaOptions,AmigaFormats); + //DOS Format ------------------------------------------------------------------ + //Set up the control array + SetLength(DOSOptions,Length(DOSFormats)); + //Create the controls + CreateRadioBoxes(DOSLabel,DOS,DOSOptions,DOSFormats); + //AFS Format ------------------------------------------------------------------ + //Set up the control array + SetLength(AFSOptions,Length(AFSFormats)); + //Create the controls + CreateRadioBoxes(AFSLabel,AFS,AFSOptions,AFSFormats); + //Set the OnChange + for Index:=0 to Length(AFSFormats)-1 do + AFSOptions[Index].OnChange:=@AFSClick; + //Create the sizing controls + AFSImageSize:=TGJHSlider.Create(AFSSize as TControl); + AFSImageSize.Parent:=AFSSize as TWinControl; + AFSImageSize.Visible:=True; + AFSImageSize.Top:=AFSImageSizeLabel.Top+AFSImageSizeLabel.Height; + AFSImageSize.Align:=alTop; + AFSImageSize.Height:=Round(30*ratio); + AFSImageSize.Min:=40; + AFSImageSize.Max:=52428; + AFSImageSize.Position:=40; + AFSImageSize.OnChange:=@AFSImageSizeChange; + AFSImageSize.Orientation:=csHorizontal; + AFSImageSize.Pointers:=False; + AFSImageSize.Outline:=csOutInner; + cb_AFScreatepword:=TGJHTickBox.Create(AFSSize as TControl); + cb_AFScreatepword.Parent:=AFSSize as TWinControl; + cb_AFScreatepword.Visible:=True; + cb_AFScreatepword.Caption:='Create password file'; + cb_AFScreatepword.Left:=Round(8*ratio); + cb_AFScreatepword.Top:=AFSImageSize.Top+AFSImageSize.Height+Round(4*ratio); + AFSSize.Height:=cb_AFScreatepword.Top+cb_AFScreatepword.Height; + //Adjust the panel widths and left positions ---------------------------------- + inc(LWid,8); + MainFormatPanel.Width:=LWid; + MainFormatPanel.Top:=0; + MainFormatPanel.Left:=0; + RepositionPanel(DFS); + DFSTracks.Width:=LWid; + DFSTracks.Top:=DFS.Top+DFS.Height; + DFSTracks.Left:=LWid; + RepositionPanel(ADFS); + RepositionPanel(C64); + RepositionPanel(Spectrum); + RepositionPanel(Amiga); + RepositionPanel(DOS); + RepositionPanel(AFS); + AFSSize.Top:=AFS.Top+AFS.Height; + AFSSize.Left:=LWid; + AFSSize.Width:=LWid; + //Align the buttons ----------------------------------------------------------- + btn_Cancel:=MainForm.CreateButton(NewImageForm as TControl,'Cancel',False,0, + MainFormatPanel.Top+MainFormatPanel.Height+Round(8*ratio), + mrCancel); + btn_OK:=MainForm.CreateButton(NewImageForm as TControl,'Create',True,0, + btn_Cancel.Top-Round(4*ratio),mrNone); + btn_OK.Left:=(LWid*2)-btn_OK.Width-Round(8*ratio); + btn_OK.OnClick:=@btn_OKClick; + btn_Cancel.Left:=btn_OK.Left-Round(4*ratio)-btn_Cancel.Width; + //Adjust the form size + Height:=btn_OK.Top+btn_OK.Height+Round(8*ratio); + Width:=LWid*2; end; {------------------------------------------------------------------------------- @@ -205,7 +397,7 @@ procedure TNewImageForm.AFSImageSizeChange(Sender: TObject); AFSImageSizeLabel.Caption:=IntToStr(AFSImageSize.Position*10)+'KB' else begin - AFSImageSize.Position:=Round((Ceil((AFSImageSize.Position*10)/1024)*1024)/10); + AFSImageSize.Position:=Round((Ceil((AFSImageSize.Position*10)/1024)<<10)/10); AFSImageSizeLabel.Caption:=IntToStr(Ceil((AFSImageSize.Position*10)/1024))+'MB'; end; end; @@ -215,12 +407,12 @@ procedure TNewImageForm.AFSImageSizeChange(Sender: TObject); -------------------------------------------------------------------------------} procedure TNewImageForm.AFSClick(Sender: TObject); begin - if AFS.ItemIndex=0 then + if AFSOptions[0].Ticked then begin AFSImageSize.Min:=40; //Level 2 minimum size 400K AFSImageSize.Max:=102; //Level 2 maximum size is 1023K (1MB) end; - if(AFS.ItemIndex=1)or(AFS.ItemIndex=2)then + if(AFSOptions[1].Ticked)or(AFSOptions[2].Ticked)then begin AFSImageSize.Min:=64; //Level 3 minimum size 640K AFSImageSize.Max:=13107; //Level 3 temporary max is ~128MB diff --git a/LazarusSource/PWordEditorUnit.lfm b/LazarusSource/PWordEditorUnit.lfm index 85033d9..c0f397e 100644 --- a/LazarusSource/PWordEditorUnit.lfm +++ b/LazarusSource/PWordEditorUnit.lfm @@ -10,9 +10,10 @@ object PwordEditorForm: TPwordEditorForm BorderIcons = [] BorderStyle = bsDialog Caption = 'Acorn FS User Account Editor' - ClientHeight = 254 + ClientHeight = 267 ClientWidth = 500 Color = 15527148 + OnCreate = FormCreate OnHide = FormHide OnPaint = FormPaint OnShow = FormShow @@ -20,11 +21,12 @@ object PwordEditorForm: TPwordEditorForm LCLVersion = '2.2.0.4' object AccountsPanel: TPanel Left = 0 - Height = 216 + Height = 217 Top = 0 Width = 500 + Align = alClient BevelOuter = bvNone - ClientHeight = 216 + ClientHeight = 217 ClientWidth = 500 TabOrder = 0 object HeaderPanel: TPanel @@ -146,14 +148,14 @@ object PwordEditorForm: TPwordEditorForm end object AccountsScroll: TScrollBox Left = 0 - Height = 196 + Height = 197 Top = 20 Width = 500 HorzScrollBar.Page = 23 VertScrollBar.Page = 22 Align = alClient BorderStyle = bsNone - ClientHeight = 196 + ClientHeight = 197 ClientWidth = 500 TabOrder = 1 OnPaint = FormPaint @@ -206,49 +208,10 @@ object PwordEditorForm: TPwordEditorForm object ControlsPanel: TPanel Left = 0 Height = 50 - Top = 204 + Top = 217 Width = 500 Align = alBottom - ClientHeight = 50 - ClientWidth = 500 TabOrder = 1 OnPaint = FormPaint - object CancelButton: TBitBtn - Left = 4 - Height = 30 - Top = 8 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 0 - end - object OKBtnBack: TPanel - Left = 120 - Height = 30 - Top = 8 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 1 - object OKButton: TBitBtn - Left = 0 - Height = 30 - Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - ModalResult = 1 - OnClick = OKButtonClick - TabOrder = 0 - end - end end end diff --git a/LazarusSource/PWordEditorUnit.pas b/LazarusSource/PWordEditorUnit.pas index 0b76841..28d5b03 100644 --- a/LazarusSource/PWordEditorUnit.pas +++ b/LazarusSource/PWordEditorUnit.pas @@ -1,7 +1,7 @@ unit PWordEditorUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -25,7 +25,7 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls, - Buttons, DiscImageUtils; + GJHCustomComponents, DiscImageUtils, Buttons; type @@ -33,7 +33,6 @@ interface TPwordEditorForm = class(TForm) AccountsPanel: TPanel; - CancelButton: TBitBtn; HeaderPanel: TPanel; AccountsScroll: TScrollBox; ControlsPanel: TPanel; @@ -42,28 +41,29 @@ TPwordEditorForm = class(TForm) Label3: TLabel; Label4: TLabel; Label5: TLabel; - OKBtnBack: TPanel; - OKButton: TBitBtn; btnAdd: TSpeedButton; UsernamesHdr: TPanel; PasswordsHdr: TPanel; SystemHdr: TPanel; LockedHdr: TPanel; BootOptionHdr: TPanel; + OKButton, + CancelButton: TGJHButton; procedure btnAddClick(Sender: TObject); + procedure FormCreate(Sender: TObject); procedure FormHide(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormShow(Sender: TObject); function CreateNewEntry: Integer; function CreateEditField(column: TPanel;maxlen,len: Integer): TEdit; - function CreateTickBox(column: TPanel;len: Integer): TCheckBox; + function CreateTickBox(column: TPanel;len: Integer): TGJHTickBox; function CreateDropDown(column: TPanel;len: Integer): TComboBox; procedure OKButtonClick(Sender: TObject); private Usernames: array of TEdit; Passwords: array of TEdit; - System : array of TCheckBox; - Locked : array of TCheckBox; + System : array of TGJHTickBox; + Locked : array of TGJHTickBox; BootOpts : array of TComboBox; FreeSpc : array of TEdit; public @@ -98,8 +98,8 @@ procedure TPwordEditorForm.FormShow(Sender: TObject); //Fill in the fields Usernames[ctrl].Text :=UserAccounts[index].Username; Passwords[ctrl].Text :=UserAccounts[index].Password; - System[ctrl].Checked :=UserAccounts[index].System; - Locked[ctrl].Checked :=UserAccounts[index].Locked; + System[ctrl].Ticked :=UserAccounts[index].System; + Locked[ctrl].Ticked :=UserAccounts[index].Locked; BootOpts[ctrl].ItemIndex:=UserAccounts[index].BootOption; FreeSpc[ctrl].Text :=IntToHex(UserAccounts[index].FreeSpace,8); end; @@ -151,6 +151,24 @@ procedure TPwordEditorForm.btnAddClick(Sender: TObject); CreateNewEntry; end; +{------------------------------------------------------------------------------} +//Create the form +{------------------------------------------------------------------------------} +procedure TPwordEditorForm.FormCreate(Sender: TObject); +var + ratio : Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + OKButton:=MainForm.CreateButton(ControlsPanel as TControl,'OK',True,0, + Round(8*ratio),mrOK); + OKButton.Left:=ControlsPanel.ClientWidth-OKButton.Width-Round(8*ratio); + OKButton.OnClick:=@OKButtonClick; + CancelButton:=MainForm.CreateButton(ControlsPanel as TControl,'Cancel',False, + 0,Round(12*ratio),mrCancel); + CancelButton.Left:=OKButton.Left-Round(8*ratio)-CancelButton.Width; + ControlsPanel.Height:=OKButton.Top+OKButton.Height+Round(8*ratio); +end; + {------------------------------------------------------------------------------} //Create a new entry, including creating the components {------------------------------------------------------------------------------} @@ -198,12 +216,13 @@ function TPwordEditorForm.CreateEditField(column: TPanel;maxlen,len: Integer): T {------------------------------------------------------------------------------} //Create a TCheckBox {------------------------------------------------------------------------------} -function TPwordEditorForm.CreateTickBox(column: TPanel;len: Integer): TCheckBox; +function TPwordEditorForm.CreateTickBox(column: TPanel;len: Integer): TGJHTickBox; begin - Result:=TCheckBox.Create(AccountsScroll); + Result:=TGJHTickBox.Create(AccountsScroll); Result.Parent:=AccountsScroll; Result.Left:=column.Left+(column.Width-18)div 2; Result.Top:=2+(2+column.Height)*len; + Result.Caption:=''; end; {------------------------------------------------------------------------------} @@ -240,8 +259,8 @@ procedure TPwordEditorForm.OKButtonClick(Sender: TObject); //Populate it UserAccounts[Length(UserAccounts)-1].Username :=Usernames[index].Text; UserAccounts[Length(UserAccounts)-1].Password :=Passwords[index].Text; - UserAccounts[Length(UserAccounts)-1].System :=System[index].Checked; - UserAccounts[Length(UserAccounts)-1].Locked :=Locked[index].Checked; + UserAccounts[Length(UserAccounts)-1].System :=System[index].Ticked; + UserAccounts[Length(UserAccounts)-1].Locked :=Locked[index].Ticked; UserAccounts[Length(UserAccounts)-1].BootOption:=BootOpts[index].ItemIndex; UserAccounts[Length(UserAccounts)-1].FreeSpace :=StrToIntDef('$'+FreeSpc[index].Text,0); end; diff --git a/LazarusSource/ProgressUnit.pas b/LazarusSource/ProgressUnit.pas index 73d21df..822abe1 100644 --- a/LazarusSource/ProgressUnit.pas +++ b/LazarusSource/ProgressUnit.pas @@ -1,7 +1,7 @@ unit ProgressUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free diff --git a/LazarusSource/SearchUnit.lfm b/LazarusSource/SearchUnit.lfm index 56b2a84..0b2ed54 100755 --- a/LazarusSource/SearchUnit.lfm +++ b/LazarusSource/SearchUnit.lfm @@ -9,8 +9,8 @@ object SearchForm: TSearchForm ClientHeight = 335 ClientWidth = 451 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint - OnShow = FormShow Position = poMainFormCenter ShowHint = True LCLVersion = '2.2.0.4' @@ -27,9 +27,9 @@ object SearchForm: TSearchForm OnPaint = FormPaint object SearchFiletypeLabel: TLabel Left = 16 - Height = 17 + Height = 16 Top = 37 - Width = 67 + Width = 57 Alignment = taRightJustify Caption = 'Filetype:' Font.Color = clWindowText @@ -63,9 +63,9 @@ object SearchForm: TSearchForm end object SearchFilenameLabel: TLabel Left = 8 - Height = 17 + Height = 16 Top = 10 - Width = 74 + Width = 64 Alignment = taRightJustify Caption = 'Filename:' Font.Color = clWindowText @@ -82,21 +82,12 @@ object SearchForm: TSearchForm Alignment = taCenter AutoSize = False Caption = 'Number of results found: 0' - Font.Color = clWindowText + Color = 7829367 + Font.Color = clWhite Font.Name = 'Tahoma' Font.Style = [fsBold] ParentFont = False - end - object sb_SearchButton: TBitBtn - Left = 348 - Height = 30 - Top = 32 - Width = 100 - Caption = 'Search' - Color = 15527148 - Default = True - OnClick = sb_searchClick - TabOrder = 2 + Transparent = False end end object lb_searchresults: TListBox @@ -114,6 +105,5 @@ object SearchForm: TSearchForm ParentFont = False Sorted = True TabOrder = 1 - TopIndex = -1 end end diff --git a/LazarusSource/SearchUnit.pas b/LazarusSource/SearchUnit.pas index 1e512dd..0cbcecf 100755 --- a/LazarusSource/SearchUnit.pas +++ b/LazarusSource/SearchUnit.pas @@ -1,7 +1,7 @@ unit SearchUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -24,15 +24,14 @@ interface uses - Classes,SysUtils,Forms,Controls,Graphics,Dialogs,ExtCtrls,StdCtrls,Buttons, - DiscImageUtils; + Classes,SysUtils,Forms,Controls,Graphics,Dialogs,ExtCtrls,StdCtrls, + DiscImageUtils,GJHCustomComponents; type { TSearchForm } TSearchForm = class(TForm) - sb_SearchButton: TBitBtn; ed_filenamesearch: TEdit; ed_filetypesearch: TEdit; lb_searchresults: TListBox; @@ -40,8 +39,9 @@ TSearchForm = class(TForm) SearchFilenameLabel: TLabel; SearchFiletypeLabel: TLabel; searchresultscount: TLabel; + sb_SearchButton: TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); - procedure FormShow(Sender: TObject); procedure sb_searchClick(Sender: TObject); procedure ed_filenamesearchKeyPress(Sender: TObject; var Key: char); procedure lb_searchresultsClick(Sender: TObject); @@ -110,16 +110,38 @@ procedure TSearchForm.FormPaint(Sender: TObject); end; {------------------------------------------------------------------------------} -//Re-arrange the controls +//Create the form {------------------------------------------------------------------------------} -procedure TSearchForm.FormShow(Sender: TObject); +procedure TSearchForm.FormCreate(Sender: TObject); +var + ratio: Real; begin - ed_filenamesearch.Left:=(SearchFilenameLabel.Left+SearchFilenameLabel.Width)+4; - ed_filenamesearch.Width:=(SearchEntryPanel.Width-ed_filenamesearch.Left)-4; - SearchFiletypeLabel.Left:=(ed_filenamesearch.Left-4)-SearchFiletypeLabel.Width; + ratio:=PixelsPerInch/DesignTimePPI; + //Move the fields to account for scaling + ed_filenamesearch.Left:=SearchFilenameLabel.Left + +SearchFilenameLabel.Width + +Round(4*ratio); + ed_filenamesearch.Width:=SearchEntryPanel.Width + -ed_filenamesearch.Left + -Round(4*ratio); + SearchFiletypeLabel.Left:=ed_filenamesearch.Left + -Round(4*ratio) + -SearchFiletypeLabel.Width; ed_filetypesearch.Left:=ed_filenamesearch.Left; + //Create the button + sb_SearchButton:=MainForm.CreateButton(SearchEntryPanel as TControl,'Search', + False,0,0,mrNone); + //And position it sb_SearchButton.Top:=ed_filetypesearch.Top; - sb_SearchButton.Left:=(SearchEntryPanel.Width-sb_SearchButton.Width)-4; + sb_SearchButton.Left:=SearchEntryPanel.Width + -sb_SearchButton.Width + -Round(4*ratio); + sb_SearchButton.OnClick:=@sb_searchClick; + //Adjust the panel height to account for scaling + SearchEntryPanel.Height:=sb_SearchButton.Top + +sb_SearchButton.Height + +Round(4*ratio) + +searchresultscount.Height; end; {------------------------------------------------------------------------------} diff --git a/LazarusSource/SettingsUnit.lfm b/LazarusSource/SettingsUnit.lfm index fb458c9..c753bd5 100644 --- a/LazarusSource/SettingsUnit.lfm +++ b/LazarusSource/SettingsUnit.lfm @@ -9,23 +9,27 @@ object SettingsForm: TSettingsForm ClientHeight = 429 ClientWidth = 448 Color = 15527148 + OnCreate = FormCreate OnPaint = FormPaint OnShow = FormShow Position = poMainFormCenter LCLVersion = '2.2.0.4' - object TextureGroup: TGroupBox + object TexturePanel: TPanel Left = 0 Height = 166 Top = 0 Width = 448 - Caption = 'Window Texture' - ClientHeight = 147 - ClientWidth = 438 + BevelColor = clTeal + BevelOuter = bvNone + BevelWidth = 4 + ClientHeight = 166 + ClientWidth = 448 TabOrder = 0 + OnPaint = FormPaint object TilePictureRO5: TImage - Left = 176 + Left = 180 Height = 84 - Top = 32 + Top = 48 Width = 84 OnClick = TilePictureRO5Click Stretch = True @@ -33,238 +37,1444 @@ object SettingsForm: TSettingsForm object TilePictureRO4: TImage Left = 92 Height = 84 - Top = 32 + Top = 48 Width = 84 OnClick = TilePictureRO5Click Stretch = True end - object TileRO5: TRadioButton - Left = 176 - Height = 18 - Top = 120 - Width = 81 - Caption = 'RISC OS 5' - Checked = True - TabOrder = 3 - TabStop = True - end - object TileRO4: TRadioButton - Left = 92 - Height = 18 - Top = 120 - Width = 81 - Caption = 'RISC OS 4' - TabOrder = 2 - end - object NoTile: TRadioButton - Left = 12 - Height = 18 - Top = 8 - Width = 52 - Caption = 'None' - TabOrder = 0 - end object TilePictureRO3: TImage - Left = 8 + Left = 4 Height = 84 - Top = 32 + Top = 48 Width = 84 OnClick = TilePictureRO5Click Stretch = True end - object TileRO3: TRadioButton - Left = 8 - Height = 18 - Top = 120 - Width = 81 - Caption = 'RISC OS 3' - TabOrder = 1 - end object TilePictureIyonix: TImage - Left = 260 + Left = 268 Height = 84 - Top = 32 + Top = 48 Width = 84 OnClick = TilePictureRO5Click Stretch = True end - object TileIyonix: TRadioButton - Left = 260 - Height = 18 - Top = 120 - Width = 55 - Caption = 'Iyonix' - TabOrder = 4 - end object TilePictureROPi: TImage - Left = 344 + Left = 356 Height = 84 - Top = 32 + Top = 48 Width = 84 OnClick = TilePictureRO5Click Stretch = True end - object TileROPi: TRadioButton - Left = 344 - Height = 18 - Top = 120 - Width = 84 - Caption = 'RISC OS Pi' - TabOrder = 5 - end - end - object CancelButton: TBitBtn - Left = 224 - Height = 30 - Top = 392 - Width = 100 - Cancel = True - Caption = 'Cancel' - Color = 15527148 - ModalResult = 2 - TabOrder = 5 - end - object OKBtnBack: TPanel - Left = 340 - Height = 30 - Top = 392 - Width = 100 - BevelColor = clYellow - BevelInner = bvLowered - BevelOuter = bvLowered - BevelWidth = 4 - ClientHeight = 30 - ClientWidth = 100 - Color = clYellow - ParentColor = False - TabOrder = 4 - object OKButton: TBitBtn + object TexturePanelLabel: TLabel Left = 0 - Height = 30 + Height = 16 Top = 0 - Width = 100 - Caption = '&OK' - Color = 15527148 - Default = True - ModalResult = 1 - TabOrder = 0 + Width = 448 + Align = alTop + Caption = ' Window Texture' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end - end - object InterleaveGroup: TRadioGroup - Left = 0 - Height = 104 - Top = 176 - Width = 224 - AutoFill = True - Caption = 'Track Order (ADFS L and Acorn FS)' - ChildSizing.LeftRightSpacing = 6 - ChildSizing.EnlargeHorizontal = crsHomogenousChildResize - ChildSizing.EnlargeVertical = crsHomogenousChildResize - ChildSizing.ShrinkHorizontal = crsScaleChilds - ChildSizing.ShrinkVertical = crsScaleChilds - ChildSizing.Layout = cclLeftToRightThenTopToBottom - ChildSizing.ControlsPerLine = 1 - ClientHeight = 85 - ClientWidth = 214 - ItemIndex = 0 - Items.Strings = ( - 'Automatic (recommended)' - 'Sequential (0,1,2,...80,81,82,...)' - 'Interleaved (0,80,1,81,2,82,...)' - 'Multiplexed (0,2,4,...1,3,5,...)' - ) - TabOrder = 1 - end - object MiscGroup: TGroupBox - Left = 0 - Height = 96 - Top = 288 - Width = 440 - Caption = 'Miscellaneous' - ClientHeight = 77 - ClientWidth = 430 - TabOrder = 3 - object CreateINF: TCheckBox - Left = 4 - Height = 18 - Top = 8 - Width = 188 - Caption = 'Create *.inf files on download' - Checked = True - State = cbChecked - TabOrder = 0 + object Border1: TImage + Left = 48 + Height = 152 + Top = 25 + Width = 152 + OnClick = TilePictureRO5Click + Picture.Data = { + 1754506F727461626C654E6574776F726B47726170686963961F000089504E47 + 0D0A1A0A0000000D494844520000009800000098080600000018C22021000018 + 84694343504943432050726F66696C65000058859579093855DFF7F73EE7CE97 + 6BBAE6799E67E122F39C313311D77C4D715D421A0C69A0814A4429642C1A84A4 + 845029A142516910A2522965C8FF18EAF7FD7F7FEFF3BECFBB9F679FF3B96BAF + BDF65E6BAFBDD75EF7002070871A1D1D01B3011019C5A03B599A887A787A89E2 + C6010458013740037E6A406CB4B1A3A32D40CA9FF7FF2E3F06106EA43C565A91 + F5DFEDFFD7C21118141B0000E48D60FFC0D8804804DF06009D1A104D67008035 + 43E812DB19D12B3814C19C746482084E5EC1216BF8E80AF65FC3A5AB3C2E4EA6 + 086E0400CF4CA5D2430060B983D045E3034210392CEF90368EA8405A14C2FA13 + C10601A1D440000428088F6264E4B6158C54208BF04723380BC114FF7FC80CF9 + 5FF2FDFFCAA75243FEE235BD560BDE8C161B1D414DFCFF34CDFFBB4446C4FD19 + 431AA9CCA1742BA715FD111B0E856FB359C1CC089E8EF2B77758B135827FD202 + D7EC0E004C0C8DB3725DE3870503624D11FB216B0E60D540AA990D8205116C11 + 15616FBB4EF70FA659582318F1163881C6B07659EFBB3F28D6DC795D66217D9B + 93C31F1C4C37355EEF5B43A5AF8EBBC27F272EDCD5785DFE506890F51FF9B349 + A12EEE0826028022C6D3DCEC11CC8260CED870679B351E947852A8A9FD1F1E7A + 9CD3CAFC25114C098AB23459938FF20EA65B38ADF34747C6FED11795114AB3B6 + 5FC7798C5017AB35FBA0AA02A8ABF3E745707D5094B1EB1F3941B11EB67F7409 + 0C32335FD31DD51314E5BAAE2FEA6534C3C469BDEF4C7484E33A3F1A1F1461B9 + 421747307F6CBCF37A5FF44606E29C6BF2D1B6D10C4797B579A2FDC2A89B1CD7 + E6838E07B6C0149801511087547FB00D84015ACF74C334F26BADC50250011D84 + 8020A0B44EF9D3C37DB5250A793A8324F011414120F66F3F93D5D620108FD097 + FE52D79E4A2078B5357EB54738788FE04860032290DF71ABBDA2FE8EE606DE21 + 14DA7F8D1E80CC3502A92B6DFF4D334628B6EB94B83F724559FF7062CDB16658 + 2BAC05560ECD8F3640EBA16D91A71152D5D114B4CE9FD9FE871FF31ED3877983 + 798A19C53CF3A5A5D2FF35173B308AC8B758D7D8FF9F1AA3A511999A6813B43E + 221D918CE646F30325F406641C63B42132B22642355D9FF78AEEA2FF073DFF6A + F00F9BAFF3115409308187604490FD774F167916CDBF52562CFA4FFBACCDD5FF + AF554DFFB6FC7B7CD37FD8391079DBFC9B13B51F7515D5856A45DD4335A31A80 + 28AA05D5887A80BAB982FFFAD0BB551FFA339AD3EA7CC21139B4FF1A8FBA3EE6 + 8A256355AB55275517D7DB00232881B1B2C14CB74527D26921A10C5163240A04 + 895A4705282B8AAAABAA6B00B01253D68EA96F4EABB102E27EF41F5A641A003A + C7913DB6E53FB48051001ABE004078FF1F9A14B293599073BF732A208E1EBF46 + 43AF3C30C869C08AEC283E200C24802CA2913AD0027AC00898834DC001B8004F + B015B17328E2CF74B01D248314900132C15170029C0245A00454808BE00A6800 + CDA01574826ED00B9E8261C47FC6C01498013FC002044138880491213E480492 + 8214207588021940E6902DE40479427E50081405C541C9501A9409E540A7A073 + 50257419BA0EB542F7A03EE819F41A9A84BE42F3300A6686396121581A568129 + B0316C03BBC03E70081C0327C1E9F061380F2E862FC0F5702BDC0D3F8547E129 + F83B0AA09850DC283194128A82324539A0BC50C1283A6A17EA202A17558CAA41 + 35212BFD18358A9A46FD4263D164B4285A09F1612BB42B3A001D83DE85CE429F + 4257A0EBD177D08FD1AFD133E8DF18124610A380D1C558633C302198ED980C4C + 2EA60C730DD381ECA631CC0F2C16CB8D95C16A23BBD1131B86DD81CDC29EC6D6 + 626F63FBB06FB1DF71381C1F4E01A78F73C051710C5C062E1F7701D782EBC78D + E17EE299F0227875BC05DE0B1F854FC5E7E2ABF0B7F0FDF871FC02818D2045D0 + 253810020989842384524213E111618CB0406427CA10F5892EC430620A318F58 + 43EC208E10BF3131318933E9306D66A231ED61CA63BAC47497E935D32F660E66 + 796653666FE638E6C3CCE5CCB7999F317F239148D22423921789413A4CAA24B5 + 935E927EB290599459AC59025976B314B0D4B3F4B37C6225B04AB11AB36E654D + 62CD65BDCAFA88759A8DC026CD66CA4665DBC556C0769D6D90ED3B3B995D8DDD + 813D923D8BBD8AFD1EFB04078E439AC39C2390239DA384A39DE32D194596209B + 9203C869E4527207798C13CB29C369CD19C699C97991B38773868B836B03971B + 57025701D74DAE516E14B734B7357704F711EE2BDC03DCF33C423CC63C413C07 + 786A78FA79E67805788D7883780FF2D6F23EE59DE713E533E70BE7CBE66BE07B + C18FE697E7DFCCBF9DFF0C7F07FFB400A7809E4080C041812B02CF0561417941 + 27C11D8225820F04BF0B090B590A450BE50BB50B4D0B730B1B0987091F17BE25 + 3C2942163110A1891C176911F920CA256A2C1A219A277A4774464C50CC4A2C4E + EC9C588FD882B88CB8AB78AA78ADF80B09A204452258E2B8449BC48CA488A49D + 64B264B5E473298214452A54EAA45497D49CB48CB4BBF43EE906E909195E196B + 9924996A99115992ACA16C8C6CB1EC1339AC1C452E5CEEB45CAF3C2CAF291F2A + 5F20FF480156D052A0299C56E853C428EA284629162B0E2A312B192BC52B552B + BD56E656B6554E556E50FEA422A9E2A592ADD2A5F25B55533542B55475588D43 + 6D935AAA5A93DA577579F500F502F5271A240D0B8DDD1A8D1A5F36286C08DA70 + 66C3902659D34E739F669BE69296B6165DAB466B525B52DB4FBB507B90C24971 + A46451EEEA60744C7476EB34EBFCD2D5D265E85ED1FDACA7A417AE57A537B151 + 6663D0C6D28D6FF5C5F5A9FAE7F4470D440DFC0CCE1A8C1A8A19520D8B0DDF18 + 4918051A95198D1BCB1987195F30FE64A26A4237B9663267AA6BBAD3F4B619CA + CCD2ECA0598F3987B9ABF929F39716E2162116D51633969A963B2C6F5B61AC6C + ACB2AD06AD85AC03AC2BAD6736696FDAB9E98E0DB38DB3CD299B37B6F2B674DB + 263BD86E93DD31BB117B29FB28FB0607E060ED70CCE185A38C638CE38DCDD8CD + 8E9B0B36BF7752734A76EA72263BFB3A5739FF70317139E232EC2AEB1AE7DAE6 + C6EAE6ED56E936E76EE69EE33EEAA1E2B1D3A3DB93DF93E6D9E885F372F32AF3 + FABEC57CCB892D63DE9ADE19DE033E323E093EF7B6F26F8DD87AD397D597EA7B + D50FE3E7EE57E5B74875A01653BFFB5BFB17FACF0498069C0C980A340A3C1E38 + 19A41F9413341EAC1F9C133C11A21F722C6432D4303437749A664A3B45FB1266 + 1556143617EE105E1EBE1CE11E511B898FF48BBC1EC511151E75679BF0B6846D + 7DD10AD119D1A331BA31276266E836F4B25828D627B691C1895CDE1FC4C9C6ED + 8D7B1D6F105F10FF73BBDBF6AB09EC0951090F12E5130F248E2759249DDF81DE + 11B0A32D592C3925F9F54EE39DE77641BBFC77B5ED96D89DBE7B6C8FE59E8A14 + 624A78CAC354D5D49CD4D934F7B4A674A1F43DE96FF75AEEADCE60C9A0670CEE + D3DB57B41FBD9FB6BFE780C681FC03BF0F061EBC9FA99A999BB998159075FF90 + DAA1BC43CB87830FF71CD13A72E628F668D4D1816CC3EC8A1CF69CA49CB7C7EC + 8ED51F173D7EF0F8EC09DF13F77237E4169D249E8C3B399A679BD7982F997F34 + 7FF154E8A9A7052605B5858285070AE74E079EEE3F6374A6A648A828B368FE2C + EDECD039CB73F5C5D2C5B925D892F892F7A56EA55DE729E72BCBF8CB32CB96CA + A3CA472B9C2AEE546A57565609561DA986ABE3AA272F785FE8BD6876B1B146A9 + E65C2D776DE6257029EED287CB7E9707AED85C69BB4AB95A53275557788D7CED + 603D549F583FD310DA30DAE8D9D8777DD3F5B626BDA66B37946F94378B3517DC + E4BA79E416F156FAADE596A496EFB7A36F4FB786B4BE6DF36D1B6EF7687F7267 + F39D9E0E9B8EBB9D169DED5DC65D2D77F5EF36DFD3BD77FD3EE57E43B75677FD + 03CD07D71E6A3EBCD6A3D553FF48FB5163AF4E6F53DFC6BE5BFD86FDAD8FCD1E + 773EB17ED2FDD4FE69DF80EBC0D0A0F7E0E850E0D0C4B388675F9EC73F5F18DE + 33821939F882ED45EE4BC197C5AFE45ED58E6A8DDE7C6DF6FAC11BE737C36F03 + DE4EBD8B7DB73896FE9EF43E775C64BC72427DA279D262B2F7C3960F6353D153 + 0BD3191FD93F167E92FD54F7D9E8F383198F99B12FF42FCB5FB3BEF17D2B9FDD + 30DBF6DDF1FBCB1F913F16E60EFEE4FB59F18BF2AB6BDE7D7E7C61FB226E316F + 496EA9E9B7CDEF91E5C8E5E5682A9DBA7A154021150E0E06E06B3900244F00C8 + BD489AB0652DE75B2F28E4F201236F2C927B9821B780C79030E40355C200F680 + 6FA06450A7D03CE8428C22A60B1B8513C13DC69F20F8119599D04C2F99BFB090 + 5835D8B6B0A7725C268F7309727BF29CE41DE197128816BC25CC2A12227A4B9C + 4F822ED92C352FA3251B2D572EFF5C11A7A4A46CAF12AC9AA096A2BE572375C3 + 4E4D865688F6668ABC0E5AE7A5EE75BDDC8D71FAAE06DA860246B0D1B4F1A049 + 87E935B372F3428B1CCB8356A9D63B36316CA26C697641F6810E818E819B439D + A29C192E3B5D33DC0EBB9FF428F22CF7AADD52EFDDECD3B6B5D3B7DBEF11F5B1 + FF60C070E09BA04FC1BF43C934C530ABF0E088FD9117A27AB7CDC6F0D029B19E + 8C84B8ACF882ED17126E25F6274D26C33B8577E9EFF6DD93965295FA38EDF75E + E10CB57DA6FBDD0F441EDC97599AD575E8F311A1A34ED95939DDC7594FB8E6E6 + 9F1CC9173CE55570B2B0F70CBEC8E86CC2B9DAE28952F1F3DE65F4F23D15472B + 8BAB1AABFB2FCCD4906BF52ED12E175C795487BFA65DEFD6C0683C7ABDBAA9ED + C6D3E6B19B5F6ECDB72CB7A2DAD0EDD83B840E6227AE73A96BFA6EEFBDF2FBF4 + 6EB5EEF107D90FB51F8EF6543F8AEB35ECC3F7F5F7173C0E7CA2FCE4D7D38E81 + 9C41EA10E519FFB3A5E7AF87EF8C9C7F91F132E895F1A8E0E8ECEBFB6F8ADEC6 + BF731C5342BCECCBF8F3897B93CD1FEAA62E4F5FFA78F553CDE78A998B5FDABF + CECC52BE17CE09FFBC391FBB68F09B6F7979F5C6C807368218D008112133683F + 34082BC069F01872B76A437282168C2D660C7B00A7857B8F3F4DF0268A11A799 + A6100F00AC243649760A871399C17982AB897B8C9783CF987FBBC045C1096129 + 9100D17362BDE23F24F9A5F4A4B7C8C4CA1E90CB972F5628513CA3744C395525 + 42D5496D833A597D5CE32AE209965A6C5ACFB48B29113A5ABA40F79E5ECE466F + 7D69FDCF064D86FB8D7C8C29269C269F4DBB116F48B7F0B734B212B25AB41EDE + D464936F9B60E7656FE820ED4872FCBEF995D37DE7069712D76CB71477BA07D5 + D3D9CB6C8BA6B7940FF756C2D625DF6F7E53D477FEA3012F028783868347425E + 84BEA2BD0A7B113E1CF13CF279D4F0B617C8493D469F8AFDC6588CC76EE74810 + 48144B92D9A19CACB5D37097F56ED73D01298CD48CB482F42B7BBB3326F7B31C + D038E899B933ABF850E7E10F47D9B2B5727C8E651CAF3D3198FB390FE4739C92 + 2ED02F743FCD38935B74F3EC7831578965693272FEDD2D1FAFC45649579B5F08 + BC9856535ADB7969F20AE9AA7A9DD3355AFDCE86ECC6D2EBF54D5D37869A276E + FE6A21DE166C556ED36897BA43EE001DD39D835DAD77ABEF1DBF9FDC1DF4C0FE + 21A547F69158AF601F5F3FDF63FE27C24F250664075586349FE93E371AB618B1 + 7FE1F532FC55DA6831E20F4BEF74C676BEEF9AE09D0CFFD03A2DF3F1DC67B599 + 375FAFCE96FF68FEF969417BE9F8EAFAA3916C411578816360041282DCA07CE8 + 1DBC013E084FA2EC514D6855740D4613D386F5C0CEE28EE3F5F01384F3C40426 + 3F665B1285458A95878DC48EE380C8284E0C17969B954780579A4F93DF5CC04D + 90261421EC2FE2216A23B6515C568215B951754B9D958E92A1C8FC92BD261725 + 2F253FA8B05B5154F1B6125519522E55B1529956CD51D3517BAD9EA9A1ADF166 + C3114D03CD29AD93DA26DA1F29F93AE63A33BA057A967ADF3616E9DBEAFF3428 + 3574325C36AA37A69BA89B7C33AD338B33D7329FB368B04CB4D2B35AB0BEB969 + 978D912DB06DB34BB7B77220393C712CDC1CE2A4E10C3BF7213E12E766ED2EE4 + FEC9A3C5F3A85700E22578EF119FCB5BF7FBFAFA51A864EA67FF070117028F06 + C5057B86E8878AD130B4C9B087E197234E442646F96C33895688E1A3E3E8DF63 + DF301EC535C5976CCF4C8849744DA2ECE04B8692E77741BB097B3852F85325D2 + 14D235F6EA6618EDB3D86F73C0F1A04F263D6BFFA1A2C3578F741E1DCC1ECBF9 + 7C6CEEF8E289DFB9BFF388F9AAA73C0BD20B6B4E0F1681B332E7EC8AE925B9A5 + 8DE79F952D57A85506569DAC7E7011D46CA8A55D3A73F9F1555CDDC66B31F5E7 + 1B06AF139A746F84379FBA79F7D6EC6D9156ABB698F6BC3B2D1D6FBA3077E5EE + 39DC4FECAE78F0A287FFD1D6DECABE85C74E4FDA077C87789FCD8FC8BF6C79DD + 37C6986CF874ECDBECAFBB2BEBBFF6DFDF4AC16A0150520C80BB24004E760094 + 2A2279A63A123F5A00702401E0A20360BE7C00B51D019065CDDFF8C102E491CC + 32021C41B2C6A7601E8922665038740CBA0A3D85E6607ED8100E44BCE9123C84 + E46E722867D44E5405EA091AA095D1DEE883E826F4078C00C60E938269C2CC62 + 55B191D80BD88F38555C3CAE054FC47BE2AB0930C19B708328444C434E9E2D4C + 83CCAECC03240FD2088B3FCB246B0CEB3C5B3A3B2B7B01872C473DD99CFC9433 + 9473912B875B9EFB0E8F2FCF026F1E9F36DF007FBC00AF4093E056218CD04561 + 0F118C489D68B018BF589F78A684A52446B253EA80B4830CB7CCB06C919CBFBC + A4FC7B850AC5302545A54FCA5754B6AB1AAA11D406D4CF6B6CDFE0ACA9A5C5A7 + F55BFB2D72ABBEA89BA3B71D39A78C0CA40C09869F8D9E183799D4217E78CDBC + C1E2BAE575ABEBD6F59B2EDB54D916D91DB34F776038066C7674327256779176 + 1576E375E7F6E0F6E4F712DD22EBADE163B8D5CE778B5F1835C9FF50406F1039 + D82D242FF459184FB8734456647BD48F68991837FADED82B8C97F1B2DBE3123A + 93047630921FEFA2EC2E4DE149CD4EE7D89BBF4F6A7FFD41B3CCA1430C244A0D + E6541D2FCABD91CF5270E28CCE59FFE2ECD2CEB2E54A83EADD175B2FA1AF58D6 + 1DA82F6ABCD6F4B0F9430BA955BB3DBCA3B2EBEB7DF307677BBEF5993ECE7CDA + 3D043F571ED9FC326234E54DCEBBB3EF3B273E7EF831FDFAD3C5199F2FB3DF18 + B3AF7EE8CD65FD7C32CFBE60BDB873A9EAF7C0EAF9C106548033480045A0034C + 41646823140C654375489EFF1B96826DE138B808BE07CF2239BB3D2A19558D1A + 46332171651BBA183D8061C218631231F598EF582D6C22F6260E83E4D185B869 + BC31FE147E8EE049B84D54201630B1321D62E6643E43522035B338B28CB3A6B0 + 89B0B5B2077190381AC83E9C1067399723D72277158F172F89B79D6F07BF26FF + 3781AB820C214DA139E11B2229A256626C62C3E2E5120C4953292EA909E95B32 + B9B2B1728EF2CA0A24858F8A3D4AB5CAD92A0C554F350375290D168D5F1B3E68 + BED47AAC7D8FD2AAD3A47B4DEFD2C60BFA9506E586654665C6E526B5A637CCEE + 9A0F5A8C5BFEB4266E12B451B135B673B60F764870CCDC7CDAA9C2B9CEA5DDF5 + B1DB7BF7794F762FB92DA6DE3E3E895B73917CA39FFA254034D02FE86CF068A8 + 28CD37AC307C28923DCA6ADBAEE8CB316F63B918E67129F10F13F813C3929A93 + D97606EFBAB587272526F541BACCDEB48CD1FDFA07AA32C5B30A0FF31F29C816 + C9293BAE7AE2E649DBBC17A7B615A24EE715F99DD329E12EFD55365AF1B0AAE5 + 425D4DCDA5AA2B157565F5598DD14D4ECD1AB7385A665A7BDA2F761CEADA76CF + B5DBE0A1DC23CEDEC5FE574F9A06B2865C9E730C77BC887E451EBDF4C6FAEDC8 + 58E43866E2D807EEA9ACE9EF9F9C3E9F9E19FECAFA4D7BD6E93BED47EC5CD2CF + A45F71F3910B7E8B4E4B86BF1597B956D79F13E8007F7008348277103B640445 + 4367A02EE80B2C04DBC04970153C8C624119A3E2511751EFD08268377436FA21 + B2EED6982CCC00561C1B836DC7F1E16271FD786D7C09819B904DE4221631A931 + 0D31A7933449132C45AC1E6C9C6CFDECC7393CC862E4AF9C5D5CE7B877F304F0 + 6EE2D3E297161010240B2E09BD17EE136915AD13AB162F9328952C97BA28DD20 + D3293B243725BFACC8A924A76CA8E2AA1AA1B657BD48E3C686512DBCB63AC557 + E7B0EE2DBD197D090377C32CA336E39FA6F2665BCD732D7AAD48D6F69B726C9E + D949D86F7368D9CCEEE4E35CE6F2CDCDCC3DCFE38B97E3963A1F91AD47FC30D4 + 14FF4F8194A0B4E0DE50115A4C58478440645C547FB47ACC09FA222328AE7D3B + 7F426C62CF0EA5E4A33B7FEE0EDEF33CD5256D60EFD68CA9FDBB0F8C659A649D + 3B0C1D093C7A2F47F558C109426ED2C9CFF921A7DE16FA9F7E5BE474F676B16A + C9B9F3E4B27DE54B958CAA8F17422EBEADA55E7A7DC5FFEAD8B588FAB9C6B426 + F61B2537B56FF5DCA6B5E1DBAB3B36772EDCADB8EFF180F8B0E3514A9F61FFE2 + 938681A821F1678F86E35F70BFBC3C6AF17AF06DE0BB4FEF5DC74B27A63E884F + D94ED33E867D0AFC6C362332F3E6CBF9AF8E5F7F7D3B3DAB3A7BE7BBEBF7A11F + 5E3F5ECCB9CD3DF869F2B3E197D4AFEC5F4BF3A1F3BD0B9A0BF90B4B8BFE8BAD + 4B224BBB965EFCD6FB7DE2F7CCF2A6E5D295F58F0DD6505F0D1F10B30972997C + B9BCFC4D1A005C0E004BD9CBCB0BC5CBCB4B2548B23102C0ED88B5EF49ABB186 + 0D80C295EF53A0D3347DCFBFBFE5AC7D6BFA471EF3EF37588D44ABA3229168F5 + 8D4425F03F9CADF490FF9D1F830000005C655849664D4D002A00000008000401 + 0600030000000100020000011200030000000100010000012800030000000100 + 02000087690004000000010000003E000000000002A002000400000001000000 + 98A00300040000000100000098000000003B31A17E000002B669545874584D4C + 3A636F6D2E61646F62652E786D7000000000003C783A786D706D65746120786D + 6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22 + 584D5020436F726520352E342E30223E0A2020203C7264663A52444620786D6C + 6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30 + 322F32322D7264662D73796E7461782D6E7323223E0A2020202020203C726466 + 3A4465736372697074696F6E207264663A61626F75743D22220A202020202020 + 202020202020786D6C6E733A746966663D22687474703A2F2F6E732E61646F62 + 652E636F6D2F746966662F312E302F220A202020202020202020202020786D6C + 6E733A657869663D22687474703A2F2F6E732E61646F62652E636F6D2F657869 + 662F312E302F223E0A2020202020202020203C746966663A5265736F6C757469 + 6F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A20 + 20202020202020203C746966663A4F7269656E746174696F6E3E313C2F746966 + 663A4F7269656E746174696F6E3E0A2020202020202020203C746966663A436F + 6D7072657373696F6E3E313C2F746966663A436F6D7072657373696F6E3E0A20 + 20202020202020203C746966663A50686F746F6D6574726963496E7465727072 + 65746174696F6E3E323C2F746966663A50686F746F6D6574726963496E746572 + 707265746174696F6E3E0A2020202020202020203C657869663A506978656C59 + 44696D656E73696F6E3E3135323C2F657869663A506978656C5944696D656E73 + 696F6E3E0A2020202020202020203C657869663A506978656C5844696D656E73 + 696F6E3E3135323C2F657869663A506978656C5844696D656E73696F6E3E0A20 + 20202020203C2F7264663A4465736372697074696F6E3E0A2020203C2F726466 + 3A5244463E0A3C2F783A786D706D6574613E0A02DDCEB6000003A34944415478 + 01EDD5316EC20014444188B8335730A72680E422CD368F74E306A4D577317A82 + EBFD7E7F5E3C04FE41E0388ECBCF3FBCD72B095CDE71BD9FDB69F1783CAEE777 + 9F04AAC02BB0CF3FA35FB02AE97E0A086CF218AB80C0AAA0FB2920B0C963AC02 + 02AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218 + AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B + 3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780 + C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB + 2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02A + E87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08 + AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC + 0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF2 + 18AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F0202 + 9B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA7 + 80C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0 + FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B0 + 2AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A + 08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963 + AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086C + F218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02 + 029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EE + A780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AA + A0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20 + B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB1 + 0A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C9 + 63AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A08 + 6CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F + 02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82 + EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0 + AAA0FB29703BD7E7EB39BFFB24F02D81CF2FD8711CDF7A9FF710F823F00B490C + 108FA01F47D70000000049454E44AE426082 + } + Proportional = True + Stretch = True end - object WriteDebug: TCheckBox - Left = 4 - Height = 18 - Top = 32 - Width = 186 - Caption = 'Write Debugging Information' - TabOrder = 2 + object Border2: TImage + Left = 48 + Height = 152 + Top = 25 + Width = 152 + OnClick = TilePictureRO5Click + Picture.Data = { + 1754506F727461626C654E6574776F726B47726170686963961F000089504E47 + 0D0A1A0A0000000D494844520000009800000098080600000018C22021000018 + 84694343504943432050726F66696C65000058859579093855DFF7F73EE7CE97 + 6BBAE6799E67E122F39C313311D77C4D715D421A0C69A0814A4429642C1A84A4 + 845029A142516910A2522965C8FF18EAF7FD7F7FEFF3BECFBB9F679FF3B96BAF + BDF65E6BAFBDD75EF7002070871A1D1D01B3011019C5A03B599A887A787A89E2 + C6010458013740037E6A406CB4B1A3A32D40CA9FF7FF2E3F06106EA43C565A91 + F5DFEDFFD7C21118141B0000E48D60FFC0D8804804DF06009D1A104D67008035 + 43E812DB19D12B3814C19C746482084E5EC1216BF8E80AF65FC3A5AB3C2E4EA6 + 086E0400CF4CA5D2430060B983D045E3034210392CEF90368EA8405A14C2FA13 + C10601A1D440000428088F6264E4B6158C54208BF04723380BC114FF7FC80CF9 + 5FF2FDFFCAA75243FEE235BD560BDE8C161B1D414DFCFF34CDFFBB4446C4FD19 + 431AA9CCA1742BA715FD111B0E856FB359C1CC089E8EF2B77758B135827FD202 + D7EC0E004C0C8DB3725DE3870503624D11FB216B0E60D540AA990D8205116C11 + 15616FBB4EF70FA659582318F1163881C6B07659EFBB3F28D6DC795D66217D9B + 93C31F1C4C37355EEF5B43A5AF8EBBC27F272EDCD5785DFE506890F51FF9B349 + A12EEE0826028022C6D3DCEC11CC8260CED870679B351E947852A8A9FD1F1E7A + 9CD3CAFC25114C098AB23459938FF20EA65B38ADF34747C6FED11795114AB3B6 + 5FC7798C5017AB35FBA0AA02A8ABF3E745707D5094B1EB1F3941B11EB67F7409 + 0C32335FD31DD51314E5BAAE2FEA6534C3C469BDEF4C7484E33A3F1A1F1461B9 + 421747307F6CBCF37A5FF44606E29C6BF2D1B6D10C4797B579A2FDC2A89B1CD7 + E6838E07B6C0149801511087547FB00D84015ACF74C334F26BADC50250011D84 + 8020A0B44EF9D3C37DB5250A793A8324F011414120F66F3F93D5D620108FD097 + FE52D79E4A2078B5357EB54738788FE04860032290DF71ABBDA2FE8EE606DE21 + 14DA7F8D1E80CC3502A92B6DFF4D334628B6EB94B83F724559FF7062CDB16658 + 2BAC05560ECD8F3640EBA16D91A71152D5D114B4CE9FD9FE871FF31ED3877983 + 798A19C53CF3A5A5D2FF35173B308AC8B758D7D8FF9F1AA3A511999A6813B43E + 221D918CE646F30325F406641C63B42132B22642355D9FF78AEEA2FF073DFF6A + F00F9BAFF3115409308187604490FD774F167916CDBF52562CFA4FFBACCDD5FF + AF554DFFB6FC7B7CD37FD8391079DBFC9B13B51F7515D5856A45DD4335A31A80 + 28AA05D5887A80BAB982FFFAD0BB551FFA339AD3EA7CC21139B4FF1A8FBA3EE6 + 8A256355AB55275517D7DB00232881B1B2C14CB74527D26921A10C5163240A04 + 895A4705282B8AAAABAA6B00B01253D68EA96F4EABB102E27EF41F5A641A003A + C7913DB6E53FB48051001ABE004078FF1F9A14B293599073BF732A208E1EBF46 + 43AF3C30C869C08AEC283E200C24802CA2913AD0027AC00898834DC001B8004F + B015B17328E2CF74B01D248314900132C15170029C0245A00454808BE00A6800 + CDA01574826ED00B9E8261C47FC6C01498013FC002044138880491213E480492 + 8214207588021940E6902DE40479427E50081405C541C9501A9409E540A7A073 + 50257419BA0EB542F7A03EE819F41A9A84BE42F3300A6686396121581A568129 + B0316C03BBC03E70081C0327C1E9F061380F2E862FC0F5702BDC0D3F8547E129 + F83B0AA09850DC283194128A82324539A0BC50C1283A6A17EA202A17558CAA41 + 35212BFD18358A9A46FD4263D164B4285A09F1612BB42B3A001D83DE85CE429F + 4257A0EBD177D08FD1AFD133E8DF18124610A380D1C558633C302198ED980C4C + 2EA60C730DD381ECA631CC0F2C16CB8D95C16A23BBD1131B86DD81CDC29EC6D6 + 626F63FBB06FB1DF71381C1F4E01A78F73C051710C5C062E1F7701D782EBC78D + E17EE299F0227875BC05DE0B1F854FC5E7E2ABF0B7F0FDF871FC02818D2045D0 + 253810020989842384524213E111618CB0406427CA10F5892EC430620A318F58 + 43EC208E10BF3131318933E9306D66A231ED61CA63BAC47497E935D32F660E66 + 796653666FE638E6C3CCE5CCB7999F317F239148D22423921789413A4CAA24B5 + 935E927EB290599459AC59025976B314B0D4B3F4B37C6225B04AB11AB36E654D + 62CD65BDCAFA88759A8DC026CD66CA4665DBC556C0769D6D90ED3B3B995D8DDD + 813D923D8BBD8AFD1EFB04078E439AC39C2390239DA384A39DE32D194596209B + 9203C869E4527207798C13CB29C369CD19C699C97991B38773868B836B03971B + 57025701D74DAE516E14B734B7357704F711EE2BDC03DCF33C423CC63C413C07 + 786A78FA79E67805788D7883780FF2D6F23EE59DE713E533E70BE7CBE66BE07B + C18FE697E7DFCCBF9DFF0C7F07FFB400A7809E4080C041812B02CF0561417941 + 27C11D8225820F04BF0B090B590A450BE50BB50B4D0B730B1B0987091F17BE25 + 3C2942163110A1891C176911F920CA256A2C1A219A277A4774464C50CC4A2C4E + EC9C588FD882B88CB8AB78AA78ADF80B09A204452258E2B8449BC48CA488A49D + 64B264B5E473298214452A54EAA45497D49CB48CB4BBF43EE906E909195E196B + 9924996A99115992ACA16C8C6CB1EC1339AC1C452E5CEEB45CAF3C2CAF291F2A + 5F20FF480156D052A0299C56E853C428EA284629162B0E2A312B192BC52B552B + BD56E656B6554E556E50FEA422A9E2A592ADD2A5F25B55533542B55475588D43 + 6D935AAA5A93DA577579F500F502F5271A240D0B8DDD1A8D1A5F36286C08DA70 + 66C3902659D34E739F669BE69296B6165DAB466B525B52DB4FBB507B90C24971 + A46451EEEA60744C7476EB34EBFCD2D5D265E85ED1FDACA7A417AE57A537B151 + 6663D0C6D28D6FF5C5F5A9FAE7F4470D440DFC0CCE1A8C1A8A19520D8B0DDF18 + 4918051A95198D1BCB1987195F30FE64A26A4237B9663267AA6BBAD3F4B619CA + CCD2ECA0598F3987B9ABF929F39716E2162116D51633969A963B2C6F5B61AC6C + ACB2AD06AD85AC03AC2BAD6736696FDAB9E98E0DB38DB3CD299B37B6F2B674DB + 263BD86E93DD31BB117B29FB28FB0607E060ED70CCE185A38C638CE38DCDD8CD + 8E9B0B36BF7752734A76EA72263BFB3A5739FF70317139E232EC2AEB1AE7DAE6 + C6EAE6ED56E936E76EE69EE33EEAA1E2B1D3A3DB93DF93E6D9E885F372F32AF3 + FABEC57CCB892D63DE9ADE19DE033E323E093EF7B6F26F8DD87AD397D597EA7B + D50FE3E7EE57E5B74875A01653BFFB5BFB17FACF0498069C0C980A340A3C1E38 + 19A41F9413341EAC1F9C133C11A21F722C6432D4303437749A664A3B45FB1266 + 1556143617EE105E1EBE1CE11E511B898FF48BBC1EC511151E75679BF0B6846D + 7DD10AD119D1A331BA31276266E836F4B25828D627B691C1895CDE1FC4C9C6ED + 8D7B1D6F105F10FF73BBDBF6AB09EC0951090F12E5130F248E2759249DDF81DE + 11B0A32D592C3925F9F54EE39DE77641BBFC77B5ED96D89DBE7B6C8FE59E8A14 + 624A78CAC354D5D49CD4D934F7B4A674A1F43DE96FF75AEEADCE60C9A0670CEE + D3DB57B41FBD9FB6BFE780C681FC03BF0F061EBC9FA99A999BB998159075FF90 + DAA1BC43CB87830FF71CD13A72E628F668D4D1816CC3EC8A1CF69CA49CB7C7EC + 8ED51F173D7EF0F8EC09DF13F77237E4169D249E8C3B399A679BD7982F997F34 + 7FF154E8A9A7052605B5858285070AE74E079EEE3F6374A6A648A828B368FE2C + EDECD039CB73F5C5D2C5B925D892F892F7A56EA55DE729E72BCBF8CB32CB96CA + A3CA472B9C2AEE546A57565609561DA986ABE3AA272F785FE8BD6876B1B146A9 + E65C2D776DE6257029EED287CB7E9707AED85C69BB4AB95A53275557788D7CED + 603D549F583FD310DA30DAE8D9D8777DD3F5B626BDA66B37946F94378B3517DC + E4BA79E416F156FAADE596A496EFB7A36F4FB786B4BE6DF36D1B6EF7687F7267 + F39D9E0E9B8EBB9D169DED5DC65D2D77F5EF36DFD3BD77FD3EE57E43B75677FD + 03CD07D71E6A3EBCD6A3D553FF48FB5163AF4E6F53DFC6BE5BFD86FDAD8FCD1E + 773EB17ED2FDD4FE69DF80EBC0D0A0F7E0E850E0D0C4B388675F9EC73F5F18DE + 33821939F882ED45EE4BC197C5AFE45ED58E6A8DDE7C6DF6FAC11BE737C36F03 + DE4EBD8B7DB73896FE9EF43E775C64BC72427DA279D262B2F7C3960F6353D153 + 0BD3191FD93F167E92FD54F7D9E8F383198F99B12FF42FCB5FB3BEF17D2B9FDD + 30DBF6DDF1FBCB1F913F16E60EFEE4FB59F18BF2AB6BDE7D7E7C61FB226E316F + 496EA9E9B7CDEF91E5C8E5E5682A9DBA7A154021150E0E06E06B3900244F00C8 + BD489AB0652DE75B2F28E4F201236F2C927B9821B780C79030E40355C200F680 + 6FA06450A7D03CE8428C22A60B1B8513C13DC69F20F8119599D04C2F99BFB090 + 5835D8B6B0A7725C268F7309727BF29CE41DE197128816BC25CC2A12227A4B9C + 4F822ED92C352FA3251B2D572EFF5C11A7A4A46CAF12AC9AA096A2BE572375C3 + 4E4D865688F6668ABC0E5AE7A5EE75BDDC8D71FAAE06DA860246B0D1B4F1A049 + 87E935B372F3428B1CCB8356A9D63B36316CA26C697641F6810E818E819B439D + A29C192E3B5D33DC0EBB9FF428F22CF7AADD52EFDDECD3B6B5D3B7DBEF11F5B1 + FF60C070E09BA04FC1BF43C934C530ABF0E088FD9117A27AB7CDC6F0D029B19E + 8C84B8ACF882ED17126E25F6274D26C33B8577E9EFF6DD93965295FA38EDF75E + E10CB57DA6FBDD0F441EDC97599AD575E8F311A1A34ED95939DDC7594FB8E6E6 + 9F1CC9173CE55570B2B0F70CBEC8E86CC2B9DAE28952F1F3DE65F4F23D15472B + 8BAB1AABFB2FCCD4906BF52ED12E175C795487BFA65DEFD6C0683C7ABDBAA9ED + C6D3E6B19B5F6ECDB72CB7A2DAD0EDD83B840E6227AE73A96BFA6EEFBDF2FBF4 + 6EB5EEF107D90FB51F8EF6543F8AEB35ECC3F7F5F7173C0E7CA2FCE4D7D38E81 + 9C41EA10E519FFB3A5E7AF87EF8C9C7F91F132E895F1A8E0E8ECEBFB6F8ADEC6 + BF731C5342BCECCBF8F3897B93CD1FEAA62E4F5FFA78F553CDE78A998B5FDABF + CECC52BE17CE09FFBC391FBB68F09B6F7979F5C6C807368218D008112133683F + 34082BC069F01872B76A437282168C2D660C7B00A7857B8F3F4DF0268A11A799 + A6100F00AC243649760A871399C17982AB897B8C9783CF987FBBC045C1096129 + 9100D17362BDE23F24F9A5F4A4B7C8C4CA1E90CB972F5628513CA3744C395525 + 42D5496D833A597D5CE32AE209965A6C5ACFB48B29113A5ABA40F79E5ECE466F + 7D69FDCF064D86FB8D7C8C29269C269F4DBB116F48B7F0B734B212B25AB41EDE + D464936F9B60E7656FE820ED4872FCBEF995D37DE7069712D76CB71477BA07D5 + D3D9CB6C8BA6B7940FF756C2D625DF6F7E53D477FEA3012F028783868347425E + 84BEA2BD0A7B113E1CF13CF279D4F0B617C8493D469F8AFDC6588CC76EE74810 + 48144B92D9A19CACB5D37097F56ED73D01298CD48CB482F42B7BBB3326F7B31C + D038E899B933ABF850E7E10F47D9B2B5727C8E651CAF3D3198FB390FE4739C92 + 2ED02F743FCD38935B74F3EC7831578965693272FEDD2D1FAFC45649579B5F08 + BC9856535ADB7969F20AE9AA7A9DD3355AFDCE86ECC6D2EBF54D5D37869A276E + FE6A21DE166C556ED36897BA43EE001DD39D835DAD77ABEF1DBF9FDC1DF4C0FE + 21A547F69158AF601F5F3FDF63FE27C24F250664075586349FE93E371AB618B1 + 7FE1F532FC55DA6831E20F4BEF74C676BEEF9AE09D0CFFD03A2DF3F1DC67B599 + 375FAFCE96FF68FEF969417BE9F8EAFAA3916C411578816360041282DCA07CE8 + 1DBC013E084FA2EC514D6855740D4613D386F5C0CEE28EE3F5F01384F3C40426 + 3F665B1285458A95878DC48EE380C8284E0C17969B954780579A4F93DF5CC04D + 90261421EC2FE2216A23B6515C568215B951754B9D958E92A1C8FC92BD261725 + 2F253FA8B05B5154F1B6125519522E55B1529956CD51D3517BAD9EA9A1ADF166 + C3114D03CD29AD93DA26DA1F29F93AE63A33BA057A967ADF3616E9DBEAFF3428 + 3574325C36AA37A69BA89B7C33AD338B33D7329FB368B04CB4D2B35AB0BEB969 + 978D912DB06DB34BB7B77220393C712CDC1CE2A4E10C3BF7213E12E766ED2EE4 + FEC9A3C5F3A85700E22578EF119FCB5BF7FBFAFA51A864EA67FF070117028F06 + C5057B86E8878AD130B4C9B087E197234E442646F96C33895688E1A3E3E8DF63 + DF301EC535C5976CCF4C8849744DA2ECE04B8692E77741BB097B3852F85325D2 + 14D235F6EA6618EDB3D86F73C0F1A04F263D6BFFA1A2C3578F741E1DCC1ECBF9 + 7C6CEEF8E289DFB9BFF388F9AAA73C0BD20B6B4E0F1681B332E7EC8AE925B9A5 + 8DE79F952D57A85506569DAC7E7011D46CA8A55D3A73F9F1555CDDC66B31F5E7 + 1B06AF139A746F84379FBA79F7D6EC6D9156ABB698F6BC3B2D1D6FBA3077E5EE + 39DC4FECAE78F0A287FFD1D6DECABE85C74E4FDA077C87789FCD8FC8BF6C79DD + 37C6986CF874ECDBECAFBB2BEBBFF6DFDF4AC16A0150520C80BB24004E760094 + 2A2279A63A123F5A00702401E0A20360BE7C00B51D019065CDDFF8C102E491CC + 32021C41B2C6A7601E8922665038740CBA0A3D85E6607ED8100E44BCE9123C84 + E46E722867D44E5405EA091AA095D1DEE883E826F4078C00C60E938269C2CC62 + 55B191D80BD88F38555C3CAE054FC47BE2AB0930C19B708328444C434E9E2D4C + 83CCAECC03240FD2088B3FCB246B0CEB3C5B3A3B2B7B01872C473DD99CFC9433 + 9473912B875B9EFB0E8F2FCF026F1E9F36DF007FBC00AF4093E056218CD04561 + 0F118C489D68B018BF589F78A684A52446B253EA80B4830CB7CCB06C919CBFBC + A4FC7B850AC5302545A54FCA5754B6AB1AAA11D406D4CF6B6CDFE0ACA9A5C5A7 + F55BFB2D72ABBEA89BA3B71D39A78C0CA40C09869F8D9E183799D4217E78CDBC + C1E2BAE575ABEBD6F59B2EDB54D916D91DB34F776038066C7674327256779176 + 1576E375E7F6E0F6E4F712DD22EBADE163B8D5CE778B5F1835C9FF50406F1039 + D82D242FF459184FB8734456647BD48F68991837FADED82B8C97F1B2DBE3123A + 93047630921FEFA2EC2E4DE149CD4EE7D89BBF4F6A7FFD41B3CCA1430C244A0D + E6541D2FCABD91CF5270E28CCE59FFE2ECD2CEB2E54A83EADD175B2FA1AF58D6 + 1DA82F6ABCD6F4B0F9430BA955BB3DBCA3B2EBEB7DF307677BBEF5993ECE7CDA + 3D043F571ED9FC326234E54DCEBBB3EF3B273E7EF831FDFAD3C5199F2FB3DF18 + B3AF7EE8CD65FD7C32CFBE60BDB873A9EAF7C0EAF9C106548033480045A0034C + 41646823140C654375489EFF1B96826DE138B808BE07CF2239BB3D2A19558D1A + 46332171651BBA183D8061C218631231F598EF582D6C22F6260E83E4D185B869 + BC31FE147E8EE049B84D54201630B1321D62E6643E43522035B338B28CB3A6B0 + 89B0B5B2077190381AC83E9C1067399723D72277158F172F89B79D6F07BF26FF + 3781AB820C214DA139E11B2229A256626C62C3E2E5120C4953292EA909E95B32 + B9B2B1728EF2CA0A24858F8A3D4AB5CAD92A0C554F350375290D168D5F1B3E68 + BED47AAC7D8FD2AAD3A47B4DEFD2C60BFA9506E586654665C6E526B5A637CCEE + 9A0F5A8C5BFEB4266E12B451B135B673B60F764870CCDC7CDAA9C2B9CEA5DDF5 + B1DB7BF7794F762FB92DA6DE3E3E895B73917CA39FFA254034D02FE86CF068A8 + 28CD37AC307C28923DCA6ADBAEE8CB316F63B918E67129F10F13F813C3929A93 + D97606EFBAB587272526F541BACCDEB48CD1FDFA07AA32C5B30A0FF31F29C816 + C9293BAE7AE2E649DBBC17A7B615A24EE715F99DD329E12EFD55365AF1B0AAE5 + 425D4DCDA5AA2B157565F5598DD14D4ECD1AB7385A665A7BDA2F761CEADA76CF + B5DBE0A1DC23CEDEC5FE574F9A06B2865C9E730C77BC887E451EBDF4C6FAEDC8 + 58E43866E2D807EEA9ACE9EF9F9C3E9F9E19FECAFA4D7BD6E93BED47EC5CD2CF + A45F71F3910B7E8B4E4B86BF1597B956D79F13E8007F7008348277103B640445 + 4367A02EE80B2C04DBC04970153C8C624119A3E2511751EFD08268377436FA21 + B2EED6982CCC00561C1B836DC7F1E16271FD786D7C09819B904DE4221631A931 + 0D31A7933449132C45AC1E6C9C6CFDECC7393CC862E4AF9C5D5CE7B877F304F0 + 6EE2D3E297161010240B2E09BD17EE136915AD13AB162F9328952C97BA28DD20 + D3293B243725BFACC8A924A76CA8E2AA1AA1B657BD48E3C686512DBCB63AC557 + E7B0EE2DBD197D090377C32CA336E39FA6F2665BCD732D7AAD48D6F69B726C9E + D949D86F7368D9CCEEE4E35CE6F2CDCDCC3DCFE38B97E3963A1F91AD47FC30D4 + 14FF4F8194A0B4E0DE50115A4C58478440645C547FB47ACC09FA222328AE7D3B + 7F426C62CF0EA5E4A33B7FEE0EDEF33CD5256D60EFD68CA9FDBB0F8C659A649D + 3B0C1D093C7A2F47F558C109426ED2C9CFF921A7DE16FA9F7E5BE474F676B16A + C9B9F3E4B27DE54B958CAA8F17422EBEADA55E7A7DC5FFEAD8B588FAB9C6B426 + F61B2537B56FF5DCA6B5E1DBAB3B36772EDCADB8EFF180F8B0E3514A9F61FFE2 + 938681A821F1678F86E35F70BFBC3C6AF17AF06DE0BB4FEF5DC74B27A63E884F + D94ED33E867D0AFC6C362332F3E6CBF9AF8E5F7F7D3B3DAB3A7BE7BBEBF7A11F + 5E3F5ECCB9CD3DF869F2B3E197D4AFEC5F4BF3A1F3BD0B9A0BF90B4B8BFE8BAD + 4B224BBB965EFCD6FB7DE2F7CCF2A6E5D295F58F0DD6505F0D1F10B30972997C + B9BCFC4D1A005C0E004BD9CBCB0BC5CBCB4B2548B23102C0ED88B5EF49ABB186 + 0D80C295EF53A0D3347DCFBFBFE5AC7D6BFA471EF3EF37588D44ABA3229168F5 + 8D4425F03F9CADF490FF9D1F830000005C655849664D4D002A00000008000401 + 0600030000000100020000011200030000000100010000012800030000000100 + 02000087690004000000010000003E000000000002A002000400000001000000 + 98A00300040000000100000098000000003B31A17E000002B669545874584D4C + 3A636F6D2E61646F62652E786D7000000000003C783A786D706D65746120786D + 6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22 + 584D5020436F726520352E342E30223E0A2020203C7264663A52444620786D6C + 6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30 + 322F32322D7264662D73796E7461782D6E7323223E0A2020202020203C726466 + 3A4465736372697074696F6E207264663A61626F75743D22220A202020202020 + 202020202020786D6C6E733A746966663D22687474703A2F2F6E732E61646F62 + 652E636F6D2F746966662F312E302F220A202020202020202020202020786D6C + 6E733A657869663D22687474703A2F2F6E732E61646F62652E636F6D2F657869 + 662F312E302F223E0A2020202020202020203C746966663A5265736F6C757469 + 6F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A20 + 20202020202020203C746966663A4F7269656E746174696F6E3E313C2F746966 + 663A4F7269656E746174696F6E3E0A2020202020202020203C746966663A436F + 6D7072657373696F6E3E313C2F746966663A436F6D7072657373696F6E3E0A20 + 20202020202020203C746966663A50686F746F6D6574726963496E7465727072 + 65746174696F6E3E323C2F746966663A50686F746F6D6574726963496E746572 + 707265746174696F6E3E0A2020202020202020203C657869663A506978656C59 + 44696D656E73696F6E3E3135323C2F657869663A506978656C5944696D656E73 + 696F6E3E0A2020202020202020203C657869663A506978656C5844696D656E73 + 696F6E3E3135323C2F657869663A506978656C5844696D656E73696F6E3E0A20 + 20202020203C2F7264663A4465736372697074696F6E3E0A2020203C2F726466 + 3A5244463E0A3C2F783A786D706D6574613E0A02DDCEB6000003A34944415478 + 01EDD5316EC20014444188B8335730A72680E422CD368F74E306A4D577317A82 + EBFD7E7F5E3C04FE41E0388ECBCF3FBCD72B095CDE71BD9FDB69F1783CAEE777 + 9F04AAC02BB0CF3FA35FB02AE97E0A086CF218AB80C0AAA0FB2920B0C963AC02 + 02AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218 + AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B + 3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780 + C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB + 2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02A + E87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08 + AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC + 0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF2 + 18AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F0202 + 9B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA7 + 80C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0 + FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B0 + 2AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A + 08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963 + AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086C + F218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02 + 029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EE + A780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AA + A0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20 + B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB1 + 0A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C9 + 63AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A08 + 6CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F + 02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82 + EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0 + AAA0FB29703BD7E7EB39BFFB24F02D81CF2FD8711CDF7A9FF710F823F00B490C + 108FA01F47D70000000049454E44AE426082 + } + Proportional = True + Stretch = True end - object CompressUEF: TCheckBox - Left = 228 - Height = 18 - Top = 8 - Width = 150 - Caption = 'Compress UEF Images' - Checked = True - State = cbChecked - TabOrder = 1 + object Border3: TImage + Left = 76 + Height = 152 + Top = 14 + Width = 152 + OnClick = TilePictureRO5Click + Picture.Data = { + 1754506F727461626C654E6574776F726B47726170686963961F000089504E47 + 0D0A1A0A0000000D494844520000009800000098080600000018C22021000018 + 84694343504943432050726F66696C65000058859579093855DFF7F73EE7CE97 + 6BBAE6799E67E122F39C313311D77C4D715D421A0C69A0814A4429642C1A84A4 + 845029A142516910A2522965C8FF18EAF7FD7F7FEFF3BECFBB9F679FF3B96BAF + BDF65E6BAFBDD75EF7002070871A1D1D01B3011019C5A03B599A887A787A89E2 + C6010458013740037E6A406CB4B1A3A32D40CA9FF7FF2E3F06106EA43C565A91 + F5DFEDFFD7C21118141B0000E48D60FFC0D8804804DF06009D1A104D67008035 + 43E812DB19D12B3814C19C746482084E5EC1216BF8E80AF65FC3A5AB3C2E4EA6 + 086E0400CF4CA5D2430060B983D045E3034210392CEF90368EA8405A14C2FA13 + C10601A1D440000428088F6264E4B6158C54208BF04723380BC114FF7FC80CF9 + 5FF2FDFFCAA75243FEE235BD560BDE8C161B1D414DFCFF34CDFFBB4446C4FD19 + 431AA9CCA1742BA715FD111B0E856FB359C1CC089E8EF2B77758B135827FD202 + D7EC0E004C0C8DB3725DE3870503624D11FB216B0E60D540AA990D8205116C11 + 15616FBB4EF70FA659582318F1163881C6B07659EFBB3F28D6DC795D66217D9B + 93C31F1C4C37355EEF5B43A5AF8EBBC27F272EDCD5785DFE506890F51FF9B349 + A12EEE0826028022C6D3DCEC11CC8260CED870679B351E947852A8A9FD1F1E7A + 9CD3CAFC25114C098AB23459938FF20EA65B38ADF34747C6FED11795114AB3B6 + 5FC7798C5017AB35FBA0AA02A8ABF3E745707D5094B1EB1F3941B11EB67F7409 + 0C32335FD31DD51314E5BAAE2FEA6534C3C469BDEF4C7484E33A3F1A1F1461B9 + 421747307F6CBCF37A5FF44606E29C6BF2D1B6D10C4797B579A2FDC2A89B1CD7 + E6838E07B6C0149801511087547FB00D84015ACF74C334F26BADC50250011D84 + 8020A0B44EF9D3C37DB5250A793A8324F011414120F66F3F93D5D620108FD097 + FE52D79E4A2078B5357EB54738788FE04860032290DF71ABBDA2FE8EE606DE21 + 14DA7F8D1E80CC3502A92B6DFF4D334628B6EB94B83F724559FF7062CDB16658 + 2BAC05560ECD8F3640EBA16D91A71152D5D114B4CE9FD9FE871FF31ED3877983 + 798A19C53CF3A5A5D2FF35173B308AC8B758D7D8FF9F1AA3A511999A6813B43E + 221D918CE646F30325F406641C63B42132B22642355D9FF78AEEA2FF073DFF6A + F00F9BAFF3115409308187604490FD774F167916CDBF52562CFA4FFBACCDD5FF + AF554DFFB6FC7B7CD37FD8391079DBFC9B13B51F7515D5856A45DD4335A31A80 + 28AA05D5887A80BAB982FFFAD0BB551FFA339AD3EA7CC21139B4FF1A8FBA3EE6 + 8A256355AB55275517D7DB00232881B1B2C14CB74527D26921A10C5163240A04 + 895A4705282B8AAAABAA6B00B01253D68EA96F4EABB102E27EF41F5A641A003A + C7913DB6E53FB48051001ABE004078FF1F9A14B293599073BF732A208E1EBF46 + 43AF3C30C869C08AEC283E200C24802CA2913AD0027AC00898834DC001B8004F + B015B17328E2CF74B01D248314900132C15170029C0245A00454808BE00A6800 + CDA01574826ED00B9E8261C47FC6C01498013FC002044138880491213E480492 + 8214207588021940E6902DE40479427E50081405C541C9501A9409E540A7A073 + 50257419BA0EB542F7A03EE819F41A9A84BE42F3300A6686396121581A568129 + B0316C03BBC03E70081C0327C1E9F061380F2E862FC0F5702BDC0D3F8547E129 + F83B0AA09850DC283194128A82324539A0BC50C1283A6A17EA202A17558CAA41 + 35212BFD18358A9A46FD4263D164B4285A09F1612BB42B3A001D83DE85CE429F + 4257A0EBD177D08FD1AFD133E8DF18124610A380D1C558633C302198ED980C4C + 2EA60C730DD381ECA631CC0F2C16CB8D95C16A23BBD1131B86DD81CDC29EC6D6 + 626F63FBB06FB1DF71381C1F4E01A78F73C051710C5C062E1F7701D782EBC78D + E17EE299F0227875BC05DE0B1F854FC5E7E2ABF0B7F0FDF871FC02818D2045D0 + 253810020989842384524213E111618CB0406427CA10F5892EC430620A318F58 + 43EC208E10BF3131318933E9306D66A231ED61CA63BAC47497E935D32F660E66 + 796653666FE638E6C3CCE5CCB7999F317F239148D22423921789413A4CAA24B5 + 935E927EB290599459AC59025976B314B0D4B3F4B37C6225B04AB11AB36E654D + 62CD65BDCAFA88759A8DC026CD66CA4665DBC556C0769D6D90ED3B3B995D8DDD + 813D923D8BBD8AFD1EFB04078E439AC39C2390239DA384A39DE32D194596209B + 9203C869E4527207798C13CB29C369CD19C699C97991B38773868B836B03971B + 57025701D74DAE516E14B734B7357704F711EE2BDC03DCF33C423CC63C413C07 + 786A78FA79E67805788D7883780FF2D6F23EE59DE713E533E70BE7CBE66BE07B + C18FE697E7DFCCBF9DFF0C7F07FFB400A7809E4080C041812B02CF0561417941 + 27C11D8225820F04BF0B090B590A450BE50BB50B4D0B730B1B0987091F17BE25 + 3C2942163110A1891C176911F920CA256A2C1A219A277A4774464C50CC4A2C4E + EC9C588FD882B88CB8AB78AA78ADF80B09A204452258E2B8449BC48CA488A49D + 64B264B5E473298214452A54EAA45497D49CB48CB4BBF43EE906E909195E196B + 9924996A99115992ACA16C8C6CB1EC1339AC1C452E5CEEB45CAF3C2CAF291F2A + 5F20FF480156D052A0299C56E853C428EA284629162B0E2A312B192BC52B552B + BD56E656B6554E556E50FEA422A9E2A592ADD2A5F25B55533542B55475588D43 + 6D935AAA5A93DA577579F500F502F5271A240D0B8DDD1A8D1A5F36286C08DA70 + 66C3902659D34E739F669BE69296B6165DAB466B525B52DB4FBB507B90C24971 + A46451EEEA60744C7476EB34EBFCD2D5D265E85ED1FDACA7A417AE57A537B151 + 6663D0C6D28D6FF5C5F5A9FAE7F4470D440DFC0CCE1A8C1A8A19520D8B0DDF18 + 4918051A95198D1BCB1987195F30FE64A26A4237B9663267AA6BBAD3F4B619CA + CCD2ECA0598F3987B9ABF929F39716E2162116D51633969A963B2C6F5B61AC6C + ACB2AD06AD85AC03AC2BAD6736696FDAB9E98E0DB38DB3CD299B37B6F2B674DB + 263BD86E93DD31BB117B29FB28FB0607E060ED70CCE185A38C638CE38DCDD8CD + 8E9B0B36BF7752734A76EA72263BFB3A5739FF70317139E232EC2AEB1AE7DAE6 + C6EAE6ED56E936E76EE69EE33EEAA1E2B1D3A3DB93DF93E6D9E885F372F32AF3 + FABEC57CCB892D63DE9ADE19DE033E323E093EF7B6F26F8DD87AD397D597EA7B + D50FE3E7EE57E5B74875A01653BFFB5BFB17FACF0498069C0C980A340A3C1E38 + 19A41F9413341EAC1F9C133C11A21F722C6432D4303437749A664A3B45FB1266 + 1556143617EE105E1EBE1CE11E511B898FF48BBC1EC511151E75679BF0B6846D + 7DD10AD119D1A331BA31276266E836F4B25828D627B691C1895CDE1FC4C9C6ED + 8D7B1D6F105F10FF73BBDBF6AB09EC0951090F12E5130F248E2759249DDF81DE + 11B0A32D592C3925F9F54EE39DE77641BBFC77B5ED96D89DBE7B6C8FE59E8A14 + 624A78CAC354D5D49CD4D934F7B4A674A1F43DE96FF75AEEADCE60C9A0670CEE + D3DB57B41FBD9FB6BFE780C681FC03BF0F061EBC9FA99A999BB998159075FF90 + DAA1BC43CB87830FF71CD13A72E628F668D4D1816CC3EC8A1CF69CA49CB7C7EC + 8ED51F173D7EF0F8EC09DF13F77237E4169D249E8C3B399A679BD7982F997F34 + 7FF154E8A9A7052605B5858285070AE74E079EEE3F6374A6A648A828B368FE2C + EDECD039CB73F5C5D2C5B925D892F892F7A56EA55DE729E72BCBF8CB32CB96CA + A3CA472B9C2AEE546A57565609561DA986ABE3AA272F785FE8BD6876B1B146A9 + E65C2D776DE6257029EED287CB7E9707AED85C69BB4AB95A53275557788D7CED + 603D549F583FD310DA30DAE8D9D8777DD3F5B626BDA66B37946F94378B3517DC + E4BA79E416F156FAADE596A496EFB7A36F4FB786B4BE6DF36D1B6EF7687F7267 + F39D9E0E9B8EBB9D169DED5DC65D2D77F5EF36DFD3BD77FD3EE57E43B75677FD + 03CD07D71E6A3EBCD6A3D553FF48FB5163AF4E6F53DFC6BE5BFD86FDAD8FCD1E + 773EB17ED2FDD4FE69DF80EBC0D0A0F7E0E850E0D0C4B388675F9EC73F5F18DE + 33821939F882ED45EE4BC197C5AFE45ED58E6A8DDE7C6DF6FAC11BE737C36F03 + DE4EBD8B7DB73896FE9EF43E775C64BC72427DA279D262B2F7C3960F6353D153 + 0BD3191FD93F167E92FD54F7D9E8F383198F99B12FF42FCB5FB3BEF17D2B9FDD + 30DBF6DDF1FBCB1F913F16E60EFEE4FB59F18BF2AB6BDE7D7E7C61FB226E316F + 496EA9E9B7CDEF91E5C8E5E5682A9DBA7A154021150E0E06E06B3900244F00C8 + BD489AB0652DE75B2F28E4F201236F2C927B9821B780C79030E40355C200F680 + 6FA06450A7D03CE8428C22A60B1B8513C13DC69F20F8119599D04C2F99BFB090 + 5835D8B6B0A7725C268F7309727BF29CE41DE197128816BC25CC2A12227A4B9C + 4F822ED92C352FA3251B2D572EFF5C11A7A4A46CAF12AC9AA096A2BE572375C3 + 4E4D865688F6668ABC0E5AE7A5EE75BDDC8D71FAAE06DA860246B0D1B4F1A049 + 87E935B372F3428B1CCB8356A9D63B36316CA26C697641F6810E818E819B439D + A29C192E3B5D33DC0EBB9FF428F22CF7AADD52EFDDECD3B6B5D3B7DBEF11F5B1 + FF60C070E09BA04FC1BF43C934C530ABF0E088FD9117A27AB7CDC6F0D029B19E + 8C84B8ACF882ED17126E25F6274D26C33B8577E9EFF6DD93965295FA38EDF75E + E10CB57DA6FBDD0F441EDC97599AD575E8F311A1A34ED95939DDC7594FB8E6E6 + 9F1CC9173CE55570B2B0F70CBEC8E86CC2B9DAE28952F1F3DE65F4F23D15472B + 8BAB1AABFB2FCCD4906BF52ED12E175C795487BFA65DEFD6C0683C7ABDBAA9ED + C6D3E6B19B5F6ECDB72CB7A2DAD0EDD83B840E6227AE73A96BFA6EEFBDF2FBF4 + 6EB5EEF107D90FB51F8EF6543F8AEB35ECC3F7F5F7173C0E7CA2FCE4D7D38E81 + 9C41EA10E519FFB3A5E7AF87EF8C9C7F91F132E895F1A8E0E8ECEBFB6F8ADEC6 + BF731C5342BCECCBF8F3897B93CD1FEAA62E4F5FFA78F553CDE78A998B5FDABF + CECC52BE17CE09FFBC391FBB68F09B6F7979F5C6C807368218D008112133683F + 34082BC069F01872B76A437282168C2D660C7B00A7857B8F3F4DF0268A11A799 + A6100F00AC243649760A871399C17982AB897B8C9783CF987FBBC045C1096129 + 9100D17362BDE23F24F9A5F4A4B7C8C4CA1E90CB972F5628513CA3744C395525 + 42D5496D833A597D5CE32AE209965A6C5ACFB48B29113A5ABA40F79E5ECE466F + 7D69FDCF064D86FB8D7C8C29269C269F4DBB116F48B7F0B734B212B25AB41EDE + D464936F9B60E7656FE820ED4872FCBEF995D37DE7069712D76CB71477BA07D5 + D3D9CB6C8BA6B7940FF756C2D625DF6F7E53D477FEA3012F028783868347425E + 84BEA2BD0A7B113E1CF13CF279D4F0B617C8493D469F8AFDC6588CC76EE74810 + 48144B92D9A19CACB5D37097F56ED73D01298CD48CB482F42B7BBB3326F7B31C + D038E899B933ABF850E7E10F47D9B2B5727C8E651CAF3D3198FB390FE4739C92 + 2ED02F743FCD38935B74F3EC7831578965693272FEDD2D1FAFC45649579B5F08 + BC9856535ADB7969F20AE9AA7A9DD3355AFDCE86ECC6D2EBF54D5D37869A276E + FE6A21DE166C556ED36897BA43EE001DD39D835DAD77ABEF1DBF9FDC1DF4C0FE + 21A547F69158AF601F5F3FDF63FE27C24F250664075586349FE93E371AB618B1 + 7FE1F532FC55DA6831E20F4BEF74C676BEEF9AE09D0CFFD03A2DF3F1DC67B599 + 375FAFCE96FF68FEF969417BE9F8EAFAA3916C411578816360041282DCA07CE8 + 1DBC013E084FA2EC514D6855740D4613D386F5C0CEE28EE3F5F01384F3C40426 + 3F665B1285458A95878DC48EE380C8284E0C17969B954780579A4F93DF5CC04D + 90261421EC2FE2216A23B6515C568215B951754B9D958E92A1C8FC92BD261725 + 2F253FA8B05B5154F1B6125519522E55B1529956CD51D3517BAD9EA9A1ADF166 + C3114D03CD29AD93DA26DA1F29F93AE63A33BA057A967ADF3616E9DBEAFF3428 + 3574325C36AA37A69BA89B7C33AD338B33D7329FB368B04CB4D2B35AB0BEB969 + 978D912DB06DB34BB7B77220393C712CDC1CE2A4E10C3BF7213E12E766ED2EE4 + FEC9A3C5F3A85700E22578EF119FCB5BF7FBFAFA51A864EA67FF070117028F06 + C5057B86E8878AD130B4C9B087E197234E442646F96C33895688E1A3E3E8DF63 + DF301EC535C5976CCF4C8849744DA2ECE04B8692E77741BB097B3852F85325D2 + 14D235F6EA6618EDB3D86F73C0F1A04F263D6BFFA1A2C3578F741E1DCC1ECBF9 + 7C6CEEF8E289DFB9BFF388F9AAA73C0BD20B6B4E0F1681B332E7EC8AE925B9A5 + 8DE79F952D57A85506569DAC7E7011D46CA8A55D3A73F9F1555CDDC66B31F5E7 + 1B06AF139A746F84379FBA79F7D6EC6D9156ABB698F6BC3B2D1D6FBA3077E5EE + 39DC4FECAE78F0A287FFD1D6DECABE85C74E4FDA077C87789FCD8FC8BF6C79DD + 37C6986CF874ECDBECAFBB2BEBBFF6DFDF4AC16A0150520C80BB24004E760094 + 2A2279A63A123F5A00702401E0A20360BE7C00B51D019065CDDFF8C102E491CC + 32021C41B2C6A7601E8922665038740CBA0A3D85E6607ED8100E44BCE9123C84 + E46E722867D44E5405EA091AA095D1DEE883E826F4078C00C60E938269C2CC62 + 55B191D80BD88F38555C3CAE054FC47BE2AB0930C19B708328444C434E9E2D4C + 83CCAECC03240FD2088B3FCB246B0CEB3C5B3A3B2B7B01872C473DD99CFC9433 + 9473912B875B9EFB0E8F2FCF026F1E9F36DF007FBC00AF4093E056218CD04561 + 0F118C489D68B018BF589F78A684A52446B253EA80B4830CB7CCB06C919CBFBC + A4FC7B850AC5302545A54FCA5754B6AB1AAA11D406D4CF6B6CDFE0ACA9A5C5A7 + F55BFB2D72ABBEA89BA3B71D39A78C0CA40C09869F8D9E183799D4217E78CDBC + C1E2BAE575ABEBD6F59B2EDB54D916D91DB34F776038066C7674327256779176 + 1576E375E7F6E0F6E4F712DD22EBADE163B8D5CE778B5F1835C9FF50406F1039 + D82D242FF459184FB8734456647BD48F68991837FADED82B8C97F1B2DBE3123A + 93047630921FEFA2EC2E4DE149CD4EE7D89BBF4F6A7FFD41B3CCA1430C244A0D + E6541D2FCABD91CF5270E28CCE59FFE2ECD2CEB2E54A83EADD175B2FA1AF58D6 + 1DA82F6ABCD6F4B0F9430BA955BB3DBCA3B2EBEB7DF307677BBEF5993ECE7CDA + 3D043F571ED9FC326234E54DCEBBB3EF3B273E7EF831FDFAD3C5199F2FB3DF18 + B3AF7EE8CD65FD7C32CFBE60BDB873A9EAF7C0EAF9C106548033480045A0034C + 41646823140C654375489EFF1B96826DE138B808BE07CF2239BB3D2A19558D1A + 46332171651BBA183D8061C218631231F598EF582D6C22F6260E83E4D185B869 + BC31FE147E8EE049B84D54201630B1321D62E6643E43522035B338B28CB3A6B0 + 89B0B5B2077190381AC83E9C1067399723D72277158F172F89B79D6F07BF26FF + 3781AB820C214DA139E11B2229A256626C62C3E2E5120C4953292EA909E95B32 + B9B2B1728EF2CA0A24858F8A3D4AB5CAD92A0C554F350375290D168D5F1B3E68 + BED47AAC7D8FD2AAD3A47B4DEFD2C60BFA9506E586654665C6E526B5A637CCEE + 9A0F5A8C5BFEB4266E12B451B135B673B60F764870CCDC7CDAA9C2B9CEA5DDF5 + B1DB7BF7794F762FB92DA6DE3E3E895B73917CA39FFA254034D02FE86CF068A8 + 28CD37AC307C28923DCA6ADBAEE8CB316F63B918E67129F10F13F813C3929A93 + D97606EFBAB587272526F541BACCDEB48CD1FDFA07AA32C5B30A0FF31F29C816 + C9293BAE7AE2E649DBBC17A7B615A24EE715F99DD329E12EFD55365AF1B0AAE5 + 425D4DCDA5AA2B157565F5598DD14D4ECD1AB7385A665A7BDA2F761CEADA76CF + B5DBE0A1DC23CEDEC5FE574F9A06B2865C9E730C77BC887E451EBDF4C6FAEDC8 + 58E43866E2D807EEA9ACE9EF9F9C3E9F9E19FECAFA4D7BD6E93BED47EC5CD2CF + A45F71F3910B7E8B4E4B86BF1597B956D79F13E8007F7008348277103B640445 + 4367A02EE80B2C04DBC04970153C8C624119A3E2511751EFD08268377436FA21 + B2EED6982CCC00561C1B836DC7F1E16271FD786D7C09819B904DE4221631A931 + 0D31A7933449132C45AC1E6C9C6CFDECC7393CC862E4AF9C5D5CE7B877F304F0 + 6EE2D3E297161010240B2E09BD17EE136915AD13AB162F9328952C97BA28DD20 + D3293B243725BFACC8A924A76CA8E2AA1AA1B657BD48E3C686512DBCB63AC557 + E7B0EE2DBD197D090377C32CA336E39FA6F2665BCD732D7AAD48D6F69B726C9E + D949D86F7368D9CCEEE4E35CE6F2CDCDCC3DCFE38B97E3963A1F91AD47FC30D4 + 14FF4F8194A0B4E0DE50115A4C58478440645C547FB47ACC09FA222328AE7D3B + 7F426C62CF0EA5E4A33B7FEE0EDEF33CD5256D60EFD68CA9FDBB0F8C659A649D + 3B0C1D093C7A2F47F558C109426ED2C9CFF921A7DE16FA9F7E5BE474F676B16A + C9B9F3E4B27DE54B958CAA8F17422EBEADA55E7A7DC5FFEAD8B588FAB9C6B426 + F61B2537B56FF5DCA6B5E1DBAB3B36772EDCADB8EFF180F8B0E3514A9F61FFE2 + 938681A821F1678F86E35F70BFBC3C6AF17AF06DE0BB4FEF5DC74B27A63E884F + D94ED33E867D0AFC6C362332F3E6CBF9AF8E5F7F7D3B3DAB3A7BE7BBEBF7A11F + 5E3F5ECCB9CD3DF869F2B3E197D4AFEC5F4BF3A1F3BD0B9A0BF90B4B8BFE8BAD + 4B224BBB965EFCD6FB7DE2F7CCF2A6E5D295F58F0DD6505F0D1F10B30972997C + B9BCFC4D1A005C0E004BD9CBCB0BC5CBCB4B2548B23102C0ED88B5EF49ABB186 + 0D80C295EF53A0D3347DCFBFBFE5AC7D6BFA471EF3EF37588D44ABA3229168F5 + 8D4425F03F9CADF490FF9D1F830000005C655849664D4D002A00000008000401 + 0600030000000100020000011200030000000100010000012800030000000100 + 02000087690004000000010000003E000000000002A002000400000001000000 + 98A00300040000000100000098000000003B31A17E000002B669545874584D4C + 3A636F6D2E61646F62652E786D7000000000003C783A786D706D65746120786D + 6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22 + 584D5020436F726520352E342E30223E0A2020203C7264663A52444620786D6C + 6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30 + 322F32322D7264662D73796E7461782D6E7323223E0A2020202020203C726466 + 3A4465736372697074696F6E207264663A61626F75743D22220A202020202020 + 202020202020786D6C6E733A746966663D22687474703A2F2F6E732E61646F62 + 652E636F6D2F746966662F312E302F220A202020202020202020202020786D6C + 6E733A657869663D22687474703A2F2F6E732E61646F62652E636F6D2F657869 + 662F312E302F223E0A2020202020202020203C746966663A5265736F6C757469 + 6F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A20 + 20202020202020203C746966663A4F7269656E746174696F6E3E313C2F746966 + 663A4F7269656E746174696F6E3E0A2020202020202020203C746966663A436F + 6D7072657373696F6E3E313C2F746966663A436F6D7072657373696F6E3E0A20 + 20202020202020203C746966663A50686F746F6D6574726963496E7465727072 + 65746174696F6E3E323C2F746966663A50686F746F6D6574726963496E746572 + 707265746174696F6E3E0A2020202020202020203C657869663A506978656C59 + 44696D656E73696F6E3E3135323C2F657869663A506978656C5944696D656E73 + 696F6E3E0A2020202020202020203C657869663A506978656C5844696D656E73 + 696F6E3E3135323C2F657869663A506978656C5844696D656E73696F6E3E0A20 + 20202020203C2F7264663A4465736372697074696F6E3E0A2020203C2F726466 + 3A5244463E0A3C2F783A786D706D6574613E0A02DDCEB6000003A34944415478 + 01EDD5316EC20014444188B8335730A72680E422CD368F74E306A4D577317A82 + EBFD7E7F5E3C04FE41E0388ECBCF3FBCD72B095CDE71BD9FDB69F1783CAEE777 + 9F04AAC02BB0CF3FA35FB02AE97E0A086CF218AB80C0AAA0FB2920B0C963AC02 + 02AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218 + AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B + 3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780 + C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB + 2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02A + E87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08 + AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC + 0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF2 + 18AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F0202 + 9B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA7 + 80C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0 + FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B0 + 2AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A + 08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963 + AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086C + F218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02 + 029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EE + A780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AA + A0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20 + B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB1 + 0A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C9 + 63AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A08 + 6CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F + 02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82 + EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0 + AAA0FB29703BD7E7EB39BFFB24F02D81CF2FD8711CDF7A9FF710F823F00B490C + 108FA01F47D70000000049454E44AE426082 + } + Proportional = True + Stretch = True end - object ScanSubDirs: TCheckBox - Left = 228 - Height = 18 - Top = 32 - Width = 190 - Caption = 'Scan sub-directories on open' - Checked = True - State = cbChecked - TabOrder = 3 + object Border4: TImage + Left = 76 + Height = 152 + Top = 14 + Width = 152 + OnClick = TilePictureRO5Click + Picture.Data = { + 1754506F727461626C654E6574776F726B47726170686963961F000089504E47 + 0D0A1A0A0000000D494844520000009800000098080600000018C22021000018 + 84694343504943432050726F66696C65000058859579093855DFF7F73EE7CE97 + 6BBAE6799E67E122F39C313311D77C4D715D421A0C69A0814A4429642C1A84A4 + 845029A142516910A2522965C8FF18EAF7FD7F7FEFF3BECFBB9F679FF3B96BAF + BDF65E6BAFBDD75EF7002070871A1D1D01B3011019C5A03B599A887A787A89E2 + C6010458013740037E6A406CB4B1A3A32D40CA9FF7FF2E3F06106EA43C565A91 + F5DFEDFFD7C21118141B0000E48D60FFC0D8804804DF06009D1A104D67008035 + 43E812DB19D12B3814C19C746482084E5EC1216BF8E80AF65FC3A5AB3C2E4EA6 + 086E0400CF4CA5D2430060B983D045E3034210392CEF90368EA8405A14C2FA13 + C10601A1D440000428088F6264E4B6158C54208BF04723380BC114FF7FC80CF9 + 5FF2FDFFCAA75243FEE235BD560BDE8C161B1D414DFCFF34CDFFBB4446C4FD19 + 431AA9CCA1742BA715FD111B0E856FB359C1CC089E8EF2B77758B135827FD202 + D7EC0E004C0C8DB3725DE3870503624D11FB216B0E60D540AA990D8205116C11 + 15616FBB4EF70FA659582318F1163881C6B07659EFBB3F28D6DC795D66217D9B + 93C31F1C4C37355EEF5B43A5AF8EBBC27F272EDCD5785DFE506890F51FF9B349 + A12EEE0826028022C6D3DCEC11CC8260CED870679B351E947852A8A9FD1F1E7A + 9CD3CAFC25114C098AB23459938FF20EA65B38ADF34747C6FED11795114AB3B6 + 5FC7798C5017AB35FBA0AA02A8ABF3E745707D5094B1EB1F3941B11EB67F7409 + 0C32335FD31DD51314E5BAAE2FEA6534C3C469BDEF4C7484E33A3F1A1F1461B9 + 421747307F6CBCF37A5FF44606E29C6BF2D1B6D10C4797B579A2FDC2A89B1CD7 + E6838E07B6C0149801511087547FB00D84015ACF74C334F26BADC50250011D84 + 8020A0B44EF9D3C37DB5250A793A8324F011414120F66F3F93D5D620108FD097 + FE52D79E4A2078B5357EB54738788FE04860032290DF71ABBDA2FE8EE606DE21 + 14DA7F8D1E80CC3502A92B6DFF4D334628B6EB94B83F724559FF7062CDB16658 + 2BAC05560ECD8F3640EBA16D91A71152D5D114B4CE9FD9FE871FF31ED3877983 + 798A19C53CF3A5A5D2FF35173B308AC8B758D7D8FF9F1AA3A511999A6813B43E + 221D918CE646F30325F406641C63B42132B22642355D9FF78AEEA2FF073DFF6A + F00F9BAFF3115409308187604490FD774F167916CDBF52562CFA4FFBACCDD5FF + AF554DFFB6FC7B7CD37FD8391079DBFC9B13B51F7515D5856A45DD4335A31A80 + 28AA05D5887A80BAB982FFFAD0BB551FFA339AD3EA7CC21139B4FF1A8FBA3EE6 + 8A256355AB55275517D7DB00232881B1B2C14CB74527D26921A10C5163240A04 + 895A4705282B8AAAABAA6B00B01253D68EA96F4EABB102E27EF41F5A641A003A + C7913DB6E53FB48051001ABE004078FF1F9A14B293599073BF732A208E1EBF46 + 43AF3C30C869C08AEC283E200C24802CA2913AD0027AC00898834DC001B8004F + B015B17328E2CF74B01D248314900132C15170029C0245A00454808BE00A6800 + CDA01574826ED00B9E8261C47FC6C01498013FC002044138880491213E480492 + 8214207588021940E6902DE40479427E50081405C541C9501A9409E540A7A073 + 50257419BA0EB542F7A03EE819F41A9A84BE42F3300A6686396121581A568129 + B0316C03BBC03E70081C0327C1E9F061380F2E862FC0F5702BDC0D3F8547E129 + F83B0AA09850DC283194128A82324539A0BC50C1283A6A17EA202A17558CAA41 + 35212BFD18358A9A46FD4263D164B4285A09F1612BB42B3A001D83DE85CE429F + 4257A0EBD177D08FD1AFD133E8DF18124610A380D1C558633C302198ED980C4C + 2EA60C730DD381ECA631CC0F2C16CB8D95C16A23BBD1131B86DD81CDC29EC6D6 + 626F63FBB06FB1DF71381C1F4E01A78F73C051710C5C062E1F7701D782EBC78D + E17EE299F0227875BC05DE0B1F854FC5E7E2ABF0B7F0FDF871FC02818D2045D0 + 253810020989842384524213E111618CB0406427CA10F5892EC430620A318F58 + 43EC208E10BF3131318933E9306D66A231ED61CA63BAC47497E935D32F660E66 + 796653666FE638E6C3CCE5CCB7999F317F239148D22423921789413A4CAA24B5 + 935E927EB290599459AC59025976B314B0D4B3F4B37C6225B04AB11AB36E654D + 62CD65BDCAFA88759A8DC026CD66CA4665DBC556C0769D6D90ED3B3B995D8DDD + 813D923D8BBD8AFD1EFB04078E439AC39C2390239DA384A39DE32D194596209B + 9203C869E4527207798C13CB29C369CD19C699C97991B38773868B836B03971B + 57025701D74DAE516E14B734B7357704F711EE2BDC03DCF33C423CC63C413C07 + 786A78FA79E67805788D7883780FF2D6F23EE59DE713E533E70BE7CBE66BE07B + C18FE697E7DFCCBF9DFF0C7F07FFB400A7809E4080C041812B02CF0561417941 + 27C11D8225820F04BF0B090B590A450BE50BB50B4D0B730B1B0987091F17BE25 + 3C2942163110A1891C176911F920CA256A2C1A219A277A4774464C50CC4A2C4E + EC9C588FD882B88CB8AB78AA78ADF80B09A204452258E2B8449BC48CA488A49D + 64B264B5E473298214452A54EAA45497D49CB48CB4BBF43EE906E909195E196B + 9924996A99115992ACA16C8C6CB1EC1339AC1C452E5CEEB45CAF3C2CAF291F2A + 5F20FF480156D052A0299C56E853C428EA284629162B0E2A312B192BC52B552B + BD56E656B6554E556E50FEA422A9E2A592ADD2A5F25B55533542B55475588D43 + 6D935AAA5A93DA577579F500F502F5271A240D0B8DDD1A8D1A5F36286C08DA70 + 66C3902659D34E739F669BE69296B6165DAB466B525B52DB4FBB507B90C24971 + A46451EEEA60744C7476EB34EBFCD2D5D265E85ED1FDACA7A417AE57A537B151 + 6663D0C6D28D6FF5C5F5A9FAE7F4470D440DFC0CCE1A8C1A8A19520D8B0DDF18 + 4918051A95198D1BCB1987195F30FE64A26A4237B9663267AA6BBAD3F4B619CA + CCD2ECA0598F3987B9ABF929F39716E2162116D51633969A963B2C6F5B61AC6C + ACB2AD06AD85AC03AC2BAD6736696FDAB9E98E0DB38DB3CD299B37B6F2B674DB + 263BD86E93DD31BB117B29FB28FB0607E060ED70CCE185A38C638CE38DCDD8CD + 8E9B0B36BF7752734A76EA72263BFB3A5739FF70317139E232EC2AEB1AE7DAE6 + C6EAE6ED56E936E76EE69EE33EEAA1E2B1D3A3DB93DF93E6D9E885F372F32AF3 + FABEC57CCB892D63DE9ADE19DE033E323E093EF7B6F26F8DD87AD397D597EA7B + D50FE3E7EE57E5B74875A01653BFFB5BFB17FACF0498069C0C980A340A3C1E38 + 19A41F9413341EAC1F9C133C11A21F722C6432D4303437749A664A3B45FB1266 + 1556143617EE105E1EBE1CE11E511B898FF48BBC1EC511151E75679BF0B6846D + 7DD10AD119D1A331BA31276266E836F4B25828D627B691C1895CDE1FC4C9C6ED + 8D7B1D6F105F10FF73BBDBF6AB09EC0951090F12E5130F248E2759249DDF81DE + 11B0A32D592C3925F9F54EE39DE77641BBFC77B5ED96D89DBE7B6C8FE59E8A14 + 624A78CAC354D5D49CD4D934F7B4A674A1F43DE96FF75AEEADCE60C9A0670CEE + D3DB57B41FBD9FB6BFE780C681FC03BF0F061EBC9FA99A999BB998159075FF90 + DAA1BC43CB87830FF71CD13A72E628F668D4D1816CC3EC8A1CF69CA49CB7C7EC + 8ED51F173D7EF0F8EC09DF13F77237E4169D249E8C3B399A679BD7982F997F34 + 7FF154E8A9A7052605B5858285070AE74E079EEE3F6374A6A648A828B368FE2C + EDECD039CB73F5C5D2C5B925D892F892F7A56EA55DE729E72BCBF8CB32CB96CA + A3CA472B9C2AEE546A57565609561DA986ABE3AA272F785FE8BD6876B1B146A9 + E65C2D776DE6257029EED287CB7E9707AED85C69BB4AB95A53275557788D7CED + 603D549F583FD310DA30DAE8D9D8777DD3F5B626BDA66B37946F94378B3517DC + E4BA79E416F156FAADE596A496EFB7A36F4FB786B4BE6DF36D1B6EF7687F7267 + F39D9E0E9B8EBB9D169DED5DC65D2D77F5EF36DFD3BD77FD3EE57E43B75677FD + 03CD07D71E6A3EBCD6A3D553FF48FB5163AF4E6F53DFC6BE5BFD86FDAD8FCD1E + 773EB17ED2FDD4FE69DF80EBC0D0A0F7E0E850E0D0C4B388675F9EC73F5F18DE + 33821939F882ED45EE4BC197C5AFE45ED58E6A8DDE7C6DF6FAC11BE737C36F03 + DE4EBD8B7DB73896FE9EF43E775C64BC72427DA279D262B2F7C3960F6353D153 + 0BD3191FD93F167E92FD54F7D9E8F383198F99B12FF42FCB5FB3BEF17D2B9FDD + 30DBF6DDF1FBCB1F913F16E60EFEE4FB59F18BF2AB6BDE7D7E7C61FB226E316F + 496EA9E9B7CDEF91E5C8E5E5682A9DBA7A154021150E0E06E06B3900244F00C8 + BD489AB0652DE75B2F28E4F201236F2C927B9821B780C79030E40355C200F680 + 6FA06450A7D03CE8428C22A60B1B8513C13DC69F20F8119599D04C2F99BFB090 + 5835D8B6B0A7725C268F7309727BF29CE41DE197128816BC25CC2A12227A4B9C + 4F822ED92C352FA3251B2D572EFF5C11A7A4A46CAF12AC9AA096A2BE572375C3 + 4E4D865688F6668ABC0E5AE7A5EE75BDDC8D71FAAE06DA860246B0D1B4F1A049 + 87E935B372F3428B1CCB8356A9D63B36316CA26C697641F6810E818E819B439D + A29C192E3B5D33DC0EBB9FF428F22CF7AADD52EFDDECD3B6B5D3B7DBEF11F5B1 + FF60C070E09BA04FC1BF43C934C530ABF0E088FD9117A27AB7CDC6F0D029B19E + 8C84B8ACF882ED17126E25F6274D26C33B8577E9EFF6DD93965295FA38EDF75E + E10CB57DA6FBDD0F441EDC97599AD575E8F311A1A34ED95939DDC7594FB8E6E6 + 9F1CC9173CE55570B2B0F70CBEC8E86CC2B9DAE28952F1F3DE65F4F23D15472B + 8BAB1AABFB2FCCD4906BF52ED12E175C795487BFA65DEFD6C0683C7ABDBAA9ED + C6D3E6B19B5F6ECDB72CB7A2DAD0EDD83B840E6227AE73A96BFA6EEFBDF2FBF4 + 6EB5EEF107D90FB51F8EF6543F8AEB35ECC3F7F5F7173C0E7CA2FCE4D7D38E81 + 9C41EA10E519FFB3A5E7AF87EF8C9C7F91F132E895F1A8E0E8ECEBFB6F8ADEC6 + BF731C5342BCECCBF8F3897B93CD1FEAA62E4F5FFA78F553CDE78A998B5FDABF + CECC52BE17CE09FFBC391FBB68F09B6F7979F5C6C807368218D008112133683F + 34082BC069F01872B76A437282168C2D660C7B00A7857B8F3F4DF0268A11A799 + A6100F00AC243649760A871399C17982AB897B8C9783CF987FBBC045C1096129 + 9100D17362BDE23F24F9A5F4A4B7C8C4CA1E90CB972F5628513CA3744C395525 + 42D5496D833A597D5CE32AE209965A6C5ACFB48B29113A5ABA40F79E5ECE466F + 7D69FDCF064D86FB8D7C8C29269C269F4DBB116F48B7F0B734B212B25AB41EDE + D464936F9B60E7656FE820ED4872FCBEF995D37DE7069712D76CB71477BA07D5 + D3D9CB6C8BA6B7940FF756C2D625DF6F7E53D477FEA3012F028783868347425E + 84BEA2BD0A7B113E1CF13CF279D4F0B617C8493D469F8AFDC6588CC76EE74810 + 48144B92D9A19CACB5D37097F56ED73D01298CD48CB482F42B7BBB3326F7B31C + D038E899B933ABF850E7E10F47D9B2B5727C8E651CAF3D3198FB390FE4739C92 + 2ED02F743FCD38935B74F3EC7831578965693272FEDD2D1FAFC45649579B5F08 + BC9856535ADB7969F20AE9AA7A9DD3355AFDCE86ECC6D2EBF54D5D37869A276E + FE6A21DE166C556ED36897BA43EE001DD39D835DAD77ABEF1DBF9FDC1DF4C0FE + 21A547F69158AF601F5F3FDF63FE27C24F250664075586349FE93E371AB618B1 + 7FE1F532FC55DA6831E20F4BEF74C676BEEF9AE09D0CFFD03A2DF3F1DC67B599 + 375FAFCE96FF68FEF969417BE9F8EAFAA3916C411578816360041282DCA07CE8 + 1DBC013E084FA2EC514D6855740D4613D386F5C0CEE28EE3F5F01384F3C40426 + 3F665B1285458A95878DC48EE380C8284E0C17969B954780579A4F93DF5CC04D + 90261421EC2FE2216A23B6515C568215B951754B9D958E92A1C8FC92BD261725 + 2F253FA8B05B5154F1B6125519522E55B1529956CD51D3517BAD9EA9A1ADF166 + C3114D03CD29AD93DA26DA1F29F93AE63A33BA057A967ADF3616E9DBEAFF3428 + 3574325C36AA37A69BA89B7C33AD338B33D7329FB368B04CB4D2B35AB0BEB969 + 978D912DB06DB34BB7B77220393C712CDC1CE2A4E10C3BF7213E12E766ED2EE4 + FEC9A3C5F3A85700E22578EF119FCB5BF7FBFAFA51A864EA67FF070117028F06 + C5057B86E8878AD130B4C9B087E197234E442646F96C33895688E1A3E3E8DF63 + DF301EC535C5976CCF4C8849744DA2ECE04B8692E77741BB097B3852F85325D2 + 14D235F6EA6618EDB3D86F73C0F1A04F263D6BFFA1A2C3578F741E1DCC1ECBF9 + 7C6CEEF8E289DFB9BFF388F9AAA73C0BD20B6B4E0F1681B332E7EC8AE925B9A5 + 8DE79F952D57A85506569DAC7E7011D46CA8A55D3A73F9F1555CDDC66B31F5E7 + 1B06AF139A746F84379FBA79F7D6EC6D9156ABB698F6BC3B2D1D6FBA3077E5EE + 39DC4FECAE78F0A287FFD1D6DECABE85C74E4FDA077C87789FCD8FC8BF6C79DD + 37C6986CF874ECDBECAFBB2BEBBFF6DFDF4AC16A0150520C80BB24004E760094 + 2A2279A63A123F5A00702401E0A20360BE7C00B51D019065CDDFF8C102E491CC + 32021C41B2C6A7601E8922665038740CBA0A3D85E6607ED8100E44BCE9123C84 + E46E722867D44E5405EA091AA095D1DEE883E826F4078C00C60E938269C2CC62 + 55B191D80BD88F38555C3CAE054FC47BE2AB0930C19B708328444C434E9E2D4C + 83CCAECC03240FD2088B3FCB246B0CEB3C5B3A3B2B7B01872C473DD99CFC9433 + 9473912B875B9EFB0E8F2FCF026F1E9F36DF007FBC00AF4093E056218CD04561 + 0F118C489D68B018BF589F78A684A52446B253EA80B4830CB7CCB06C919CBFBC + A4FC7B850AC5302545A54FCA5754B6AB1AAA11D406D4CF6B6CDFE0ACA9A5C5A7 + F55BFB2D72ABBEA89BA3B71D39A78C0CA40C09869F8D9E183799D4217E78CDBC + C1E2BAE575ABEBD6F59B2EDB54D916D91DB34F776038066C7674327256779176 + 1576E375E7F6E0F6E4F712DD22EBADE163B8D5CE778B5F1835C9FF50406F1039 + D82D242FF459184FB8734456647BD48F68991837FADED82B8C97F1B2DBE3123A + 93047630921FEFA2EC2E4DE149CD4EE7D89BBF4F6A7FFD41B3CCA1430C244A0D + E6541D2FCABD91CF5270E28CCE59FFE2ECD2CEB2E54A83EADD175B2FA1AF58D6 + 1DA82F6ABCD6F4B0F9430BA955BB3DBCA3B2EBEB7DF307677BBEF5993ECE7CDA + 3D043F571ED9FC326234E54DCEBBB3EF3B273E7EF831FDFAD3C5199F2FB3DF18 + B3AF7EE8CD65FD7C32CFBE60BDB873A9EAF7C0EAF9C106548033480045A0034C + 41646823140C654375489EFF1B96826DE138B808BE07CF2239BB3D2A19558D1A + 46332171651BBA183D8061C218631231F598EF582D6C22F6260E83E4D185B869 + BC31FE147E8EE049B84D54201630B1321D62E6643E43522035B338B28CB3A6B0 + 89B0B5B2077190381AC83E9C1067399723D72277158F172F89B79D6F07BF26FF + 3781AB820C214DA139E11B2229A256626C62C3E2E5120C4953292EA909E95B32 + B9B2B1728EF2CA0A24858F8A3D4AB5CAD92A0C554F350375290D168D5F1B3E68 + BED47AAC7D8FD2AAD3A47B4DEFD2C60BFA9506E586654665C6E526B5A637CCEE + 9A0F5A8C5BFEB4266E12B451B135B673B60F764870CCDC7CDAA9C2B9CEA5DDF5 + B1DB7BF7794F762FB92DA6DE3E3E895B73917CA39FFA254034D02FE86CF068A8 + 28CD37AC307C28923DCA6ADBAEE8CB316F63B918E67129F10F13F813C3929A93 + D97606EFBAB587272526F541BACCDEB48CD1FDFA07AA32C5B30A0FF31F29C816 + C9293BAE7AE2E649DBBC17A7B615A24EE715F99DD329E12EFD55365AF1B0AAE5 + 425D4DCDA5AA2B157565F5598DD14D4ECD1AB7385A665A7BDA2F761CEADA76CF + B5DBE0A1DC23CEDEC5FE574F9A06B2865C9E730C77BC887E451EBDF4C6FAEDC8 + 58E43866E2D807EEA9ACE9EF9F9C3E9F9E19FECAFA4D7BD6E93BED47EC5CD2CF + A45F71F3910B7E8B4E4B86BF1597B956D79F13E8007F7008348277103B640445 + 4367A02EE80B2C04DBC04970153C8C624119A3E2511751EFD08268377436FA21 + B2EED6982CCC00561C1B836DC7F1E16271FD786D7C09819B904DE4221631A931 + 0D31A7933449132C45AC1E6C9C6CFDECC7393CC862E4AF9C5D5CE7B877F304F0 + 6EE2D3E297161010240B2E09BD17EE136915AD13AB162F9328952C97BA28DD20 + D3293B243725BFACC8A924A76CA8E2AA1AA1B657BD48E3C686512DBCB63AC557 + E7B0EE2DBD197D090377C32CA336E39FA6F2665BCD732D7AAD48D6F69B726C9E + D949D86F7368D9CCEEE4E35CE6F2CDCDCC3DCFE38B97E3963A1F91AD47FC30D4 + 14FF4F8194A0B4E0DE50115A4C58478440645C547FB47ACC09FA222328AE7D3B + 7F426C62CF0EA5E4A33B7FEE0EDEF33CD5256D60EFD68CA9FDBB0F8C659A649D + 3B0C1D093C7A2F47F558C109426ED2C9CFF921A7DE16FA9F7E5BE474F676B16A + C9B9F3E4B27DE54B958CAA8F17422EBEADA55E7A7DC5FFEAD8B588FAB9C6B426 + F61B2537B56FF5DCA6B5E1DBAB3B36772EDCADB8EFF180F8B0E3514A9F61FFE2 + 938681A821F1678F86E35F70BFBC3C6AF17AF06DE0BB4FEF5DC74B27A63E884F + D94ED33E867D0AFC6C362332F3E6CBF9AF8E5F7F7D3B3DAB3A7BE7BBEBF7A11F + 5E3F5ECCB9CD3DF869F2B3E197D4AFEC5F4BF3A1F3BD0B9A0BF90B4B8BFE8BAD + 4B224BBB965EFCD6FB7DE2F7CCF2A6E5D295F58F0DD6505F0D1F10B30972997C + B9BCFC4D1A005C0E004BD9CBCB0BC5CBCB4B2548B23102C0ED88B5EF49ABB186 + 0D80C295EF53A0D3347DCFBFBFE5AC7D6BFA471EF3EF37588D44ABA3229168F5 + 8D4425F03F9CADF490FF9D1F830000005C655849664D4D002A00000008000401 + 0600030000000100020000011200030000000100010000012800030000000100 + 02000087690004000000010000003E000000000002A002000400000001000000 + 98A00300040000000100000098000000003B31A17E000002B669545874584D4C + 3A636F6D2E61646F62652E786D7000000000003C783A786D706D65746120786D + 6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22 + 584D5020436F726520352E342E30223E0A2020203C7264663A52444620786D6C + 6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30 + 322F32322D7264662D73796E7461782D6E7323223E0A2020202020203C726466 + 3A4465736372697074696F6E207264663A61626F75743D22220A202020202020 + 202020202020786D6C6E733A746966663D22687474703A2F2F6E732E61646F62 + 652E636F6D2F746966662F312E302F220A202020202020202020202020786D6C + 6E733A657869663D22687474703A2F2F6E732E61646F62652E636F6D2F657869 + 662F312E302F223E0A2020202020202020203C746966663A5265736F6C757469 + 6F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A20 + 20202020202020203C746966663A4F7269656E746174696F6E3E313C2F746966 + 663A4F7269656E746174696F6E3E0A2020202020202020203C746966663A436F + 6D7072657373696F6E3E313C2F746966663A436F6D7072657373696F6E3E0A20 + 20202020202020203C746966663A50686F746F6D6574726963496E7465727072 + 65746174696F6E3E323C2F746966663A50686F746F6D6574726963496E746572 + 707265746174696F6E3E0A2020202020202020203C657869663A506978656C59 + 44696D656E73696F6E3E3135323C2F657869663A506978656C5944696D656E73 + 696F6E3E0A2020202020202020203C657869663A506978656C5844696D656E73 + 696F6E3E3135323C2F657869663A506978656C5844696D656E73696F6E3E0A20 + 20202020203C2F7264663A4465736372697074696F6E3E0A2020203C2F726466 + 3A5244463E0A3C2F783A786D706D6574613E0A02DDCEB6000003A34944415478 + 01EDD5316EC20014444188B8335730A72680E422CD368F74E306A4D577317A82 + EBFD7E7F5E3C04FE41E0388ECBCF3FBCD72B095CDE71BD9FDB69F1783CAEE777 + 9F04AAC02BB0CF3FA35FB02AE97E0A086CF218AB80C0AAA0FB2920B0C963AC02 + 02AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218 + AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B + 3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780 + C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB + 2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02A + E87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08 + AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC + 0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF2 + 18AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F0202 + 9B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA7 + 80C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0 + FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B0 + 2AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A + 08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963 + AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086C + F218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02 + 029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EE + A780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AA + A0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20 + B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB1 + 0A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C9 + 63AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A08 + 6CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F + 02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82 + EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0 + AAA0FB29703BD7E7EB39BFFB24F02D81CF2FD8711CDF7A9FF710F823F00B490C + 108FA01F47D70000000049454E44AE426082 + } + Proportional = True + Stretch = True end - object OpenDOS: TCheckBox - Left = 4 - Height = 18 - Top = 56 - Width = 191 - Caption = 'Open DOS Partitions on ADFS' - Checked = True - State = cbChecked - TabOrder = 4 + object Border5: TImage + Left = 76 + Height = 152 + Top = 14 + Width = 152 + OnClick = TilePictureRO5Click + Picture.Data = { + 1754506F727461626C654E6574776F726B47726170686963961F000089504E47 + 0D0A1A0A0000000D494844520000009800000098080600000018C22021000018 + 84694343504943432050726F66696C65000058859579093855DFF7F73EE7CE97 + 6BBAE6799E67E122F39C313311D77C4D715D421A0C69A0814A4429642C1A84A4 + 845029A142516910A2522965C8FF18EAF7FD7F7FEFF3BECFBB9F679FF3B96BAF + BDF65E6BAFBDD75EF7002070871A1D1D01B3011019C5A03B599A887A787A89E2 + C6010458013740037E6A406CB4B1A3A32D40CA9FF7FF2E3F06106EA43C565A91 + F5DFEDFFD7C21118141B0000E48D60FFC0D8804804DF06009D1A104D67008035 + 43E812DB19D12B3814C19C746482084E5EC1216BF8E80AF65FC3A5AB3C2E4EA6 + 086E0400CF4CA5D2430060B983D045E3034210392CEF90368EA8405A14C2FA13 + C10601A1D440000428088F6264E4B6158C54208BF04723380BC114FF7FC80CF9 + 5FF2FDFFCAA75243FEE235BD560BDE8C161B1D414DFCFF34CDFFBB4446C4FD19 + 431AA9CCA1742BA715FD111B0E856FB359C1CC089E8EF2B77758B135827FD202 + D7EC0E004C0C8DB3725DE3870503624D11FB216B0E60D540AA990D8205116C11 + 15616FBB4EF70FA659582318F1163881C6B07659EFBB3F28D6DC795D66217D9B + 93C31F1C4C37355EEF5B43A5AF8EBBC27F272EDCD5785DFE506890F51FF9B349 + A12EEE0826028022C6D3DCEC11CC8260CED870679B351E947852A8A9FD1F1E7A + 9CD3CAFC25114C098AB23459938FF20EA65B38ADF34747C6FED11795114AB3B6 + 5FC7798C5017AB35FBA0AA02A8ABF3E745707D5094B1EB1F3941B11EB67F7409 + 0C32335FD31DD51314E5BAAE2FEA6534C3C469BDEF4C7484E33A3F1A1F1461B9 + 421747307F6CBCF37A5FF44606E29C6BF2D1B6D10C4797B579A2FDC2A89B1CD7 + E6838E07B6C0149801511087547FB00D84015ACF74C334F26BADC50250011D84 + 8020A0B44EF9D3C37DB5250A793A8324F011414120F66F3F93D5D620108FD097 + FE52D79E4A2078B5357EB54738788FE04860032290DF71ABBDA2FE8EE606DE21 + 14DA7F8D1E80CC3502A92B6DFF4D334628B6EB94B83F724559FF7062CDB16658 + 2BAC05560ECD8F3640EBA16D91A71152D5D114B4CE9FD9FE871FF31ED3877983 + 798A19C53CF3A5A5D2FF35173B308AC8B758D7D8FF9F1AA3A511999A6813B43E + 221D918CE646F30325F406641C63B42132B22642355D9FF78AEEA2FF073DFF6A + F00F9BAFF3115409308187604490FD774F167916CDBF52562CFA4FFBACCDD5FF + AF554DFFB6FC7B7CD37FD8391079DBFC9B13B51F7515D5856A45DD4335A31A80 + 28AA05D5887A80BAB982FFFAD0BB551FFA339AD3EA7CC21139B4FF1A8FBA3EE6 + 8A256355AB55275517D7DB00232881B1B2C14CB74527D26921A10C5163240A04 + 895A4705282B8AAAABAA6B00B01253D68EA96F4EABB102E27EF41F5A641A003A + C7913DB6E53FB48051001ABE004078FF1F9A14B293599073BF732A208E1EBF46 + 43AF3C30C869C08AEC283E200C24802CA2913AD0027AC00898834DC001B8004F + B015B17328E2CF74B01D248314900132C15170029C0245A00454808BE00A6800 + CDA01574826ED00B9E8261C47FC6C01498013FC002044138880491213E480492 + 8214207588021940E6902DE40479427E50081405C541C9501A9409E540A7A073 + 50257419BA0EB542F7A03EE819F41A9A84BE42F3300A6686396121581A568129 + B0316C03BBC03E70081C0327C1E9F061380F2E862FC0F5702BDC0D3F8547E129 + F83B0AA09850DC283194128A82324539A0BC50C1283A6A17EA202A17558CAA41 + 35212BFD18358A9A46FD4263D164B4285A09F1612BB42B3A001D83DE85CE429F + 4257A0EBD177D08FD1AFD133E8DF18124610A380D1C558633C302198ED980C4C + 2EA60C730DD381ECA631CC0F2C16CB8D95C16A23BBD1131B86DD81CDC29EC6D6 + 626F63FBB06FB1DF71381C1F4E01A78F73C051710C5C062E1F7701D782EBC78D + E17EE299F0227875BC05DE0B1F854FC5E7E2ABF0B7F0FDF871FC02818D2045D0 + 253810020989842384524213E111618CB0406427CA10F5892EC430620A318F58 + 43EC208E10BF3131318933E9306D66A231ED61CA63BAC47497E935D32F660E66 + 796653666FE638E6C3CCE5CCB7999F317F239148D22423921789413A4CAA24B5 + 935E927EB290599459AC59025976B314B0D4B3F4B37C6225B04AB11AB36E654D + 62CD65BDCAFA88759A8DC026CD66CA4665DBC556C0769D6D90ED3B3B995D8DDD + 813D923D8BBD8AFD1EFB04078E439AC39C2390239DA384A39DE32D194596209B + 9203C869E4527207798C13CB29C369CD19C699C97991B38773868B836B03971B + 57025701D74DAE516E14B734B7357704F711EE2BDC03DCF33C423CC63C413C07 + 786A78FA79E67805788D7883780FF2D6F23EE59DE713E533E70BE7CBE66BE07B + C18FE697E7DFCCBF9DFF0C7F07FFB400A7809E4080C041812B02CF0561417941 + 27C11D8225820F04BF0B090B590A450BE50BB50B4D0B730B1B0987091F17BE25 + 3C2942163110A1891C176911F920CA256A2C1A219A277A4774464C50CC4A2C4E + EC9C588FD882B88CB8AB78AA78ADF80B09A204452258E2B8449BC48CA488A49D + 64B264B5E473298214452A54EAA45497D49CB48CB4BBF43EE906E909195E196B + 9924996A99115992ACA16C8C6CB1EC1339AC1C452E5CEEB45CAF3C2CAF291F2A + 5F20FF480156D052A0299C56E853C428EA284629162B0E2A312B192BC52B552B + BD56E656B6554E556E50FEA422A9E2A592ADD2A5F25B55533542B55475588D43 + 6D935AAA5A93DA577579F500F502F5271A240D0B8DDD1A8D1A5F36286C08DA70 + 66C3902659D34E739F669BE69296B6165DAB466B525B52DB4FBB507B90C24971 + A46451EEEA60744C7476EB34EBFCD2D5D265E85ED1FDACA7A417AE57A537B151 + 6663D0C6D28D6FF5C5F5A9FAE7F4470D440DFC0CCE1A8C1A8A19520D8B0DDF18 + 4918051A95198D1BCB1987195F30FE64A26A4237B9663267AA6BBAD3F4B619CA + CCD2ECA0598F3987B9ABF929F39716E2162116D51633969A963B2C6F5B61AC6C + ACB2AD06AD85AC03AC2BAD6736696FDAB9E98E0DB38DB3CD299B37B6F2B674DB + 263BD86E93DD31BB117B29FB28FB0607E060ED70CCE185A38C638CE38DCDD8CD + 8E9B0B36BF7752734A76EA72263BFB3A5739FF70317139E232EC2AEB1AE7DAE6 + C6EAE6ED56E936E76EE69EE33EEAA1E2B1D3A3DB93DF93E6D9E885F372F32AF3 + FABEC57CCB892D63DE9ADE19DE033E323E093EF7B6F26F8DD87AD397D597EA7B + D50FE3E7EE57E5B74875A01653BFFB5BFB17FACF0498069C0C980A340A3C1E38 + 19A41F9413341EAC1F9C133C11A21F722C6432D4303437749A664A3B45FB1266 + 1556143617EE105E1EBE1CE11E511B898FF48BBC1EC511151E75679BF0B6846D + 7DD10AD119D1A331BA31276266E836F4B25828D627B691C1895CDE1FC4C9C6ED + 8D7B1D6F105F10FF73BBDBF6AB09EC0951090F12E5130F248E2759249DDF81DE + 11B0A32D592C3925F9F54EE39DE77641BBFC77B5ED96D89DBE7B6C8FE59E8A14 + 624A78CAC354D5D49CD4D934F7B4A674A1F43DE96FF75AEEADCE60C9A0670CEE + D3DB57B41FBD9FB6BFE780C681FC03BF0F061EBC9FA99A999BB998159075FF90 + DAA1BC43CB87830FF71CD13A72E628F668D4D1816CC3EC8A1CF69CA49CB7C7EC + 8ED51F173D7EF0F8EC09DF13F77237E4169D249E8C3B399A679BD7982F997F34 + 7FF154E8A9A7052605B5858285070AE74E079EEE3F6374A6A648A828B368FE2C + EDECD039CB73F5C5D2C5B925D892F892F7A56EA55DE729E72BCBF8CB32CB96CA + A3CA472B9C2AEE546A57565609561DA986ABE3AA272F785FE8BD6876B1B146A9 + E65C2D776DE6257029EED287CB7E9707AED85C69BB4AB95A53275557788D7CED + 603D549F583FD310DA30DAE8D9D8777DD3F5B626BDA66B37946F94378B3517DC + E4BA79E416F156FAADE596A496EFB7A36F4FB786B4BE6DF36D1B6EF7687F7267 + F39D9E0E9B8EBB9D169DED5DC65D2D77F5EF36DFD3BD77FD3EE57E43B75677FD + 03CD07D71E6A3EBCD6A3D553FF48FB5163AF4E6F53DFC6BE5BFD86FDAD8FCD1E + 773EB17ED2FDD4FE69DF80EBC0D0A0F7E0E850E0D0C4B388675F9EC73F5F18DE + 33821939F882ED45EE4BC197C5AFE45ED58E6A8DDE7C6DF6FAC11BE737C36F03 + DE4EBD8B7DB73896FE9EF43E775C64BC72427DA279D262B2F7C3960F6353D153 + 0BD3191FD93F167E92FD54F7D9E8F383198F99B12FF42FCB5FB3BEF17D2B9FDD + 30DBF6DDF1FBCB1F913F16E60EFEE4FB59F18BF2AB6BDE7D7E7C61FB226E316F + 496EA9E9B7CDEF91E5C8E5E5682A9DBA7A154021150E0E06E06B3900244F00C8 + BD489AB0652DE75B2F28E4F201236F2C927B9821B780C79030E40355C200F680 + 6FA06450A7D03CE8428C22A60B1B8513C13DC69F20F8119599D04C2F99BFB090 + 5835D8B6B0A7725C268F7309727BF29CE41DE197128816BC25CC2A12227A4B9C + 4F822ED92C352FA3251B2D572EFF5C11A7A4A46CAF12AC9AA096A2BE572375C3 + 4E4D865688F6668ABC0E5AE7A5EE75BDDC8D71FAAE06DA860246B0D1B4F1A049 + 87E935B372F3428B1CCB8356A9D63B36316CA26C697641F6810E818E819B439D + A29C192E3B5D33DC0EBB9FF428F22CF7AADD52EFDDECD3B6B5D3B7DBEF11F5B1 + FF60C070E09BA04FC1BF43C934C530ABF0E088FD9117A27AB7CDC6F0D029B19E + 8C84B8ACF882ED17126E25F6274D26C33B8577E9EFF6DD93965295FA38EDF75E + E10CB57DA6FBDD0F441EDC97599AD575E8F311A1A34ED95939DDC7594FB8E6E6 + 9F1CC9173CE55570B2B0F70CBEC8E86CC2B9DAE28952F1F3DE65F4F23D15472B + 8BAB1AABFB2FCCD4906BF52ED12E175C795487BFA65DEFD6C0683C7ABDBAA9ED + C6D3E6B19B5F6ECDB72CB7A2DAD0EDD83B840E6227AE73A96BFA6EEFBDF2FBF4 + 6EB5EEF107D90FB51F8EF6543F8AEB35ECC3F7F5F7173C0E7CA2FCE4D7D38E81 + 9C41EA10E519FFB3A5E7AF87EF8C9C7F91F132E895F1A8E0E8ECEBFB6F8ADEC6 + BF731C5342BCECCBF8F3897B93CD1FEAA62E4F5FFA78F553CDE78A998B5FDABF + CECC52BE17CE09FFBC391FBB68F09B6F7979F5C6C807368218D008112133683F + 34082BC069F01872B76A437282168C2D660C7B00A7857B8F3F4DF0268A11A799 + A6100F00AC243649760A871399C17982AB897B8C9783CF987FBBC045C1096129 + 9100D17362BDE23F24F9A5F4A4B7C8C4CA1E90CB972F5628513CA3744C395525 + 42D5496D833A597D5CE32AE209965A6C5ACFB48B29113A5ABA40F79E5ECE466F + 7D69FDCF064D86FB8D7C8C29269C269F4DBB116F48B7F0B734B212B25AB41EDE + D464936F9B60E7656FE820ED4872FCBEF995D37DE7069712D76CB71477BA07D5 + D3D9CB6C8BA6B7940FF756C2D625DF6F7E53D477FEA3012F028783868347425E + 84BEA2BD0A7B113E1CF13CF279D4F0B617C8493D469F8AFDC6588CC76EE74810 + 48144B92D9A19CACB5D37097F56ED73D01298CD48CB482F42B7BBB3326F7B31C + D038E899B933ABF850E7E10F47D9B2B5727C8E651CAF3D3198FB390FE4739C92 + 2ED02F743FCD38935B74F3EC7831578965693272FEDD2D1FAFC45649579B5F08 + BC9856535ADB7969F20AE9AA7A9DD3355AFDCE86ECC6D2EBF54D5D37869A276E + FE6A21DE166C556ED36897BA43EE001DD39D835DAD77ABEF1DBF9FDC1DF4C0FE + 21A547F69158AF601F5F3FDF63FE27C24F250664075586349FE93E371AB618B1 + 7FE1F532FC55DA6831E20F4BEF74C676BEEF9AE09D0CFFD03A2DF3F1DC67B599 + 375FAFCE96FF68FEF969417BE9F8EAFAA3916C411578816360041282DCA07CE8 + 1DBC013E084FA2EC514D6855740D4613D386F5C0CEE28EE3F5F01384F3C40426 + 3F665B1285458A95878DC48EE380C8284E0C17969B954780579A4F93DF5CC04D + 90261421EC2FE2216A23B6515C568215B951754B9D958E92A1C8FC92BD261725 + 2F253FA8B05B5154F1B6125519522E55B1529956CD51D3517BAD9EA9A1ADF166 + C3114D03CD29AD93DA26DA1F29F93AE63A33BA057A967ADF3616E9DBEAFF3428 + 3574325C36AA37A69BA89B7C33AD338B33D7329FB368B04CB4D2B35AB0BEB969 + 978D912DB06DB34BB7B77220393C712CDC1CE2A4E10C3BF7213E12E766ED2EE4 + FEC9A3C5F3A85700E22578EF119FCB5BF7FBFAFA51A864EA67FF070117028F06 + C5057B86E8878AD130B4C9B087E197234E442646F96C33895688E1A3E3E8DF63 + DF301EC535C5976CCF4C8849744DA2ECE04B8692E77741BB097B3852F85325D2 + 14D235F6EA6618EDB3D86F73C0F1A04F263D6BFFA1A2C3578F741E1DCC1ECBF9 + 7C6CEEF8E289DFB9BFF388F9AAA73C0BD20B6B4E0F1681B332E7EC8AE925B9A5 + 8DE79F952D57A85506569DAC7E7011D46CA8A55D3A73F9F1555CDDC66B31F5E7 + 1B06AF139A746F84379FBA79F7D6EC6D9156ABB698F6BC3B2D1D6FBA3077E5EE + 39DC4FECAE78F0A287FFD1D6DECABE85C74E4FDA077C87789FCD8FC8BF6C79DD + 37C6986CF874ECDBECAFBB2BEBBFF6DFDF4AC16A0150520C80BB24004E760094 + 2A2279A63A123F5A00702401E0A20360BE7C00B51D019065CDDFF8C102E491CC + 32021C41B2C6A7601E8922665038740CBA0A3D85E6607ED8100E44BCE9123C84 + E46E722867D44E5405EA091AA095D1DEE883E826F4078C00C60E938269C2CC62 + 55B191D80BD88F38555C3CAE054FC47BE2AB0930C19B708328444C434E9E2D4C + 83CCAECC03240FD2088B3FCB246B0CEB3C5B3A3B2B7B01872C473DD99CFC9433 + 9473912B875B9EFB0E8F2FCF026F1E9F36DF007FBC00AF4093E056218CD04561 + 0F118C489D68B018BF589F78A684A52446B253EA80B4830CB7CCB06C919CBFBC + A4FC7B850AC5302545A54FCA5754B6AB1AAA11D406D4CF6B6CDFE0ACA9A5C5A7 + F55BFB2D72ABBEA89BA3B71D39A78C0CA40C09869F8D9E183799D4217E78CDBC + C1E2BAE575ABEBD6F59B2EDB54D916D91DB34F776038066C7674327256779176 + 1576E375E7F6E0F6E4F712DD22EBADE163B8D5CE778B5F1835C9FF50406F1039 + D82D242FF459184FB8734456647BD48F68991837FADED82B8C97F1B2DBE3123A + 93047630921FEFA2EC2E4DE149CD4EE7D89BBF4F6A7FFD41B3CCA1430C244A0D + E6541D2FCABD91CF5270E28CCE59FFE2ECD2CEB2E54A83EADD175B2FA1AF58D6 + 1DA82F6ABCD6F4B0F9430BA955BB3DBCA3B2EBEB7DF307677BBEF5993ECE7CDA + 3D043F571ED9FC326234E54DCEBBB3EF3B273E7EF831FDFAD3C5199F2FB3DF18 + B3AF7EE8CD65FD7C32CFBE60BDB873A9EAF7C0EAF9C106548033480045A0034C + 41646823140C654375489EFF1B96826DE138B808BE07CF2239BB3D2A19558D1A + 46332171651BBA183D8061C218631231F598EF582D6C22F6260E83E4D185B869 + BC31FE147E8EE049B84D54201630B1321D62E6643E43522035B338B28CB3A6B0 + 89B0B5B2077190381AC83E9C1067399723D72277158F172F89B79D6F07BF26FF + 3781AB820C214DA139E11B2229A256626C62C3E2E5120C4953292EA909E95B32 + B9B2B1728EF2CA0A24858F8A3D4AB5CAD92A0C554F350375290D168D5F1B3E68 + BED47AAC7D8FD2AAD3A47B4DEFD2C60BFA9506E586654665C6E526B5A637CCEE + 9A0F5A8C5BFEB4266E12B451B135B673B60F764870CCDC7CDAA9C2B9CEA5DDF5 + B1DB7BF7794F762FB92DA6DE3E3E895B73917CA39FFA254034D02FE86CF068A8 + 28CD37AC307C28923DCA6ADBAEE8CB316F63B918E67129F10F13F813C3929A93 + D97606EFBAB587272526F541BACCDEB48CD1FDFA07AA32C5B30A0FF31F29C816 + C9293BAE7AE2E649DBBC17A7B615A24EE715F99DD329E12EFD55365AF1B0AAE5 + 425D4DCDA5AA2B157565F5598DD14D4ECD1AB7385A665A7BDA2F761CEADA76CF + B5DBE0A1DC23CEDEC5FE574F9A06B2865C9E730C77BC887E451EBDF4C6FAEDC8 + 58E43866E2D807EEA9ACE9EF9F9C3E9F9E19FECAFA4D7BD6E93BED47EC5CD2CF + A45F71F3910B7E8B4E4B86BF1597B956D79F13E8007F7008348277103B640445 + 4367A02EE80B2C04DBC04970153C8C624119A3E2511751EFD08268377436FA21 + B2EED6982CCC00561C1B836DC7F1E16271FD786D7C09819B904DE4221631A931 + 0D31A7933449132C45AC1E6C9C6CFDECC7393CC862E4AF9C5D5CE7B877F304F0 + 6EE2D3E297161010240B2E09BD17EE136915AD13AB162F9328952C97BA28DD20 + D3293B243725BFACC8A924A76CA8E2AA1AA1B657BD48E3C686512DBCB63AC557 + E7B0EE2DBD197D090377C32CA336E39FA6F2665BCD732D7AAD48D6F69B726C9E + D949D86F7368D9CCEEE4E35CE6F2CDCDCC3DCFE38B97E3963A1F91AD47FC30D4 + 14FF4F8194A0B4E0DE50115A4C58478440645C547FB47ACC09FA222328AE7D3B + 7F426C62CF0EA5E4A33B7FEE0EDEF33CD5256D60EFD68CA9FDBB0F8C659A649D + 3B0C1D093C7A2F47F558C109426ED2C9CFF921A7DE16FA9F7E5BE474F676B16A + C9B9F3E4B27DE54B958CAA8F17422EBEADA55E7A7DC5FFEAD8B588FAB9C6B426 + F61B2537B56FF5DCA6B5E1DBAB3B36772EDCADB8EFF180F8B0E3514A9F61FFE2 + 938681A821F1678F86E35F70BFBC3C6AF17AF06DE0BB4FEF5DC74B27A63E884F + D94ED33E867D0AFC6C362332F3E6CBF9AF8E5F7F7D3B3DAB3A7BE7BBEBF7A11F + 5E3F5ECCB9CD3DF869F2B3E197D4AFEC5F4BF3A1F3BD0B9A0BF90B4B8BFE8BAD + 4B224BBB965EFCD6FB7DE2F7CCF2A6E5D295F58F0DD6505F0D1F10B30972997C + B9BCFC4D1A005C0E004BD9CBCB0BC5CBCB4B2548B23102C0ED88B5EF49ABB186 + 0D80C295EF53A0D3347DCFBFBFE5AC7D6BFA471EF3EF37588D44ABA3229168F5 + 8D4425F03F9CADF490FF9D1F830000005C655849664D4D002A00000008000401 + 0600030000000100020000011200030000000100010000012800030000000100 + 02000087690004000000010000003E000000000002A002000400000001000000 + 98A00300040000000100000098000000003B31A17E000002B669545874584D4C + 3A636F6D2E61646F62652E786D7000000000003C783A786D706D65746120786D + 6C6E733A783D2261646F62653A6E733A6D6574612F2220783A786D70746B3D22 + 584D5020436F726520352E342E30223E0A2020203C7264663A52444620786D6C + 6E733A7264663D22687474703A2F2F7777772E77332E6F72672F313939392F30 + 322F32322D7264662D73796E7461782D6E7323223E0A2020202020203C726466 + 3A4465736372697074696F6E207264663A61626F75743D22220A202020202020 + 202020202020786D6C6E733A746966663D22687474703A2F2F6E732E61646F62 + 652E636F6D2F746966662F312E302F220A202020202020202020202020786D6C + 6E733A657869663D22687474703A2F2F6E732E61646F62652E636F6D2F657869 + 662F312E302F223E0A2020202020202020203C746966663A5265736F6C757469 + 6F6E556E69743E323C2F746966663A5265736F6C7574696F6E556E69743E0A20 + 20202020202020203C746966663A4F7269656E746174696F6E3E313C2F746966 + 663A4F7269656E746174696F6E3E0A2020202020202020203C746966663A436F + 6D7072657373696F6E3E313C2F746966663A436F6D7072657373696F6E3E0A20 + 20202020202020203C746966663A50686F746F6D6574726963496E7465727072 + 65746174696F6E3E323C2F746966663A50686F746F6D6574726963496E746572 + 707265746174696F6E3E0A2020202020202020203C657869663A506978656C59 + 44696D656E73696F6E3E3135323C2F657869663A506978656C5944696D656E73 + 696F6E3E0A2020202020202020203C657869663A506978656C5844696D656E73 + 696F6E3E3135323C2F657869663A506978656C5844696D656E73696F6E3E0A20 + 20202020203C2F7264663A4465736372697074696F6E3E0A2020203C2F726466 + 3A5244463E0A3C2F783A786D706D6574613E0A02DDCEB6000003A34944415478 + 01EDD5316EC20014444188B8335730A72680E422CD368F74E306A4D577317A82 + EBFD7E7F5E3C04FE41E0388ECBCF3FBCD72B095CDE71BD9FDB69F1783CAEE777 + 9F04AAC02BB0CF3FA35FB02AE97E0A086CF218AB80C0AAA0FB2920B0C963AC02 + 02AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218 + AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B + 3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780 + C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB + 2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02A + E87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08 + AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC + 0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF2 + 18AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F0202 + 9B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA7 + 80C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0 + FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B0 + 2AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A + 08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963 + AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086C + F218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02 + 029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EE + A780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AA + A0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20 + B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB1 + 0A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C9 + 63AC0202AB82EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A08 + 6CF218AB80C0AAA0FB2920B0C963AC0202AB82EEA780C0268FB10A08AC0ABA9F + 02029B3CC62A20B02AE87E0A086CF218AB80C0AAA0FB2920B0C963AC0202AB82 + EEA780C0268FB10A08AC0ABA9F02029B3CC62A20B02AE87E0A086CF218AB80C0 + AAA0FB29703BD7E7EB39BFFB24F02D81CF2FD8711CDF7A9FF710F823F00B490C + 108FA01F47D70000000049454E44AE426082 + } + Proportional = True + Stretch = True end end - object DFSGroup: TGroupBox + object DFSPanel: TPanel Left = 224 Height = 104 Top = 176 Width = 224 - Caption = 'DFS Validation' - ClientHeight = 85 - ClientWidth = 214 - TabOrder = 2 - object DFSBeyondEdge: TCheckBox - Left = 4 - Height = 18 - Top = 8 - Width = 197 - Caption = 'Allow files goes over disc edge' - TabOrder = 0 + BevelOuter = bvNone + ClientHeight = 104 + ClientWidth = 224 + TabOrder = 1 + OnPaint = FormPaint + object DFSPanelLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 224 + Align = alTop + Caption = ' DFS Validation' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end - object AllowDFSZeroSecs: TCheckBox - Left = 4 - Height = 18 - Top = 32 - Width = 126 - Caption = 'Allow zero sectors' - TabOrder = 1 + end + object InterleavePanel: TPanel + Left = 0 + Height = 104 + Top = 176 + Width = 226 + BevelOuter = bvNone + ClientHeight = 104 + ClientWidth = 226 + TabOrder = 2 + OnPaint = FormPaint + object InterleaveLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 226 + Align = alTop + Caption = ' Track Order (ADFS L and Acorn FS)' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end - object AllowDFSBlankFilenames: TCheckBox - Left = 4 - Height = 18 - Top = 56 - Width = 144 - Caption = 'Allow blank filenames' - TabOrder = 2 + end + object MiscPanel: TPanel + Left = 0 + Height = 104 + Top = 280 + Width = 452 + BevelOuter = bvNone + ClientHeight = 104 + ClientWidth = 452 + TabOrder = 3 + OnPaint = FormPaint + object MiscLabel: TLabel + Left = 0 + Height = 16 + Top = 0 + Width = 452 + Align = alTop + Caption = ' Miscellaneous' + Color = 7829367 + Font.Color = clWhite + Font.Style = [fsBold] + ParentFont = False + Transparent = False end end end diff --git a/LazarusSource/SettingsUnit.pas b/LazarusSource/SettingsUnit.pas index d3b5ec2..75892ac 100644 --- a/LazarusSource/SettingsUnit.pas +++ b/LazarusSource/SettingsUnit.pas @@ -1,7 +1,7 @@ unit SettingsUnit; { -Copyright (C) 2018-2022 Gerald Holdsworth gerald@hollypops.co.uk +Copyright (C) 2018-2023 Gerald Holdsworth gerald@hollypops.co.uk This source is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free @@ -25,39 +25,52 @@ interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, - Buttons{, Spin}; + GJHCustomComponents; type { TSettingsForm } TSettingsForm = class(TForm) - AllowDFSZeroSecs: TCheckBox; - AllowDFSBlankFilenames: TCheckBox; - CancelButton: TBitBtn; - OpenDOS: TCheckBox; - ScanSubDirs: TCheckBox; - DFSBeyondEdge: TCheckBox; - DFSGroup: TGroupBox; - WriteDebug: TCheckBox; - CreateINF: TCheckBox; - MiscGroup: TGroupBox; - InterleaveGroup: TRadioGroup; - NoTile: TRadioButton; - TextureGroup: TGroupBox; - OKBtnBack: TPanel; - OKButton: TBitBtn; - TileROPi: TRadioButton; + Border2: TImage; + Border3: TImage; + Border4: TImage; + Border5: TImage; + DFSPanel: TPanel; + DFSPanelLabel: TLabel; + Border1: TImage; + InterleavePanel: TPanel; + InterleaveLabel: TLabel; + MiscLabel: TLabel; + MiscPanel: TPanel; + TexturePanelLabel: TLabel; + TexturePanel: TPanel; TilePictureIyonix: TImage; TilePictureROPi: TImage; - TileRO3: TRadioButton; TilePictureRO5: TImage; TilePictureRO4: TImage; - TileRO5: TRadioButton; - TileRO4: TRadioButton; TilePictureRO3: TImage; - TileIyonix: TRadioButton; - CompressUEF: TCheckBox; + NoTile, + TileRO3, + TileRO4, + TileRO5, + TileIyonix, + TileROPi, + ilAuto, + ilSeq, + ilInter, + ilMPX: TGJHRadioBox; + DFSBeyondEdge, + AllowDFSZeroSecs, + AllowDFSBlankFilenames, + CreateINF, + WriteDebug, + CompressUEF, + ScanSubDirs, + OpenDOS: TGJHTickBox; + CancelButton, + OKButton: TGJHButton; + procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormShow(Sender: TObject); procedure TilePictureRO5Click(Sender: TObject); @@ -98,6 +111,161 @@ procedure TSettingsForm.FormPaint(Sender: TObject); MainForm.FileInfoPanelPaint(Sender); end; +{------------------------------------------------------------------------------} +//Create the form +{------------------------------------------------------------------------------} +procedure TSettingsForm.FormCreate(Sender: TObject); +function CreateRadioBox(text: String;prt: TPanel): TGJHRadioBox; +begin + Result:=TGJHRadioBox.Create(prt as TControl); + Result.Parent:=prt as TWinControl; + Result.Visible:=True; + Result.Caption:=text; +end; +function CreateTickBox(text: String;prt: TPanel): TGJHTickBox; +begin + Result:=TGJHTickBox.Create(prt as TControl); + Result.Parent:=prt as TWinControl; + Result.Visible:=True; + Result.Caption:=text; +end; +var + LRefWid: Integer; + ratio : Real; +begin + ratio:=PixelsPerInch/DesignTimePPI; + //Create the texture radio boxes, and move the tiles around + NoTile:=CreateRadioBox('No Tile',TexturePanel); + NoTile.Top:=TexturePanelLabel.Top+TexturePanelLabel.Height+Round(4*ratio); + NoTile.Left:=TilePictureRO3.Left; + TileRO3:=CreateRadioBox('RISC OS 3',TexturePanel); + TileRO4:=CreateRadioBox('RISC OS 4',TexturePanel); + TileRO5:=CreateRadioBox('RISC OS 5',TexturePanel); + TileIyonix:=CreateRadioBox('Iyonix',TexturePanel); + TileROPi:=CreateRadioBox('RISC OS Pi',TexturePanel); + //Move and resize the tiles - borders first + LRefWid:=TileROPi.Width+Round(32*ratio); + Border1.Top:=NoTile.Top+NoTile.Height+Round(4*ratio); + Border1.Width:=LRefWid; + Border1.Height:=LRefWid; + Border1.Left:=NoTile.Left; + Border2.Top:=Border1.Top; + Border2.Width:=LRefWid; + Border2.Height:=LRefWid; + Border2.Left:=Border1.Left+Border1.Width+Round(4*ratio); + Border3.Top:=Border1.Top; + Border3.Width:=LRefWid; + Border3.Height:=LRefWid; + Border3.Left:=Border2.Left+Border2.Width+Round(4*ratio); + Border4.Top:=Border1.Top; + Border4.Width:=LRefWid; + Border4.Height:=LRefWid; + Border4.Left:=Border3.Left+Border3.Width+Round(4*ratio); + Border5.Top:=Border1.Top; + Border5.Width:=LRefWid; + Border5.Height:=LRefWid; + Border5.Left:=Border4.Left+Border4.Width+Round(4*ratio); + TilePictureRO3.Top:=Border1.Top; + TilePictureRO3.Left:=Border1.Left; + TilePictureRO3.Width:=LRefWid; + TilePictureRO3.Height:=LRefWid; + TilePictureRO4.Top:=Border2.Top; + TilePictureRO4.Left:=Border2.Left; + TilePictureRO4.Width:=LRefWid; + TilePictureRO4.Height:=LRefWid; + TilePictureRO5.Top:=Border3.Top; + TilePictureRO5.Left:=Border3.Left; + TilePictureRO5.Width:=LRefWid; + TilePictureRO5.Height:=LRefWid; + TilePictureIyonix.Top:=Border4.Top; + TilePictureIyonix.Left:=Border4.Left; + TilePictureIyonix.Width:=LRefWid; + TilePictureIyonix.Height:=LRefWid; + TilePictureROPi.Top:=Border5.Top; + TilePictureROPi.Left:=Border5.Left; + TilePictureROPi.Width:=LRefWid; + TilePictureROPi.Height:=LRefWid; + //Move the radio boxes around + TileRO3.Top:=TilePictureRO3.Top+TilePictureRO3.Height+Round(4*ratio); + TileRO3.Left:=TilePictureRO3.Left; + TileRO4.Top:=TilePictureRO4.Top+TilePictureRO4.Height+Round(4*ratio); + TileRO4.Left:=TilePictureRO4.Left; + TileRO5.Top:=TilePictureRO5.Top+TilePictureRO5.Height+Round(4*ratio); + TileRO5.Left:=TilePictureRO5.Left; + TileIyonix.Top:=TilePictureIyonix.Top+TilePictureIyonix.Height+Round(4*ratio); + TileIyonix.Left:=TilePictureIyonix.Left; + TileROPi.Top:=TilePictureROPi.Top+TilePictureROPi.Height+Round(4*ratio); + TileROPi.Left:=TilePictureROPi.Left; + TexturePanel.Height:=TileROPi.Top+TileROPi.Height+Round(8*ratio); + //Resize the form and panels to accomodate the above + TexturePanel.ClientWidth:=LRefWid+TileROPi.Left+Round(4*ratio); + SettingsForm.Width:=TexturePanel.Width; + DFSPanel.Width:=SettingsForm.Width div 2; + DFSPanel.Left:=SettingsForm.Width div 2; + InterleavePanel.Left:=0; + InterleavePanel.Width:=SettingsForm.Width div 2; + MiscPanel.Width:=TexturePanel.Width; + //Create the DFS panel tick boxes + DFSBeyondEdge:=CreateTickBox('Allow files goes over disc edge',DFSPanel); + DFSBeyondEdge.Top:=DFSPanelLabel.Top+DFSPanelLabel.Height+Round(4*ratio); + DFSBeyondEdge.Left:=Round(4*ratio); + AllowDFSZeroSecs:=CreateTickBox('Allow zero sectors',DFSPanel); + AllowDFSZeroSecs.Top:=DFSBeyondEdge.Top+DFSBeyondEdge.Height+Round(4*ratio); + AllowDFSZeroSecs.Left:=Round(4*ratio); + AllowDFSBlankFilenames:=CreateTickBox('Allow blank filenames',DFSPanel); + AllowDFSBlankFilenames.Top:=AllowDFSZeroSecs.Top+AllowDFSZeroSecs.Height+Round(4*ratio); + AllowDFSBlankFilenames.Left:=Round(4*ratio); + DFSPanel.Height:=AllowDFSBlankFilenames.Top+AllowDFSBlankFilenames.Height+Round(8*ratio); + //Create the Interleave panel radio boxes + ilAuto:=CreateRadioBox('Automatic (recommended)',InterleavePanel); + ilAuto.Left:=Round(4*ratio); + ilAuto.Top:=InterleaveLabel.Top+InterleaveLabel.Height+Round(4*ratio); + ilSeq:=CreateRadioBox('Sequential (0,1,2,...80,81,82,...)',InterleavePanel); + ilSeq.Left:=Round(4*ratio); + ilSeq.Top:=ilAuto.Top+ilAuto.Height+Round(4*ratio); + ilInter:=CreateRadioBox('Interleaved (0,80,1,81,2,82,...)',InterleavePanel); + ilInter.Left:=Round(4*ratio); + ilInter.Top:=ilSeq.Top+ilSeq.Height+Round(4*ratio); + ilMPX:=CreateRadioBox('Multiplexed (0,2,4,...1,3,5,...)',InterleavePanel); + ilMPX.Left:=Round(4*ratio); + ilMPX.Top:=ilInter.Top+ilInter.Height+Round(4*ratio); + InterleavePanel.Height:=ilMPX.Top+ilMPX.Height+Round(8*ratio); + //Create the Misc panel tick boxes + CreateINF:=CreateTickBox('Create *.inf files on download',MiscPanel); + CreateINF.Top:=MiscLabel.Top+MiscLabel.Height+Round(4*ratio); + CreateINF.Left:=Round(4*ratio); + WriteDebug:=CreateTickBox('Write debugging information',MiscPanel); + WriteDebug.Top:=CreateINF.Top+CreateINF.Height+Round(4*ratio); + WriteDebug.Left:=Round(4*ratio); + CompressUEF:=CreateTickBox('Compress UEF images',MiscPanel); + CompressUEF.Top:=WriteDebug.Top+WriteDebug.Height+Round(4*ratio); + CompressUEF.Left:=Round(4*ratio); + ScanSubDirs:=CreateTickBox('Scan sub-directories on open',MiscPanel); + ScanSubDirs.Top:=CreateINF.Top; + ScanSubDirs.Left:=(MiscPanel.Width div 2)+Round(4*ratio); + OpenDOS:=CreateTickBox('Open DOS partitions on ADFS',MiscPanel); + OpenDOS.Top:=ScanSubDirs.Top+ScanSubDirs.Height+Round(4*ratio); + OpenDOS.Left:=ScanSubDirs.Left; + MiscPanel.Height:=CompressUEF.Top+CompressUEF.Height+Round(8*ratio); + //Move the panels up/down + DFSPanel.Top:=TexturePanel.Top+TexturePanel.Height; + InterleavePanel.Top:=DFSPanel.Top; + MiscPanel.Top:=InterleavePanel.Top+InterleavePanel.Height; + //Create the buttons + OKButton:=MainForm.CreateButton(SettingsForm as TControl, + 'OK',True,0, + MiscPanel.Top+MiscPanel.Height+Round(4*ratio), + mrOK); + OKButton.Left:=Width-OKButton.Width-Round(8*ratio); + CancelButton:=MainForm.CreateButton(SettingsForm as TControl, + 'Cancel',False,0, + OKButton.Top+Round(4*ratio), + mrCancel); + CancelButton.Left:=OKButton.Left-CancelButton.Width-Round(8*ratio); + //Resize the form + SettingsForm.Height:=OKButton.Top+OKButton.Height+Round(8*ratio); +end; + {------------------------------------------------------------------------------} //User has clicked on a picture rather than the radio button {------------------------------------------------------------------------------} @@ -105,11 +273,16 @@ procedure TSettingsForm.TilePictureRO5Click(Sender: TObject); begin if Sender is TImage then begin - if TImage(Sender)=TilePictureRO3 then TileRO3.Checked:=True; - if TImage(Sender)=TilePictureRO4 then TileRO4.Checked:=True; - if TImage(Sender)=TilePictureRO5 then TileRO5.Checked:=True; - if TImage(Sender)=TilePictureIyonix then TileIyonix.Checked:=True; - if TImage(Sender)=TilePictureROPi then TileROPi.Checked:=True; + if(TImage(Sender)=TilePictureRO3) + or(TImage(Sender)=Border1) then TileRO3.Ticked:=True; + if(TImage(Sender)=TilePictureRO4) + or(TImage(Sender)=Border2) then TileRO4.Ticked:=True; + if(TImage(Sender)=TilePictureRO5) + or(TImage(Sender)=Border3) then TileRO5.Ticked:=True; + if(TImage(Sender)=TilePictureIyonix) + or(TImage(Sender)=Border4) then TileIyonix.Ticked:=True; + if(TImage(Sender)=TilePictureROPi) + or(TImage(Sender)=Border5) then TileROPi.Ticked:=True; end; end; diff --git a/README.md b/README.md index b399c1a..cf03640 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ For images in HFE format, I recommend you use UEF Reader. The results of this project paved the way for UEF files to be read by Disc Image Manager.

-In order to compile Disc Image Manager, you will require the TSpriteFile class (specifically the files SpriteFile.pas and SpriteFilePalettes.pas).
+In order to compile Disc Image Manager, you will require the TSpriteFile class (specifically the files SpriteFile.pas and SpriteFilePalettes.pas), and the TGJHCustomComponents class (specifically the files GJHCustomComponents.pas, ButtonGraphics.pas, PointerGraphics.pas, RadioBoxGraphics.pas and TickBoxGraphics.pas).

Project was written in Lazarus. Binaries are available for macOS 32 bit, 64 bit and ARM, Windows 32 and 64 bit, Linux 32 and 64 bit, and Raspbian 32 bit (Linux ARM 32 bit). Full source is available if you wish to compile for other systems.

diff --git a/binaries/Linux/Disc Image Manager 32 bit.zip b/binaries/Linux/Disc Image Manager 32 bit.zip index 8cdb840..320de67 100644 Binary files a/binaries/Linux/Disc Image Manager 32 bit.zip and b/binaries/Linux/Disc Image Manager 32 bit.zip differ diff --git a/binaries/Linux/Disc Image Manager ARM 32 bit.zip b/binaries/Linux/Disc Image Manager ARM 32 bit.zip index b064c45..0f475bb 100644 Binary files a/binaries/Linux/Disc Image Manager ARM 32 bit.zip and b/binaries/Linux/Disc Image Manager ARM 32 bit.zip differ diff --git a/binaries/Linux/Disc Image Manager.zip b/binaries/Linux/Disc Image Manager.zip index 5d4d070..20f3bab 100644 Binary files a/binaries/Linux/Disc Image Manager.zip and b/binaries/Linux/Disc Image Manager.zip differ diff --git a/binaries/Windows/Disc Image Manager 32 bit.zip b/binaries/Windows/Disc Image Manager 32 bit.zip index c722f3d..617850c 100644 Binary files a/binaries/Windows/Disc Image Manager 32 bit.zip and b/binaries/Windows/Disc Image Manager 32 bit.zip differ diff --git a/binaries/Windows/Disc Image Manager.zip b/binaries/Windows/Disc Image Manager.zip index 95eb0e4..96eda40 100644 Binary files a/binaries/Windows/Disc Image Manager.zip and b/binaries/Windows/Disc Image Manager.zip differ diff --git a/binaries/macOS/Disc Image Manager 32 bit.dmg b/binaries/macOS/Disc Image Manager 32 bit.dmg index d983234..cd4a0e4 100644 Binary files a/binaries/macOS/Disc Image Manager 32 bit.dmg and b/binaries/macOS/Disc Image Manager 32 bit.dmg differ diff --git a/binaries/macOS/Disc Image Manager ARM.dmg b/binaries/macOS/Disc Image Manager ARM.dmg index d3fd69a..3955768 100644 Binary files a/binaries/macOS/Disc Image Manager ARM.dmg and b/binaries/macOS/Disc Image Manager ARM.dmg differ diff --git a/binaries/macOS/Disc Image Manager.dmg b/binaries/macOS/Disc Image Manager.dmg index 45f9fa0..12b162e 100644 Binary files a/binaries/macOS/Disc Image Manager.dmg and b/binaries/macOS/Disc Image Manager.dmg differ