StringGridのセル選択時にフォーカス位置を決める
71 StringGridSelectFocusCell 動作確認 Delphi2007 更新日 2008/02/02(土)

StringGridでは選択範囲を決めるときに
Selection プロパティに、TGridRect型を代入します。

TGridRect型はTRect型とそっくりなので
Rectをキャストすることができます。

例えば、こんな風に指定できます。
  StringGrid1.Selection := TGridRect(Rect(2,2,4,4));
ちょっと便利でしょう。

定義は、Types.pasとGrid.pasで見ることができます。

  TRect = packed record
    case Integer of
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TPoint);
  end;
	  TPoint = packed record
	    X: Longint;
	    Y: Longint;
	  end;
  
  TGridRect = record
    case Integer of
      0: (Left, Top, Right, Bottom: Longint);
      1: (TopLeft, BottomRight: TGridCoord);
  end;
	  TGridCoord = record
	    X: Longint;
	    Y: Longint;
	  end;

ね。一緒です。

さて、選択範囲を指定するときに

普通に次のように指定すれば
  StringGrid1.Selection := TGridRect(Rect(2,2,4,4);
右下の4,4の位置にフォーカスがきます。




マウスでなぞった時には左上でも左下でも右上にでも
フォーカスを指定する事ができるので

コードで選択する場合でもフォーカス位置を4隅に変更したくなります。

これは、TGridRectのRightとBottomで指定した場所に
フォーカスがくるようになります。
つまり
  StringGrid1.Selection := TGridRect(Rect(4,2,2,4);
このように指定すると、左下にフォーカスがきます。




ちょっと使いやすく関数化してみたので使ってください。
────────────────────
type
  TGridSelectionFocus = (gsfTopLeft, gsfTopRight, gsfBottomLeft, gsfBottomRight);
  //4隅を指定する列挙型

procedure ChangeValue(var A, B: Integer);
var
  Buffer: Integer;
begin
  Buffer := A;
  A := B;
  B := Buffer;
end;

function SelectGridCell(R: TGridRect; Focus: TGridSelectionFocus): TGridRect;
begin
  case Focus of
  gsfTopLeft: begin
    if R.Top < R.Bottom then ChangeValue(R.Top, R.Bottom);
    if R.Left < R.Right then ChangeValue(R.Left, R.Right);
  end;
  gsfTopRight: begin
    if R.Top < R.Bottom then ChangeValue(R.Top, R.Bottom);
    if R.Right < R.Left then ChangeValue(R.Left, R.Right);
  end;
  gsfBottomLeft: begin
    if R.Bottom < R.Top then ChangeValue(R.Top, R.Bottom);
    if R.Left < R.Right then ChangeValue(R.Left, R.Right);
  end;
  gsfBottomRight: begin
    if R.Bottom < R.Top then ChangeValue(R.Top, R.Bottom);
    if R.Right < R.Left then ChangeValue(R.Left, R.Right);
  end;
  end;
  Result := R;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  StrGrid1.Selection :=
    SelectGridCell(TGridRect(Rect(2,2,4,4)), gsfTopLeft);
  StrGrid1.SetFocus;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  StrGrid1.Selection :=
    SelectGridCell(TGridRect(Rect(2,2,4,4)), gsfTopRight);
  StrGrid1.SetFocus;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  StrGrid1.Selection :=
    SelectGridCell(TGridRect(Rect(2,2,4,4)), gsfBottomLeft);
  StrGrid1.SetFocus;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  StrGrid1.Selection :=
    SelectGridCell(TGridRect(Rect(2,2,4,4)), gsfBottomRight);
  StrGrid1.SetFocus;
end;
────────────────────
フォーカス位置はStringGrid1.Colと.Rowでしることができます。

これで左上や右上にもフォーカスをあてることができます。