🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

2回答

6736閲覧

KeyPress/KeyDownが動作しない。

anpan___

総合スコア28

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2019/11/29 07:15

編集2019/11/29 07:35

前回はの質問ではKeyPress、KeyDownについて教えていただき、使い方を調べました。
また、FormのKeyPreviewはTrueにしております。

デバックで確認したところ、

VB

1'CellStatusによって表示を変更 2 Select Case Me.Status 3 Case CellStatus._1 4 g.DrawString(1, fnt, Brushes.Orange, 0, 0) 5 Case CellStatus._2 6 g.DrawString(2, fnt, Brushes.Black, 0, 0) 7 Case CellStatus._3 8 g.DrawString(3, fnt, Brushes.Black, 0, 0) 9 Case CellStatus._4 10 g.DrawString(4, fnt, Brushes.Black, 0, 0) 11 Case CellStatus._5 12 g.DrawString(5, fnt, Brushes.Black, 0, 0) 13 Case CellStatus._6 14 g.DrawString(6, fnt, Brushes.Black, 0, 0) 15 Case CellStatus._7 16 g.DrawString(7, fnt, Brushes.Black, 0, 0) 17 Case CellStatus._8 18 g.DrawString(8, fnt, Brushes.Black, 0, 0) 19 Case CellStatus._9 20 g.DrawString(9, fnt, Brushes.Black, 0, 0) 21 Case CellStatus.Nothing 22 g.DrawString(777, fnt, Brushes.Black, 0, 0) 23 End Select

こちらのコードでうまく数字を読み込めていなさそうです。
KeyDownのイベントは発生しておりますが、Case文がうまく働いていない状態です。

その二つを用いて、コーディングを行ったのですが、うまく動作せず、なぜそうなるのかわからない現状です。
実際のゲーム画面はこちらです。
Formの上にPictureboxを配置し、Graphicsを用いて表を作成しています。

イメージ説明
セルがオレンジで囲まれているのは、Pictureboxのクリックイベントにより、フォーカスがあるセルに着色しています。

今できずに悩んでいることは、picturebox内のセルに対し、文字の入力を行う処理です。
やりたいことは下記のとおりです。
1、フォーカスのある座標で数字のみを入力する
2、入力されたキー情報を受け取り、列挙体のステータスを与える(※下記の参照コード2)
3、Drowメソッドで
出力に関しては、
Graphics.DrawStringメソッドorTextRenderer.DrawTextメソッドを用いることで実現できるのかな、と考えておりますが、座標の指定がうまくできていないのかなと考えております。

参照コード1(Form1 Class)

VB

1Public Class Form1 2 Dim S As New source 3 4 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 5 Me.KeyPreview = True 6 End Sub 7 8 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint 9 10 S.Draw(e.Graphics) 11 12 End Sub 13 14 Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click 15 16 'マウスの座標をPictureBox1のコントロール座標に変換する。 17 Dim Pos As Point = PictureBox1.PointToClient(Windows.Forms.Cursor.Position) 18 19 S.CellFromPoint(Pos.X, Pos.Y).Focus() 20 21 PictureBox1.Invalidate() 22 23 End Sub 24 25 Private Sub PictureBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles PictureBox1.KeyPress 26 27 If "0"c <= e.KeyChar And e.KeyChar <= "9"c Then 28 e.Handled = True 29 End If 30 31 End Sub 32 33 Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown 34 Dim Pos As Point = PictureBox1.PointToClient(Windows.Forms.Cursor.Position) 35 Select Case e.KeyCode 36 Case Keys.D1 Or Keys.NumPad1 37 S.Cells(Pos.X, Pos.Y).Status = CellStatus._1 38 Case Keys.D2 Or Keys.NumPad2 39 S.Cells(Pos.X, Pos.Y).Status = CellStatus._2 40 Case Keys.D3 Or Keys.NumPad3 41 S.Cells(Pos.X, Pos.Y).Status = CellStatus._3 42 Case Keys.D4 Or Keys.NumPad4 43 S.Cells(Pos.X, Pos.Y).Status = CellStatus._4 44 Case Keys.D5 Or Keys.NumPad5 45 S.Cells(Pos.X, Pos.Y).Status = CellStatus._5 46 Case Keys.D6 Or Keys.NumPad6 47 S.Cells(Pos.X, Pos.Y).Status = CellStatus._6 48 Case Keys.D7 Or Keys.NumPad7 49 S.Cells(Pos.X, Pos.Y).Status = CellStatus._7 50 Case Keys.D8 Or Keys.NumPad8 51 S.Cells(Pos.X, Pos.Y).Status = CellStatus._8 52 Case Keys.D9 Or Keys.NumPad9 53 S.Cells(Pos.X, Pos.Y).Status = CellStatus._9 54 End Select 55 PictureBox1.Invalidate() 56 End Sub 57End Class

参照コード2(Contants Class)

VB

1 2Public Enum CellStatus 3 [Nothing] 'なし 4 _1 '1 5 _2 '2 6 _3 '3 7 _4 '4 8 _5 '5 9 _6 '6 10 _7 '7 11 _8 '8 12 _9 '9 13End Enum

参照コード3(source Class)

VB

1Public Class source 2 3 Public Const CellSize As Integer = 50 'セルのサイズ 4 Public Const XCount As Integer = 9 '盤の横方向のセル数 5 Public Const YCount As Integer = 9 '盤の縦方向のセル数 6 Dim aCell(XCount - 1, YCount - 1) As Cell '全セルを表す配列 7 8 Public Sub New() 9 10 Dim X As Integer 11 Dim Y As Integer 12 13 For X = 0 To XCount - 1 14 For Y = 0 To YCount - 1 15 aCell(X, Y) = New Cell(Me, New Point(X, Y)) 16 Next 17 Next 18 19 End Sub 20 21 Public Sub Draw(ByVal g As Graphics) 22 23 Dim X As Integer 24 Dim Y As Integer 25 Dim aPen As New Pen(Color.Gray, 2) 26 Dim bPen As New Pen(Color.Black, 3) 27 28 '四角形 29 g.FillRectangle(Brushes.White, 0, 0, XCount * CellSize, YCount * CellSize) 30 31 '縦線 32 For X = 0 To XCount 33 If X Mod 3 = 0 Then 34 g.DrawLine(bPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 35 Else 36 g.DrawLine(aPen, X * CellSize, 0, X * CellSize, YCount * CellSize) 37 End If 38 39 Next 40 41 '横線 42 For Y = 0 To YCount 43 If Y Mod 3 = 0 Then 44 g.DrawLine(bPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 45 Else 46 g.DrawLine(aPen, 0, Y * CellSize, XCount * CellSize, Y * CellSize) 47 End If 48 49 Next 50 51 For Y = 0 To YCount - 1 52 For X = -0 To XCount - 1 53 Cells(X, Y).Draw(g) 54 Next 55 Next 56 End Sub 57 58 Public Property Cells(ByVal X As Integer, ByVal Y As Integer) As Cell 59 Get 60 Return aCell(X, Y) 61 End Get 62 Set(ByVal value As Cell) 63 aCell(X, Y) = value 64 End Set 65 End Property 66 67 Public Function CellFromPoint(ByVal X As Integer, ByVal Y As Integer) As Cell 68 69 Dim ThisCell As Cell 70 71 If X < 0 OrElse X >= XCount * CellSize Then 72 Return Nothing 73 End If 74 75 If Y < 0 OrElse Y >= YCount * CellSize Then 76 Return Nothing 77 End If 78 79 ThisCell = Cells(X \ CellSize, Y \ CellSize) 80 81 Return ThisCell 82 83 End Function 84 85End Class

参照コード4(Cell Class)

VB

1Public Class Cell 2 Public Status As CellStatus 3 Public S As source 4 Public Position As Point '論理位置 5 Public Rectangle As Rectangle '物理位置 6 Public Focused As Boolean 7 8 '■コンストラクタ 9 Public Sub New(ByVal S As source, ByVal Position As Point) 10 11 Me.S = S 12 Me.Position = Position 13 14 Dim Rect As New Rectangle 15 16 '物理位置を求める。 17 Rect.X = Position.X * source.CellSize 18 Rect.Y = Position.Y * source.CellSize 19 Rect.Width = source.CellSize 20 Rect.Height = source.CellSize 21 22 Me.Rectangle = Rect 23 End Sub 24 25 '■Focus 26 Public Sub Focus() 27 28 Dim X As Integer 29 Dim Y As Integer 30 31 '同じグリッドに属する自分以外のセルを非アクティブにする。 32 For X = 0 To source.XCount - 1 33 For Y = 0 To source.YCount - 1 34 S.Cells(X, Y).Focused = False 35 Next 36 Next 37 38 '自分自身をアクティブにする。 39 Me.Focused = True 40 41 End Sub 42 43 Public Sub Draw(ByVal g As Graphics) 44 45 Dim CellRect As Rectangle 46 Dim oPen As New Pen(Color.Orange, 3) 47 48 'オレンジ枠に余裕を持たせる 49 CellRect = Me.Rectangle 50 CellRect.Inflate(-2, -2) 51 Dim fnt As New Font("MS UI Gothic", 20) 52 53 'CellStatusによって表示を変更 54 Select Case Me.Status 55 Case CellStatus._1 56 g.DrawString(1, fnt, Brushes.Orange, 0, 0) 57 Case CellStatus._2 58 g.DrawString(2, fnt, Brushes.Black, 0, 0) 59 Case CellStatus._3 60 g.DrawString(3, fnt, Brushes.Black, 0, 0) 61 Case CellStatus._4 62 g.DrawString(4, fnt, Brushes.Black, 0, 0) 63 Case CellStatus._5 64 g.DrawString(5, fnt, Brushes.Black, 0, 0) 65 Case CellStatus._6 66 g.DrawString(6, fnt, Brushes.Black, 0, 0) 67 Case CellStatus._7 68 g.DrawString(7, fnt, Brushes.Black, 0, 0) 69 Case CellStatus._8 70 g.DrawString(8, fnt, Brushes.Black, 0, 0) 71 Case CellStatus._9 72 g.DrawString(9, fnt, Brushes.Black, 0, 0) 73 Case CellStatus.Nothing 74 g.DrawString(777, fnt, Brushes.Black, 0, 0) 75 End Select 76 77 'フォーカスのある枠をオレンジで囲む 78 If Me.Focused Then 79 g.DrawRectangle(oPen, CellRect) 80 End If 81 82 End Sub 83End Class

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2019/11/29 07:32

Form1_KeyDownイベントは発生しているのでしょうか?
anpan___

2019/11/29 07:34

ttyp03さん!連日にわたりありがとうございます。 発生はしているんですが、その後のケース文に入れていない状態です!
ttyp03

2019/11/29 08:29

> 発生はしているんですが、その後のケース文に入れていない状態です! 質問にはここまで書かないと余計な質疑応答が発生しちゃいます。 今後気をつけてくださいね。
anpan___

2019/11/29 08:36

ご指摘ありがとうございます。 デバッグがうまくわかっていなかったことが原因だったと思われます。 今回の件ではっきりと、デバッグの必要性について理解することができましたので、今後はこの知識を生かし同じことがないように努めます。 ご指摘ありがとうございました!
guest

回答2

0

VisualStudioを使ってるなら、デバッグ機能を使って動作を追いかけていきましょう。
ブレークポイントを設定すればそこで実行を止め、変数の中身を見ることができます。
そしてそこから1行づつ実行することができます
そうすれば、なぜそういう動作になるのかがわかります

投稿2019/11/29 07:37

編集2019/11/29 07:38
y_waiwai

総合スコア88040

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpan___

2019/11/29 07:39

「変数の中身を見る」なるほど。 初心者なもので、変数の中身まで見れていない状態となってしまっておりました。 すぐに確認させてもらいます!
guest

0

ベストアンサー

VB

1Select Case e.KeyCode 2 Case Keys.D1 Or Keys.NumPad1

これだと
e.KeyCode と (Keys.D1 Or Keys.NumPad1)

の比較になります。

VB

1Select Case e.KeyCode 2 Case Keys.D1, Keys.NumPad1

これが正しいかと。

投稿2019/11/29 07:41

KOZ6.0

総合スコア2707

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

anpan___

2019/11/29 07:43

ご回答ありがとうございます! なるほど。比較になってしまっているのですね。 いますぐためしてみます! ちなみにAndでも同じでしょうか・・・?
anpan___

2019/11/29 07:46

記載いただきました方法に変更したところ、Caseのもんだいをぶじかいけつすることができました! ありがとうございます。 しかしその後、例外が吐き出されたため、そちらの調査を次に行わせていただきます。
KOZ6.0

2019/11/29 07:46

同じです。 Dim tmp1 As Keys = Keys.D1 And Keys.NumPad1 Dim tmp2 As Keys = Keys.D1 Or Keys.NumPad1 tmp1 と tmp2 の中身を見てみましょう。
anpan___

2019/11/29 08:15

確認させていただきました。初歩的なデバックができておらず、このような質問をしてしまい申し訳ありません???? 例外が発生した部分もそのご指摘により、どこが問題かはっきりとわかりました! 次のエラーの解決に取り組みたいと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問