- PR -

ボタン押下時のフォーカス遷移

投稿者投稿内容
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2003-11-11 18:40
お世話になります。
VB .NET 2003 でちょっと困ってしまいました。

通常は、無効(Enabled = False) なのですが、いくつかのテキスト項目に
フォーカスがある場合にだけ有効になるボタンがあります。
ここで、単純にこれらのテキスト項目について Enter / Leave イベント
ハンドラを実装し、そこでボタンの有効化/無効化を行なおうとしました。

ところが、該当テキスト項目にフォーカスがある状態でボタンをクリック
すると、該当テキスト項目がフォーカスを失ってしまうため、
クリックイベントが発生する直前にボタンが無効になってしまうのです。


ボタンが押されても、元のコンポーネントにフォーカスが残ったままで、
且つ、ボタンの Click イベントを発生させることってできないのでしょうか。

よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-11 23:39
こんにちわ。諸農です。

なんとなく無茶な感じですね(^^;

どのようなフォームデザインなのかはわかりませんが、
Leaveイベントでの処理をなしにすればうまく行くかもしれないですね。

Enterイベントで、フォームクラスのグローバル変数に現在フォーカスの
あるオブジェクトを格納しておき、ボタンが押された後は(ボタンのク
リックイベント内で)グローバル変数に格納されたオブジェクトにフォ
ーカスをセットするようにしてみればいかがですか。

ただし、上記考え方だけでは考慮不足の部分もあるかと思いますので、
そのあたりの穴埋めを忘れないでくださいね。

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2003-11-12 01:48
ボアさん、こんばんは。
引用:

通常は、無効(Enabled = False) なのですが、いくつかのテキスト項目に
フォーカスがある場合にだけ有効になるボタンがあります。



まず、確認なのですが、これはWindows フォーム アプリケーションのお話ですよね?
それと、「テキスト項目」というのは、TextBox の事でよろしいでしょうか?
そうであると仮定して話を進めますが、単純に、Control.GotFocus イベントで Button.Enabled プロパティの制御を行えば解決するような気がします。

コード:

Private Sub TextBox_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles _
TextBox1.GotFocus, _
TextBox2.GotFocus, _
TextBox3.GotFocus, _
TextBox4.GotFocus

' フォーム上のテキストボックス(TextBox1 〜 TextBox4)のうち、
' TextBox2 にフォーカスがあるときだけボタンを有効にする
If CType(sender, TextBox) Is TextBox2 Then
Me.Button1.Enabled = True
Else
Me.Button1.Enabled = False
End If

End Sub





[ メッセージ編集済み 編集者: きくちゃん 編集日時 2003-11-12 01:50 ]
KeroKero
常連さん
会議室デビュー日: 2003/11/06
投稿数: 26
投稿日時: 2003-11-12 08:45
Application.AddMessageFilterというものがありますが,どうでしょう。
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2003-11-13 09:33
みなさんご回答ありがとうございます。
いろいろ対応策はありそうですが、結局ボタンが押されたときに、この
ボタンにフォーカスが移ってしまうのは避けられないのでしょうか。。。

引用:
諸農さん
Enterイベントで、フォームクラスのグローバル変数に現在フォーカスの
あるオブジェクトを格納しておき、ボタンが押された後は(ボタンのク
リックイベント内で)グローバル変数に格納されたオブジェクトにフォ
ーカスをセットするようにしてみればいかがですか。



こうした時、その他のテキスト項目にフォーカスがある場合にどのように
ボタンを無効にするかが問題なのですが、

引用:
きくちゃんさん
まず、確認なのですが、これはWindows フォーム アプリケーションのお話ですよね?
それと、「テキスト項目」というのは、TextBox の事でよろしいでしょうか?



言葉が足らずスミマセン。上記であってます。

引用:
そうであると仮定して話を進めますが、単純に、Control.GotFocus イベントで Button.Enabled プロパティの制御を行えば解決するような気がします。



この場合、無効になるテキスト項目全てを対象に含める必要があります
よね。サンプルで提示いただいた方法で確かにできそうですが、なんか
スマートじゃないなぁというのが率直な感想です。

引用:
KeroKero さん
Application.AddMessageFilterというものがありますが,どうでしょう。



ちょっとだけ調べてみましたが、ようはイベントが発生する前にマウスの
クリックイベントだけ捕まえて、場合わけを行うようなイメージなので
しょうか?
具体的に試してみないとなんともいえませんが、これを使うのは結構
一般的なのですか?

VB .NET ってフォーカス遷移については結構神経質にならないと
うまく使いこなせないような気がしてきました。
なかなか楽できないものですね。
架空兎
ベテラン
会議室デビュー日: 2003/08/18
投稿数: 78
お住まい・勤務地: さいたま氏
投稿日時: 2003-11-13 10:17
引用:

いろいろ対応策はありそうですが、結局ボタンが押されたときに、この
ボタンにフォーカスが移ってしまうのは避けられないのでしょうか。。。


恐らく無理だと思います。
#もしできるとしても簡単にはいかないと思います。

引用:

通常は、無効(Enabled = False) なのですが、いくつかのテキスト項目に
フォーカスがある場合にだけ有効になるボタンがあります。
ここで、単純にこれらのテキスト項目について Enter / Leave イベント
ハンドラを実装し、そこでボタンの有効化/無効化を行なおうとしました。

ところが、該当テキスト項目にフォーカスがある状態でボタンをクリック
すると、該当テキスト項目がフォーカスを失ってしまうため、
クリックイベントが発生する直前にボタンが無効になってしまうのです。


パネルの上にテキストボックスとボタンを配置して、そのパネルの Enter/Leave イベントで
ボタンの有効化/無効化を行うというのはどうでしょうか?
ユミ
会議室デビュー日: 2003/11/13
投稿数: 1
投稿日時: 2003-11-13 11:15
はじめまして。

引用:
--------------------------------------------------------------------------------

いろいろ対応策はありそうですが、結局ボタンが押されたときに、この
ボタンにフォーカスが移ってしまうのは避けられないのでしょうか。。。

--------------------------------------------------------------------------------

この方法はどうでしょうか?

・Buttonを継承したクラスを作成します。
・そのクラスのNew( )の中で
 SetStyle(ControlStyles.Selectable, False)
 を書いてください。

そのボタンには決してフォーカスが移りません。

このボタンを使えばテキストボックスのEnter、Leaveで
ボタンのEnableを設定しても問題ないと思います。

お試しください。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-13 13:03
こんにちわ。諸農です。

引用:

引用:
諸農さん
Enterイベントで、フォームクラスのグローバル変数に現在フォーカスの
あるオブジェクトを格納しておき、ボタンが押された後は(ボタンのク
リックイベント内で)グローバル変数に格納されたオブジェクトにフォ
ーカスをセットするようにしてみればいかがですか。



こうした時、その他のテキスト項目にフォーカスがある場合にどのように
ボタンを無効にするかが問題なのですが、



えっと、ちょっとイメージがつかみきれていないのですが

フォームにTextBoxが3つあって、Buttonが1つあったとします。
3つのTextBoxのうち、1つにフォーカスがある場合にはボタンが
有効化され、且つ、その時だけボタンイベントハンドラが起動でき
ればいいんですよね。

C#で申し訳ないですが、ボタンを有効化したいTextBoxのTagプロ
パティに1をセットしておいて、ボタンの有効化制御をしてみました。
3つのTextBoxのEntryイベントに以下のイベントハンドラをセットしています。

コード:
private TextBox tb = null;
private void textBox1_Enter(object sender, System.EventArgs e)
{
	TextBox _tb = sender as TextBox;
	if (_tb != null){
		if (_tb.Tag == null)
		{
			button1.Enabled = false;
		}
		else
		{
			button1.Enabled = true;
		}
		tb = _tb;
	}
}

private void button1_Click(object sender, System.EventArgs e)
{
	if (tb.Tag != null)
	{
		label1.Text = "クリックされました";
		tb.Focus();
	}
}



でも、こんな感じではないということなのかしらん(^^ゞ

ではでは(^^)/

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

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