お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"矢印キーでフォーカス移動4"






■説明
 Form1 に碁盤の目のように配置されたボタンへのフォーカスを、矢印
キーで移動させます。(上下左右に)
 以下の例はボタンですが、少々手を加えることで他のコントロールと
混在させることも可能です。

 今回のものは TList を利用したものです。

■注意点
 (1).ボタンの配置は以下のようにして下さい。

     ┌─────┐  ┌─────┐  ┌─────┐
     │ Button1 │  │ Button2 │  │ Button3 │
     └─────┘  └─────┘  └─────┘
     ┌─────┐  ┌─────┐  ┌─────┐
     │ Button4 │  │ Button5 │  │ Button6  │
     └─────┘  └─────┘  └─────┘
     ┌─────┐  ┌─────┐  ┌─────┐
     │ Button7 │  │ Button8 │  │ Button9  │
     └─────┘  └─────┘  └─────┘
     ┌─────┐  ┌─────┐  ┌─────┐
     │ Button10 │  │ Button11 │  │ Button12 │
     └─────┘  └─────┘  └─────┘

 (2).ボタンの作成順は Button1 → Button12 として下さい。(※1)

 (3).TabOrder は、

    Button1 :  0  Button2 :  4    Button3 :  8
    Button4 :  1  Button5 :  5    Button6 :  9
    Button7 :  2  Button8 :  6    Button9 : 10
    Button10:  3  Button11:  7    Button12: 11

   として下さい。(※2)

 ※1,2がポイントですので必ずこの様にして下さい。m(_"_)m


 なお、CM_CHILDKEY メッセージを受ける手続き名は任意に定められる
のですが、ここでは解り易いように、WMKeyDown としました。m(_"_)m

 また、ButtonList.Count が 0 の場合を篩にかける処理は省略してい
ますのでご注意下さい。


■サンプルコード
//=====================================================================
{...略...}
  private
    { Private 宣言 }  //↓次の2行を追加します
    procedure WMKeyDown( var Msg : TWMKEYDOWN );
      message CM_CHILDKEY;
  public
    { Public 宣言 }
  end;
{...略...}
implementation

{$R *.DFM}

var
  ButtonList : TList; //フォーカスの横方向移動順指定のため
                      //必要であれば縦方向も用意して下さい
procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
begin
  ButtonList := TList.Create;
  for i := 0 to ControlCount - 1 do
    if Controls[i] is TButton then ButtonList.Add( Controls[i] );
end;  //↑この辺りは必要に応じて・・・

procedure TForm1.FormDestroy(Sender: TObject);
begin
  ButtonList.Free;
end;

procedure TForm1.WMKeyDown( var Msg : TWMKEYDOWN );
var
  Idx : Integer;
begin
  with Msg do
    case CharCode of
      VK_LEFT :
        with ButtonList do
          begin
            Idx := IndexOf( ActiveControl );
            if Idx = -1 then Exit;  //List に該当するものがないとき
            TWinControl( 
              Items[ ( Count + Idx - 1 ) mod Count ]
                         ).SetFocus;
            Result := 1;
          end;

      VK_RIGHT :
        with ButtonList do
          begin
            Idx := IndexOf( ActiveControl );
            if Idx = -1 then Exit;
            TWinControl( Items[ ( Idx + 1 ) mod Count ] ).SetFocus;
            Result := 1;
          end;
    end;
end;
{...略...}
end.
//=====================================================================


                                     98/01/14(水) 16:51 Fermion(KHF03264)

Original document by Fermion         氏 ID:(KHF03264)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum