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でしることができます。
これで左上や右上にもフォーカスをあてることができます。
|