こんにちは。
いつも参考にさせていただいております。
TStringGridでのカーソルの移動をTabキーで行っています。
Tabキーでカーソルを移動させたくない列は
StringGrid1.TabStops[i] := false;
としています。
Tabキー押下時は上記の設定を行っている列をとばして
カーソルが移動するのですが、
Shift + Tab の時に、上記の設定を行っている列で
カーソルの移動が止まってしまいます。
Shift + Tab の時も、上記の設定を行っている列をとばして
カーソルを移動する事は出来ないものでしょうか。
どうかご教授下さいませ。
Delphi7を使っています。
TStringGrid.TabStop は、true 、
TStringGrid.Options の goTabs は、true です。
VCLのソースを見たところグリッドのKeyDownメソッドのバグのようですね。
継承したコンポーネントを作るか、VCLをプロジェクトにコピーして直接
直すかどっちかですね。
ちょこちょこっと直して動かしてみただけなので保障できませんが
メソッドの引数のShiftパラメータをクリアするタイミングが
違うかなと...
VCLのソースを直接コピペして指摘するのは、まずいかと思うのでGrids.pasを
見てみて下さい。
TStringGridのShift+Tabの動作は、昔からこうだったと思います。
いろいろ対処方法はあると思いますが、とりあえずTApplicationEventsを追加してOnMessageでグリッドのShift+Tab処理する方法もあります。
例えば...
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
ACol,ARow : Integer;
begin
if Msg.hwnd = StringGrid1.Handle then // グリッドに対するメッセージか?
begin
if Msg.message = WM_KEYDOWN then
begin
if (Msg.wParam = VK_TAB) and ((GetKeyState(VK_SHIFT) and $8000) <> 0) then
begin
ACol := StringGrid1.Col;
ARow := StringGrid1.Row;
repeat
if ACol > StringGrid1.FixedCols then
begin
dec(ACol);
end
else
begin
if ARow > StringGrid1.FixedRows then
begin
dec(ARow);
ACol := StringGrid1.ColCount - 1;
end;
end;
until (StringGrid1.TabStops[ACol]);
StringGrid1.Col := ACol;
StringGrid1.Row := ARow;
Handled := True; // グリッド標準のShift+Tab処理を禁止
end;
end;
end;
end;
てな感じです。安直な方法ですが参考までに...
ご返答が大変遅くなり申し訳ありません。
えびさん、masayanさんアドバイスありがとうございます。
結構大変なんですね・・・
参考にさせて頂きます。ありがとうございました。
解決とさせていただきます。
編集 削除