【VB】テキストボックスのキーハンドルについて

このQ&Aのポイント
  • Visual Basic初心者がテキストボックスのキーハンドルについて困っています。
  • テキストボックスでCtrl+Spaceキーを押すとテキストの補間を行いたいです。
  • しかし、プログラムをコンパイルすると「HANDLES 句には、それを含む型または基本型の1つで定義されたWithEvents変数が必要です」というエラーが出ます。
回答を見る
  • ベストアンサー

【VB】テキストボックスのキーハンドルについて

はじめまして。 Visual Basic初心者でキーハンドルについて困っています。 行いたいことは、 1.テキストボックスでctrl + space キーを押す。 2.テキストの補間を行う。 です。ですが下記のプログラムをコンパイルした時、 Sub MainTextKeyDown...の行で以下のエラーがでます。 「HANDLES 句には、それを含む型または基本型の 1 つで定義された WithEvents 変数が必要です。」 実際のプログラムです。(テキストボックスは"MainText"という名前で作成してあります。) ↓ Public Partial Class MainForm Public Sub New() ' The Me.InitializeComponent call is required for Windows Forms designer support. Me.InitializeComponent() ' ' TODO : Add constructor code after InitializeComponents ' End Sub Sub MainFormLoad(sender As Object, e As EventArgs) Handles MyBase.Load Me.KeyPreview = True End Sub Sub MainTextTextChanged(sender As Object, e As System.Windows.Forms.KeyEventArgs) End Sub Sub MainTextKeyDown( sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles MainText.KeyDown If e.Control Then If e.KeyCode = Keys.Space Then ' 補間処理 End If End If End Class エラー内容は調べましたが、解決が見つかりませんでした。 まだまだ勉強したてで、単純なミスかもしれませんがよろしくお願いします。

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

  • ベストアンサー
  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

まず、質問の内容とは違いますが、 提示のコードでは、最後から2行目に  End Sub が抜けているのでその時点でコンパイルエラーです。 >「HANDLES 句には、それを含む型または基本型の 1 つで定義された WithEvents 変数が必要です。」 http://msdn.microsoft.com/ja-jp/library/32787dt6(v=VS.100).aspx 画面上のコントロールをイベントの関数と結びつけるのが HANDLES 句です。 そこでエラーが出てる事からコントロールと結びつけができていないと予想できます。 > Handles 句に WithEvents 変数が指定されませんでした。(MSDN より抜粋) 「WithEvents 変数」というのはデザイン画面でコントロールを配置した時点で コントロール名と同じものが自動で宣言されています。(場所は InitializeComponent 内) ここまで分かれば、エラーメッセージの通りです。デザイン画面で配置した コントロール名が間違っているのではないでしょうか。 つまり、 >(テキストボックスは"MainText"という名前で作成してあります。) 作成したと思い込んでるだけで、スペルミス等で画面上に MainText が存在しない (もしくはコードを書き換えて食い違っている)と思われます。 イベント関数は、基本的に、コード入力画面上部のコンボボックスを選択して VB に自動で書かせます。 その場合、Private 宣言になると思います。また関数名のデフォルトは 「コントロール名_イベント名」です。 提示のコードは、最初から手書きか、修正されています。 初心者はそんなところでケアレスミスを犯すので、自動で書かせて動く事を 確認してから修正すべきでしょう。

tomu_sanboy
質問者

お礼

自動で書かせることができるんですね。^^; いままで、javaやc言語しか触ったことしかなかったので知りませんでした。 早速試してみたら、ちゃんと動きました。ありがとうございます。 あと、せっかく回答していただいた方に言葉を返すようで申し訳ないのですが >まず、質問の内容とは違いますが、 >提示のコードでは、最後から2行目に > End Sub >が抜けているのでその時点でコンパイルエラーです。 とのことですが、1行目がクラスの開始 2行目がメソッドの開始なので問題ないと思います。

関連するQ&A

  • VB2008でPictureBoxをキーボードを使って動かしたい

    VBを始めたばかりの初心者です。 VB2008を使ってPictureBoxに取り込んだイラストをキーボードを使って自由に動かしたいと思っています。 今作ったものの問題点 1.現状、全く同時に→と↑のキーを押せば右上に動きます。  また、→キーを押してイラストが右に動いているときに、↑キーを押すと上に動きます。  これを右上に動くようにする方法が知りたいのです。 2.キーを押し続けてイラストを動かし続けようとすると、一回動いて止まってから動き続けるという風になってしまいます。  これを止まらずに動くようにしたいのです。 ちなみにこれ↓が今のソースコードです。 Public Class Form1 Private Sub form1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Up Then PictureBox1.Top = PictureBox1.Top - 10 End If End Sub Private Sub form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Down Then PictureBox1.Top = PictureBox1.Top + 10 End If End Sub Private Sub form1_KeyLeft(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Left Then PictureBox1.Left = PictureBox1.Left - 10 End If End Sub Private Sub form1_KeyRight(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown If e.KeyCode = Keys.Right Then PictureBox1.Left = PictureBox1.Left + 10 End If End Sub End Class これ↑を実行する場合は、デザインにPictureBoxを表示してください。PictureBoxに入れるイラストは適当なものを入れてください。 よろしくお願いします。

  • VB2005 TextBoxの入力制限について

    はじめて質問させていただきます。 現在、VB2005を使ってプログラムを組んでいるのですが、半角カタカナだけをTextBoxに入力し、表示する方法がわかりません。 Private Sub TextBox6_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox6.KeyDown TextBox6.ImeMode = Windows.Forms.ImeMode.KatakanaHalf End Sub Private Sub TextBox6_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox6.KeyPress If (e.KeyChar < "ア"c Or e.KeyChar > "-"c) And e.KeyChar <> vbBack Then e.Handled = True End If End Sub ↑見にくいかもしれませんがコードです。 この方法ではだめなのでしょうか? 回答をお願いします

  • VB2013でのプログラム作成でつまづきました

    初めまして ご質問です 会社にて、職場改善のため VB2013でプログラムを作成していますが PCに詳しいのが自分しかいなく、指名されました。。。 もちろん自作PCとか作れるぐらいですが プログラムなんてやったことないし困っています 職場にプログラム専門の方がいるので教育を受けていますが 2.3回教えてもらって  「windowsの電卓を作ろう」と言われました 電卓作成は、初心者用の題材らしいですが とりあえず教えてもらった事を駆使し まずは、テキストボックスとテキストボックスに数字を入れ その二つを +や-ボタンを押し =ボタンを押すと、3つ目のテキストボックスに表示させるという 簡単なプログラムは、なんとかできましたが windowsぽくすると 例 11 + 12 - 9 とテキストに表示され =ボタンを押すと 表示が消え 計算結果が表示されます いまの問題 ・整数と文字列を表示させ、計算だけさせる ・変数宣言、IF、Serectしか教わってない(それだけでできる言われた笑) ・まだ、いまいちわかっていないため 詳しく知りたい 無論、教えてもらったコードをそのまま使いたいわけじゃなく どーいう流れで、どーいう風にというのを理解したいです 結局は自分が理解して、少しずつやらないといけないので 詳しい方、教えてください。 現在なにもできてないコードです ここにどう埋めるか教えてほしいです ------------------------------------------------------------------------------ Option Explicit On Public Class Form Public oboe As String '押されたボタンが数値以外を覚える変数 Public befor As String '押されたボタンが数値の場合 覚える変数 Public anser As Integer ' 計算結果を保存する 変数 Public number As Integer '入力された数値を保存する 変数 Private Sub Form_Load(sender As Object, e As EventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '1 befor = "1" ans.Text &= "1" End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '2 befor = "2" ans.Text &= "2" End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '3 befor = "3" ans.Text &= "3" End Sub Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click 'たし算 oboe = "+" ans.Text &= "+" number = befor + ans.Text End Sub Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '掛け算 End Sub Private Sub Button4_Click_1(sender As Object, e As EventArgs) Handles Button4.Click '計算 End Sub Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click 'CLEAR End Sub Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '引き算 End Sub Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '割り算 End Sub Private Sub ans_TextChanged(sender As Object, e As EventArgs) Handles ans.TextChanged

  • テキストボックスの改行について質問です。

    VB超初心者です。 現在VBで複数のCSVファイルを処理するアプリケーションを作成しています。 ドラッグドロップでファイルを認識して処理するのが目的です。 そこでまずテキストボックスにドラッグしたファイル名を表示したいと考えており、 ネットで公開されている以下のソースを利用したいと思っています。 Private Sub TextBox1_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy End If End Sub Private Sub TextBox1_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles TextBox1.DragDrop TextBox1.Text = e.Data.GetData(DataFormats.FileDrop)(0) End Sub しかし、これでは複数のファイルの表示ができませんでした。 テキストボックス内で改行させるにはどこを変更したら良いのか全く分かりません。 また、ファイル名ではなくファイルの階層を表示するのも目的と少し異なってしまいます。 調べてみても良くわかりませんでした。 そこでVBに精通している方にお願いです。 希望通りに表示する方法のアドバイスをお願いします!!

  • KeyUpイベントにて

    テキストボックスのKeyUpイベントにて『Enter』または『Tab』が押されたら処理をさせようと Private Sub Text_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Text.KeyUp If e.KeyCode = Keys.Enter or e.KeyCode = Keys.Tab Then   処理コード End If End Sub としたのですが『Enter』のときしか処理コードが反映されません ご教授お願いします

  • イベント内で別イベントを呼ぶ方法

    早速質問させていただきます。 Form上にDataGridView(dgv)があります。 dgvのセルをマウスでダブルクリックした時に処理を入れております。 Private Sub dgv_CellDoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv.CellDoubleClick   If e.RowIndex = -1 Then     Exit Sub   End If   '//処理 End Sub このdgv上でEnterキーを押した際に、ダブルクリックしたのと同じ処理を 行いたいのですが、このような場合、どのような実装をするのが一般的なのでしょうか? 例えば、下記の様にCall dgv_CellDoubleClick(sender, e)をするとEventArgsが合わないためエラーになってしまいます。 適切な方法をご教授お願い致します。 Private Sub dgv_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dgv.KeyDown   If e.KeyCode = Keys.Enter Then     Call dgv_CellDoubleClick(sender, e)   End If End Sub

  • テキストボックスに描画

    テキストボックスの上でマウスを動かすと赤い線を描画するプログラムを書きました。 Private Sub TextBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBox1.MouseMove Dim g As Graphics = sender.CreateGraphics() g.FillEllipse(Brushes.Red, e.X, e.Y, 5, 5) End Sub この方法の場合、フォームが再描画されると書いたものが消えてしまいます。 再描画されても消えなくて、なおかつアプリケーションをいったん終了しても復元できる方法があれば、教えてください。

  • VBでの質問です

    VBでの質問です 5分を計るタイマーを作っていて5分たつと止まるプログラムを作っていて、コンマ以下のケタが長くて、しかも止まらない( Label1.Text = n5.Subtract(Now).ToStringをLabel1.Text = n5.Subtract(Now).TotalMinutesにしてIf Label1.Text = "00:00:00" ThenをIf Label1.Text = "0" Thenにした時は止まりました)ので止まるようにするにはどこを変えればいいですか? 教えてください 以下コードです Public Class Form1 Dim n5 As DatePrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load n5 = Now.AddMinutes(5) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = n5.Subtract(Now).ToString If Label1.Text = "00:00:00" Then MsgBox("時間になりました。") Timer1.Stop() End If End Sub 長文ですいません

  • VBでラベルの大きさと文字数によってフォントサイズが変化するプログラムについて

    VBで、「ラベル」っての、ありますよね。そこに入力された文字数とラベルの大きさによって、フォントサイズを変化させるプログラムを書いたのですが、うまくいきません。何が間違っているのでしょうか? Private Sub name_text_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles name_text.KeyUp Dim nam As Byte nam = Len(name_text.Text) Dim FSize As Short If nam = 2 Then FSize = 36 FSize = Label.Font.Size ElseIf nam = 3 Then FSize = 25 FSize = Label.Font.Size End If Label.Text = TextBox.Text End Sub 何が間違ってますでしょうか?お願いします。

  • VBの記述。サブや関数のコードを束ねる

    VBの記述でsubやfunctionの上の単位でまとめる記述があったように思えますが、久々で思い出せません。 クラスの構成だとかではなくコメントレベルの操作です。 □フォームの操作関係  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load   ' code  End Sub  Private Sub Form1_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed   ' code  End Sub □ボタンの操作関係  Private Sub Button_Close_Click(sender As Object, e As EventArgs) Handles Button_Close.Click   Me.Close()  End Sub  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click   ' code  End Sub サブの頭のところクリックしたら、コードが見えたり隠れたりするように、 記述ブロックの頭のところをクリックすると、記述ブロック全体のコードが見えたり隠れたりしたような。。。 なんというヤツでしたっけ?