For文でTextBox内に1行ずつ表示するには?

解決


びぎなー  2007-09-27 20:09:03  No: 137616

いつもお世話になっております。
毎度非常に簡単だと思われる質問で非常に恐縮なのですがお願いします。

TextBoxに1行ずつ配列の中身を表示させたいと思い、以下のように書きました。

For i = 0 To 3
   TextBox1.Text = "[ " & i & "," & A(i) & " ]" & vbCrLf
Next i

Aという配列は宣言してあり、TextBoxはMultiline = Trueです。

これで実行すると、[ 3,0 ]のみが表示されます。(配列の中身は0です)

[ 0,0 ]
[ 1,0 ]
[ 2,0 ]
[ 3,0 ]
と表示させるにはどうすればいいのでしょうか?
VB2005です。


旅人A  2007-09-27 20:20:44  No: 137617

ループする度にText1を上書きしてるから

For i = 0 To 3
   TextBox1.Text = Text1.Text & "[ " & i & "," & A(i) & " ]" & vbCrLf
Next i

で、できます。
ループする度に文字を連結する


びぎなー  2007-09-27 20:33:43  No: 137618

旅人Aさん、素早い回答ありがとうございます。

解決しました。「文字を連結」、勉強します。
ありがとうございました。


魔界の仮面弁士  2007-09-27 22:44:16  No: 137619

VB2005 の TextBox には、『AppendText メソッド』が用意されていますので、
そちらを利用してみてください。すなわち、

  TextBox1.Clear()
  For i As Integer = 0 To 3
    TextBox1.AppendText(String.Format("[{0},{1}]", i, a(i)) & vbCrLf)
  Next

または、

  TextBox1.Clear()
  For i As Integer = 0 To 3
    TextBox1.AppendText("[" & CStr(i) & "," & a(i) & "]" & vbCrLf)
  Next

といった感じになります。

Text プロパティに、毎回文字列連結させていく方法でも実現できますが、
その方法だと、ループの回数が多い場合に辛くなってきます。

実際、当方の環境では、3000回の単純なループ処理で試したときに、
AppendText 法だと 3秒、Text 連結で 150 秒という結果になりました。

  Dim sw As New Stopwatch()
  sw.Start()   '時間測定開始
  TextBox1.Clear()
  For i As Integer = 1 To 3000
    TextBox1.AppendText("[" & CStr(i) & "]" & vbCrLf)
    'TextBox1.Text = TextBox1.Text & "[" & CStr(i) & "]" & vbCrLf 
  Next
  sw.Stop()
  MessageBox.Show(sw.Elapsed.ToString())  '処理時間を表示

また、もしも文字列連結法を使うのであれば、Text プロパティを毎回読み書きするのではなく、
StringBuilder クラスを利用するようにします。これなら、3000 回でも 0.1 秒未満で処理できます。

  Dim sw As New Stopwatch()
  sw.Start()
  Dim S As New System.Text.StringBuilder()
  For i As Integer = 0 To 3000
    S.AppendLine("[" & CStr(i) & "]")
  Next
  TextBox1.Text = S.ToString()
  sw.Stop()
  MessageBox.Show(sw.Elapsed.ToString())

>> 旅人Aさん
そもそも、TextBox1 に Text1 の内容を繋げてはマズイかと…。(^^;

ちなみに、(今回は関係ありませんが)VB6 の場合は、AppendText が無いので
  Dim i As Integer
  Text1.Text = ""
  For i = 0 To 3
    Text1.SelText = "[" & CStr(i) & "," & a(i) & "]" & vbCrLf
    Text1.SelStart = Len(Text1.Text)
  Next
のように「SelText プロパティ」を使う方法があります。


びぎなー  2007-09-28 00:29:38  No: 137620

魔界の仮面弁士さん、回答ありがとうございます。

確かに例文では 0 to 3  と書いたのですが、
実際には255回ループさせていますので、少し時間がかかりました。
AppendText メソッドを利用してやってみます。
ありがとうございました。


旅人A  2007-10-01 21:59:47  No: 137621

魔界の仮面弁士さん  ありがとうございます。

書くときに間違えてしまいますた。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加