いつもお世話になってます。
VB6.0でFormの起動時にiniファイルからデータを読み込み、
終了時にiniファイルにデータを書き込む操作をやろうと思ってます。
ファイル操作のコードを3箇所で書いているのですが
実行していると、うまくいく時もあるのですが、毎回ではないのですが、
終了時に”すでにファイルは開かれています。”というエラーが出ます。
きちんと3つ全てのコードでClose #FileNum
とコードを書いてるのですが原因がわかりません・・・
ご指導いただけると幸いです。
また、コードを見たら分かるかもという方がいらっしゃったら
載せさせて頂きます。
もちろんコードを見ないと何も分かりませんが、
iniファイルを扱うならAPIを使った方が便利ですよ。
GetPrivateProfileStringとWritePrivateProfileStringで出来ます。
nanashiさんありがとうございます。
初心者なので無駄な部分が多いかと思いますが
コードを載せさせて頂きます。
メイン画面起動時
Private Sub Form_Load()
Dim FileNum As Integer 'ファイル番号を変数に格納
FileNum = FreeFile
Dim MyDir As String '実行ファイル名を宣言
MyDir = App.Path '実行ファイルを変数に格納
Dim temp As String '読み込んだデータを変数に格納
Dim ReadData(99) As String '配列の変数を指定
Dim i As Integer '繰り返し命令の変数を指定
'iniファイルを開いて1行ずつ読み込み配列に格納
i = 0
Open MyDir & "\SvAliveCK.ini" For Input As #FileNum
Do Until EOF(FileNum)
Line Input #FileNum, temp
ReadData(i) = temp
i = i + 1
Loop
Close #FileNum
終了時(メイン画面)
Open MyDir & "\SvAliveCk.ini" For Output As #FileNum
Print #FileNum, "[" & "Setting" & "]" & vbCrLf & "hostname = " & _
svalu & vbCrLf & "ip=" & _
Mid(lblHost.Caption, 11, 12) & vbCrLf & "MODE=" & K & vbCrLf & _
"IntTimer=" & frmSettei.txtInterval.Text
For i = 1 To l Step 1
Print #FileNum, "[" & lstv.ListItems.Item(i).Text & "]"
Print #FileNum, "IP_ADR=" & lstv.ListItems.Item(i).SubItems(1)
Next i
Close #FileNum
End
サブ画面起動時(iniファイルから表示したいデータがあるため)
終了時に”すでにファイルが開かれています”とエラーが出た時に
デバッグすると
この画面のOpen MyDir & "\SvAliveCk.ini" For Input As #FileNumが
黄色く表示されます。
Private Sub Form_Load()
Dim FileNum As Integer 'ファイル番号を変数に格納
FileNum = FreeFile
Dim MyDir As String
MyDir = App.Path
Dim temp As String '読み込んだデータを変数に格納
Dim ReadData(99) As String '配列の変数を指定
Dim i As Integer '繰り返し命令の変数を指定
'iniファイルを開いて1行ずつ読み込み配列に格納
i = 0
Open MyDir & "\SvAliveCk.ini" For Input As #FileNum
Do Until EOF(FileNum)
Line Input #FileNum, temp
ReadData(i) = temp
i = i + 1
Loop
Close #FileNum
長くてもうしわけありません。
きちんとCloseでファイルを閉じているつもりなのですが・・・
FileNumは何処で初期化しているのですか?
ファイルを開くときは決めうちでファイル番号を指定するのではなく、直前で
FileNum = FreeFile
としてファイル番号を取得したほうがいいですよ。
ん〜、これを見る限り特に問題は無さそうなんですが……。
ファイルの操作はこのiniファイルに対して以外は行っていないのでしょうか?
もしそうならFileNumは常に1のハズです。
エラー時にFileNumの値を見てください。
2以上の値であるなら、どこかでCloseし忘れてるのでしょう。
※それと、やはりiniファイルの操作はAPIを使った方がイイですよ。
結構簡単ですしf^_^;
”すでにファイルが開かれています”というエラーはファイル番号が同じ時にも出ますね。
Maxさんの仰るとおり、FreeFileの取得位置を確認した方がイイです。
みなさんレスありがとうございます。
誠に勝手ですが、とりあえずAPIを使わずにやってみたいと
思ってます。本当にごめんなさい。
MaxさんのおっしゃるとおりOpenの前の行に
FileNum = FreeFile と書いて実行してみましたが
やはりたまにエラーが出ます。色々テストしてみたのですが、
エラーが出る時の共通点が見つからなくて困っています。
エラーが出た時のデバッグで、サブ画面のFileNumを見てみると
nanashiさんのおっしゃるとおり FileNum = 2 となっていました。
なにか改善策はあるでしょうか?
改善策はバグをつぶすことしかありません。
自分の作った処理の流れを良く追ってみてください。
エラーがでるには原因があるはずですから。
まずはFileNum = 2とならないようクローズし忘れているところを
探してみると良いでしょう。
返信おくれてすいません。
昨日と今日で、ファイルを開いたり閉じたりする時に
FileNumを出すMsgBoxを表示させて、バグを探してみたところ、
エラーが起きる時は、メイン画面終了時のiniファイルを更新する時に
サブ画面のデータも持ってくるため、
メイン画面終了時iniファイルオープン FileNum = 1
iniファイルを閉じる前にサブ画面でiniファイルオープン FileNum = 2
となっていたのが原因でした。
みなさん本当に多数のレスありがとうございました。助かりました。
これからはAPIも使っていけるよう勉強していきたいと思ってますので
またわからないことがあったらよろしくお願いいたします。
ツイート | ![]() |