LCL Key Handling/ja

From Lazarus wiki
Revision as of 00:59, 1 November 2006 by Saeka-jp (talk | contribs)
Jump to navigationJump to search

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. get parent form, if it has keypreview, call it's DoKeyUpBeforeInterface
  2. let the associated dragobject handle the key
  3. call KeyUpBeforeInterface (if control does not have csNoStdEvents in ControlStyle):
    1. call KeyUp:
      1. call OnKeyUp handler if any

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:

  1. call ControlKeyUp, which in TWinControl, calls Application.ControlKeyDown:
    1. handle Enter and Escape keys for forms
    • if your custom control does something special with enter and escape, override and inhibit
  2. call KeyUpAfterInterface; TWinControl does nothing here