Пишу программу по обработке текстовых файла, достаточно больших по размерам, порядка 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 - все на месте.
- Код: Выделить всё
Private Sub Form_Activate()
'open file for input
Open FileInput$ For Input As #1
While Not EOF(1)
Line Input #1, FileString$
'calculate lines for progressbar
LineCount = LineCount + 1
Wend
Close #1
Open Fileinput$ For Output As #1
For i = 1 To LineCount
'draw progress bar
prgProgress.Value = i / LineCount * 100
' ******************************************
'read and processing....
Line Input #1, FileString$
' ******************************************
Next i
close #1
End Sub
Интуитивно понимаю, что форма не получает фокус, но почему??? Пока вышел из положения через кнопку OK на форме. Вынес всю обработку в процедуру MAIN. Теперь форма вроде как прорисовывается, и после нажатия на кнопку выполняется код:
- Код: Выделить всё
Private Sub cmdOK_Click()
Call Main
End Sub
Но возникает другая проблема - на форме во время работы не меняются cвойства .CAPTION у меток. Предполагается, что в первом, вспомогательном цикле будет метка "Loading..." , перед работой второго она заменятся на имя обрабатываемого файла
- Код: Выделить всё
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", а цикл достаточно протяженый по времени, хотелось бы хотя бы заблокировать повторное нажатие кнопки, и изменить ее на неактивную, но вот как это сделать?