unit main;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Graphics, Dialogs, Grids, ComCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    grid: TStringGrid;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    ToolBar1: TToolBar;
    SaveButton: TToolButton;
    LoadButton: TToolButton;
    procedure gridBeforeSelection(Sender: TObject; aCol, aRow: Integer);
    procedure gridDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect;
      aState: TGridDrawState);
    procedure gridPrepareCanvas(sender: TObject; aCol, aRow: Integer;
      aState: TGridDrawState);
    procedure LoadButtonClick(Sender: TObject);
    procedure SaveButtonClick(Sender: TObject);
  private
    function IndexToAlphaIndex(AIndex: Integer): string;
  public

  end; 

var
  Form1: TForm1; 

implementation

{$R main.lfm}

{ TForm1 }

procedure TForm1.gridBeforeSelection(Sender: TObject; aCol, aRow: Integer);
begin

  if Grid.Col<>aCol then
  begin
    grid.InvalidateCell(grid.Col, 0);
    grid.InvalidateCell(aCol, 0);
  end;

  if Grid.Row<>aRow then
  begin
    grid.InvalidateCell(0, grid.Row);
    grid.InvalidateCell(0, aRow);
  end;

end;

procedure TForm1.gridDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);

  procedure HorizontalCenter;
  var
    aTextStyle : TTextStyle;
  begin
    aTextStyle := grid.Canvas.TextStyle;
    aTextStyle.Alignment:=taCenter;
    grid.Canvas.TextStyle:=aTextStyle;
  end;

begin

  if gdFixed in aState then
  begin
    if (aCol=0) and (aRow>=Grid.FixedRows) then
    begin
      HorizontalCenter;
      grid.Canvas.TextRect(aRect, aRect.Left, aRect.Top, IntToStr(aRow));
      exit;
    end else
    if (aRow=0) and (aCol>=Grid.FixedCols) then
    begin
      HorizontalCenter;
      grid.Canvas.TextRect(aRect, aRect.Left, aRect.Top,
                                 IndexToAlphaIndex(aCol-Grid.FixedCols));
      exit;
    end;
  end;

  grid.DefaultDrawCell(aCol,aRow,aRect,aState);
end;

procedure TForm1.gridPrepareCanvas(sender: TObject; aCol, aRow: Integer;
  aState: TGridDrawState);
begin
  if gdFixed in aState then
  begin
    if (aCol=grid.Col) or (aRow=grid.Row) then
      grid.Canvas.Brush.Color := clInactiveCaption;
  end;
end;

procedure TForm1.LoadButtonClick(Sender: TObject);
begin
  if OpenDialog1.Execute then
    grid.LoadFromFile(OpenDialog1.FileName);
end;

procedure TForm1.SaveButtonClick(Sender: TObject);
begin
  if SaveDialog1.Execute then
    grid.SaveToFile(SaveDialog1.FileName);
end;

function TForm1.IndexToAlphaIndex(AIndex: Integer): string;
var
  i: Integer;
begin
  Result := chr((AIndex mod 26) + ord('A'));
  i := (AIndex div 26)-1;
  if i>25 then
    result := '['+IntToStr(AIndex)+']'
  else
  if i>=0 then
    result := chr(i + ord('A')) + Result;
end;

end.

