Запись лога в файл. Закипаю.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Запись лога в файл. Закипаю.

Сообщение Dimon111 » 17.04.2013 (Ср) 17:40

Нужно в одной процедуре открыть файл Open "data.txt" For Append As #1

А в другой - записать в него Print #1, Val(str). Ну так, для примера.

Беда в том, что в другой процедуре этого открытого файла не видно!

Т.е. система выдаёт просто ERROR на строку Print #1, "5"

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Запись лога в файл. Закипаю.

Сообщение ger_kar » 17.04.2013 (Ср) 18:49

Ну все правильно, файл открывается с локальной константой, зона видимости которой ограничивается процедурой. Поэтому следует использовать переменную уровня модуля.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.04.2013 (Ср) 19:05

ger_kar писал(а):с локальной константой

Хм...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Запись лога в файл. Закипаю.

Сообщение ger_kar » 17.04.2013 (Ср) 19:10

Ну да :) #1константа? Конечно! И зона видимости оной ограничивается процедурой. Как ее еще назвать то?
Бороться и искать, найти и перепрятать

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Запись лога в файл. Закипаю.

Сообщение Dimon111 » 17.04.2013 (Ср) 19:35

Нашёл выход.

В Form_Load() открываю файл: Open "data.txt" For Output As #1

В другой процедуре (Timer1_Timer()) тогда всё великолепно пишется: Print #1, Time

Если условие поменялось, закрываю файл в третьей процедуре и открываю там же вновь:

Код: Выделить всё
    Close #1
    Open "data.txt" For Output As #1

Таким образом файл очищается.
Работает.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.04.2013 (Ср) 20:57

ger_kar писал(а):Ну да :) #1константа? Конечно! И зона видимости оной ограничивается процедурой. Как ее еще назвать то?

Как у числовой константы может быть область видимости? Это же число и оно во всех местах одинаковое. Я что-то не понимаю?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Запись лога в файл. Закипаю.

Сообщение ger_kar » 17.04.2013 (Ср) 21:14

Ну число то одинаковое, но оно привязано к конкретной функции или процедуре. Не факт, что номер файла открытый в одной процедуре будет валидным в другой. Да и вообще открывать файл с константой довольно корявое решение само по себе.
Dimon111 писал(а):В Form_Load() открываю файл: Open "data.txt" For Output As #1

Если при таком раскладе открыть второй экземпляр формы уже будет облом.
Поэтому лучше всегда использовать переменную и функцию FreeFile. Для данного случая переменная должна быть глобальной.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 17.04.2013 (Ср) 21:53

ger_kar писал(а):Поэтому лучше всегда использовать переменную и функцию FreeFile.

Лучше, но не поэтому. Эта функция просто берет свободный номер.
Номер - это номер в рамках всей программы.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Запись лога в файл. Закипаю.

Сообщение ger_kar » 17.04.2013 (Ср) 22:00

Qwertiy писал(а):Лучше, но не поэтому. Эта функция просто берет свободный номер.
Правильно, но свободные номера могут быть разными, поэтому и следует использовать функцию FreeFile и присваивать, то что она возвращает переменным.
Бороться и искать, найти и перепрятать

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Запись лога в файл. Закипаю.

Сообщение Dimon111 » 18.04.2013 (Чт) 8:41

Появился следующий вопрос. Вывожу в файл:

Код: Выделить всё
Print #1, "R" & ReaderNum & " = " & Format(Reader / 100, "#000.00") & vbTab


Получаю результат:
R11 = 009,87
R12 = 001,27
R14 = 002,69
R15 = 000,06


Хотя должно быть по идее в одну строку (vbTab) вконце. Т.е. команда Print #1 обязательно вставляет либо 0xD, либо 0xA, либо всё сразу. Можно ли как - то этого избежать?

Dimon111
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 28.01.2008 (Пн) 22:11

Re: Запись лога в файл. Закипаю.

Сообщение Dimon111 » 18.04.2013 (Чт) 9:11

Понял. И всего - то нужно ";"

Код: Выделить всё
Print #1, "R" & ReaderNum & " = " & Format(Reader / 100, "#000.00") & vbTab;

А после цикла уже переводим строку:

Код: Выделить всё
Print #1, vbLf;


Вот что получилось:

Код: Выделить всё
R11 = 014,28   R12 = 001,90   R14 = 001,92   
R11 = 014,70   R12 = 001,66   R14 = 002,36   
R11 = 015,04   R12 = 001,53   R14 = 002,33   
R11 = 014,43   R12 = 001,23   R14 = 002,17   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 18.04.2013 (Чт) 12:20

Dimon111 писал(а):
Код: Выделить всё
Print #1, "R" & ReaderNum & " = " & Format(Reader / 100, "#000.00") & vbTab;
Print #1, vbLf;

:(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Запись лога в файл. Закипаю.

Сообщение Хакер » 18.04.2013 (Чт) 22:48

ger_kar писал(а):Не факт, что номер файла открытый в одной процедуре будет валидным в другой.

Вообще то факт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Запись лога в файл. Закипаю.

Сообщение ger_kar » 19.04.2013 (Пт) 16:33

Хакер писал(а):Вообще то факт.
Почему тогда
Dimon111 писал(а):Нужно в одной процедуре открыть файл Open "data.txt" For Append As #1А в другой - записать в него Print #1, Val(str). Ну так, для примера.Беда в том, что в другой процедуре этого открытого файла не видно!
???
Я предположил, что именно из-за того, что я собственно и изложил. Сам я так никогда не пишу, и всегда использую переменную нужной области видимости и FreeFile.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 19.04.2013 (Пт) 18:24

ger_kar писал(а):Сам я так никогда не пишу, и всегда использую переменную нужной области видимости и FreeFile.

Ты действительно думаешь, что VB будет отслеживать все действия с этой переменной и какая там область видимости?
Есть массив с указателями на открытые файлы и полученное значение однозначно связано с ним (но не является индексом).

ger_kar писал(а):Почему тогда

Вот мне тоже интересно... Вероятно, код кривой.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Запись лога в файл. Закипаю.

Сообщение ger_kar » 19.04.2013 (Пт) 18:28

Qwertiy писал(а):Ты действительно думаешь
Была обозначена проблема, я предположил почему. У меня таких ситуаций не было, ибо я всегда действую по другому. А как там оно есть в действительности, пес его знает :)
Бороться и искать, найти и перепрятать


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 77

    TopList  
cron