• 締切済み

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

みんなの回答

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.8

ウチのNo6のスペックでは9×9×9はできました。 あと画面解像度は1920×1080ピクセルです。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.7

追記 >和も出てこないのですが、 Button2を押してって事で良いんですよね? こちらでは押せば出てきますよ。 ただこれもテキストボックス全てを打ち込んだら出てくるって 待っているのであれば、それは無理ですね。 それだけのテキストボックスへの入力を 監視し続けるのは大変でしょう・・・と思います。

sucess56
質問者

補足

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

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.6

No5です。 >5 5 5などの少し大きな値を入力した場合一番最後(の5番目)の行列のテキストボックスが出てこず、 >和も出てこないのですが、何故なのでしょうか。 こちらの環境ではフォームをスクロール(あるいは広げてやる)させれば5×5×5のテキストボックスの表示と 和の5×5のテキストボックスは表示されますよ。 なのでコード上の問題よりパソコンのスペック的なものなのか? としか言えないかも・・・・・ ⇒結構こちらでも描画は負担がかかっていますけどね。 一応こちらは APU: AMD A8-3870 グラフィック:APU内蔵 メモリ:16GB(うち13GBはRAMディスクでページングファイル3.5GB含む) OS:WindowsXP SP2 です。 これ以上のスペックのパソコンであるなら可能なはずだとは思いますけどとしか、 言えないですね。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.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

sucess56
質問者

補足

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

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.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 一例まで。

sucess56
質問者

補足

ありがとうございます。 もう1つ質問です。 このプログラムに以下のような機能をつけたいです。 1個目の行列 2個目の行列 3個目の行列 とわかるように テキストボックスが入力した値分出てきたときに 1個目 2個目 3個目というラベルも表示されるようにしたいのですが、 どのようにしたらできるのでしょうか。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

元の質問 http://okwave.jp/qa/q8131574.html のNo2の回答の方がマシな状態かな? ⇒No3は編集で手修正したらか カッコの位置が変わってしまっている。 その回答者として言えることはFindは不要だと思います。 ⇒Findメソッドって存在の確認ですよね? 存在は確実であるからあえてチェックの必要性は ないと思っているんですが、 エラー対策としては必要なのかな? あとはどこからどんな回答(考え?)があってコードが混乱しているのか わかりませんけど、まずはやりたい事を書き出して行っては如何ですかね?

  • hirotn
  • ベストアンサー率59% (147/246)
回答No.2

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

sucess56
質問者

補足

sum += Double.Parse(CType(Me.Controls.Find("tb" + (cnt + (rows * columns * (k - 1))).ToString()), TextBox).Text) 引数が足りないとエラーが出るのですが、なぜなのでしょうか。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

http://okwave.jp/qa/q8149924.html こちらでやろうとしている事と なんかあっていない気がするんですよね。 ⇒完成図がはっきりイメージできない。 いっその事、外部委託で丸ごと作成して貰っては? じっくり打ち合わせも出来て良いかも知れませよ。

関連するQ&A