フォーカスを無効にする方法と苦戦している理由

このQ&Aのポイント
  • VB2010の環境で電卓を作っていますが、フォーカスを無効にする方法がわかりません。
  • Windowsの電卓を参考にしているのですが、ボタンを押した時にフォーカスが設定されないような状況を作りたいです。
  • 現在、フォーカスを無効にするための記述方法に苦戦しています。どのように記述すればよいでしょうか。
回答を見る
  • ベストアンサー

フォーカスを無効にしたいのですが、できません。どうしたらいいでしょう?

フォーカスを無効にしたいのですが、できません。どうしたらいいでしょう? VB2010の環境で電卓を作っています。計算処理は問題ないのですが、一番肝心なのは、フォーカスフォーカスの問題です。 フォーム上にボタンコントロール多数及びラベルコントロールがあります。 Windowsに付属する電卓を参考に作っています。Windowsの電卓では、ボタンを押したとき、そのままフォーカスは設定されないようになっていることがわかります。よって、エンターキーを押したときに、フォーム上のボタンコントロールの例えば”1”をクリックした動作が起こるわけではありません。それは、”1”のボタンにフォーカスが設定されていないからです。 このようにフォーカスに左右されないような状況を作りたいのですが、どうもできなくて苦戦しているところであります。 どのように記述したらよいのでしょう。 どうかご教授お願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • emsuja
  • ベストアンサー率50% (1034/2055)
回答No.1

私がその昔 VB6 で電卓を作った時は数字ボタンを押したクリックイベントの最後で入力数値が表示されている TextBox にフォーカスを強制的に動かしていました。 そうすれば TextBox に直接数値を入力する事も可能です。 四則演算のボタンを押しても同じように TextBox にフォーカスを動かします。 TextBox 上のカーソルの位置も制御する必要があるので TextBox にフォーカスと移動させる処理もサブルーチン化しておいた方が後々楽です。

yangxun38
質問者

お礼

なるほど。大変参考になりました。 おかげで解決にいたりました。 表示処理をラベルコントロールのままにし、テキストボックスを隠れる場所に配置。 そこにフォーカスをすべて動かすことで、とりあえず、目的達成にいたりました。 どうも、ありがとうございました!

その他の回答 (1)

回答No.2

電卓の動きは、計算処理ロジックを行った後、結果表示のテキスト部分にフォーカスを飛ばしているようです。 フォーカス消しの足し算サンプルです。 ※必要なもの Form1 →ボタン1~4 →テキストボックス Public Class Form1  <System.Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=System.Runtime.InteropServices.CharSet.Auto)> Private Shared Function HideCaret(ByVal hwnd As IntPtr) As Integer  End Function  Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load   Me.Button1.Text = "1"   Me.Button2.Text = "2"   Me.Button3.Text = "3"   Me.Button4.Text = "C"   With Me.TextBox1    .ReadOnly = True    .BackColor = Color.White    .ForeColor = Color.Black    .Text = 0    .TabIndex = 0   End With   Dim typBtn As Type = GetType(Button)   For Each ctl As Control In Me.Controls    If ctl.GetType Is typBtn Then     Dim btn As Button = ctl     AddHandler btn.Click, AddressOf All_Click    End If   Next  End Sub  Private Sub Num_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click   Dim btn As Button = sender   SumCalc(btn.Text)  End Sub  Private Sub C_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click   Me.TextBox1.Text = "0"  End Sub  Private Sub All_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)   Me.TextBox1.Focus()  End Sub  Private Sub TextBox1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.GotFocus   With Me.TextBox1    Call HideCaret(.Handle)    .[Select](.Text.Length, 0)   End With  End Sub  Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress   If IsNumeric(e.KeyChar) Then    SumCalc(e.KeyChar)   End If  End Sub  Sub SumCalc(ByVal pVal As String)   Me.TextBox1.Text = CULng(Me.TextBox1.Text) + CULng(pVal)  End Sub End Class

関連するQ&A

  • VB6 ユーザーコントロールのフォーカス無効

    現在VB6 SP5にて、テンキーのようなユーザーコントロールを作成しています。 コマンドボタンを配置し、押された場合にキーボードの入力をエミュレートするような作りにしています。 問題は、作成したコントロールをフォームに貼り付けて使用する場合に、マウスでクリックしたキーに応じて、現在フォーカスのあるテキストボックスなどに入力したいのですが、ユーザーコントロールのコマンドボタンにフォーカスが移ってしまい、うまくいきません。 ユーザーコントロールのCanGetFocusプロパティをFalseに設定しようとすると、「フォーカスを取得できないコントロール上に配置された子コントロールは、フォーカスを取得することができません。」とエラーが表示されてFalseにできません。 フォーカスを無効にし、このような機能を実現するには何か良い方法ありますでしょうか?

  • フォーカスを持たないユーザコントロール

    ユーザコントロールにラベルをひとつ貼り付け、 ラベルを機能拡張したユーザコントロールを作成しているのですが、このコントロールはフォーカスを持たないようにしたいのです。 よろしくお願いします。 Win2K SP4 + VB6 SP6

  • ユーザーがクリックするまでフォーカスをつけない方法(Access VBA)

    こんにちは。 AccessVBAですが、ユーザーフォーム上で、 ユーザーが、コントロールをクリックするまで、 フォーカスを設定しない方法は、あるでしょうか。 テキストにフォーカスされたときの黒反転が、 綺麗でないので、フォーカスさせたくありません。 フォームを開いたときに、強引にボタンにフォーカス する、方法もありますが、ボタンのないフォーム ですと、この方法が使えません。 何か、いい方法がありましたら、教えてください。 お願いします。

  • SSTabのフォーカスの移動について!

    Windows2000、VB6.0、SP5で開発しています。 質問は、SSTabのフォーカス移動についてです。 SSTab上のコントロール上にフォーカスがある時、 Tabでフォーカスの移動をしてると、急にフォーカスが見えなくなってしまうことがあります。 調べてみると、隠れているコントロールに移動してしまってるみたいなんですが、 これは、解決策はないんでしょうか? 最後のコントロールでSetFocusを使うとかあったのですが、その場合、 最後のコントロールにフォーカスがある時に、どのコントロールをクリックしても、 最後のコントロールのSetFocusで設定したコントロールにフォーカスが移動してしまいます。 良い方法をご存知の方、いらっしゃいましたら、 どうぞ、ご教授よろしくおねがいしますm(_ _)m

  • フォーカスの順番移動

    VBAで今フォーム1にテキストボックス2つ コンボボックス3つ上から順にあるのですが エンターキーまたはタブを押すと上から順番にフォーカスを移動させたいので すが、どうすればいいのでしょうか?プロパティの設定でできるのでしょうか ?今はタブキーを押すとばらばらの順番でフォーカスが移動します。なぜでしょう? ちなみにコントロールの名前は上から TextBox1、TextBox2、ComboBox1、ComboBox2、ComboBox3です

  • フォーカスの移動

    IMEソフトキーボードのようなものを作っています。 フォーム1にテキストボックスがあり、フォーム2をソフトキーボード。というように作りたいと思っているのですが問題があります。 コマンドボタンを押すごとに1文字ずつ送るような作りになっているのですが、1文字ごとにテキストボックスからコマンドボタンにフォーカスが移るため、2文字以上の文字列の変換ができないのです。VB的に無理なのかもしれないですが、IMEソフトキーボードのようにテキストボックスにフォーカスをセットしたままの文字入力を出来ないでしょうか?ちなみにkeybd_eventを使っています。 時間がありましたら、ご教授のほどよろしくお願いします。

  • コマンドボタンのEnterイベント後に、フォーカスを移動したい。

    コマンドボタンのEnterイベント後に、フォーカスを移動したい。 フォームに「TextBox1」(TabIndex=0)「TextBox2」(TabIndex=1)「CommandButton1」(TabIndex=2)の3つのコントロールがある場合。 CommandButton1がクリックされた場合も、TextBox2からCommandButton1に、タブキーまたはエンターキーで、フォーカスが移った場合にも、同じ処理を行い、処理結果によってTextBox1やTextBox2にフォーカスを移したいと考えています。 以下のようなサンプルを作成しました。 Private Sub CommandButton1_Enter() CommandButton1_Click End Sub Private Sub CommandButton1_Click() MsgBox ("OK") TextBox2.SetFocus End Sub この場合、CommandButton1_Enterのイベントが起こった場合、CommandButton1_Click()のTextBox2.SetFocusは効きません。 (正確には、CommandButton1_Enterイベントが終わった時点で無効でしょうか。) Enterイベントは、フォーカスが移動する前に発生するため、このイベントが終わった後に、そもそもの動作に戻り、フォーカス移動が発生してしまうからなのだと思っております。 要は、コマンドボタンにタブキーやエンターキーでフォーカスしても、コマンドボタンをクリックしたのと同じ処理を行い、所定の位置にフォーカスを持っていきたいのですが、どのように行えば良いか、わからない状況です。 よろしくお願いいたします。

  • フォームを継承した際の、コントロールへのフォーカスの設定方法

    こんにちは。 フォームを継承した際の、コントロールへのフォーカスの設定方法について質問です。 ※利用しているバージョンは、.NET 2003 です。 1 : フォーム『 frmParent 』と、frmParent を継承したフォーム『 frmChild 』があります。 2 : frmParent には、ボタン『 btnTest 』が配置されています。 3 : frmParent 内で、Load イベントの ハンドラとして、以下を記述します。    Private Sub frmParent_Load( _      ByVal sender As Object, ByVal e As System.EventArgs) _      Handles MyBase.Load      btnTest.Focus()    End Sub 4 : 以下を実行し、frmChild フォームをディスプレイに表示します。    Dim frm As New frmChild    frm.Show() この際、btnTest ボタンにフォーカスが設定された状態でフォームを表示したいのですが、実際はフォーカスが設定されていません。 btnTest.CanFocus の値を調べると、False になっているのですが、なぜ CanFocus が False になるのか理由がわかりません。 ヘルプによると、入力フォーカスを受け取る条件として、  1 : コントロールの ControlStyles.Selectable スタイル ビットが true に設定されていること  2 : コントロールが別のコントロールに格納されていること  3 : すべての親コントロールが表示されており、有効であること と書いてあったのですが、1 がよくわかりません。 根本的に考え方が間違えているのかもしれません…。 フォーカスを設定する方法をご教示ください。よろしくお願い致します。

  • 「送信」ボタンからフォーカスを自動的に外す方法

    こんにちは。PHP初心者です。 先日、PHPでメールフォームを作成しました。 テキストエリアに"住所""名前"など入力し、最後に『送信』ボタンを押す。 と、ごく普通のメールフォームです。動作などは全く問題ありません。 でもどうしても気になることが。。。 それは最初にページを開いて、テキストエリアをクリックすると、 『送信』ボタンにもフォーカスされてしまいます。 これだと、入力が完了してない状態でエンターキーを押してしまうと、 次ページ(確認ページ)に移動してしまうのです。。。 どこがどうなって、こういった現象が出るのかわかりません。 簡単な方法としては、常に『送信』ボタンからフォーカスを外す方法 と安易に考えてます。。。 教えて下さい。 また、これが原因じゃない?という意見などもあれば教えて下さい^^

    • 締切済み
    • PHP
  • コントロールにフォーカスをおくとカナモードになる

    言語バーのKANAが有効になっている状態で半角カナを入力し、submitをかけ、その後にKANAを無効にして、フォーカスをコントロール(どれでも)におくと自動的にKANAが有効になってしまいます。 これはなぜでしょうか??どっかでこのモードが保持されているのでしょうか?? KANAの有効無効の設定はCtrl+Shift+カタカナひらがなボタンで行っています。 すごいわかりにくい説明ですいません。説明するのがむずかしい。。。

専門家に質問してみよう