- PR -

AcceptsTab, AcceptsReturn の実現

1
投稿者投稿内容
文科系ぷろぐらま
会議室デビュー日: 2004/03/21
投稿数: 2
投稿日時: 2004-03-21 14:36
初めての書き込みです。よろしくお願いします。

Borland C#Builder で遊んでいるのですが、
この度キーワードの色分け機能つきのテキストエディタを作成しました。
作ったときはフォームを直に描画していたので気づかなかったのですが、
エディタ部分をユーザーコントロールに移植した時に、
タブキーや矢印キーの入力が親フォームに取られてしまうようになりました。
いろいろ試してみたのですが、スマートに問題を解決できないので
ヒントをいただければ幸いです。

解決法1.
 親フォームのProcessDialogKey関数などをオーバーライドする

→問題
 エディタにKeyPressイベントが来るようになったのですが、
これではコントロールを貼り付けるたびに親フォームをいじらねばなりません。
できればTextBoxの「AcceptsTab」プロパティのように、
親フォームに迷惑をかけずにキーイベントを拾いたい...

解決法2.
 キーボードイベントのフック(SetWindowsHookExだったかな?)

→問題
 ...しんどいです(TT
 チャレンジしてみたのですが、標準のキー操作が(フォーカス移動など)
失われてしまいます。たとえば、タブキーをフックすると、
IMEの変換中にタブを押しても、エディタにタブ文字が挿入されたしまったり...
「IMEで変換中か?」などを調べている間にコードがぐちゃぐちゃになっちゃいました
なんだか根本的に間違ってる気がします。

別に解決策1でもいいんですけど、できれば単一のコントロールとして
完結したものにしてみたいのでよろしくお願いします。
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-03-21 15:41
引用:

解決法1.
 親フォームのProcessDialogKey関数などをオーバーライドする

→問題
 エディタにKeyPressイベントが来るようになったのですが、
これではコントロールを貼り付けるたびに親フォームをいじらねばなりません。
できればTextBoxの「AcceptsTab」プロパティのように、
親フォームに迷惑をかけずにキーイベントを拾いたい...


こんにちは。
自分はこれでやっちゃってます^^。
言われた二つの方法以外にも確かに方法はありそうですね、、、、
意味のない返答ですんません。
_________________
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-03-21 23:14
> 解決法1.
> 親フォームのProcessDialogKey関数などをオーバーライドする

いや、よく読んでみたら
これがおかしいですね。
私は、コントロール自身のProcessDialogKeyをオーバーライドしてます。
これなら、何の問題もないです。

最初読んだとき「親フォームの」のところが見えてませんでしたので
上のような返答になってしまいました。
_________________
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2004-03-22 03:30
Control.IsInputKey,Control.IsInputChar あたりをオーバーライドされてはどうでしょうか。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=9169&forum=7


[ メッセージ編集済み 編集者: ya 編集日時 2004-03-22 03:32 ]
文科系ぷろぐらま
会議室デビュー日: 2004/03/21
投稿数: 2
投稿日時: 2004-03-22 04:03
CHNさん、yaさん、どうもありがとうございます

なんだか「ProcessDialogKeyは親フォームでオーバーライドしなきゃいけない」と
勝手に思い込んでいたのが敗因のようです(TT
IsInputCharなんのもあるんですね。
フォーカス関連はまだ理解不足なので、いろいろ試して結果をご報告したく思います。

ちょっと見ただけですけど、「TabでTab文字入力、Ctrl+Tabでフォーカス移動」などの
動作も再現したいので、IsInputKeyは少し非力かもしれません。
「検索文字列(&F)」と書いたLabelの隣にComboBoxを置いて
Alt+Fでコンボボックスにフォーカスを移動させる動作に使えるかな?
(Delphiではラベルのプロパティをいじるだけでできたので、考えたこともなかった…
 気づかないうちにいろいろ助けてもらってたんですね。C#に転んでごめん>Delphi)
1

スキルアップ/キャリアアップ(JOB@IT)