お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





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

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






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

■注意点
 ボタンの配置は以下のようにして下さい。
 ボタンの作成順も Button1 → Button12 とし、TabOrder もこの順序
にして下さい。( TabOrder は Button1 が 0、Button12 が 11 となる
ようにして下さい。クリックによるフォーカス移動に対応させるため。)
 また、最初は Button1 にフォーカスを設定して下さい。 そして、各
ボタンの OnClick イベントには、Button1 の OnClick イベントを指定
してイベントを共有して下さい。

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

■サンプルコード
//=====================================================================
{...略...}
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;
    Button11: TButton;
    Button12: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
    procedure WMKEYDOWN( var Msg : TWMKEYDOWN );
      message CM_CHILDKEY;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
  ACol, ARow : Integer;                       //ボタン位置格納用
  BtnArray : array[ 1..3, 1..4 ] of TButton;  //ボタンを格納

procedure TForm1.WMKEYDOWN( var Msg : TWMKEYDOWN );
begin
  if ActiveControl is TButton then
    with Msg do
      begin
        Result := 1;
        case CharCode of
          VK_LEFT:
            if ACol > 1 then
              begin
                ACol := ACol - 1;
                BtnArray[ ACol, ARow ].SetFocus;
              end;
          VK_UP:
            if ARow > 1 then
              begin
                ARow := ARow - 1;
                BtnArray[ ACol, ARow ].SetFocus;
              end;
          VK_RIGHT:
            if ACol < 3 then      //条件はボタンの配置により変化
              begin
                ACol := ACol + 1;
                BtnArray[ ACol, ARow ].SetFocus;
              end;
          VK_DOWN:
            if ARow < 4 then
              begin
                ARow := ARow + 1; //条件はボタンの配置により変化
                BtnArray[ ACol, ARow ].SetFocus;
              end;
          else Result := 0;
        end;
      end;
  inherited;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i, j : Integer;
begin
  ARow := 1;
  ACol := 1;
  j := 0;
  for i := 0 to ComponentCount - 1 do
    if Components[ i ] is TButton then
      begin
        BtnArray[ j div 4 + 1, j mod 4 + 1 ] := TButton( Components[ i ] );
        Inc( j );{~~~~~~~~~~~~~~~~~~~~~~~~\_配置に依存します}
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TButton( Sender ) do
    begin
      ACol := TabOrder div 4 + 1;  //この部分も配置に依存します
      ARow := TabOrder mod 4 + 1;  //この部分も配置に依存します
    end;
end;
{...略...}
//=====================================================================

                                     97/10/18(Sat) 17:30 Fermion [KHF03264]

Original document by Fermion         氏 ID:(KHF03264)


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

Copyright 1996-2002 Delphi Users' Forum