TStringGridのShift+Tab移動について

解決


うさこ  2003-11-20 05:22:50  No: 5693  IP: [192.*.*.*]

こんにちは。
いつも参考にさせていただいております。

TStringGridでのカーソルの移動をTabキーで行っています。
Tabキーでカーソルを移動させたくない列は

  StringGrid1.TabStops[i] := false;

としています。

Tabキー押下時は上記の設定を行っている列をとばして
カーソルが移動するのですが、
Shift + Tab の時に、上記の設定を行っている列で
カーソルの移動が止まってしまいます。

Shift + Tab の時も、上記の設定を行っている列をとばして
カーソルを移動する事は出来ないものでしょうか。
どうかご教授下さいませ。

Delphi7を使っています。
TStringGrid.TabStop は、true 、
TStringGrid.Options の goTabs は、true です。

編集    削除
えび  2003-11-21 07:38:18  No: 5694  IP: [192.*.*.*]

VCLのソースを見たところグリッドのKeyDownメソッドのバグのようですね。

継承したコンポーネントを作るか、VCLをプロジェクトにコピーして直接
直すかどっちかですね。
ちょこちょこっと直して動かしてみただけなので保障できませんが
メソッドの引数のShiftパラメータをクリアするタイミングが
違うかなと...
VCLのソースを直接コピペして指摘するのは、まずいかと思うのでGrids.pasを
見てみて下さい。

編集    削除
masayan  2003-11-21 20:31:19  No: 5695  IP: [192.*.*.*]

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;

てな感じです。安直な方法ですが参考までに...

編集    削除
うさこ  2003-12-05 20:58:14  No: 5696  IP: [192.*.*.*]

ご返答が大変遅くなり申し訳ありません。

えびさん、masayanさんアドバイスありがとうございます。
結構大変なんですね・・・

参考にさせて頂きます。ありがとうございました。

編集    削除
うさこ  2003-12-05 22:27:12  No: 5697  IP: [192.*.*.*]

解決とさせていただきます。

編集    削除