You've already forked lazarus-ccr
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:
@ -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 = {
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user