|
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
|