Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Работа с txt файлами


Автор: Linzer 7.10.2010, 05:33
Не могу понять в чем ошибка. Есть 2 формы, в 1й есть ListView - в него грузятся данные из тхт файла, во 2й форме происходит добавление новой инфы в тхт файл. Есть модуль, в котром есть 2 процедуры, соответственно 1я на загрузку инфы, 2я на добавление. 

Загрузка:
Код

Public Sub obnovlenie()
Form1.ListView1.ListItems.Clear
baza = App.path & "\db.txt"
i = 1
p = 0
razdel = "|"
nFreeFile = FreeFile
Open baza For Input As #nFreeFile
nFileLenght = FileLen(baza)
If nFileLenght = 0 Then
Close #nFreeFile
Exit Sub
Else
Do
    Line Input #nFreeFile, strFileContent
Do
dlina = Len(strFileContent)
nFilm = ""
name_f = ""
genre_f = ""
format = ""
video_f = ""
audio_f = ""
country_f = ""
simvol = ""
god_f = ""
sub_f = ""

nFilm = Left(strFileContent, 3)

For i = 5 To dlina
simvol = Mid(strFileContent, i, 1)
If simvol = "|" Then
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
name_f = name_f & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
genre_f = genre_f & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
format = format & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
video_f = video_f & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
audio_f = audio_f & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
country_f = country_f & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
If simvol <> razdel Then
god_f = god_f & simvol
Else
p = i + 1
i = 0
Exit For
End If
Next i

For i = p To dlina
simvol = Mid(strFileContent, i, 1)
sub_f = sub_f & simvol
Next i

Loop Until dlina = dlina
dbaz
Loop Until EOF(1) = True
Close #nFreeFile
End If
End Sub


Добавление:
Код

Public Sub film_add()
'Проверка
If Form2.Text1.Text = "" Or Form2.Text2.Text = "" Or Form2.Text3.Text = "" Or Form2.Text4.Text = "" Or Form2.Combo1.Text = "" Or Form2.ListView2.ListItems.Count = 0 Or Form2.ListView4.ListItems.Count = 0 Then
MsgBox "Пожалуйста, заполните все поля!", vbOKOnly + vbInformation, "Видеотека ver. 1.0"
Exit Sub
End If
'Добавление фильма
baza = App.path & "\db.txt"
nFreeFile = FreeFile
nFilm = 0
razdel = "|"
Close #1
Open baza For Input As #nFreeFile
nFileLenght = FileLen(baza)
strFileContent = Input(nFileLenght, #nFreeFile)
If strFileContent = Empty Then
GoTo close_bd_empty
Else
GoTo close_bd
End If
close_bd_empty:
Close #nFreeFile
genre_rashirenie_country

'Если БД пуста
Open baza For Output As #nFreeFile
genre_rashirenie_country
nFilm = 1
Print #nFreeFile, nFilm & "  |" & Form2.Text5.Text & "|" & Form2.Text1.Text & "|" & film_genre & "|" & UCase(rashirenie) & "|" & Form2.Text2.Text & "|" & Form2.Text3.Text & "|" & film_country & "|" & Form2.Text4.Text & "|" & Form2.Combo1.Text
close_bd:
Close #nFreeFile

'Если БД <> Empty
Open baza For Append As #nFreeFile
genre_rashirenie_country
nFilm = Form1.ListView1.ListItems.Count + 1
If nFilm < 10 Then
Print #nFreeFile, nFilm & " " & " " & razdel & Form2.Text5.Text & "|" & Form2.Text1.Text & "|" & film_genre & "|" & UCase(rashirenie) & "|" & Form2.Text2.Text & "|" & Form2.Text3.Text & "|" & film_country & "|" & Form2.Text4.Text & "|" & Form2.Combo1.Text
Close #nFreeFile
ElseIf nFilm < 100 Then
Print #nFreeFile, nFilm & " " & razdel & Text5.Text & "|" & Text1.Text & "|" & film_genre & "|" & UCase(rashirenie) & "|" & Text2.Text & "|" & Text3.Text & "|" & film_country & "|" & Text4.Text & "|" & Combo1.Text
Close #nFreeFile
Else
Print #nFreeFile, nFilm & razdel & Text5.Text & "|" & Text1.Text & "|" & film_genre & "|" & UCase(rashirenie) & "|" & Text2.Text & "|" & Text3.Text & "|" & film_country & "|" & Text4.Text & "|" & Combo1.Text
Close #nFreeFile
End If

Unload Form2

Load Form1
End Sub


В конце каждой процедуры я закрываю файл. Но при добавлении новой инфы пишет ошибку file already open. Почему? Заранее благодарен.

Автор: Akina 7.10.2010, 07:44
FreeFile следует вызывать заново перед каждым открытием.

Автор: Linzer 7.10.2010, 11:25
Цитата(Akina @ 7.10.2010,  07:44)
FreeFile следует вызывать заново перед каждым открытием.

А разве я не вызываю ее? 7 и 9 строчки. Или я не так понимаю?

Автор: Akina 7.10.2010, 11:31
Читай вслух, медленно, громко, внимательно и вдумчиво.

НЕПОСРЕДСТВЕННО ПЕРЕД КАЖДЫМ OPEN ДОЛЖЕН БЫТЬ ВЫЗВАН СВОЙ FREEFILE


Во втором коде 3 оператора Open и только 1 раз обращение к FreeFile. И к тому же между ними присутствуют ещё операторы, работающие с файлами.

Автор: Linzer 7.10.2010, 12:36
Цитата(Akina @ 7.10.2010,  11:31)
Читай вслух, медленно, громко, внимательно и вдумчиво.

НЕПОСРЕДСТВЕННО ПЕРЕД КАЖДЫМ OPEN ДОЛЖЕН БЫТЬ ВЫЗВАН СВОЙ FREEFILE


Во втором коде 3 оператора Open и только 1 раз обращение к FreeFile. И к тому же между ними присутствуют ещё операторы, работающие с файлами.

Добавил перед каждым Open, не помогло

Автор: Akina 7.10.2010, 12:41
Так... кастрируй по максимуму проект (убери лишние формы, модули, процедуры, контролы и пр., упрости код) - но чтобы проблема осталась. Выкладывай. Посмотрим.

Автор: Linzer 8.10.2010, 03:07
Цитата(Akina @ 7.10.2010,  12:41)
Так... кастрируй по максимуму проект (убери лишние формы, модули, процедуры, контролы и пр., упрости код) - но чтобы проблема осталась. Выкладывай. Посмотрим.

Спасибо тебе, разобрался! Все работает! smile 

Автор: Akina 8.10.2010, 07:30
Ну и в чём таки был косяк?

PS. Не забудь пометить вопрос как решённый (вверху справа).

Автор: Linzer 9.10.2010, 07:27
Цитата(Akina @ 8.10.2010,  07:30)
Ну и в чём таки был косяк?

PS. Не забудь пометить вопрос как решённый (вверху справа).

Да там в середине одной процедуры вызывалась другая, а там тоже была работа с этим же файлом, вот и косяк вышел...
Сейчас др проблема, я даже ни знаю как такое возможно)) Короче по клику на кнопку блокируются (Enabled) две другие, и почему то одна блокируется, а вторая нет) А когда нажимаешь еще раз на кнопку, которая блокирует, то та которая не блочилась блокируется...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)