From e1d784ff8a75b5d9153ba9b9667f41c500dec71e Mon Sep 17 00:00:00 2001 From: lazarus-bart Date: Sat, 4 Jan 2020 17:19:07 +0000 Subject: [PATCH] Sudoku: restrict user input in grid. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7228 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- applications/sudoku/sudokumain.lfm | 1 + applications/sudoku/sudokumain.pas | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/applications/sudoku/sudokumain.lfm b/applications/sudoku/sudokumain.lfm index 6de0ea146..b0a36bc6f 100644 --- a/applications/sudoku/sudokumain.lfm +++ b/applications/sudoku/sudokumain.lfm @@ -27,6 +27,7 @@ object Form1: TForm1 ScrollBars = ssNone TabOrder = 2 OnPrepareCanvas = SGridPrepareCanvas + OnSelectEditor = SGridSelectEditor OnSetEditText = SGridSetEditText end object ButtonFill: TButton diff --git a/applications/sudoku/sudokumain.pas b/applications/sudoku/sudokumain.pas index 188dd6fba..39212b6ef 100644 --- a/applications/sudoku/sudokumain.pas +++ b/applications/sudoku/sudokumain.pas @@ -43,9 +43,12 @@ type SGrid: TStringGrid; procedure ButtonFillClick(Sender: TObject); procedure ButtonSolveClick(Sender: TObject); + procedure EditorKeyPress(Sender: TObject; var Key: char); procedure FormActivate(Sender: TObject); procedure SGridPrepareCanvas(sender: TObject; aCol, aRow: Integer; {%H-}aState: TGridDrawState); + procedure SGridSelectEditor(Sender: TObject; {%H-}aCol, {%H-}aRow: Integer; + var Editor: TWinControl); procedure SGridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); private @@ -84,6 +87,19 @@ begin ShowSolution; end; +procedure TForm1.EditorKeyPress(Sender: TObject; var Key: char); +var + Ed: TStringCellEditor; +begin + if (Sender is TStringCellEditor) then + begin + Ed := TStringCellEditor(Sender); + Ed.SelectAll; //Key will now overwrite selection, in effect allowing to enter only 1 key + if not (Key in [#8, '1'..'9']) then Key := #0; + end; +end; + + procedure TForm1.FormActivate(Sender: TObject); begin Self.OnActivate := nil; @@ -92,6 +108,7 @@ begin ClientWidth := 2 * SGrid.Left + SGrid.Width; end; + procedure TForm1.SGridPrepareCanvas(sender: TObject; aCol, aRow: Integer; aState: TGridDrawState); var @@ -116,6 +133,18 @@ begin (Sender as TStringGrid).Canvas.Brush.Color := $00EEEEEE; end; +procedure TForm1.SGridSelectEditor(Sender: TObject; aCol, aRow: Integer; + var Editor: TWinControl); +var + Ed: TStringCellEditor; +begin + if Editor is TStringCellEditor then + begin + Ed := TStringCellEditor(Editor); + Ed.OnKeyPress := @EditorKeyPress; + end; +end; + procedure TForm1.SGridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); begin @@ -153,6 +182,7 @@ begin ShowMessage(Format('Unable to completely solve sudoku (tried %d steps).',[Steps])); end; + procedure TForm1.ShowSolution; var Col, Row: Integer;