Sudoku: DigitSetEditor:

- disallow setting values that are not in original DigitsPPossible set
- disallow clearing the set entirely


git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7250 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
lazarus-bart
2020-01-08 12:08:49 +00:00
parent 21c87d8266
commit b24bcfec2b
3 changed files with 47 additions and 12 deletions

View File

@ -20,8 +20,10 @@ object DigitSetEditorForm: TDigitSetEditorForm
AutoFill = True
Caption = 'Digits'
ChildSizing.LeftRightSpacing = 6
ChildSizing.TopBottomSpacing = 6
ChildSizing.VerticalSpacing = 6
ChildSizing.EnlargeHorizontal = crsScaleChilds
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
@ -40,6 +42,7 @@ object DigitSetEditorForm: TDigitSetEditorForm
'8'
'9'
)
OnItemClick = DigitCGItemClick
ParentBiDiMode = False
TabOrder = 0
Data = {

View File

@ -15,17 +15,22 @@ type
TDigitSetEditorForm = class(TForm)
btnOK: TButton;
DigitCG: TCheckGroup;
procedure DigitCGItemClick(Sender: TObject; {%H-}Index: integer);
procedure FormActivate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: char);
procedure FormShow(Sender: TObject);
private
FPreferredRight: Integer;
function GetDigitSet: TDigitSet;
procedure SetDigitSet(ASet: TDigitSet);
FOriginalDigitsPossible: TDigitSet;
function GetCurrentDigitSet: TDigitSet;
procedure SetCurrentDigitSet(ASet: TDigitSet);
procedure SetOriginalDigitsPossible(ASet: TDigitSet);
procedure SetRight({%H-}Data: PtrInt);
procedure UpdateButtonState;
public
property DigitSet: TDigitSet read GetDigitSet write SetDigitSet;
property CurrentDigitSet: TDigitSet read GetCurrentDigitSet write SetCurrentDigitSet;
property OriginalDigitsPossible: TDigitSet read FOriginalDigitsPossible write SetOriginalDigitsPossible; //set this before CurrentDigitSet!
property PreferredRight: Integer read FPreferredRight write FPreferredRight;
end;
@ -45,8 +50,10 @@ begin
if (Key in ['1'..'9']) then
begin
Digit := Ord(Key) - Ord('0');
DigitCG.Checked[Pred(Digit)] := not DigitCG.Checked[Pred(Digit)];
if Digit in FOriginalDigitsPossible then
DigitCG.Checked[Pred(Digit)] := not DigitCG.Checked[Pred(Digit)];
Key := #0;
UpdateButtonState;
end;
if (Key = #27) then //escape
begin
@ -67,22 +74,41 @@ begin
ClientHeight := btnOK.Top + btnOK.Height + DigitCG.Top;
end;
function TDigitSetEditorForm.GetDigitSet: TDigitSet;
procedure TDigitSetEditorForm.DigitCGItemClick(Sender: TObject; Index: integer);
begin
UpdateButtonState;
end;
function TDigitSetEditorForm.GetCurrentDigitSet: TDigitSet;
var
i: Integer;
begin
Result := [];
for i := 0 to DigitCG.Items.Count - 1 do
if DigitCG.Checked[i] then Include(Result, Succ(i));
if DigitCG.Checked[i] and (Succ(i) in FOriginalDigitsPossible)then Include(Result, Succ(i));
end;
procedure TDigitSetEditorForm.SetDigitSet(ASet: TDigitSet);
procedure TDigitSetEditorForm.SetCurrentDigitSet(ASet: TDigitSet);
var
D: TDigits;
begin
for D in TDigits do
begin
DigitCG.Checked[D-1] := (D in ASet); //don't use Pred(D) here, gives RangeCheckError when D=1
DigitCG.Checked[D-1] := (D in ASet) and DigitCG.CheckEnabled[D-1]; //don't use Pred(D) here, gives RangeCheckError when D=1
end;
end;
procedure TDigitSetEditorForm.SetOriginalDigitsPossible(ASet: TDigitSet);
var
D: TDigits;
begin
if FOriginalDigitsPossible = ASet then Exit;
FOriginalDigitsPossible := ASet;
for D in TDigits do
begin
DigitCG.CheckEnabled[D-1] := (D in ASet); //don't use Pred(D) here, gives RangeCheckError when D=1
end;
end;
@ -91,5 +117,10 @@ begin
Left := FPreferredRight - Width;
end;
procedure TDigitSetEditorForm.UpdateButtonState;
begin
btnOk.Enabled := (GetCurrentDigitSet <> []);
end;
end.

View File

@ -226,16 +226,17 @@ end;
procedure TScratchForm.EditCell(ACol, ARow: Integer);
var
S: String;
DigitSet: TDigitSet;
CurrentDigitSet: TDigitSet;
begin
S := ScratchGrid.Cells[ACol, ARow];
DigitSet := StrToDigitSet(S);
DigitSetEditorForm.DigitSet := DigitSet;
CurrentDigitSet := StrToDigitSet(S);
DigitSetEditorForm.OriginalDigitsPossible := FRawData[ACol+1,ARow+1].DigitsPossible; //always set this first
DigitSetEditorForm.CurrentDigitSet := CurrentDigitSet;
DigitSetEditorForm.Top := Top;
DigitSetEditorForm.PreferredRight := Left;
if (DigitSetEditorForm.ShowModal = mrOK) then
begin
S := DigitSetToStr(DigitSetEditorForm.DigitSet);
S := DigitSetToStr(DigitSetEditorForm.CurrentDigitSet);
ScratchGrid.Cells[ACol, ARow] := S;
end;
end;