📄 main.pas
字号:
if Chessboard1.Undo then
begin
if Chessboard1.Turn = 1 then
lblTurn.Caption := 'WHITE to move'
else
lblTurn.Caption := 'BLACK to move';
lblCheck.Visible := Chessboard1.Check;
end;
UpdateUndoRedo;
end;
end;
procedure TfrmMain.mnuRedo1Click(Sender: TObject);
begin
if Chessboard1.RedoPossible then
begin
Chessboard1.Redo;
UpdateUndoRedo;
end;
end;
procedure TfrmMain.mnuUseRed1Click(Sender: TObject);
begin
bgndFancy.ChangeRColour := not bgndFancy.ChangeRColour;
mnuUseRed1.Checked := bgndFancy.ChangeRColour;
mnuUseRed2.Checked := mnuUseRed1.Checked;
end;
procedure TfrmMain.mnuUseGreen1Click(Sender: TObject);
begin
bgndFancy.ChangeGColour := not bgndFancy.ChangeGColour;
mnuUseGreen1.Checked := bgndFancy.ChangeGColour;
mnuUseGreen2.Checked := mnuUseGreen1.Checked;
end;
procedure TfrmMain.mnuUseBlue1Click(Sender: TObject);
begin
bgndFancy.ChangeBColour := not bgndFancy.ChangeBColour;
mnuUseBlue1.Checked := bgndFancy.ChangeBColour;
mnuUseBlue2.Checked := mnuUseBlue1.Checked;
end;
procedure TfrmMain.mnuShowTextCaptions1Click(Sender: TObject);
begin
mnuShowTextCaptions1.Checked := not mnuShowTextCaptions1.Checked;
tlbMain.ShowCaptions := mnuShowTextCaptions1.Checked;
end;
procedure TfrmMain.mnuShowHints1Click(Sender: TObject);
begin
mnuShowHints1.Checked := not mnuShowHints1.Checked;
tlbMain.ShowHint := mnuShowHints1.Checked;
end;
procedure TfrmMain.mnuLeftRight1Click(Sender: TObject);
begin
// TODO make the following more succinct
case TMenuItem(Sender).Tag of
0: begin
mnuLeftRight1.Checked := True;
mnuLeftRight2.Checked := True;
end;
1: begin
mnuRightLeft1.Checked := True;
mnuRightLeft2.Checked := True;
end;
2: begin
mnuUpDown1.Checked := True;
mnuUpDown1.Checked := True;
end;
3: begin
mnuDownUp1.Checked := True;
mnuDownUp2.Checked := True;
end;
end;
bgndFancy.Direction := TFillDirection(TMenuItem(Sender).Tag);
end;
procedure TfrmMain.FormResize(Sender: TObject);
begin
bgndFancy.ForceRedraw;
if Color <> Chessboard1.BackgroundColour then
Color := Chessboard1.BackgroundColour;
end;
procedure TfrmMain.mnuViewCapturedPieces1Click(Sender: TObject);
begin
frmCapturedPieces := TfrmCapturedPieces.Create(Application);
try
if Chessboard1.TimeLimitEnabled then PauseGame;
frmCapturedPieces.ShowModal;
finally
if Chessboard1.TimeLimitEnabled then UnpauseGame;
frmCapturedPieces.Free;
end;
end;
procedure TfrmMain.mnuAnalysePosition1Click(Sender: TObject);
begin
MessageDlg('THIS IS STILL TO BE IMPLEMENTED!', mtInformation, [mbOK], 0);
end;
procedure TfrmMain.mnuHighlightSquares1Click(Sender: TObject);
begin
mnuHighlightSquares1.Checked := not mnuHighlightSquares1.Checked;
mnuHighlightSquares2.Checked := mnuHighlightSquares1.Checked;
Chessboard1.ShowSquareHighlights := mnuHighlightSquares1.Checked;
end;
procedure TfrmMain.mnuSelectPieceFilter1Click(Sender: TObject);
begin
frmPieceFilter := TfrmPieceFilter.Create(Application);
with frmPieceFilter do
try
if Chessboard1.TimeLimitEnabled then PauseGame;
cmbFilters.ItemIndex := cmbFilters.Items.IndexOf(Chessboard1.PieceFilter);
chkEnableFilter.Checked := Chessboard1.SmoothPieces;
ShowModal;
finally
if ModalResult = mrOK then
begin
Chessboard1.PieceFilter := cmbFilters.Items[cmbFilters.ItemIndex];
if mnuFilterPieces1.Checked <> chkEnableFilter.Checked then
mnuFilterPieces1Click(Self);
end;
if Chessboard1.TimeLimitEnabled then UnpauseGame;
Free;
end;
end;
procedure TfrmMain.PauseGame;
begin
if Chessboard1.GameRunning then
begin
if PauseGameOnDialogue then
Chessboard1.Pause;
Chessboard1.Hide;
memMoveList.Font.Color := clWhite;
end;
end;
procedure TfrmMain.UnpauseGame;
begin
if Chessboard1.GameRunning then
begin
Chessboard1.Show;
memMoveList.Font.Color := clBlack;
if PauseGameOnDialogue then
Chessboard1.Unpause;
end;
end;
procedure TfrmMain.mnuHighlightDragStartSquare1Click(Sender: TObject);
begin
mnuHighlightDragStartSquare1.Checked := not mnuHighlightDragStartSquare1.Checked;
Chessboard1.HighlightStartSquare := mnuHighlightDragStartSquare1.Checked;
end;
procedure TfrmMain.mnuResetBoardOnGameEnd1Click(Sender: TObject);
begin
mnuResetBoardOnGameEnd1.Checked := not mnuResetBoardOnGameEnd1.Checked;
ResetBoardOnGameEnd := mnuResetBoardOnGameEnd1.Checked;
end;
procedure TfrmMain.mnuContinueLastGameOnStartup1Click(Sender: TObject);
begin
mnuContinueLastGameOnStartup1.Checked := not mnuContinueLastGameOnStartup1.Checked;
SaveOnExit := mnuContinueLastGameOnStartup1.Checked;
end;
procedure TfrmMain.mnuGame1Click(Sender: TObject);
begin
mnuShowTimeLeft1.Enabled := mnuTimeLimitEnabled1.Checked and (Chessboard1.GameRunning);
end;
procedure TfrmMain.mnuPauseGame1Click(Sender: TObject);
begin
mnuPauseGame1.Checked := not mnuPauseGame1.Checked;
PauseGameOnDialogue := mnuPauseGame1.Checked;
end;
procedure TfrmMain.ShowOptionsScreen(Sender: TObject);
begin
// frmOptionsPreview := TfrmOptionsPreview.Create(Application);
try
with frmOptions do
begin
SetBackgroundColour(Chessboard1.BackgroundColour);
SetGridLinesColour(Chessboard1.GridLineColour);
SetBlackSquaresColour(Chessboard1.BlackSquareColour);
SetWhiteSquaresColour(Chessboard1.WhiteSquareColour);
SetCurrentDragColour(Chessboard1.ValidMoveDragColour);
SetStartSquareColour(Chessboard1.StartDragColour);
SetCaptureColour(Chessboard1.HighlightCaptureColour);
SetInvalidMoveColour(Chessboard1.HighlightEnemyColour);
SetValidMoveColour(Chessboard1.HighlightColour);
chkEnableHighlighting.Checked := Chessboard1.ShowSquareHighlights;
chkHighlightStartDragSquare.Checked := Chessboard1.HighlightStartSquare;
chkShowValidMoves.Checked := Chessboard1.ShowValidMovesMode;
chkContinueLastGame.Checked := SaveOnExit;
chkShowPieceHints.Checked := Chessboard1.ShowPieceHints;
chkDrawGridLines.Checked := Chessboard1.DrawLines;
chkResetBoardOnGameEnd.Checked := ResetBoardOnGameEnd;
chkUseRed.Checked := bgndFancy.ChangeRColour;
chkUseGreen.Checked := bgndFancy.ChangeGColour;
chkUseBlue.Checked := bgndFancy.ChangeBColour;
rgpBackgroundDirection.ItemIndex := Ord(bgndFancy.Direction);
chkEnableTimeLimit.Checked := Chessboard1.TimeLimitEnabled;
speTimeLimit.Value := Chessboard1.TimeLimit div 60;
chkPauseGame.Checked := PauseGameOnDialogue;
chkEnableTimeLimit.Enabled := not Chessboard1.GameRunning;
speTimeLimit.Enabled := not Chessboard1.GameRunning;
chkPauseGame.Enabled := not Chessboard1.GameRunning;
lblUncheckResetBoard.Visible := Chessboard1.GameRunning and
ResetBoardOnGameEnd;
lblTimeNote.Visible := Chessboard1.GameRunning;
end;
Hide;
frmOptions.ShowModal;
finally
// frmOptionsPreview.Free;
if frmOptions.ModalResult = mrOK then
with frmOptions do
begin
Chessboard1.BackgroundColour := pnlBackgroundColour.Color;
Chessboard1.GridLineColour := pnlGridLinesColour.Color;
Chessboard1.BlackSquareColour := pnlBlackSquaresColour.Color;
Chessboard1.WhiteSquareColour := pnlWhiteSquaresColour.Color;
Chessboard1.ValidMoveDragColour := pnlCurrentDragColour.Color;
Chessboard1.StartDragColour := pnlStartSquareColour.Color;
Chessboard1.HighlightCaptureColour := pnlCaptureColour.Color;
Chessboard1.HighlightEnemyColour := pnlInvalidMoveColour.Color;
Chessboard1.HighlightColour := pnlValidMoveColour.Color;
if chkEnableHighlighting.Checked <> Chessboard1.ShowSquareHighlights then
mnuHighlightSquares1Click(Self);
if chkHighlightStartDragSquare.Checked <> Chessboard1.HighlightStartSquare then
mnuHighlightDragStartSquare1Click(Self);
if chkShowValidMoves.Checked <> Chessboard1.ShowValidMovesMode then
mnuShowValidMoves1Click(Self);
if mnuContinueLastGameOnStartup1.Checked <> chkContinueLastGame.Checked then
mnuContinueLastGameOnStartup1Click(Self);
Chessboard1.ShowPieceHints := chkShowPieceHints.Checked;
mnuShowPieceHints1.Checked := Chessboard1.ShowPieceHints;
if not Chessboard1.ShowPieceHints then Chessboard1.Hint := '';
if mnuDrawGridLines1.Checked <> chkDrawGridLines.Checked then
mnuDrawGridLines1Click(Self);
if mnuResetBoardOnGameEnd1.Checked <> chkResetBoardOnGameEnd.Checked then
mnuResetBoardOnGameEnd1Click(Self);
// Change the panel background colours
if mnuUseRed1.Checked <> chkUseRed.Checked then
mnuUseRed1Click(Self);
if mnuUseGreen1.Checked <> chkUseGreen.Checked then
mnuUseGreen1Click(Self);
if mnuUseBlue1.Checked <> chkUseBlue.Checked then
mnuUseBlue1Click(Self);
case rgpBackgroundDirection.ItemIndex of
0: mnuLeftRight1Click( mnuLeftRight1);
1: mnuLeftRight1Click( mnuRightLeft1);
2: mnuLeftRight1Click( mnuUpDown1);
3: mnuLeftRight1Click( mnuDownUp1);
end;
if not Chessboard1.GameRunning then
begin
Chessboard1.TimeLimitEnabled := chkEnableTimeLimit.Checked;
mnuTimeLimitEnabled1.Checked := Chessboard1.TimeLimitEnabled;
Chessboard1.TimeLimit := speTimeLimit.Value * 60;
if mnuPauseGame1.Checked <> chkPauseGame.Checked then
mnuPauseGame1Click(Self);
end;
end;
Show;
end;
end;
procedure TfrmMain.mnuShowPieceHints1Click(Sender: TObject);
begin
mnuShowPieceHints1.Checked := not mnuShowPieceHints1.Checked;
Chessboard1.ShowPieceHints := mnuShowPieceHints1.Checked;
if not Chessboard1.ShowPieceHints then Chessboard1.Hint := '';
end;
procedure TfrmMain.Chessboard1PositionMove(MovedColour: TColour; const From,
WhereTo: TPoint);
begin
UpdateUndoRedo;
if Chessboard1.RedoPossible then
begin
if RedoStrings.Count > 0 then
RedoStrings.Delete(RedoStrings.Count - 1);
end;
memMoveList.Lines.Add(Format('POSITION: [%d,%d] to [%d,%d]', [From.X,
From.Y, WhereTo.X, WhereTo.Y]));
end;
procedure TfrmMain.mnuFile1Click(Sender: TObject);
var
iter: Integer;
CurrMenu: TMenuItem;
MenuName: String;
begin
for iter := 0 to ComponentCount - 1 do
if (Components[iter] is TMenuItem) then
begin
CurrMenu := (Components[iter] as TMenuItem);
MenuName := CurrMenu.Name;
Delete(MenuName, Length(MenuName), 1);
if Lowercase(MenuName) = 'mnufilehistory' then
begin
CurrMenu.Caption := FileHistory[CurrMenu.Tag];
CurrMenu.Visible := CurrMenu.Caption <> '(Empty)';
end;
end;
mnuN1.Visible := mnuFileHistory1.Visible;
end;
procedure TfrmMain.mnuFileHistory1Click(Sender: TObject);
begin
LoadGame((Sender as TMenuItem).Caption);
end;
procedure TfrmMain.AddToFileHistory(const Filename: String);
var
iter,
iter2: Integer;
FindStr: String;
begin
// First, check to see if the name is already in the list.
FindStr := Lowercase(Filename);
for iter := 0 to High(FileHistory) do
if FindStr = Lowercase(FileHistory[iter]) then
begin
if iter = 0 then Exit; // no more work to be done - it's first item in list
if iter <> High(FileHistory) then
for iter2 := iter to High(FileHistory) - 1 do
FileHistory[iter] := FileHistory[iter + 1];
Break;
end;
for iter := High(FileHistory) downto 1 do
FileHistory[iter] := FileHistory[iter - 1];
FileHistory[0] := Filename;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -