diff --git a/applications/sudoku/digitseteditor.lfm b/applications/sudoku/digitseteditor.lfm index ee2930d41..efeba7dea 100644 --- a/applications/sudoku/digitseteditor.lfm +++ b/applications/sudoku/digitseteditor.lfm @@ -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 = { diff --git a/applications/sudoku/digitseteditor.pas b/applications/sudoku/digitseteditor.pas index f009d6209..c86d9955a 100644 --- a/applications/sudoku/digitseteditor.pas +++ b/applications/sudoku/digitseteditor.pas @@ -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. diff --git a/applications/sudoku/scratchpad.pas b/applications/sudoku/scratchpad.pas index f3512e18f..f7e413940 100644 --- a/applications/sudoku/scratchpad.pas +++ b/applications/sudoku/scratchpad.pas @@ -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;