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

締切り済みの質問

読み込んだデータの表示

読み込んだデータを指定したインターバルごとにラベルに表示したいのですが,作成したプログラムを実行すると,配列の1番目しか表示されません.なにがいけないのでしょうか.Visual Basic6.0を使用しております.

' 共通変数
Dim yy() As Double
Private Sub Command1_Click()
' ダイアログのタイトルを設定する
CommonDialog1.DialogTitle = "データ保存"
' 初期表示するディレクトリを設定する
If strCurDir = "" Then
CommonDialog1.InitDir = Mid$(strStartDir, 1, 3)
Else
CommonDialog1.InitDir = strCurDir
End If

' ダイアログ設定
Call SetDialog
' エラーをトラップしない
On Error Resume Next
' ダイアログを表示する
Me.CommonDialog1.ShowOpen

' [キャンセル] ボタンが選択されなかった場合は、選択したファイル名を表示する
If Err.Number = ErrorConstants.cdlCancel Then
On Error GoTo 0
Exit Sub
End If
' エラー処理を通常のロジックに戻す
On Error GoTo 0

' FileSystemObject (FSO) の新しいインスタンスを生成する
Dim cFso As FileSystemObject
Set cFso = New FileSystemObject
' カレントドライブ設定
strCurDir = cFso.GetParentFolderName(CommonDialog1.FileName)

FileNumber = FreeFile
Open CommonDialog1.FileName For Input As #FileNumber
Dim n As Integer ' カウンタ
Dim i As Integer
Dim intN As Integer ' 最初の配列数
Dim nn As Integer ' 配列の増分量

' データ数のカウンタ
n = 0
i = 0

' 最初の配列数
'  配列の上限を上げる処理は何回でも出来ますが、その処理を繰り返す
' ことより同じデータ数の場合には処理時間はかかります。
'  ですから、読み取りデータ数の上限が分かっている場合は、その数を
' intN に指定してください。この場合には配列の上限を判断するプログラム
' 部分を省くことができます。
intN = 500

' 配列の増分量
'  データ数が未定のときは、なるべく配列の上限を増やす処理を少なく
' する配列数を指定してください。
nn = 200

' 最初の配列数設定
ReDim yy(intN)
Do While Not EOF(1) ' ファイルの終端までループを繰り返します。
' 配列増分処理
If n > intN Then
ReDim Preserve yy(UBound(yy) + nn)
intN = intN + nn
End If
' データ読み取り
Input #FileNumber, yy(n) ' データ配列に代入します。
n = n + 1
Loop
Close #FileNumber

' 配列のサイズを揃える
ReDim Preserve yy(n - 1)
blnGetData = True ' データ取得
End Sub
' ダイアログの設定
Private Sub SetDialog()

' 初期表示するファイル名を設定する
CommonDialog1.FileName = "Data.txt"
' ファイルのフィルタを設定する
CommonDialog1.Filter = "テキスト ファイル|*.txt|すべてのファイル|*.*"
' ファイルの種類 の初期設定を 2 番目に設定する (初期値 1)
CommonDialog1.FilterIndex = 1
' 存在しているファイルを指定した場合は、上書きするかどうかの問い合わせを表示する
CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNOverwritePrompt
' 存在しないパスを指定した場合は警告を表示する
CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNPathMustExist
' 有効な Win32 ファイル名でなくとも返す (検証しない)
'CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNNoValidate
' [読み取り専用] チェックボックスを非表示にする
' (省略しても表示はされませんが、ダイアログの大きさが変わります)
CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNHideReadOnly
' 長いファイル名を使用する
CommonDialog1.Flags = CommonDialog1.Flags Or FileOpenConstants.cdlOFNLongNames
' [キャンセル] ボタンを選択した場合はエラーを発生させる
CommonDialog1.CancelError = True
' エラーをトラップしない
On Error Resume Next
End Sub
Private Sub Command2_Click()
Timer1.Enabled = True
End Sub

Private Sub Command3_Click()
Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
Label1.Caption = yy(i)
i = i + 1
End Sub

投稿日時 - 2012-08-10 16:55:53

QNo.7637082

すぐに回答ほしいです

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

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

回答(3)

ANo.3

一応、動くようにしてみました。

変更点は以下です。

(1) 共通変数としているところを、

' 共通変数
Dim yy() As Double
Dim j As Integer
Dim n As Integer


(2) Command1_Click イベントで、

Dim n As Integer ' カウンタ

をコメントアウト(あるいは削除)。共通変数に設定。

なお、動かす上でこのプロシージャの中で出てくる
strCurDir、strStartDir、FileNumber、blnGetDataなどの変数は
便宜上このプロシージャの始めで以下のように設定。
なお、blnGetDataなる変数で立てるフラッグはどこで使用するのか
分からないが、このプロシージャでは用はないが一応設定。
(本来はPublicで設定しているのかもしれませんが)
Dim strCurDir As String
Dim strStartDir As String
Dim FileNumber As Integer
Dim blnGetData As Boolean


(3) Command2_Clickイベントで、

Private Sub Command2_Click()
Timer1.Interval = 1000
Timer1.Enabled = True
End Sub

のようにして1秒間隔で表示するようにして動作の確認。


(4) Timer1_Timerイベントで、

Private Sub Timer1_Timer()
Label1.Caption = yy(j)
j = j + 1
If j = n Then
Timer1.Enabled = False
End If
End Sub

のように設定。質問の場合は変数のiが使用されていたが
この場合はフォームの共通変数に設定したjを使用する。
なお、このプロシージャの後半の、
If j = n Then
Timer1.Enabled = False
End If
は変数jの数値がCommand1_Clickイベントで取得した配列の
要素数を超えてエラーにならないようにするために設定。


(5) 確認に使ったデータ

1,2,3,4,5
10,20,30,40,50
11,21,31,41,51
12,22,32,42,52
13,23,33,43,53
14,24,34,44,54

上記をData.txtに設定して確認。



以上のようにして一応確認してみました。
なお、共通変数に設定している変数のjは
Integerとしていますが、必要ならば変更
してください。

投稿日時 - 2012-08-12 02:37:55

ANo.2

Private Sub Timer1_Timer() の中でいきなり i を使っているけど
その i はどこで宣言しましたか?

投稿日時 - 2012-08-10 21:45:50

補足

Dim n As Integer ' カウンタ
Dim i As Integer
Dim intN As Integer ' 最初の配列数
Dim nn As Integer ' 配列の増分量

上のほうになるんですが,ここで宣言しています.

投稿日時 - 2012-08-10 22:48:25

ANo.1

Private Sub Timer1_Timer()プロシージャ内でのi変数はどう変わっているかをチェック

投稿日時 - 2012-08-10 17:18:58

あなたにオススメの質問