Text files processing - VB
Формулировка задачи:
Вводные данные - VB5.0, и желание обойтись встроенными средствами именно этой версии, без подключения внешних модулей.
Пишу программу по обработке текстовых файла, достаточно больших по размерам, порядка 40-50 тысяч строк.
Предполагается, что программа воспринимает аргумент (имя файла) с командной строки,
показывает форму с именем файла и прогресс-баром, обрабатывает его и закрывается.
Но на пути к этой идилии возникло пару затруднений...
1) Открываю файл для построчного чтения OPEN Filename$ FOR INPUT, затем обрабатываю его
через цикл WHILE NOT EOF().... WEND. Предполагалась, что внутри этого цикла оператор LOC
вернет мне текущую байтовую позицию, и конструкция LOC()/LOF() *100 позволит мне получить
процент выполнения, для передачи в прогресс-бар. Оказалось напрасно - help говорит ай-я-яй
Sequential : Current byte position in the file divided by 128. However, information returned by Loc
for sequential files is neither used nor required
Пока вышел из положения предварительным подсчетом количества строк в цикле WHILE...WEND,
а затем открытием уже рабочего цикла FOR...NEXT. Но если в последнем случае передать процент
в прогресс-бар получается без проблем, то в первом - совсем никак, а операция достаточно длительная.
В идеале хотелось бы обойтись одним проходом, но вот как?
2) Первоначально предполагалось, что программа не потребует взаимодействия с пользователем. Но возникла проблема - форма не прорисовывается полностью - белый прямоугольник и квадратики прогресс бара.
Стоит поставить breakpoint в середине цикла FOR...NEXT - все на месте.
Интуитивно понимаю, что форма не получает фокус, но почему??? Пока вышел из положения через кнопку OK на форме. Вынес всю обработку в процедуру MAIN. Теперь форма вроде как прорисовывается, и после нажатия на кнопку выполняется код:
Но возникает другая проблема - на форме во время работы не меняются cвойства .CAPTION у меток. Предполагается, что в первом, вспомогательном цикле будет метка "Loading..." , перед работой второго она заменятся на имя обрабатываемого файла
[code]
Private Sub Main()
LblFilename.Caption = "Loading..."
Open FileInput$ For Input As #1
While Not EOF(1)
....
Wend
Close #1
LblFilename.Caption = Fileinput$
Open FileInput$ For Input As #1
For i = 1 To LineCount
DoEvents
....
Next i
Close #1
End Sub
[code]
Во время работы метка получает свойство "Loading..." и больше не меняется несмотря на явное присваивание перед выполнением цикла. Опять же - стоит остановить программу в середине цикла - все показывается как должно. Грешил на DOEVENTS, но что с ним, что без него - не выходит
3. Поскольку теперь на форме появилась кнопка "OK", а цикл достаточно протяженый по времени, хотелось бы хотя бы заблокировать повторное нажатие кнопки, и изменить ее на неактивную, но вот как это сделать?
Решение задачи: «Text files processing»
textual
Листинг программы
Open FileInput For Binary As 1 s = Space(LOF(1)) Get #1, , s Close 1 a=split(s,vbcrlf) 'кажется в VB5 нет этой ф-ии, можно содрать один из прототипов, например этот ([url]http://www.freevbcode.com/ShowCode.asp?ID=2250[/url]) или написать самому.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д