こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

VB添削

このプログラムは
例えば3 3 4とテキストボックスに数字が打ち込まれると
3×3行列が4個分 のテキストボックスがでてきます。
ここに数字を打ち込んでいき、ボタン2を押すと3×3のテキスト

トボックスが出てくると同時に足し算した結果が出てくるようにしたいです。

以下のプログラムはできたところまで作成しています。

どこを直せばよいのでしょうか。




Public Class Form1
Private number As Integer
Private rows As Integer
Private columns As Integer

Private Sub Form11_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For i As Integer = 1 To 3
AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged
Next
End Sub

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then
MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)

With CType(sender, TextBox)
.Text = .Text.Substring(0, .Text.Length - 1)
.SelectionStart = .Text.Length
End With
End If

Dim cnt1 As Integer
Dim cnt2 As Integer
Dim cnt3 As Integer
If Integer.TryParse(TextBox1.Text, cnt1) And Integer.TryParse(TextBox2.Text, cnt2) And Integer.TryParse(TextBox3.Text, cnt3) Then

For k = 1 To cnt3
For i = 1 To cnt1
For j = 1 To cnt2
Dim tb As TextBox = New TextBox()
tb.Name = "tb" + i.ToString()
Me.Controls.Add(tb)
tb.Top = (i - 1) * 28 + 55
tb.Left = (j - 1) * 30 + 40 * (cnt2 * (k - 1)) + 10
tb.Width = 25
Next
Next
Next
End If

End Sub


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Bounds = New Rectangle(10, 10, 1350, 800)
Me.AutoScroll = True

End Sub


Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim sum As Double
Dim cnt As Integer = 0

For i As Integer = 1 To rows
For j As Integer = 1 To columns
Dim tb As TextBox = New TextBox()
cnt += 1 : If cnt > rows * columns Then cnt = 1

tb.Name = "tb" + cnt.ToString
Me.Controls.Add(tb)
tb.Top = (i - 1) * 30 + (80 + 40 * rows)
tb.Left = (j - 1) * 60 + 10
tb.Width = 40
sum = 0

For k As Integer = 1 To number


sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text)

Next
tb.Text = sum.ToString()
Next
Next



End Sub

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

End Sub

Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged

End Sub

Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged

End Sub



End Class

投稿日時 - 2013-06-26 03:58:53

QNo.8150151

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.8

ウチのNo6のスペックでは9×9×9はできました。

あと画面解像度は1920×1080ピクセルです。

投稿日時 - 2013-06-27 17:09:30

ANo.7

追記

>和も出てこないのですが、
Button2を押してって事で良いんですよね?
こちらでは押せば出てきますよ。

ただこれもテキストボックス全てを打ち込んだら出てくるって
待っているのであれば、それは無理ですね。
それだけのテキストボックスへの入力を
監視し続けるのは大変でしょう・・・と思います。

投稿日時 - 2013-06-27 09:51:03

補足

Button2を押してっていう意味で合っています。

パソコンのスペックの問題だったんですね。
ありがとうございました。

投稿日時 - 2013-06-27 12:58:06

ANo.6

No5です。

>5 5 5などの少し大きな値を入力した場合一番最後(の5番目)の行列のテキストボックスが出てこず、
>和も出てこないのですが、何故なのでしょうか。
こちらの環境ではフォームをスクロール(あるいは広げてやる)させれば5×5×5のテキストボックスの表示と
和の5×5のテキストボックスは表示されますよ。

なのでコード上の問題よりパソコンのスペック的なものなのか?
としか言えないかも・・・・・
⇒結構こちらでも描画は負担がかかっていますけどね。

一応こちらは
APU: AMD A8-3870
グラフィック:APU内蔵
メモリ:16GB(うち13GBはRAMディスクでページングファイル3.5GB含む)
OS:WindowsXP SP2

です。
これ以上のスペックのパソコンであるなら可能なはずだとは思いますけどとしか、
言えないですね。

投稿日時 - 2013-06-27 07:34:30

ANo.5

No4です。

上手くイメージできませんけど
それぞれの塊について”何個目”と左側に
表示するものです。

Private number As Integer
Private rows As Integer
Private columns As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Bounds = New Rectangle(10, 10, 1350, 800)
Me.AutoScroll = True
For i As Integer = 1 To 3
AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged
Next
End Sub

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then
MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)

With CType(sender, TextBox)
.Text = .Text.Substring(0, .Text.Length - 1)
.SelectionStart = .Text.Length
End With
End If

If Integer.TryParse(TextBox1.Text, rows) AndAlso Integer.TryParse(TextBox2.Text, columns) _
AndAlso Integer.TryParse(TextBox3.Text, number) Then

Dim cnt As Integer = 0

For k As Integer = 1 To number
Dim lb As Label = New Label()
lb.Name = "Label" + k.ToString()
lb.Top = 40 * (rows * (k - 1)) + 63
lb.Left = 5
lb.Text = String.Format("{0}個目", k)
lb.Width = 50
Me.Controls.Add(lb)

For i As Integer = 1 To rows
For j As Integer = 1 To columns
Dim tb As TextBox = New TextBox()
cnt += 1
tb.Name = "tb" + cnt.ToString()
Me.Controls.Add(tb)
tb.Top = (i - 1) * 30 + 40 * (rows * (k - 1)) + 60
tb.Left = (j - 1) * 60 + 80
tb.Width = 50
Next
Next
Next
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim sum As Integer
Dim cnt As Integer = 0

For i As Integer = 1 To rows
For j As Integer = 1 To columns
Dim tb As TextBox = New TextBox()
cnt += 1 : If cnt > rows * columns Then cnt = 1

tb.Name = "tbA" + cnt.ToString()
Me.Controls.Add(tb)
tb.Top = (i - 1) * 30 + 60
tb.Left = (j - 1) * 60 + (70 * columns) + 80
tb.Width = 40
sum = 0

For k As Integer = 1 To number
sum += Double.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text)
Next
tb.Text = sum.ToString()
Next
Next

End Sub

もし違うようであれば画像添付にて
イメージを表示してください。

http://mbsupport.dip.jp/watson/print.htm

投稿日時 - 2013-06-26 22:49:50

補足

ありがとうございます。

3 3 3などの小さい値を入力したときはうまくいくのですが、
5 5 5などの少し大きな値を入力した場合一番最後(の5番目)の行列のテキストボックスが出てこず、和も出てこないのですが、何故なのでしょうか。

投稿日時 - 2013-06-27 02:19:02

ANo.4

Private number As Integer
Private rows As Integer
Private columns As Integer

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Bounds = New Rectangle(10, 10, 1350, 800)
Me.AutoScroll = True
For i As Integer = 1 To 3
AddHandler Me.Controls("TextBox" & i).TextChanged, AddressOf TextBox_TextChanged
Next
End Sub

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

If System.Text.RegularExpressions.Regex.IsMatch(CType(sender, TextBox).Text, "[^0-9]") Then
MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error)

With CType(sender, TextBox)
.Text = .Text.Substring(0, .Text.Length - 1)
.SelectionStart = .Text.Length
End With
End If

If Integer.TryParse(TextBox1.Text, rows) AndAlso Integer.TryParse(TextBox2.Text, columns) _
AndAlso Integer.TryParse(TextBox3.Text, number) Then

Dim cnt As Integer = 0

For k As Integer = 1 To number
For i As Integer = 1 To rows
For j As Integer = 1 To columns
Dim tb As TextBox = New TextBox()
cnt += 1
tb.Name = "tb" + cnt.ToString()
Me.Controls.Add(tb)
tb.Top = (i - 1) * 30 + 40 * (rows * (k - 1)) + 60
tb.Left = (j - 1) * 60 + 70
tb.Width = 50
Next
Next
Next
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim sum As Integer
Dim cnt As Integer = 0

For i As Integer = 1 To rows
For j As Integer = 1 To columns
Dim tb As TextBox = New TextBox()
cnt += 1 : If cnt > rows * columns Then cnt = 1

tb.Name = "tbA" + cnt.ToString()
Me.Controls.Add(tb)
tb.Top = (i - 1) * 30 + 60
tb.Left = (j - 1) * 60 + (70 * columns) + 70
tb.Width = 40
sum = 0

For k As Integer = 1 To number
sum += Integer.Parse(CType(Me.Controls("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text)
Next
tb.Text = sum.ToString()
Next
Next

End Sub

一例まで。

投稿日時 - 2013-06-26 17:36:13

補足

ありがとうございます。

もう1つ質問です。
このプログラムに以下のような機能をつけたいです。

1個目の行列
2個目の行列
3個目の行列
とわかるように
テキストボックスが入力した値分出てきたときに
1個目
2個目
3個目というラベルも表示されるようにしたいのですが、
どのようにしたらできるのでしょうか。

投稿日時 - 2013-06-26 20:58:33

ANo.3

元の質問
http://okwave.jp/qa/q8131574.html
のNo2の回答の方がマシな状態かな?
⇒No3は編集で手修正したらか
カッコの位置が変わってしまっている。

その回答者として言えることはFindは不要だと思います。
⇒Findメソッドって存在の確認ですよね?
存在は確実であるからあえてチェックの必要性は
ないと思っているんですが、
エラー対策としては必要なのかな?

あとはどこからどんな回答(考え?)があってコードが混乱しているのか
わかりませんけど、まずはやりたい事を書き出して行っては如何ですかね?

投稿日時 - 2013-06-26 15:23:21

ANo.2

Controlsの配列を名前で検索しているので、Findメソッドを利用してください。
Double.Parse(CType(Me.Controls.Find("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text

投稿日時 - 2013-06-26 10:08:27

補足

sum += Double.Parse(CType(Me.Controls.Find("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text)

引数が足りないとエラーが出るのですが、なぜなのでしょうか。

投稿日時 - 2013-06-26 10:46:15

ANo.1

http://okwave.jp/qa/q8149924.html

こちらでやろうとしている事と
なんかあっていない気がするんですよね。
⇒完成図がはっきりイメージできない。

いっその事、外部委託で丸ごと作成して貰っては?
じっくり打ち合わせも出来て良いかも知れませよ。

投稿日時 - 2013-06-26 06:55:31

あなたにオススメの質問