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]) или написать самому.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5