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