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
|
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 = {
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
Reference in New Issue
Block a user