Sign in Join
Wiki copytemporary

LCL Key Handling/ja: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: LCL Key Handling/ja

OldNewLine
1+## キーを押し下げた (KeyDown)
2+
3+widgetsetがキーを押されたことを受け取ると、次のようにふるまいます。 "ネイティブ"なwidgetにキーを処理させる前に、CN_KEYDOWNやCN_SYSKEYDOWNをLCLに送ります。(CN_SYSKEYDOWNはaltキーが押されたときに発生します。) これは、DoKeyDownBeforeInterfaceが次のようなフローでコールします。
4+
5+1. Application.NotifyKeyDownBeforeHandlerがコールされます。 (ハンドラの前に呼び出されます。)
6+2. keypreviewがある親フォームを取得し、そのDoKeyDownBeforeInterfaceメソッドを呼び出します。
7+3. 関連づけられているdragobjectにキーを処理させます。
8+
9+1. KeyDownBeforeInterfaceをコールします。 (もし、コントロールがcsNoStdEventsをControlStyleに持っていない場合):
10+ 1. KeyDownをコールします。
11+ 1. OnKeyDown ハンドラがあればコールします。
12+
13+もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_KEYDOWN/LM_SYSKEYDOWNメッセージを送ります。これは、DoRemainingKeyDownを次のようなフローでコールします。
14+
15+1. もしpopupmenuが割り当てられていれば、(それがポップアップされているかどうかにかかわらず)、ショートカットをチェックします。
16+2. 親フォームを取得し、ショートカットが有効ならば処理させます。(TCustomForm.IsShortcut):
17+ 1. フォームにOnShortcutイベントがあれば、それをコールします。
18+ 2. フォームにMenuがあれば、そのショートカットをチェックします。:
19+ - このメニューの全てのアイテムをイテレーションして、ショートカットをチェックして、該当するなら、そのアイテムの".Click"をコールします。
20+ - もし、そのショートカットを処理しなかったり、後続のキー処理をさせたくない場合は、メニューアイテムのOnClickハンドラ内でメニューのShortcutHandledプロパティをfalseにします。
21+ 3. アクションリストのショートカットをチェックして、一致するアクションの.Executeを実行します。
22+3. アプリケーションにショートカットを処理させます。(Application.IsShortcut):
23+ 1. もし、アプリケーションのOnShortcutが割り当てられていれ呼び出します。
24+ 2. もし、モーダルフォームがアクティブになっている場合は、それにショートカットを処理させます。(上記の TCustomForm.IsShortcut を参照)
25+ 3. そうでなくて、もしフォーカスされたフォームがある場合(Screen.ActiveCustomForm), そのフォームにショートカットを処理させます。
26+ 4. そうではなくて、もし、メインフォームがあれば(Application.MainForm), そのフォームにショートカットを処理させます。
27+4. もし、コントロールに親があれば、順にParent.ChildKeyを遡ってキーメッセージを処理します。
28+ - これは、パネルの例のように、キーショットカットを確定したエリア内で処理する場合に利用します。
29+ - TWinControlはその親のChildKeyを呼び出します。これが、順次遡って処理をするということです。
30+5. TWinControl内でControlKeyDownよ呼び出すと、Application.ControlKeyDownを呼び出します。
31+ 1. コントロールのためのタブナビゲーション処理
32+
33+ - もし、あなたの作ったカスタムコントロールがtabキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、たとえばTCustomMemoを例にとると..
34+6. KeyDownAfterInterface; TWinControlはここでは何もしません。
35+7. Applicationに、KeyDownAfterハンドラをコールさせます。
36+
37+result(1か0をMessage.Resultで返します)は何かをすることに注意してください。たとえば、windows環境では、ただ、WM_KEYDOWNメッセージが来たときに、0を返すとキーのWM_CHARを送るだけです。
38+
39+## キーを押している, キャラクタが送られている(KeyPress)
40+
41+widgetsetはCN_CHARメッセージを送るか、IntfUtf8KeyPressメソッドをコールすることができます。 CN_CHARはUTF-8キャラクタをサポートしませんのでIntfUtf8KeyPressが存在します。 CN_CHARの処理は次のようになっています。
42+
43+1. もし、widgetset(interface)がutf8 key pressを送らないならば、IntfUtf8KeyPressをコールします。
44+2. DoKeyPressをコールします:
45+ 1. 親フォームを取得し、KeyPreviewがTrueになっているならば、親フォームのDoKeyPressをコールします。
46+ 2. KeyPress をコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
47+ 1. OnKeyPress ハンドラがあれば、コールします。
48+
49+IntfUtf8KeyPress (DoUtf8KeyPress) 処理は次のようになっています。
50+
51+1. 親フォームを取得します。もし、KeyPreviewがtrueならば、そのDoUtf8KeyPressをコールします。
52+2. Utf8KeyPressをコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
53+ 1. OnUtf8KeyPress ハンドラがあれば、コールします。
54+
55+もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_CHAR/LM_SYSCHARメッセージを送ります。これは、SendDialogCharをコールします。SendDialogCharは次のようになっています。
56+
57+1. 親フォームを取得できたなら、そのDialogCharをコールします。:
58+ 1. TWinControlはDialogCharをそのすべての子コントロールにブロードキャストします。
59+ - これは、フォーカスされたコントロールの近く(同じフォームの)のコントロールのために、アクセラレータショートカットを実装するのに使えます。
60+ - 例: TCustomLabelはこの仕組みをalt+アクセラレータが押されたときに、割り当てられた.FocusControlにフォーカスするのに使います。
61+
62+## 押されているキーを離した(KeyUp)
63+
64+キーを離すことは、イベントの発生順序においては、キーを押すこととにています。しかし、いくつかの関数は発生しません。widgetsetはwidgetにキーを処理させる前にCN_KEYUP/CN_SYSKEYUPをLCLに送るでしょう。 そして、そのことは次のような仕組みの DoKeyUpBeforeInterface をコールします。
65+
66+1. 親フォームを取得し、そのKeyPreviewがTrueならば、そのDoKeyUpBeforeInterfaceを呼び出します。
67+2. 関連づけられているdragobjectにキーを処理させます。
68+3. KeyUpBeforeInterface をコールします。 (もし、コントロールがcsNoStdEventsをControlStyleに持っていない場合):
69+ 1. KeyUpをコールします:
70+ 1. OnKeyUp ハンドラがあればコールします。
71+
72+もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_KEYUP/LM_SYSKEYUPメッセージを送ります。これは、DoRemainingKeyUpを次のようなフローでコールします。
73+
74+1. TWinControl内でControlKeyUpを呼び出すと、Application.ControlKeyUpを呼び出します。
75+ 1. フォームのEnterキーやEscapeキーを処理します。
76+
77+ - もし、あなたの作ったカスタムコントロールがEnterキーやEscapeキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、
78+2. KeyUpAfterInterfaceを呼び出します; TWinControl はここでは何もしません。
79+
80+---
81+*From the Free Pascal wiki, page "LCL Key Handling/ja", as it stood on 2006-11-01 after a change by Saeka-jp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history