AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
Delphi2010 ホットキー(HotKey) 2010/10/08
 
前回は[Win32]内の「UpDown」(アップダウン)について見ましたので、今回は同じく[Win32]内の「HotKey」(ホットキー)について見てみます。ホットキーは Delphi6 にもあります。

 
取り合えず、ホットキーを配置してみます。1つ目ですので Nameプロパティは「HotKey1」となります。

 
私自身、このコンポーネントを使った事はありませんのでどういう動きをするのか分かりませんから、取り合えず、このまま保存・コンパイル(再構築)・実行をしてみます。

ホットキーにフォーカスがある状態で
[T]キーを押す


[Ctrl]キーを押しながら[E]キーを押す


[Ctrl]キーと[Shift]キーを押しながら[S]キーを押す


スペースキーを押すと…


 
取り合えず、押したキーの状態が表示される、という事は分かります。となるとなぜ、[Alt]キーを押していないのに「Alt + 〜」と表示されるのかがよく分かりませんが、これは、<オブジェクトインスペクタ>での Hotkeyプロパティのデフォルト値が「Alt+A」となっているから、又は、Modifiersプロパティ値が「[hkAlt]」となっているから、が原因のようです。Hotkeyプロパティを「なし」或いはModifiers.hkAltプロパティを「False」にすれば良いようです。ただ、なぜデフォルトが[Alt]付きになっているのかが少々疑問です。
 
Modifiersプロパティの値を指定する事によって、キーを押した際に、自動的に
hkShiftTrueにすると、Shift+〜
hkCtrlTrueにすると、Ctrl+〜
hkAltTrueにすると、Alt+〜
hkExtTrueにすると、Extra+〜(日本語キーボードでは無効)
となるようです。
 
InvalidKeysプロパティは、無効な修飾キーを指定する事が出来るようです。
hcNoneTrueにすると、修飾解除キーは無効
hcShiftTrueにすると、[Shift]キーは無効
hcCtrlTrueにすると、[Ctrl]キーは無効
hcAltTrueにすると、[Alt]キーは無効
hcShiftCtrlTrueにすると、[Shift]+[Ctrl]キーは無効
hcShiftAltTrueにすると、[Shift]+[Alt]キーは無効
hcCtrlAltTrueにすると、[Ctrl]+[Alt]キーは無効
hcShiftCtrlAltTrueにすると、[Shift]+[Ctrl]+[Alt]キーは無効
デフォルトは、[hcNone]と[hcShift]が True の状態となっています。ここで指定したものは、Modifiersプロパティの方も指定しないようにする必要があるとの事です。ただ、この「hcNone」=修飾解除キーというのが何か良く分かりません。この中の指定全てをON/OFFするとかでも無さそうですし、Modifiersプロパティへの影響も無さそうです。デフォルトは True のようですから、通常は、True にしておく、という感じでよいのかもしれません。
 
 
このホットキーにフォーカスがある状態で、何らかのキーを押した場合には、OnChangeイベントが発生するようです。
 
 
そのほか<オブジェクトプロパティ>をざっと見た限りでは、特に変わった所もなく、特に記述することも無さそうに思われます。
 
 
では、このホットキーは、一体どのような目的で利用するのでしょうか?
 
例えば、このホットキーにフォーカスを移動させ、何らかのキーを押したら、その他のコントロールにフォーカスを移動したり、何らかの処理を行うのでしょうか? しかし、修飾キーを押して何らかの処理を行いたい場合、このホットキーへ常にフォーカス移動をしておかねばならない、というような処理は極めて非効率のように思われます。それならば最初からメニューでそのショートカットを作成しておくとか、フォームの KeyPreviewプロパティを「True」にしておき OnKeyDownイベントハンドラを記述する、という手法のほうが良いように思われます。
 
となると、使う側が明示的にこのホットキーにフォーカスを移動させた状態で、キー入力を行う、そうすれば何らかの処理を行う、という事であれば、例えば、メインメニューやポップアップメニューのショートカットキーを利用者がカスタマイズしたい、というような状況で利用できるかもしれません。
 
例えば、メインメニューを配置し、メニュー「ファイル」〜「ファイルを開く」というメニュー項目を作成したとします。そのメニュー項目を選択したら、ファイルを開く画面が表示されるとします。[Dialogs]内の「OpenDialog」を配置します。

 

procedure TForm1.mnuFileOpenClick(Sender: TObject);
begin
 OpenDialog1.Execute ;
end;
 
<フォームデザイナ>での時点では、メニューのショートカットは指定していないとします。ですので、メニューをクリックしたり、アクセラレータキー [Alt]→[F]→[O] で実行出来たとしても、[Ctrl]+[F]キーで「開く」を実行するというような事は出来ない状態です。
そこで、このホットキーでの OnChangeイベントハンドラにて
procedure TForm1.HotKey1Change(Sender: TObject);
begin
 mnuFileOpen.ShortCut := HotKey1.HotKey ;
end;
のように記述するとします。そして、保存・コンパイル(再構築)・実行します。
 
メニューをクリックしてみると、以下のような状態です。
このメニューへのショートカットキーはありません。

このメニュー項目「ファイルを開く」を選択すると、「開く」画面が表示されます。

この画面を一旦閉じて、ホットキーにフォーカス移動した状態で、例えば、[Ctrl]キーを押しながら[F]キーを押してみます。

キーを押すと、ホットキーの OnChangeイベントが発生し、 OnChangeイベントハンドラが実行されて、メニュー項目へのショートカットが設定され、下記のような状態に変わります。

そうすれば、ファイルメニューからの実行でなくても、ホットキー以外のコントロールにフォーカスがある状態であれば、[Ctrl]を押しながら[F]キーを押せば、ファイルメニューへのショートカットが実行され、[開く]画面が表示されます。
 
という訳で、別画面として、メニュー項目へのショートカットキー設定を行うユーザーカスタマイズ用の画面というのを作っておき、その状態を保存・読み出しするようにしておけば、利用者による自由なショートカットキー利用というのが出来るようになると思われます。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/10/07
 2010/10/08
▼2010/10/09
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.