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

View File

@ -15,17 +15,22 @@ type
TDigitSetEditorForm = class(TForm) TDigitSetEditorForm = class(TForm)
btnOK: TButton; btnOK: TButton;
DigitCG: TCheckGroup; DigitCG: TCheckGroup;
procedure DigitCGItemClick(Sender: TObject; {%H-}Index: integer);
procedure FormActivate(Sender: TObject); procedure FormActivate(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: char); procedure FormKeyPress(Sender: TObject; var Key: char);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
private private
FPreferredRight: Integer; FPreferredRight: Integer;
function GetDigitSet: TDigitSet; FOriginalDigitsPossible: TDigitSet;
procedure SetDigitSet(ASet: TDigitSet); function GetCurrentDigitSet: TDigitSet;
procedure SetCurrentDigitSet(ASet: TDigitSet);
procedure SetOriginalDigitsPossible(ASet: TDigitSet);
procedure SetRight({%H-}Data: PtrInt); procedure SetRight({%H-}Data: PtrInt);
procedure UpdateButtonState;
public 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; property PreferredRight: Integer read FPreferredRight write FPreferredRight;
end; end;
@ -45,8 +50,10 @@ begin
if (Key in ['1'..'9']) then if (Key in ['1'..'9']) then
begin begin
Digit := Ord(Key) - Ord('0'); 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; Key := #0;
UpdateButtonState;
end; end;
if (Key = #27) then //escape if (Key = #27) then //escape
begin begin
@ -67,22 +74,41 @@ begin
ClientHeight := btnOK.Top + btnOK.Height + DigitCG.Top; ClientHeight := btnOK.Top + btnOK.Height + DigitCG.Top;
end; end;
function TDigitSetEditorForm.GetDigitSet: TDigitSet;
procedure TDigitSetEditorForm.DigitCGItemClick(Sender: TObject; Index: integer);
begin
UpdateButtonState;
end;
function TDigitSetEditorForm.GetCurrentDigitSet: TDigitSet;
var var
i: Integer; i: Integer;
begin begin
Result := []; Result := [];
for i := 0 to DigitCG.Items.Count - 1 do 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; end;
procedure TDigitSetEditorForm.SetDigitSet(ASet: TDigitSet); procedure TDigitSetEditorForm.SetCurrentDigitSet(ASet: TDigitSet);
var var
D: TDigits; D: TDigits;
begin begin
for D in TDigits do for D in TDigits do
begin 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;
end; end;
@ -91,5 +117,10 @@ begin
Left := FPreferredRight - Width; Left := FPreferredRight - Width;
end; end;
procedure TDigitSetEditorForm.UpdateButtonState;
begin
btnOk.Enabled := (GetCurrentDigitSet <> []);
end;
end. end.

View File

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