Difference between revisions of "LCL Key Handling/ja"
Line 62: | Line 62: | ||
もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_CHAR/LM_SYSCHARメッセージを送ります。これは、SendDialogCharをコールします。SendDialogCharは次のようになっています。 | もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_CHAR/LM_SYSCHARメッセージを送ります。これは、SendDialogCharをコールします。SendDialogCharは次のようになっています。 | ||
− | # | + | # 親フォームを取得できたなら、そのDialogCharをコールします。: |
− | ## | + | ## TWinControlはDialogCharをそのすべての子コントロールにブロードキャストします。 |
− | ##* | + | ##* これは、フォーカスされたコントロールの近く(同じフォームの)のコントロールのために、アクセラレータショートカットを実装するのに使えます。 |
− | ##* | + | ##* 例: TCustomLabelはこの仕組みをalt+アクセラレータが押されたときに、割り当てられた.FocusControlにフォーカスするのに使います。 |
== 押されているキーを離した(KeyUp) == | == 押されているキーを離した(KeyUp) == |
Revision as of 00:50, 1 November 2006
│
English (en) │
日本語 (ja) │
português (pt) │
キーを押し下げた (KeyDown)
widgetsetがキーを押されたことを受け取ると、次のようにふるまいます。 "ネイティブ"なwidgetにキーを処理させる前に、CN_KEYDOWNやCN_SYSKEYDOWNをLCLに送ります。(CN_SYSKEYDOWNはaltキーが押されたときに発生します。) これは、DoKeyDownBeforeInterfaceが次のようなフローでコールします。
- Application.NotifyKeyDownBeforeHandlerがコールされます。 (ハンドラの前に呼び出されます。)
- keypreviewがある親フォームを取得し、そのDoKeyDownBeforeInterfaceメソッドを呼び出します。
- 関連づけられているdragobjectにキーを処理させます。
- KeyDownBeforeInterfaceをコールします。 (もし、コントロールがcsNoStdEventsをControlStyleに持っていない場合):
- KeyDownをコールします。
- OnKeyDown ハンドラがあればコールします。
- KeyDownをコールします。
もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_KEYDOWN/LM_SYSKEYDOWNメッセージを送ります。これは、DoRemainingKeyDownを次のようなフローでコールします。
- もしpopupmenuが割り当てられていれば、(それがポップアップされているかどうかにかかわらず)、ショートカットをチェックします。
- 親フォームを取得し、ショートカットが有効ならば処理させます。(TCustomForm.IsShortcut):
- フォームにOnShortcutイベントがあれば、それをコールします。
- フォームにMenuがあれば、そのショートカットをチェックします。:
- このメニューの全てのアイテムをイテレーションして、ショートカットをチェックして、該当するなら、そのアイテムの".Click"をコールします。
- もし、そのショートカットを処理しなかったり、後続のキー処理をさせたくない場合は、メニューアイテムのOnClickハンドラ内でメニューのShortcutHandledプロパティをfalseにします。
- アクションリストのショートカットをチェックして、一致するアクションの.Executeを実行します。
- アプリケーションにショートカットを処理させます。(Application.IsShortcut):
- もし、アプリケーションのOnShortcutが割り当てられていれ呼び出します。
- もし、モーダルフォームがアクティブになっている場合は、それにショートカットを処理させます。(上記の TCustomForm.IsShortcut を参照)
- そうでなくて、もしフォーカスされたフォームがある場合(Screen.ActiveCustomForm), そのフォームにショートカットを処理させます。
- そうではなくて、もし、メインフォームがあれば(Application.MainForm), そのフォームにショートカットを処理させます。
- もし、コントロールに親があれば、順にParent.ChildKeyを遡ってキーメッセージを処理します。
- これは、パネルの例のように、キーショットカットを確定したエリア内で処理する場合に利用します。
- TWinControlはその親のChildKeyを呼び出します。これが、順次遡って処理をするということです。
- TWinControl内でControlKeyDownよ呼び出すと、Application.ControlKeyDownを呼び出します。
- コントロールのためのタブナビゲーション処理
- もし、あなたの作ったカスタムコントロールがtabキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、たとえばTCustomMemoを例にとると..
- KeyDownAfterInterface; TWinControlはここでは何もしません。
- Applicationに、KeyDownAfterハンドラをコールさせます。
result(1か0をMessage.Resultで返します)は何かをすることに注意してください。たとえば、windows環境では、ただ、WM_KEYDOWNメッセージが来たときに、0を返すとキーのWM_CHARを送るだけです。
キーを押している, キャラクタが送られている(KeyPress)
widgetsetはCN_CHARメッセージを送るか、IntfUtf8KeyPressメソッドをコールすることができます。 CN_CHARはUTF-8キャラクタをサポートしませんのでIntfUtf8KeyPressが存在します。 CN_CHARの処理は次のようになっています。
- もし、widgetset(interface)がutf8 key pressを送らないならば、IntfUtf8KeyPressをコールします。
- DoKeyPressをコールします:
- 親フォームを取得し、KeyPreviewがTrueになっているならば、親フォームのDoKeyPressをコールします。
- KeyPress をコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
- OnKeyPress ハンドラがあれば、コールします。
IntfUtf8KeyPress (DoUtf8KeyPress) 処理は次のようになっています。
- 親フォームを取得します。もし、KeyPreviewがtrueならば、そのDoUtf8KeyPressをコールします。
- Utf8KeyPressをコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
- OnUtf8KeyPress ハンドラがあれば、コールします。
もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_CHAR/LM_SYSCHARメッセージを送ります。これは、SendDialogCharをコールします。SendDialogCharは次のようになっています。
- 親フォームを取得できたなら、そのDialogCharをコールします。:
- TWinControlはDialogCharをそのすべての子コントロールにブロードキャストします。
- これは、フォーカスされたコントロールの近く(同じフォームの)のコントロールのために、アクセラレータショートカットを実装するのに使えます。
- 例: TCustomLabelはこの仕組みをalt+アクセラレータが押されたときに、割り当てられた.FocusControlにフォーカスするのに使います。
- TWinControlはDialogCharをそのすべての子コントロールにブロードキャストします。
押されているキーを離した(KeyUp)
Releasing a key is very much, in the order of events happening, alike pressing a key, but some functions are missing. Again the widgetset will send a CN_KEYUP/CN_SYSKEYUP to the LCL before letting the widget handle the key, which will call DoKeyUpBeforeInterface consisting of:
- get parent form, if it has keypreview, call it's DoKeyUpBeforeInterface
- let the associated dragobject handle the key
- call KeyUpBeforeInterface (if control does not have csNoStdEvents in ControlStyle):
- call KeyUp:
- call OnKeyUp handler if any
- call KeyUp:
When unhandled, that is, Message.Result = 0, it lets the widget handle the key, and if the widget has not done anything useful, then send a LM_KEYUP/LM_SYSKEYUP message to the LCL, which calls DoRemainingKeyUp consisting of:
- call ControlKeyUp, which in TWinControl, calls Application.ControlKeyDown:
- handle Enter and Escape keys for forms
- if your custom control does something special with enter and escape, override and inhibit
- call KeyUpAfterInterface; TWinControl does nothing here