C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: 継承フォーム間でのボタン操作(KeyPressイベント?)


(過去ログ 19 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■7446 / inTopicNo.1)  継承フォーム間でのボタン操作(KeyPressイベント?)
  
□投稿者/ hikaru (21回)-(2007/09/05(Wed) 21:27:47)

分類:[.NET 全般] 

いつもお世話になります。
継承フォーム間でのボタンの操作について教えてください。

継承元のフォーム「A」とAを継承する「B」の2つのフォームがあります。
「A」には、ボタンやテキストボックスが配置しています。

「B」から、「A」に配置しているボタンのフォーカスをEnterキーで
テキストボックスに移動させたいのですが、できますでしょうか?
(A・ボタン → Enterキー → A・テキストボックス)
KeyPressでイベントを捕らえようと思いますが、継承先、継承元でもイベント捕らえることができません。

うまく伝えることができなくてすいません。
もし、わかりにくいことがありましたら、質問してください。

よろしくお願いします。
引用返信 編集キー/
■7448 / inTopicNo.2)  Re[1]: 継承フォーム間でのボタン操作(KeyPressイベント?)
□投稿者/ ダッチ (152回)-(2007/09/05(Wed) 22:08:56)
ボタンにフォーカスがあるときに Enter キーを入力すると、ボタンがクリックされた動作をします。
そこで Enter キーの処理は行われたと見なされるため Key 〜 イベントは発生しません。

なのでボタンが Enter キーの処理を行う前にフォームが処理を行う必要があります。

処理の方法は ProcessDialogKey メソッドを使用します。
Enter キーが入力されたときに、フォーカスを移し
戻り値に True を返すようにすればできると思います。

Control.ProcessDialogKey メソッド
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.processdialogkey(VS.80).aspx

Windowsアプリケーションで方向キーなどの特殊キーを処理するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/241windlgkey/windlgkey.html

普通はボタンで Enter キーを入力された場合はクリックされることを期待するため、
ユーザが戸惑うと思いますが、なにかしらの理由があるんでしょうね。
引用返信 編集キー/
■7456 / inTopicNo.3)  Re[2]: 継承フォーム間でのボタン操作(KeyPressイベント?)
□投稿者/ hikaru (23回)-(2007/09/06(Thu) 06:16:22)
ダッチ さん、早速の回答ありがとうございます。
以下のように「ProcessDialogKey」を使いました。

protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Enter)
{
button1.Focus();
}
return base.ProcessDialogKey(keyData);
}

ありがとうございます。

そこで、また質問させてください。
上記のコーディングでは、フォーム全体のメソッドとして機能してしまいます。
なので、ボタンのみのメソッドとして機能させる方法はありませんか?
(コントロールのみのメソッドとして機能する方法があると、HPに記述してありましたが、
具体的にどのようにすればいいのか、わからないので、お手数ですが教えてください)

あと、本当に申し訳ないのですが、
フォーカスを移動するときに、タブキーと同じように移動させたいのですが、できますでしょか?
今のままだと、Enable=Falseのコントロールにフォーカスを動かそうとすると、フォーカスは移動できません。
タブキーでのフォーカスの移動は、そのような場合は、その次のコントロールにフォーカスが移動します。

申し訳ありませんが、よろしくお願いします。

説明が下手ですいません。適切な表現ができず、申し訳ありません。
どうぞ、よろしくお願いします。



No7448 (ダッチ さん) に返信
> ボタンにフォーカスがあるときに Enter キーを入力すると、ボタンがクリックされた動作をします。
> そこで Enter キーの処理は行われたと見なされるため Key 〜 イベントは発生しません。
>
> なのでボタンが Enter キーの処理を行う前にフォームが処理を行う必要があります。
>
> 処理の方法は ProcessDialogKey メソッドを使用します。
> Enter キーが入力されたときに、フォーカスを移し
> 戻り値に True を返すようにすればできると思います。
>
> Control.ProcessDialogKey メソッド
> http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.processdialogkey(VS.80).aspx
>
> Windowsアプリケーションで方向キーなどの特殊キーを処理するには?
> http://www.atmarkit.co.jp/fdotnet/dotnettips/241windlgkey/windlgkey.html
>
> 普通はボタンで Enter キーを入力された場合はクリックされることを期待するため、
> ユーザが戸惑うと思いますが、なにかしらの理由があるんでしょうね。
引用返信 編集キー/
■7471 / inTopicNo.4)  Re[3]: 継承フォーム間でのボタン操作(KeyPressイベント?)
□投稿者/ ダッチ (153回)-(2007/09/06(Thu) 12:52:31)
> 上記のコーディングでは、フォーム全体のメソッドとして機能してしまいます。
フォームに書けばそのようになります。
ボタンだけで行いたいのであれば、ボタンに ProcessDialogKey メソッドを書けばいいです。

> フォーカスを移動するときに、タブキーと同じように移動させたいのですが、できますでしょか?
そのように処理を上書きすればいいです。
そのための override です。

protected override bool ProcessDialogKey(Keys keyData)
{
    if (keyData == Keys.Enter)
    {
        // Enter キーの時は Tab キーに上書きする
        return base.ProcessDialogKey(Keys.Tab);
    }
    else
    {
        // それ以外のキーの時はそのまま
        return base.ProcessDialogKey(keyData);
    }
}

引用返信 編集キー/
■7532 / inTopicNo.5)  Re[4]: 継承フォーム間でのボタン操作(KeyPressイベント?)
□投稿者/ hikaru (24回)-(2007/09/07(Fri) 14:50:03)
No7471 (ダッチ さん) に返信
ダッチ さん、ありがとうございます。

> 上記のコーディングでは、フォーム全体のメソッドとして機能してしまいます。
> フォームに書けばそのようになります。
> ボタンだけで行いたいのであれば、ボタンに ProcessDialogKey メソッドを書けばいいです。
>

フォームに書いているのはわかりますが、ボタンのところというのは、具体的にどこに書けばいいかわかりません。
「Designer」ということなのでしょうか?

初歩的なことで申し訳ありませんが、よろしくお願いします。


> protected override bool ProcessDialogKey(Keys keyData)
> {
> if (keyData == Keys.Enter)
> {
> // Enter キーの時は Tab キーに上書きする
> return base.ProcessDialogKey(Keys.Tab);
> }
> else
> {
> // それ以外のキーの時はそのまま
> return base.ProcessDialogKey(keyData);
> }
> }
>

ご丁寧にありがとうございます。
override、できました。ありがとうございます。

何度も申し訳ございませんが、よろしくお願いします。



引用返信 編集キー/
■7557 / inTopicNo.6)  Re[5]: 継承フォーム間でのボタン操作(KeyPressイベント?)
□投稿者/ ダッチ (155回)-(2007/09/07(Fri) 21:37:05)
> フォームに書いているのはわかりますが、ボタンのところというのは、具体的にどこに書けばいいかわかりません。
> 「Designer」ということなのでしょうか?
ボタンを継承して新しいボタンコントロールを作成します。
そのソースに ProcessDialogKey メソッドを書けば、
そのボタンに対してのみ Enter キーを入力した処理を上書きする事が出来ます。

ボタンを継承するには、次のように書きます。

    class MyButton : Button // クラス名 : ここが継承するコントロール
    {
        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                return base.ProcessDialogKey(Keys.Tab);
            }
            else
            {
                return base.ProcessDialogKey(keyData);
            }
        }
    }

これで MyButton コントロールの出来上がりです。
ビルドをすれば自動的にツールボックスに表示されると思います。

引用返信 編集キー/
■7595 / inTopicNo.7)  Re[6]: 継承フォーム間でのボタン操作(KeyPressイベント?)
□投稿者/ hikaru (25回)-(2007/09/11(Tue) 03:08:47)
No7557 (ダッチ さん) に返信

ダッチさん、ありがとうございます。
お礼が遅れてしまい、申し訳ございません。

ダッチさんのおっしゃる通り、自動的にツールボックスに表示されたので、
そのボタンを組み込みました。

ご丁寧にありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -