for及び配列操作について

解決


お台場冒険君  2005-09-04 00:16:25  No: 124791

for やdo whileなどをつかってtextbox1.textに配列を次々と代入するにはどうしたら
いいのでしょうか?また、他に簡単な方法がございましたらそちらの方でも
一向にかまいません。自分が考えたコードではないちいちテキストボックスに文字を代入するたびに変数を一つづつ打って入れていくやり方なのでかなり能率が悪いと思うのです。なにか能率のあがる書き方はないものでしょうか?

TextBox1.Text = mytel(0) & vbCrLf +  mytel(1) & vbCrLf + mytel(2 )_               & vbCrLf + mytel(3) & vbCrLf + mytel(4) + vbCrLf + _        mytel(5) & vbCrLf + mytel(6) & vbCrLf + mytel(7) & vbCrLf   _          + mytel(8) & vbCrLf + mytel(9)

いちいち変数を打たずに繰り返し処理によってテキストボックスに代入するする方法が知りたいのです。よろしくお願いします。


通ってみた  2005-09-04 00:44:04  No: 124792

Dim i as long

For i=0 to 9
    TextBox1.Text = TextBox1.Text + mytel(i) + vbCrLf
Next

とか。


お台場冒険君  2005-09-04 01:07:43  No: 124793

ありがとう!見事解決しました!
TextBox1.Text =  mytel(i) + vbCrLf
じゃだめだったんですねー!
感覚的には大丈夫のような気がしますが??
何でじゃろ???


Geo=TK3  2005-09-04 01:09:25  No: 124794

>TextBox1.Text =  mytel(i) + vbCrLf

元々 TextBox1.Text に設定されている文字列を
mytel(i) + vbCrLf で“上書き”するから。


通ってみた  2005-09-04 05:51:37  No: 124795

変数に数値を足す時を考えればわかりやすい


ねろ  2005-09-05 03:02:57  No: 124796

最後に改行を入れるか入れないかが、かなりいいかげんになってませんか。
>他に簡単な方法がございましたらそちらの方でも
VB6なら、スピードと簡単さから言って、
Text1.Text = Join(mytel, vbCrLf)
と一行で書きます。


お台場冒険君  2005-09-05 03:44:14  No: 124797

ねろさんご忠告ありがとうございます。
ですが、私のコードには配列の(i)
があります、好きなiの配列のみ取り出したいときはこのコードの時はどうしたらいいのでしょうか?


かぶ  2005-09-05 03:52:48  No: 124798

for i=0 to 9
 select case i
 case 1,2,3 '<-----好きな添字
  text1.text=text1.text & mytel(i) & vbcrlf
 end select 
next
とか


ねろ  2005-09-05 03:54:51  No: 124799

>好きなiの配列のみ取り出したいときはこのコードの時はどうしたらいいのでしょうか?
好きなiの配列とは?  
myte(1)とかmytel(5)というのは配列の要素と言いいます。
配列の要素を選択して取り出すということでしょうか?


お台場冒険君  2005-09-05 04:02:50  No: 124800

かぶさん、ねろさん
<<<
配列の要素を選択して取り出すということでしょうか?  

そうです。
そして、Joinコードを使ったやり方で出来たらやりたいです。
selectだと
奇数番号や偶数番号のの配列だけ取り出したいときなどに手入力はきついですから。
Joinコードで無駄がなく偶数番号の配列だけとりだしたり
奇数番号の配列だけとりだすことはできないものでしょうか?


ねろ  2005-09-05 04:29:21  No: 124801

えーと、0って偶数でしたっけ?
と言うことで奇数をやって見ます。
   Const MaxD = 9
    Dim mytel(0 To MaxD) As String
    Dim i As Integer
    
    '何か文字を入れる
    For i = 0 To MaxD
        mytel(i) = CStr(i)
    Next
    
    Dim temp(0 To MaxD \ 2) As String
    For i = 0 To MaxD
        If i Mod 2 <> 0 Then
            temp(i \ 2) = mytel(i)
        End If
    Next
    Text1.Text = Join(temp, vbCrLf)


お台場冒険君  2005-09-05 06:22:53  No: 124802

ねろさん 
返信ありがとうございます。
一応やってみましたが、
Dim temp(0 To MaxD \ 2) As String
の  Toの上にエラーの~~の文字が
でます。
一応私はVB.NETなのですが、
配列宣言で下限を指定することができませんとでます。
これはどうしたら良いのでしょう?


お台場冒険君  2005-09-05 06:25:59  No: 124803

ちなみに私のやり方が悪いのかもしれませんが、
確かに奇数個の文字列は表示されるのですが、
それが二回ならんで表示されます?
一回だけでいいのですが。どしたらよいのでしょうか?


特攻隊長まるるう  2005-09-05 18:07:03  No: 124804

>配列宣言で下限を指定することができませんとでます。
>これはどうしたら良いのでしょう?
[VB.NET]の場合、メニューより
[表示]-[その他のウィンドウ]-[タスク一覧]
で表示されるウィンドウにエラーメッセージが表示されます。
エラー表示を選択して[F1]キーを押すとエラーの説明と解決法
が載ってますので参考にして下さい。
配列は常に 0 の下限となります。上限のみ指定して下さい。

>一回だけでいいのですが。どしたらよいのでしょうか?
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200509/05090018.txt
で成功したみたい。


特攻隊長まるるう  2005-09-05 19:40:51  No: 124805

ちなみにねろさんの
>ねろ 2005/09/04(日) 19:29:21
のコードの動きをそのまま[VB.NET]でテスト
しましたが、
>確かに奇数個の文字列は表示されるのですが、
>それが二回ならんで表示されます?
のような現象は再現できませんでした。
強いてあげれば、TextBox の Multiline を
有効にしてないと改行コードが文字化けして
表示されるだろうと思うくらいです。
>一回だけでいいのですが。どしたらよいのでしょうか?
二回表示している部分があるなら一回にして下さい。


ねろ  2005-09-06 18:04:01  No: 124806

ああ!これはVB.NETだったんだ、そういえばTextBox1.Textになってますね。(^^;
特攻隊長まるるうさんフォロー有難うございます。

.NETなら System.Text.StringBuilderを使う手も有りそうです。
Dim MyStringBuilder As New System.Text.StringBuilder("")
For i As Integer = 0 To MaxD
    If i Mod 2 <> 0 Then
         MyStringBuilder.Append(mytel(i))
         MyStringBuilder.Append(Environment.NewLine) 'VbCrLf
    End If
Next
'最後の改行の削除
MyStringBuilder.Remove(MyStringBuilder.Length - Environment.NewLine.Length, Environment.NewLine.Length)
TextBox1.Text = MyStringBuilder.ToString
最後の改行削除のコードがなんとなくいやらしい、何かもっと良い方法が有りそうだが。。


お台場冒険君  2005-09-06 23:37:44  No: 124807

ねろさん、そんなに長くなるのだったら最初の方が楽なような。。。。。
削除の部分は放置か、他に消す方法がありそうな。。。


ねろ  2005-09-07 00:36:19  No: 124808

>ねろさん、そんなに長くなるのだったら最初の方が楽なような。。。。。
うむむ! 確かに。。。。
ただし同じ機能で有ればコードは短い方が良いので有るが、そう簡単でもない。
細かい説明はStringBuilderクラスを調べていただきたいが、
たとえば「富士山」という文字を10,000個テキストボックスに入れるとしよう。
For n As Integer = 1 To 10000
    TextBox1.Text += "富士山" + Environment.NewLine
Next
こうすると、私の開発環境では4分15秒かかった。
ところが
Dim MyStringBuilder As New System.Text.StringBuilder("")
For i As Integer = 1 To 10000
    MyStringBuilder.Append("富士山")
    MyStringBuilder.Append(Environment.NewLine) 'VbCrLf
Next
TextBox1.Text = MyStringBuilder.ToString
StringBuilderを使った方はなんと1秒以下である。
つまり長いテキストの足し算にとってStringBuildeは画期的なのです。
StringBuilderは覚えておいて損は無い。
Joinは全ての文字の連結は速いのですが、不規則な文字の足しこみは
面倒でしかも余分な配列も必要ですね。


お台場冒険君  2005-09-07 06:12:46  No: 124809

ねろさん
長い間ありがとうございました〜


Geo=TK3  2005-09-07 11:21:03  No: 124810

本題は解決済みだけど余談という事で。

>最後の改行削除のコードがなんとなくいやらしい、何かもっと良い方法が有りそうだが。。

System.Text.StringBuilder のヘルプを読んだだけなので外しているかも
しれないけど、Length プロパティの値を Environment.NewLine.Length 分
だけ引くのじゃダメでしょうか?

Length プロパティの説明の中に

>現在の長さ未満の長さを指定した場合は、このインスタンスが指定した長さまでに切り捨てられます。
>指定した長さが現在の長さを超える場合は、このインスタンスの文字列値の末尾に空白が埋め込まれます。
>指定した長さが現在の容量を超える場合は、 Capacity が指定した長さに設定されます。

とあったので単純に Length プロパティの値を再設定してやれば
いいよな気がするんですけど。

MyStringBuilder.Length = MyStringBuilder.Length - Environment.NewLine.Length


ねろ  2005-09-07 16:49:19  No: 124811

Geo=TK3さんどうも。
>MyStringBuilder.Length = MyStringBuilder.Length - Environment.NewLine.Length
なる程、これで良さそうですね、ちょっと気が付きませんでした。(^^
MyStringBuilder.Length -= Environment.NewLine.Length
こうするともっと短くなりますか。
じつは、
MyStringBuilder.Capacity = MyStringBuilder.Length - Environment.NewLine.Length
これはやってみたのですが、これは見事に嫌われました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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