Difference between revisions of "LCL Key Handling/ja"

From Free Pascal wiki
Jump to navigationJump to search
 
(10 intermediate revisions by the same user not shown)
Line 31: Line 31:
 
## そうでなくて、もしフォーカスされたフォームがある場合(Screen.ActiveCustomForm), そのフォームにショートカットを処理させます。
 
## そうでなくて、もしフォーカスされたフォームがある場合(Screen.ActiveCustomForm), そのフォームにショートカットを処理させます。
 
## そうではなくて、もし、メインフォームがあれば(Application.MainForm), そのフォームにショートカットを処理させます。
 
## そうではなくて、もし、メインフォームがあれば(Application.MainForm), そのフォームにショートカットを処理させます。
# if there is a Parent, iteratively call Parent.ChildKey to handle key message
+
# もし、コントロールに親があれば、順にParent.ChildKeyを遡ってキーメッセージを処理します。
#* use it to handle key shortcuts in a certain "area", for example a panel
+
#* これは、パネルの例のように、キーショットカットを確定したエリア内で処理する場合に利用します。
#* TWinControl will call it's Parent's ChildKey; that's the "iteratively"
+
#* TWinControlはその親のChildKeyを呼び出します。これが、順次遡って処理をするということです。
# call ControlKeyDown, which in TWinControl, calls Application.ControlKeyDown:
+
# TWinControl内でControlKeyDownよ呼び出すと、Application.ControlKeyDownを呼び出します。
## handle tab navigation for controls
+
## コントロールのためのタブナビゲーション処理
#* if your custom control does something special with tab, override and inhibit, for example TCustomMemo
+
#* もし、あなたの作ったカスタムコントロールがtabキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、たとえばTCustomMemoを例にとると..
# call KeyDownAfterInterface; TWinControl does nothing here
+
# KeyDownAfterInterface; TWinControlはここでは何もしません。
# let Application call KeyDownAfter handlers
+
# Applicationに、KeyDownAfterハンドラをコールさせます。
  
Note that result (returning 1 or 0 in Message.Result) matters sometimes: windows for example will only send a WM_CHAR message for a key when a WM_KEYDOWN message that key has returned 0.
+
result(1か0をMessage.Resultで返します)は何かをすることに注意してください。たとえば、windows環境では、ただ、WM_KEYDOWNメッセージが来たときに、0を返すとキーのWM_CHARを送るだけです。
  
 
== キーを押している, キャラクタが送られている(KeyPress) ==
 
== キーを押している, キャラクタが送られている(KeyPress) ==
  
The widgetset can either send CN_CHAR message, or call the IntfUtf8KeyPress method. CN_CHAR does not support UTF-8 characters, so that is why a IntfUtf8KeyPress exists. CN_CHAR handling consists of:
+
widgetsetはCN_CHARメッセージを送るか、IntfUtf8KeyPressメソッドをコールすることができます。
 +
CN_CHARはUTF-8キャラクタをサポートしませんのでIntfUtf8KeyPressが存在します。
 +
CN_CHARの処理は次のようになっています。
  
# if widgetset (interface) does not send utf8 key presses, then call IntfUtf8KeyPress
+
# もし、widgetset(interface)がutf8 key pressを送らないならば、IntfUtf8KeyPressをコールします。
# call DoKeyPress:
+
# DoKeyPressをコールします:
## get parent form, and if it has KeyPreview call it's DoKeyPress
+
## 親フォームを取得し、KeyPreviewがTrueになっているならば、親フォームのDoKeyPressをコールします。
## call KeyPress (if control does not have csNoStdEvents in ControlStyle):
+
## KeyPress をコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
### call OnKeyPress handler if any
+
### OnKeyPress ハンドラがあれば、コールします。
  
IntfUtf8KeyPress (DoUtf8KeyPress) handling consists of:
+
IntfUtf8KeyPress (DoUtf8KeyPress) 処理は次のようになっています。
  
# get parent form, and if it has KeyPreview call it's DoUtf8KeyPress
+
# 親フォームを取得します。もし、KeyPreviewがtrueならば、そのDoUtf8KeyPressをコールします。
# call Utf8KeyPress (if control does not have csNoStdEvents in ControlStyle):
+
# Utf8KeyPressをコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
## call OnUtf8KeyPress handler if any
+
## OnUtf8KeyPress ハンドラがあれば、コールします。
  
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_CHAR/LM_SYSCHAR message to the LCL, which calls SendDialogChar consisting of:
+
もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_CHAR/LM_SYSCHARメッセージを送ります。これは、SendDialogCharをコールします。SendDialogCharは次のようになっています。
  
# get parent form and if found call it's .DialogChar:
+
# 親フォームを取得できたなら、そのDialogCharをコールします。:
## TWinControl broadcasts DialogChar to all it's children
+
## TWinControlはDialogCharをそのすべての子コントロールにブロードキャストします。
##* use it to implement accelerator shortcuts for controls "near" (on the same form) as the focused control
+
##* これは、フォーカスされたコントロールの近く(同じフォームの)のコントロールのために、アクセラレータショートカットを実装するのに使えます。
##* example: TCustomLabel uses it to Focus the assigned .FocusControl when alt+accelerator is pressed
+
##* : TCustomLabelはこの仕組みをalt+アクセラレータが押されたときに、割り当てられた.FocusControlにフォーカスするのに使います。
  
 
== 押されているキーを離した(KeyUp) ==
 
== 押されているキーを離した(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:
+
キーを離すことは、イベントの発生順序においては、キーを押すこととにています。しかし、いくつかの関数は発生しません。widgetsetはwidgetにキーを処理させる前にCN_KEYUP/CN_SYSKEYUPをLCLに送るでしょう。
 +
そして、そのことは次のような仕組みの DoKeyUpBeforeInterface をコールします。
  
# get parent form, if it has keypreview, call it's DoKeyUpBeforeInterface
+
# 親フォームを取得し、そのKeyPreviewがTrueならば、そのDoKeyUpBeforeInterfaceを呼び出します。
# let the associated dragobject handle the key
+
# 関連づけられているdragobjectにキーを処理させます。
# call KeyUpBeforeInterface (if control does not have csNoStdEvents in ControlStyle):
+
# KeyUpBeforeInterface をコールします。 (もし、コントロールがcsNoStdEventsをControlStyleに持っていない場合):  
## call KeyUp:
+
## KeyUpをコールします:
### call OnKeyUp handler if any
+
### OnKeyUp ハンドラがあればコールします。
  
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:
+
もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_KEYUP/LM_SYSKEYUPメッセージを送ります。これは、DoRemainingKeyUpを次のようなフローでコールします。
## 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
+
 
 +
# TWinControl内でControlKeyUpを呼び出すと、Application.ControlKeyUpを呼び出します。
 +
## フォームのEnterキーやEscapeキーを処理します。
 +
#* もし、あなたの作ったカスタムコントロールがEnterキーやEscapeキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、
 +
# KeyUpAfterInterfaceを呼び出します; TWinControl はここでは何もしません。

Latest revision as of 13:22, 1 November 2006

English (en) 日本語 (ja) português (pt)

日本語版メニュー
メインページ - Lazarus Documentation日本語版 - 翻訳ノート - 日本語障害情報

キーを押し下げた (KeyDown)

widgetsetがキーを押されたことを受け取ると、次のようにふるまいます。 "ネイティブ"なwidgetにキーを処理させる前に、CN_KEYDOWNやCN_SYSKEYDOWNをLCLに送ります。(CN_SYSKEYDOWNはaltキーが押されたときに発生します。) これは、DoKeyDownBeforeInterfaceが次のようなフローでコールします。

  1. Application.NotifyKeyDownBeforeHandlerがコールされます。 (ハンドラの前に呼び出されます。)
  2. keypreviewがある親フォームを取得し、そのDoKeyDownBeforeInterfaceメソッドを呼び出します。
  3. 関連づけられているdragobjectにキーを処理させます。
  1. KeyDownBeforeInterfaceをコールします。 (もし、コントロールがcsNoStdEventsをControlStyleに持っていない場合):
    1. KeyDownをコールします。
      1. OnKeyDown ハンドラがあればコールします。

もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_KEYDOWN/LM_SYSKEYDOWNメッセージを送ります。これは、DoRemainingKeyDownを次のようなフローでコールします。

  1. もしpopupmenuが割り当てられていれば、(それがポップアップされているかどうかにかかわらず)、ショートカットをチェックします。
  2. 親フォームを取得し、ショートカットが有効ならば処理させます。(TCustomForm.IsShortcut):
    1. フォームにOnShortcutイベントがあれば、それをコールします。
    2. フォームにMenuがあれば、そのショートカットをチェックします。:
      • このメニューの全てのアイテムをイテレーションして、ショートカットをチェックして、該当するなら、そのアイテムの".Click"をコールします。
      • もし、そのショートカットを処理しなかったり、後続のキー処理をさせたくない場合は、メニューアイテムのOnClickハンドラ内でメニューのShortcutHandledプロパティをfalseにします。
    3. アクションリストのショートカットをチェックして、一致するアクションの.Executeを実行します。
  3. アプリケーションにショートカットを処理させます。(Application.IsShortcut):
    1. もし、アプリケーションのOnShortcutが割り当てられていれ呼び出します。
    2. もし、モーダルフォームがアクティブになっている場合は、それにショートカットを処理させます。(上記の TCustomForm.IsShortcut を参照)
    3. そうでなくて、もしフォーカスされたフォームがある場合(Screen.ActiveCustomForm), そのフォームにショートカットを処理させます。
    4. そうではなくて、もし、メインフォームがあれば(Application.MainForm), そのフォームにショートカットを処理させます。
  4. もし、コントロールに親があれば、順にParent.ChildKeyを遡ってキーメッセージを処理します。
    • これは、パネルの例のように、キーショットカットを確定したエリア内で処理する場合に利用します。
    • TWinControlはその親のChildKeyを呼び出します。これが、順次遡って処理をするということです。
  5. TWinControl内でControlKeyDownよ呼び出すと、Application.ControlKeyDownを呼び出します。
    1. コントロールのためのタブナビゲーション処理
    • もし、あなたの作ったカスタムコントロールがtabキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、たとえばTCustomMemoを例にとると..
  6. KeyDownAfterInterface; TWinControlはここでは何もしません。
  7. 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の処理は次のようになっています。

  1. もし、widgetset(interface)がutf8 key pressを送らないならば、IntfUtf8KeyPressをコールします。
  2. DoKeyPressをコールします:
    1. 親フォームを取得し、KeyPreviewがTrueになっているならば、親フォームのDoKeyPressをコールします。
    2. KeyPress をコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
      1. OnKeyPress ハンドラがあれば、コールします。

IntfUtf8KeyPress (DoUtf8KeyPress) 処理は次のようになっています。

  1. 親フォームを取得します。もし、KeyPreviewがtrueならば、そのDoUtf8KeyPressをコールします。
  2. Utf8KeyPressをコールします。(もしコントロールが、csNoStdEvents を ControlStyleにもっていないならば。):
    1. OnUtf8KeyPress ハンドラがあれば、コールします。

もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_CHAR/LM_SYSCHARメッセージを送ります。これは、SendDialogCharをコールします。SendDialogCharは次のようになっています。

  1. 親フォームを取得できたなら、そのDialogCharをコールします。:
    1. TWinControlはDialogCharをそのすべての子コントロールにブロードキャストします。
      • これは、フォーカスされたコントロールの近く(同じフォームの)のコントロールのために、アクセラレータショートカットを実装するのに使えます。
      • 例: TCustomLabelはこの仕組みをalt+アクセラレータが押されたときに、割り当てられた.FocusControlにフォーカスするのに使います。

押されているキーを離した(KeyUp)

キーを離すことは、イベントの発生順序においては、キーを押すこととにています。しかし、いくつかの関数は発生しません。widgetsetはwidgetにキーを処理させる前にCN_KEYUP/CN_SYSKEYUPをLCLに送るでしょう。 そして、そのことは次のような仕組みの DoKeyUpBeforeInterface をコールします。

  1. 親フォームを取得し、そのKeyPreviewがTrueならば、そのDoKeyUpBeforeInterfaceを呼び出します。
  2. 関連づけられているdragobjectにキーを処理させます。
  3. KeyUpBeforeInterface をコールします。 (もし、コントロールがcsNoStdEventsをControlStyleに持っていない場合):
    1. KeyUpをコールします:
      1. OnKeyUp ハンドラがあればコールします。


もし、キーが処理されなければ(すなわち、Message.Result=0)、widgetにキーを処理させます。もしwidgetが有意義なことをすることがなければ、LCLにLM_KEYUP/LM_SYSKEYUPメッセージを送ります。これは、DoRemainingKeyUpを次のようなフローでコールします。


  1. TWinControl内でControlKeyUpを呼び出すと、Application.ControlKeyUpを呼び出します。
    1. フォームのEnterキーやEscapeキーを処理します。
    • もし、あなたの作ったカスタムコントロールがEnterキーやEscapeキーについて何も特別なことをしなければ、オーバーライドや禁止しなければ、
  2. KeyUpAfterInterfaceを呼び出します; TWinControl はここでは何もしません。