![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 122
|
![]()
Мое ПО - надстройка, которая (по совету EducatedFool – спасибо за совет!) инсталлируется и деинсталлируется с помощью InnoSetup. При этом еще используются скрипты. Прогресс-бар требуется, например, при завершении работы с программой (не для деинсталляции). Процесс занимает до 10-12 секунд .
Сейчас призавершении работы я п/п Finish скрываю все активные формы (до 6) и сразу запускаю свой «прогресс» ( в программном модуле общего назначения одна команда: ufProgress.Show) ufProgress - это пустая модальная форма с Caption = “идет процесс сохранения, подождите…” Выход из нее «крестом» - закрыт (в событии UserForm_QueryClose – команда: If CloseMode = vbFormControlMenu Then Cancel = True) Далее идет нудный процесс выгрузки форм, сохранения данных из форм в книге, восстановление нормального интерфейса приложения и книг, стирания временных имен и т.п. Конец п/п Finish: 'отключение Cancel на период сохранения надстройки Application.EnableCancelKey = xlDisabled 'сохранение надстройки (около 5-6 сек) ThisWorkbook.Save With Application If .Workbooks.Count = 0 Then .Quit Else Unload ufProgress End If End With End Sub Все работает без проблем, но подвешивать неинформативную (без динамики) форму как-то некрасиво. Прежде, чем пробовать предложенные варианты в ПО (в примерах-то я их прокрутил), хотелось бы просто услышать: пригодны ли они при такой структуре п/п Finish? А то боюсь в своем же запутаться… Ну, и динамика - вопрос! Простите за назойливость и заранее спасибо! |
![]() |
![]() |
![]() |
#12 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
Если вы намереваетесь отображать на форме такие действия, как сохранение, закрытие форм, ещё что-то, - то да. Если же надо отображать ход процесса сохранения (чтобы в течении 5 секунд, когда сохраняется надстройка, полоска индикатора ползла) - то нет. Не совсем понятно, что вы хотите получить в итоге. Можете просто вывести бегущую строку на форме - пример есть здесь: http://excelvba.ru/code/frmAbout |
|
![]() |
![]() |
![]() |
#13 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 122
|
![]()
Да в той же InnoSetup как-то сделано (при деинсталляции), что полоска индикатора заведомо медленно начинает заполняться, а когда процесс закончен - быстренько заполняется до конца и форма закрывается. Красиво, блин...
|
![]() |
![]() |
![]() |
#14 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 122
|
![]()
До чего-ж красив бегущий текст!!! Поразбираюсь...
Но опять DoEvents, который до меня не доходит и пугает -( Вроде как, на период до следующего шага вычислительные ресурсы отдаются другим процессам - а в этом многообразии прерываний мозги в трубочку..Дурацкая привычка пытаться вникать, куда вроде бы и не надо |
![]() |
![]() |
![]() |
#15 | |
Программист VBA
СуперМодератор
Регистрация: 13.07.2008
Сообщений: 6,858
|
![]() Цитата:
Хотите наблюдать песочные часы вместо курсора, чтобы Excel подвисал, чтобы не все компоненты формы сразу отрисовывались на экране, - не используйте DoEvents Если же вам надо сделать небольшую паузу, или дождаться наступления какого-то события, при этом не нагружая комп, - добавляйте оператор DoEvents внутрь цикла. |
|
![]() |
![]() |
![]() |
#16 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 122
|
![]()
Все так просто? - ну не скажите!
Вот Ваша бегущая строка (FormAbout.xls) - вроде все без проблем, но... Открываю книгу с макросами, запускается форма с бегущей строкой, ставлю курсор на текст формы "База договоров" (ставится!) и нажимаю Esc Форма гаснет и - зависон... Еше раз Esc - верещит дебугер "Code execution has been interrupted" и выход на ошибку в п/п StartAd... Но тут хоть выскочить можно по End дебугера. Что за эффект - не понял, да и зачем - такого просто не должно быть. Ей-Богу, случайно получилось! Пытался нащупать клавишу выхода, которая оказалась закрыта рисунком. Вот этаких эффектов по прерываниям я и боюсь, потому закрываю прерывания перед сохранением книги (еще и ряд клавиш и сочетаний) |
![]() |
![]() |
![]() |
#17 |
Форумчанин
Регистрация: 02.07.2009
Сообщений: 122
|
![]()
Вот текст из справочника функций vba:
Функция DoEvents DoEvents() Функция передает управление операционной системе для обработки событий и сообщений, ждущих в системной очереди и всех нажатий клавиш из очереди SendKeys. После обработки всех событий управление возвращается приложению(следующий за строкой DoEvents инструкции. Применяется для обеспечения возможности прерывания пользователем какой-нибудь длительной операции, выполняемой программой Возвращаемое значение Функция возвращает значение типа Integer, определяющих число открытых форм в Visual Basic, в других приложениях возвращается 0 Пример ' Создание переменной для хранения ' числа загруженных и видимых форм VB Dim I, OpenForms For I = 1 To 150000 ' Начало цикла If I Mod 1000 = 0 Then ' Если цикл выполнен 1000 раз ' Передает управление операционной системе OpenForms = DoEvents End If Next I ...Ну кабы не пример и возвращаемое значение.... ни хрена не понял! |
![]() |
![]() |
![]() |
#18 | |
Пользователь
Регистрация: 13.11.2007
Сообщений: 33
|
![]() Цитата:
Sub S100100() For i = 1 To 2 Cells.ClearContents sb = "" For r = 1 To 100 For c = 1 To 128 Cells(r, c) = "p." & Format(r, "00") & " c." & c If i = 2 Then If Len(sb) < r Then sb = sb & "I" Application.StatusBar = "Done " & Format(r, "00") & "% " & sb End If Next Next sb = "Процесс заполнения сейчас повторится. Следите за строкой состояния (снизу окна)" If i = 2 Then sb = "А с визуализацией процесса спокойнее..." MsgBox sb, vbOKOnly, "ГОТОВО..." Application.StatusBar = False Next End Sub в такой вот макрос (соответственно только строку состояния) Sub f4() Comm1 51, 4 Comm1 52, 5 Comm1 53, 6 Comm1 54, 7 Comm1 55, 8 Comm1 56, 9 Comm1 57, 10 Comm1 58, 11 Comm1 59, 12 Comm1 60, 13 Comm1 61, 14 Comm1 62, 15 End Sub Sub Comm1(arg1, arg2) Dim i As Long, acontrol As Date, icounter As Long With Sheets("ХРОНОМЕТРАЖ") For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i, 5) = "УТП" And .Cells(i, 29) <> "Вне базы " And .Cells(i, 1) <> acontrol And .Cells(i, 1) >= Sheets("Подведение итогов").Cells(arg1, 1) _ And .Cells(i, 1) <= Sheets("Подведение итогов").Cells(arg1, 2) Then acontrol = .Cells(i, 1) icounter = icounter + 1 End If Next Sheets("Подведение итогов").Cells(arg2, 6) = icounter End With End Sub Сам пытался, но чегой-то не получилось. Последний раз редактировалось Pilot; 01.09.2010 в 15:38. |
|
![]() |
![]() |
![]() |
#19 |
Старожил
Регистрация: 02.05.2009
Сообщений: 3,907
|
![]()
Не проверял,должно работать
Код:
Анализ,обработка данных Недорого
|
![]() |
![]() |
![]() |
#20 |
Пользователь
Регистрация: 13.11.2007
Сообщений: 33
|
![]()
Ругается на этой стоке
Application.StatusBar = "Done Macro " & Nom & Format(iperc, "00") & "% " & sb Сообщает: Run-time error '1004' Method 'StatusBar' of object '_Application' failed В строке состояния Done Macro 109% Последний раз редактировалось Pilot; 01.09.2010 в 16:29. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
BASS Визуализация | Garacio_cain | Мультимедиа в Delphi | 2 | 14.08.2008 00:19 |
Перенос макроса в модуль | valerij | Microsoft Office Excel | 6 | 09.06.2008 23:13 |
Привязка макроса к кнопке | VisuaL | Microsoft Office Excel | 7 | 10.05.2008 07:04 |
Запись макроса | valerij | Microsoft Office Excel | 5 | 01.12.2007 00:49 |
визуализация алгоритма | Alar | Паскаль, Turbo Pascal, PascalABC.NET | 0 | 30.10.2006 14:10 |