unit unitFrmPgnDatabase;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, Grids, Menus, Types;
type
{ TfrmPGNDatabase }
TfrmPGNDatabase = class(TForm)
mniLoadGame: TMenuItem;
pnlDatabase: TPanel;
gridPGNDatabase: TStringGrid;
pmnPGNDatabase: TPopupMenu;
procedure gridPGNDatabaseClick(Sender: TObject);
procedure gridPGNDatabaseDblClick(Sender: TObject);
procedure gridPGNDatabaseDrawCell(Sender: TObject; aCol, aRow: Integer;
aRect: TRect; aState: TGridDrawState);
procedure gridPGNDatabaseMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure gridPGNDatabasePrepareCanvas(Sender: TObject; aCol,
aRow: Integer; aState: TGridDrawState);
procedure gridPGNDatabaseSelectCell(Sender: TObject; aCol, aRow: Integer;
var CanSelect: Boolean);
procedure gridPGNDatabaseSelection(Sender: TObject; aCol, aRow: Integer);
procedure mniLoadGameClick(Sender: TObject);
private
public
end;
var
frmPGNDatabase: TfrmPGNDatabase;
My_Grid_Highlight_BackGround_Color:Tcolor=ClGreen;
My_Grid_Highlight_Font_Color:Tcolor=clYellow;
My_Grid_Highlight_Font_Multiplier:Real=1.5; // FOnt Multiplier for selected row
LastRow : Integer;
implementation
uses
MainUnit, GraphUtil, LCLIntf;
{$R *.lfm}
{ TfrmPGNDatabase }
procedure TfrmPGNDatabase.gridPGNDatabaseDblClick(Sender: TObject);
begin
ShowMessage(IntToStr(gridPGNDatabase.Row));
if LastRow <> -1 then
begin
gridPGNDatabase.Row := LastRow;
MainForm.FGame.ChessNotation.PGNString := gridPGNDatabase.Rows[gridPGNDatabase.Row].Strings[1] + ' ' + gridPGNDatabase.Rows[gridPGNDatabase.Row].Strings[2];
end;
end;
procedure TfrmPGNDatabase.gridPGNDatabaseClick(Sender: TObject);
begin
if LastRow <> -1 then
begin
gridPGNDatabase.Row := LastRow;
end;
end;
procedure TfrmPGNDatabase.gridPGNDatabaseDrawCell(Sender: TObject; aCol,
aRow: Integer; aRect: TRect; aState: TGridDrawState);
begin
If Sender is TStringGrid then
begin
With (sender as TStringGrid) Do
Begin
Canvas.Brush.Style := bsSolid;
canvas.Font.Color:=clWhite;
if arow=row then // Selected Row
begin
FocusColor:=My_Grid_Highlight_BackGround_Color;
Canvas.Brush.Color:=My_Grid_Highlight_BackGround_Color;
canvas.Font.Color:=My_Grid_Highlight_Font_Color;
canvas.Font.Size:=round(font.Size*My_Grid_Highlight_Font_Multiplier);
end
else
begin
canvas.Font.Color:=font.Color;
Canvas.Brush.Color:=color;
canvas.Font.Size:=font.Size;
end;
defaultdrawcell(Acol, Arow, arect, astate);
end;
end;
end;
procedure TfrmPGNDatabase.gridPGNDatabaseMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
R, C: Integer;
Start, Size: Integer;
i: Integer;
begin
// Row
R := -1;
Start := 0;
for i := 0 to gridPGNDatabase.RowCount-1 do
begin
Size := gridPGNDatabase.RowHeights[i];
if (Y > Start) and (Y < Start + Size) then
begin
R := i;
Break;
end;
Inc(Start, Size);
end;
// Column
C := -1;
Start := 0;
for i := 0 to gridPGNDatabase.ColCount-1 do
begin
Size := gridPGNDatabase.ColWidths[i];
if (X > Start) and (X < Start + Size) then
begin
C := i;
Break;
end;
Inc(Start, Size);
end;
// Show result
//Caption := 'Mouse X:Y = ' + X.ToString + ':' + Y.ToString;
case (R < 0) or (C < 0) of
True: LastRow := -1;
False: LastRow := R;
end;
gridPGNDatabase.Invalidate();
end;
procedure TfrmPGNDatabase.gridPGNDatabasePrepareCanvas(Sender: TObject; aCol,
aRow: Integer; aState: TGridDrawState);
var
P: TPoint;
c, r: LongInt;
obe: Boolean;
begin
P := gridPGNDatabase.ScreenToClient(Mouse.CursorPos);
if (aState = []) or (gdFixed in aState) then
begin
obe := gridPGNDatabase.AllowOutBoundEvents;
gridPGNDatabase.AllowOutBoundEvents := false;
gridPGNDatabase.MouseToCell(P.X, P.Y, c, r);
gridPGNDatabase.AllowOutBoundEvents := obe;
if (aRow = r) and (aRow >= gridPGNDatabase.FixedRows) then
begin
if aState = [] then
gridPGNDatabase.Canvas.Brush.Color := rgb(232, 232, 232)
else
gridPGNDatabase.Canvas.Brush.Color := GetShadowColor(ColorToRGB(gridPGNDatabase.FixedColor), -20);
end;
end;
end;
procedure TfrmPGNDatabase.gridPGNDatabaseSelectCell(Sender: TObject; aCol,
aRow: Integer; var CanSelect: Boolean);
begin
end;
procedure TfrmPGNDatabase.gridPGNDatabaseSelection(Sender: TObject; aCol,
aRow: Integer);
begin
end;
procedure TfrmPGNDatabase.mniLoadGameClick(Sender: TObject);
begin
if LastRow <> -1 then
begin
gridPGNDatabase.Row := LastRow;
gridPGNDatabase.Invalidate();
MainForm.FGame.ChessNotation.PGNString := gridPGNDatabase.Rows[LastRow].Strings[1] + ' ' + gridPGNDatabase.Rows[LastRow].Strings[2];
while (not MainForm.FGame.ChessNotation.Iterator.IsFirst) do
begin
MainForm.FGame.ChessNotation.Iterator.PrevMove();
end;
end;
end;
{ TfrmPGNDatabase }
end.