DOBON.NET DOBON.NETプログラミング掲示板過去ログ

任意のファイルを読み込みますが1文字ずつ動的に表示されません。

環境/言語:[VB.2005]
分類:[.NET]

OpenFileDialog1とTextBox1とButton1とTimer1を配置して
Timer1のプロパティのEnabledをtrueにして、Interevalを2500にして、下記のコードを入力しました。

Public Class Form1
Private strbuff As String
Private nagasa As Integer = 0

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
TextBox1.Text = Microsoft.VisualBasic.Left(strbuff, nagasa)
nagasa += 1
If nagasa > Len(strbuff) Then
nagasa = 0
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim FileName As String
Dim FileNum As Integer
Dim StrBuff As String

TextBox1.Text = ""

If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
FileName = OpenFileDialog1.FileName
Else
Exit Sub
End If

FileNum = FreeFile()
FileOpen(FileNum, FileName, OpenMode.Input)

Do Until EOF(FileNum)
StrBuff = LineInput(FileNum)
TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf
Loop
FileClose(FileNum)

End Sub

End Class



任意のテキストの文字を読み込んで表示しますが、1文字ずつ動的に表示されません。任意のテキストを読み込んで文字を1文字ずつ動的に表示する方法を教えてください。
よろしくお願いします。
> Public Class Form1
> Private strbuff As String
> Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
> TextBox1.Text = Microsoft.VisualBasic.Left(strbuff, nagasa)

このstrbuffへの設定は?>してないようですが。
これは、
1、ボタンを押すことでファイルから文字列を取得・格納する
2、タイマーで一定時間ごとに1で読み込んだ文字列を表示する
という仕様でよいのでしょうか。

>任意のテキストの文字を読み込んで表示しますが、1文字ずつ動的に表示されません。
これは、ファイルの文字列はとってこれているが、表示部分がうまくいかない、ということでしょうか。
ちょっと現象が不明瞭ですね。


タイマーは2003しか触ったことがないのですが、
「Timer1.Start()」が書かれていなくても起動しましたっけ?
■No20262に返信(takumixさんの記事)
> これは、
> 1、ボタンを押すことでファイルから文字列を取得・格納する
> 2、タイマーで一定時間ごとに1で読み込んだ文字列を表示する
> という仕様でよいのでしょうか。
>
> >任意のテキストの文字を読み込んで表示しますが、1文字ずつ動的に表示されません。
> これは、ファイルの文字列はとってこれているが、表示部分がうまくいかない、ということでしょうか。
> ちょっと現象が不明瞭ですね。
>
>
> タイマーは2003しか触ったことがないのですが、
> 「Timer1.Start()」が書かれていなくても起動しましたっけ?

速耳マスター2のテキスト速読のように、任意のテキストファイルを選択して読み込んで、読み込んだテキストの内容を一文字ずつ動的に表示したいです。
私が作成したプログラムを実行すると、テキストの内容を読み込んだあと
テキストファイルが、一括で表示され一文字ずつの動的表示がされません。
幾冊の本を読んでみましたが、分からなかったのでプログラムの修正方法が分かれば教えてください。
下記は、速耳マスター2のアドレスです。
http://www.vector.co.jp/soft/win95/edu/se373644.html
ということは、文字列は抽出できているのですよね。
ならば以下のコードで仕様通りの動きができるはず・・・(私は動きました)
--------------------------------------------------------------------
Private str As String = String.Empty
Private length As Integer = 0

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
str = "abcdefg"
End Sub

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
TextBox1.Text = Microsoft.VisualBasic.Left(str, length)
length += 1
If length > Len(str) Then
length = 0
End If
End Sub
--------------------------------------------------------------------
念の為もう一度、タイマーのインターバル値等のプロパティ確認をお薦めします。
適切な助言ができず申し訳ありません。
> 一括で表示され一文字ずつの動的表示がされません。
> 幾冊の本を読んでみましたが、分からなかったのでプログラムの修正方法が分かれば教えてください。

ですから、strbuffへ値を設定してませんよね。
念のため確認ですが、最初のstrbuffとButton1_Click内のStrBuffは別物です。
■No20264に返信(takumixさんの記事)
> ということは、文字列は抽出できているのですよね。
> ならば以下のコードで仕様通りの動きができるはず・・・(私は動きました)
> --------------------------------------------------------------------
> Private str As String = String.Empty
> Private length As Integer = 0
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> str = "abcdefg"
> End Sub
>
> Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
> TextBox1.Text = Microsoft.VisualBasic.Left(str, length)
> length += 1
> If length > Len(str) Then
> length = 0
> End If
> End Sub
> --------------------------------------------------------------------
> 念の為もう一度、タイマーのインターバル値等のプロパティ確認をお薦めします。
> 適切な助言ができず申し訳ありません。
ありがとうございました。
上記のコードを試してみます。
まどかさんもおっしゃっていますが,意味がわかりずらいのかな?

>念のため確認ですが、最初のstrbuffとButton1_Click内のStrBuffは別物です。

ずばり言えば,

Dim StrBuff As String

を消せばよいと思います。

失礼だとはおもいますが...
 ずばり言うことを意図的になさらない方も多くいらっしゃるので,一つ一つの発言をよく読んで,その意味を考えることが大切だと思います。
■No20272に返信(YASさんの記事)
> まどかさんもおっしゃっていますが,意味がわかりずらいのかな?
>
> >念のため確認ですが、最初のstrbuffとButton1_Click内のStrBuffは別物です。
>
> ずばり言えば,
>
> Dim StrBuff As String
>
> を消せばよいと思います。
>
> 失礼だとはおもいますが...
>  ずばり言うことを意図的になさらない方も多くいらっしゃるので,一つ一つの発言をよく読んで,その意味を考えることが大切だと思います。
まどかさん
takumixさん
YASさん
私の説明不足のところがあり、わかりずらかったと思いますが、考えをくみ取ってご回答いただき、大変ありがとうございました。
今の状況は、テキストファイルの内容を読み込むようになりました。
しかし、行が改行されたテキストファイルを読み込むと最後の行しか読み込みません。
全体を読み込ませるには、どうしたらいいでしょうか?
すみませんが、再度よろしくお願いします。
> 全体を読み込ませるには、どうしたらいいでしょうか?
> すみませんが、再度よろしくお願いします。

>StrBuff = LineInput(FileNum)
>TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf

TextBox1.Textは各行の内容を連結する事で,すべての行の内容を保持しています。
しかし,strBuffは一行の内容しか保持していません。
そのstrBuffの内容をもとに一文字ずつ表示しようとしているので当然最後の行しか表示されません。
strBuffにすべての行の内容が代入されるようにしなければならないと思います。
■No20282に返信(YASさんの記事)
>>全体を読み込ませるには、どうしたらいいでしょうか?
>>すみませんが、再度よろしくお願いします。
>
> >StrBuff = LineInput(FileNum)
> >TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf
>
> TextBox1.Textは各行の内容を連結する事で,すべての行の内容を保持しています。
> しかし,strBuffは一行の内容しか保持していません。
> そのstrBuffの内容をもとに一文字ずつ表示しようとしているので当然最後の行しか表示されません。
> strBuffにすべての行の内容が代入されるようにしなければならないと思います。

strbuffにすべての行の内容を代入するには、具体的にどのように代入して
コードを作成したらよろしいのでしょうか?
よろしくお願いします。
> strbuffにすべての行の内容を代入するには、具体的にどのように代入して
> コードを作成したらよろしいのでしょうか?
> よろしくお願いします。

TextBox1.Textにはすべての内容が入っているので,
最後にstrBuff = TextBox1.Text
とするのが,簡単かと思います。

または,
strBuff += LineInput(FileNum) & vbCrLf
TextBox1.Text = strBuff
と修正してもよいと思います。

ただ,私だったら次のようにします。
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TextBox1.Clear()
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            strbuff = My.Computer.FileSystem.ReadAllText(Me.OpenFileDialog1.FileName, System.Text.Encoding.GetEncoding("shift_jis"))
            TextBox1.Text = strbuff
        End If
    End Sub
正直な感想として、コードの各ステップが何を意味しているかを理解していない、
つまり基本知識が不足していると思われます。
結果を求めたい気持ちはわかりますが、今目の前にあるコードの各行がどんな意味でどんな動きをするのかをまず理解することをしたほうがよいでしょう。

そう思ったのは、

> 行が改行されたテキストファイルを読み込むと最後の行しか読み込みません。

「最後の行しか」の「しか」から最後の行のみを読み込んでいると思っているのではと受け取れます。
そしてファイルに対して「どんな読み方」をしているかも理解されていないんだなと。

また、YASさんの投稿内の引用の

>StrBuff = LineInput(FileNum)
>TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf

に対して、「具体的にどのように代入してコードを作成したらよろしいのでしょうか?」という返信をされています。
このコードは99%回答と等しいのです。
つまり、「TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf」を理解されていないと判断できます。

ぜひ実例付きの入門書などで一通りの基本知識を身につけることをお勧めします。
■No20300に返信(YASさんの記事)
> > strbuffにすべての行の内容を代入するには、具体的にどのように代入して
>>コードを作成したらよろしいのでしょうか?
>>よろしくお願いします。
>
> TextBox1.Textにはすべての内容が入っているので,
> 最後にstrBuff = TextBox1.Text
> とするのが,簡単かと思います。
>
> または,
> strBuff += LineInput(FileNum) & vbCrLf
> TextBox1.Text = strBuff
> と修正してもよいと思います。
>
> ただ,私だったら次のようにします。
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> TextBox1.Clear()
> If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
> strbuff = My.Computer.FileSystem.ReadAllText(Me.OpenFileDialog1.FileName, System.Text.Encoding.GetEncoding("shift_jis"))
> TextBox1.Text = strbuff
> End If
> End Sub
>
YASさんプログラムができました。
strbuff = LineInput(FileNum)の
LineInput単体だと一行読み込むのが、
strbuff += LineInput(FileNum)
+=にするとLineInputの一行を読み込む効果がなくなることがわかりました。
詳しく教えていただき
とても嬉しく感謝しています。
大変ありがとうございました。
■No20302に返信(まどかさんの記事)
> 正直な感想として、コードの各ステップが何を意味しているかを理解していない、
> つまり基本知識が不足していると思われます。
> 結果を求めたい気持ちはわかりますが、今目の前にあるコードの各行がどんな意味でどんな動きをするのかをまず理解することをしたほうがよいでしょう。
>
> そう思ったのは、
>
>>行が改行されたテキストファイルを読み込むと最後の行しか読み込みません。
>
> 「最後の行しか」の「しか」から最後の行のみを読み込んでいると思っているのではと受け取れます。
> そしてファイルに対して「どんな読み方」をしているかも理解されていないんだなと。
>
> また、YASさんの投稿内の引用の
>
> >StrBuff = LineInput(FileNum)
> >TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf
>
> に対して、「具体的にどのように代入してコードを作成したらよろしいのでしょうか?」という返信をされています。
> このコードは99%回答と等しいのです。
> つまり、「TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf」を理解されていないと判断できます。
>
> ぜひ実例付きの入門書などで一通りの基本知識を身につけることをお勧めします。
まどかさん
私の聞き方が悪かったようで申しわけありませんでした。
LineInputは、一行ぶんの文字列を読み込むということは分かっておりましたが、
LineInputの改良の仕方を、教えていただきたかったのです。

VisualBasic パーフェクトマスター (秀和システム)
テクニカルTipsシリーズ 速効解決逆引きハンドブックVisual Basic (ソシム)
VisualBasic 2005逆引き大全500の極意 (秀和システム)
を買って読みました。プログラムを単体で動かすのは記載されていましたが、プログラムの組み合わせ方は記載されていませんでした。
思い切ってインターネットで聞いてみました。
これから勉強していきます。
何か良い本などがありましたら教えてください。
> LineInputは、一行ぶんの文字列を読み込むということは分かっておりましたが、

私が言った「ファイルの読み方」とは、「ファイルの終端になるまで改行コードを区切りとして繰り返し読んでいる」ということでした。
なので、
>>>StrBuff = LineInput(FileNum)
3行のファイルならこれが3回実行されることになります。
そしてこれは単純な代入文(中身の置き換え)ですので、結果的に最終行の内容が設定(残る)されるわけです。
途中でおっしゃっていた「改行が無かったらうまくいく」は
1行しかないファイル、つまりファイルの内容=最終行であるためにうまくいっていたことになります。

で、その直後のコード
>>>TextBox1.Text = TextBox1.Text & StrBuff & vbCrLf
は、文字列連結しています。
つまりこの意味に気づけば、タイマで参照する変数に対して「変数=変数 & 読み込んだ1行のデータ」とという結果にたどり着けたかと思います。

良い本とのことですが、入門書は迷うほど出版されています。
実際に立ち読みしながら、読みやすいと思ったものを選ぶと良いと思います。
ですが、選ぶことやその掲載情報量より大事なのは、その一冊を完遂することです。

がんばってくださいね。
おかげ様で完成しました。
教えていただきありがとうございました。
また分からないことがあったら、よろしくお願いします。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板