Функция doevents


Содержание

Использование Application.DoEvents()

Может ли Application.DoEvents() использоваться в С#?

Является ли эта функция способом, позволяющим графическому интерфейсу догонять остальную часть приложения, во многом аналогично тому, как это делает VB6 DoEvents ?

Из моего опыта я бы посоветовал очень осторожно использовать DoEvents в .NET. Я испытал некоторые очень странные результаты при использовании DoEvents в TabControl, содержащем DataGridViews. С другой стороны, если все, с чем вы имеете дело, это небольшая форма с индикатором выполнения, тогда все может быть в порядке.

В нижней строке: если вы собираетесь использовать DoEvents, вам необходимо тщательно протестировать его перед развертыванием приложения.

Хмя, прочная мистика DoEvents(). Было огромное количество негативной реакции на него, но никто никогда не объясняет, почему это «плохо». Такая же мудрость, как «не мутировать структуру». Erm, почему среда выполнения и язык поддерживают мутацию структуры, если это так плохо? По той же причине: вы стреляете в ногу, если не делаете это правильно. Без труда. И делать это правильно требует, чтобы точно знать, что он делает, что в случае с DoEvents() определенно непросто перебирать.

С самого начала: практически любая программа Windows Forms фактически содержит вызов DoEvents(). Он хитро замаскирован, но с другим именем: ShowDialog(). Это DoEvents(), который позволяет диалогу быть модальным без его замораживания остальных окон в приложении.

Большинство программистов хотят использовать DoEvents, чтобы остановить их пользовательский интерфейс от зависания, когда они пишут свой собственный модальный цикл. Конечно, это так; он отправляет сообщения Windows и получает любые запросы на краску. Однако проблема состоит в том, что она не является выборочной. Он не только отправляет сообщения с краской, но и передает все остальное.

И есть набор уведомлений, которые вызывают проблемы. Они идут примерно на 3 фута перед монитором. Например, пользователь может закрыть главное окно, пока цикл, вызывающий DoEvents(), запущен. Это работает, пользовательский интерфейс ушел. Но ваш код не останавливался, он все еще выполняет цикл. Это плохо. Очень, очень плохо.

Там больше: пользователь может щелкнуть тот же элемент меню или кнопку, которая заставляет тот же цикл запускаться. Теперь у вас есть две вложенные петли, выполняющие DoEvents(), предыдущий цикл приостановлен и новый цикл начинается с нуля. Это может сработать, но у мальчика шансы тонкие. Особенно, когда заканчивается вложенная петля и возобновляется приостановление, пытаясь завершить работу, которая уже была завершена. Если это не бомбит с исключением, то, безусловно, данные скремблируются в ад.

Вернуться к ShowDialog(). Он выполняет DoEvents(), но заметьте, что он делает что-то еще. Он отключает все окна приложения, кроме диалога. Теперь, когда проблема в 3 фута решена, пользователь не может ничего сделать, чтобы испортить логику. Решатся и режимы с закрытыми окнами, и с началом работы. Или, говоря иначе, у пользователя нет возможности сделать код вашей программы в другом порядке. Он будет выполнять предсказуемо, точно так же, как и при тестировании вашего кода. Это делает диалоги крайне раздражающими; кто не ненавидит, что диалог активен и не может копировать и вставлять что-то из другого окна? Но что цена.

Это то, что нужно для безопасного использования DoEvents в вашем коде. Установка свойства Enabled всех ваших форм на false — быстрый и эффективный способ избежать проблем. Конечно, программисту никогда не нравится это делать. И нет. Вот почему вы не должны использовать DoEvents(). Вы должны использовать потоки. Даже при том, что они передают вам полный арсенал способов стрелять ногой красочными и непостижимыми способами. Но с тем преимуществом, что вы стреляете только своей ногой; он не будет (обычно) позволять пользователю стрелять в нее.

Как использовать Application.DoEvents() не в цикле

Добрый день, Товарищи!
Не совсем могу разобраться как использовать Application.DoEvents(), не в цикле, а в коде.

Допустим есть саб, которой заполняет отчет в ворде. Допустим в нем 20 строк. Как прописать Application.DoEvents(), так что бы юзер мог пользоваться программой, пока выполняется та задача?

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

Добавлено через 5 минут
Не очень хочется вешить очередной статус маркер, и делать do while, если я верно понимаю как нужно использовать это.

Добавлено через 14 минут
Даже немного по другому.Когда у меня такой код, где каждая строка начинается с функции, я уже понял. я просто в начало функции написал

А если код, который просто построчный?

К примеру это перенос из ворда, на нашу форму. он перебирает нужные ячейки и кладет в датагрид.
Как сюда подключит ?

03.12.2020, 14:08

Как перевести Console Application в Windows Application
Imports System.Console Module Module1 Sub Main() Dim S() As Char .

Обновление приложения: можно ли использовать Application.StartupPath в качестве корневой папки
Привет всем)))) есть несколько вопросов по поводу этой темы Итак первый вопрос: #Region.

Application.DoEvents
Здравствуйте, возник такой вопрос. В программе используется команда Application.DoEvents. Как.

Замена Application.DoEvents()
Доброй ночи, форумчане. Сталкнулся с такой проблемой: в многопоточном приложении заявки.

Метод — Application.DoEvents();
Добрый день. Есть такой метод: Application.DoEvents(); — Обрабатывает все сообщения Windows.

03.12.2020, 16:03 2 03.12.2020, 16:10 [ТС] 3 03.12.2020, 16:12 4 03.12.2020, 16:18 [ТС] 5

Может другими словами я помойму, потому что сейчас я все равно не понял смысла даже. Отоброжать что частями, что именно формировать в коллекции.

Добавлено через 4 минуты
OwenGlendower, Правильно ли я понял,
Сформировать коллекцию «куда переносим»
Сформировать коллекцию «что переносим»
а потом циклом 1=1, где и повесить ивент, сделать действие. или не правильно?

Функция doevents

2vv » 17.03.2008 (Пн) 19:37

ANDLL » 17.03.2008 (Пн) 20:05


Не, она делает нечто совершенно другое. Просто обрабатывает накопленные клики, клавиши и прочее.
Система сама себе передает управление, когда ей захочется.

Вообще решение проблемы — просто понаставить в узких местах функции DoEvents.

Wildwhiteash » 17.03.2008 (Пн) 22:34

покажу кусок кода с камментами
Код: Выделить всё ‘******************************
‘этот кусок для понимания не принципиален
‘время его выполнения где то от 0,05сек до 3 сек
Private Sub mnuWriteToDisk_Click()
ReDim BuferS(0)
Call WriteModule(SelectedItemMenuMod) ‘ SelectedItemMenuMod — переменная с номером эл-та списка
‘пишет модуль служебной информации на блины винта
ReDim BuferS(0)
End Sub
‘******************************

‘******************************
‘а вот эта фиговина пишет туду все отмеченные
‘если не делать DoEvents
‘то пока всё не отработает, то формы приложения висят
‘и ессно по кнопке СТОП ничего не происходит
Private Sub mnuWriteAllToDisk_Click()

Dim XX As Byte
Dim NextMod As Label

ProgressBarMod.Min = 0
ProgressBarMod.Max = 100

bStopMOD = False
For XX = 1 To (lw1.ListItems.Count)
lw1.ListItems.Item(XX).Selected = True
SelectedItemMenuMod = XX
If lw1.ListItems.Item(XX).Checked = False Then GoTo NextMod

ReDim BuferS(0)
Call WriteModule(SelectedItemMenuMod)
ReDim BuferS(0)

DoEvents ‘ ВОТ ОНО.
‘перед проверкой кнопки СТОП
‘можно тыкать несколько штук в процедурине
‘там где хотелось бы что то развесить (антоним «завесить»)

If bStopMOD = True Then
ProgressBarMod.Value = 0
ProgressBarMod.DrawProgressBar
Exit Sub
End If

NextMod: ProgressBarMod.Value = Int((XX * 100) \ (lw1.ListItems.Count))
ProgressBarMod.DrawProgressBar
lw1.Refresh

Next XX
ProgressBarMod.Value = 0
ProgressBarMod.DrawProgressBar
End Sub
‘******************************

2vv » 17.03.2008 (Пн) 23:18

Wildwhiteash В приведенном примере Doevents стоит после процедуры. Это я к тому , что до DoEvents еще очередь должна дойти, а дойдет она после того как выполниться процедура «Call WriteModule(SelectedItemMenuMod)» .
Привожу код , который я использую:
Код: Выделить всё strComputer = «.»
Set objWMIService = GetObject(_
«winmgmts:\\» & strComputer & «\root\cimv2»)
Set colPings = objWMIService.ExecQuery _
(«Select * From Win32_PingStatus where Address = ‘192.168.1.1’»)

For Each objStatus in colPings
If IsNull(objStatus.StatusCode) _
or objStatus.StatusCode<>0 Then
WScript.Echo «Computer did not respond.»
Else
Wscript.Echo «Computer responded.»
End If
Next

Так вот, у меня , пока не отработает IsNull(objStatus.StatusCode) программа дальше не выполняется, а ждать приходится несколько секунд, на которые программка «вешается». Добавление DoEvents строкой выше или ниже проблему не решает, потому как ждемс пока отработает вышеприведенная функция.
Если я не прав, поправьте.

alibek » 18.03.2008 (Вт) 9:28

alibek » 18.03.2008 (Вт) 9:29

2vv » 18.03.2008 (Вт) 12:36

alibek » 18.03.2008 (Вт) 16:02

2vv » 18.03.2008 (Вт) 19:24

2vv » 18.03.2008 (Вт) 19:26

Viper » 19.03.2008 (Ср) 7:56

Antonariy » 19.03.2008 (Ср) 10:26

2vv » 19.03.2008 (Ср) 11:39

Antonariy Не могли бы пояснить как это сделать.

Что еще пробовал:
Посмотрел пример многопоточности с вышеприведенной ссылки. Попробовал свой код запустить в другом потоке — неудачно. Похоже что в фоновом потоке нельзя обращаться к WMI.

Решил поискать готовый контрол для работы с icmp . Оказалось что есть и такие. Например здесь OstroSoft.com. С этим контролом еще проще чем с WMI. Но все-таки форма «подвисает» когда пингуешь выключенные компы, но в целом стало значительно лучше. Остановлюсь на этом варианте. Хотя на досуге попробую организовать пингование в фоновом потоке.

Antonariy » 19.03.2008 (Ср) 14:00

2vv » 19.03.2008 (Ср) 17:50

alibek » 19.03.2008 (Ср) 17:59

Основное тут не в этом.
Основное — в первом предложении, тип проекта — Active EXE.
Это единственный легальный способ сделать в VB многопоточную программу.

Ты пишешь объект, у которого будет метод Ping и событие PingComplete. Из своей основной программы ты создаешь этот объект, вызываешь метод Ping, а тот вызовет событие PingComplete по завершению работы. При этом этот метод будет работать в отдельном потоке и не будет приостанавливать твою программу.


Antonariy » 19.03.2008 (Ср) 19:10

если сам пинг выполняется не в методе. Это важно.

В общем, вот заготовка.

2vv » 19.03.2008 (Ср) 19:41

2vv » 19.03.2008 (Ср) 19:57

Хакер » 19.03.2008 (Ср) 20:48

2vv » 19.03.2008 (Ср) 22:04

2vv » 19.03.2008 (Ср) 22:30

2vv » 20.03.2008 (Чт) 1:30

Хакер » 20.03.2008 (Чт) 2:21

2vv
«Параметр не факультативный» означает в первую очередь, что надо избавиться от руссифицированного VB6.

Во-втторую, что параметр, который не Optional, почему-то тобой не задан.

2vv » 20.03.2008 (Чт) 14:48

На работе стоит английская версия. Так ней даже класс не может открыть. Пишет «Automation error» на строке:
Set lPing = New PingExe.PingClass

Дома такой ошибки нет. Ссылку на класс в проекте прописал.
Может в VB какие-то настройки есть хитрые ?

2vv » 20.03.2008 (Чт) 15:30

Проблема которая описана постом выше решена. Проект был на рабочем столе. Английский VB6 не умеет работать с русскими папками.

Возвращаясь к теме, как задать параметр который не Optional.
Я объявляю класс:
Dim WithEvents lPing as PingExe.PingClass

в классе есть событие PingComplete, которое получает значение по прохождении процедуры Ping (это метод класса). Так вот mPing_PingComplete — «Argument no optional» . Я не понимаю в чем загвоздка.

Antonariy » 20.03.2008 (Чт) 15:39

Умеет. Проблема была не в этом.

На строчке mPing_PingComplete не может возникать такая ошибка. Она может возникнуть если событие описано с параметрами, а генеришь его без параметров, типа этого:
Код: Выделить всё Public Event PingComplete(Success as Boolean, Timeout as Single)

2vv » 20.03.2008 (Чт) 15:45

Что бы было проще, покажу что написал
Это процедура главной формы опрашивает ячейки таблицы и присваивает статус:
Код: Выделить всё Private Sub stping()
Dim i
For i = 1 To 15 Step 1
IP_ADR = CStr(GrdTable.TextMatrix(i, 1))
If Len(IP_ADR) <> 0 Then
lPing.Ping IP_ADR
If lPing_PingComplete <> 0 Then
Avaible = «OFFLINE»
GrdTable.Row = i
GrdTable.Col = 3
GrdTable.CellBackColor = vbRed
Else
Avaible = «ONLINE»
GrdTable.Row = i
GrdTable.Col = 3
GrdTable.CellBackColor = vbGreen
End If
GrdTable.TextMatrix(i, 3) = Avaible
‘WinsockInit
‘GrdTable.TextMatrix(i, 2) = HostByAddress(IP_ADR)
Else
End If
Next
End Sub

Это модуль класса:
Код: Выделить всё Option Explicit
Dim WithEvents Timer As Timer
Dim Form As Form1
Dim IpAdr As String
Dim objPing
Dim objStatus
Dim Ret As Long
Public Event PingComplete(Status As Long)

Public Sub Ping(IP_ADR As String)
IpAdr = IP_ADR
Set objPing = GetObject(«winmgmts:«).ExecQuery(«select * from Win32_PingStatus where address = ‘» & IpAdr & «‘»)
For Each objStatus In objPing
If IsNull(objStatus.StatusCode) Or objStatus.StatusCode <> 0 Then
Ret = 1
Else
Ret = 0
End If
Next
Timer.Enabled = True
End Sub
Private Sub Class_Initialize()
Set Form = New Form1
Load Form
Set Timer = Form.Timer1
End Sub
Private Sub Class_Terminate()
Set Timer = Nothing
Unload Form
Set Form = Nothing
End Sub
Private Sub Timer_Timer()
Timer.Enabled = False
RaiseEvent PingComplete(Ret)
End Sub

Илон Маск рекомендует:  Атрибут cellspacing в HTML

Вобщем lPing_PingComplete ничего не отдает. Правда я еще не до конца разобрался как работать с событиями.

alibek » 20.03.2008 (Чт) 15:54

2vv , ты написал ерунду, не разобравшись, что тебе посоветовали.
lPing_PingComplete — это не переменная.
Твой код должен быть таким: lPing.Ping IP_ADR
Все.
Остальное пишется в событии lPing_PingComplete.

Кроме того, то как ты сделал, не поможет тебе избавиться от тормозов.
Непосредственно пингование должно быть в процедуре таймера, а не в методе Ping. В методе Ping ты задаешь внутренние переменные и запускаешь таймер.

2vv » 20.03.2008 (Чт) 22:02

Diplom Consult.ru

При организации вычислительных процедур с циклами Visual Basic по умолчанию не реагирует на события. Негативные последствия этого наглядно проявляются при работе с движущимися графическими объектами: объект не меняет положение или не изменяется предусмотренный цвет и т. д. Чтобы избежать таких последствий необходим механизм отслеживания состояния операционной системы и реагирования на различного рода события.

Задачи такого рода выполняет функция DoEvents. В каком бы месте программы ни стоял данный оператор, он сигнализирует Visual Basic о том, что управление передано операционной системе для обработки всех событий.


Функцию DoEvents нельзя использовать в процедуре обработки

событий, которая вызывается несколько раз. Иначе можно легко организовать в программе бесконечный цикл.

4.3.6. Упражнения: графические объекты

Поместите в форму элемент управления PictureBox. Исследуйте графические методы Line, Circle, Point и Print и способы управления представлением текста и рисунков (ClipControls и AutoRedraw) (табл. 4.3, примеры 4.10).

Поместите в форму элемент управления PictureBox. Загрузите в него рисунок. Исследуйте влияние свойств AutoSize и Align на положение и размеры объекта. Результаты исследования представьте в виде таблицы.

Поместите в форму элементы управления Image. Загрузите в него рисунок. Исследуйте влияние свойства Stretch элемента управления на взаимодействие объекта с рисунком.

Поместите на форму элементы управления PictureBox и Image. Поместить в объект PictureBox рисунок и скопируйте его с уменьшением в элемент управления Image.

Исследуйте метод Point (пример 4.12).

4.3.7. Закрепление материала

1. Для чего предназначен графический объект PictureBox?

2. Какими свойствами обладает объект PictureBox?

3. Как влияет свойство AutoSize на размер рисунка, помещаемого в объект PictureBox?

4. Какие типы файлов можно загружать в VB?

5. Чем отличается растровое изображение от векторного?

6. Для чего предназначен элемент управления Image?

7. Поясните основные свойства элемента управления Image?

8. Какую функцию выполняет свойство AutoRedraw?

9. Для чего предназначен и как используется метод Refresh?

10. Как влияет свойство ClipControl на скорость выполнения программы?

11. Поясните назначение метода PaintPicture.

12. Поясните назначение метода Point.

4.4. Анимация

4.4.1. Элемент управления Animation

Элемент управления Animation позволяет легко включать в программу различные анимационные эффекты. Он используется для воспроизведения не озвученных видео роликов в формате AVI. Видео ролик в данном формате фактически представляет собой набор растровых изображений (кадров). Кадры выводятся последовательно через равные промежутки времени, за счет чего и создается анимационный эффект, почти как в обычных мультфильмах. Обычно элемент управления Animation применяется там, где нужно “создать видимость работы”, например в процедуре копирования файлов в Windows.

Другим способом создания анимационных эффектов является использование таймера. Через определенные промежутки времени нужно просто изменять положение на экране элемента управления Image или другого рисованного объекта.

Настройка элемента управления Animation

Чтобы настроить элемент управления, его нужно сначала поместить в Форму. При этом создается контейнер для воспроизведения последовательности анимационных изображений. Чтобы теперь просмотреть фильм, нужно открыть конкретный файл и запустить его на воспроизведение. Для этой цели в форму надо поместить кнопку и в процедуру Click этой кнопки написать текст программы, который открывает и проигрывает видеофильм.

Элемент управления Animation три метода: Open, Play, Stop.

Метод Open используется для открытия файла.

Animation1.Open “Спецификация файла”

М етод Play (или свойство AutoPlay элемента управления Animation) обеспечивает управление демонстрацией ролика. Этот метод имеет три параметра:

Repeat – определяет число повторных воспроизведений;

Start – определяет номер кадра, с которого должно начаться воспроизведение;

Stop – определяет номер кадра, на котором должно заканчиваться воспроизведение.

Animation1.Play Repeat, Start, Stop


Метод Stop используется для остановки видеофильма.

Animation1.Play 2,5, 15

В приведенном примере, и на рис. 4.5., дважды воспроизводятся кадры с №5 по №15.

Советы тем, кто программирует на VB & VBA

Андрей Колесов, Ольга Павлова

Совет 234. Используйте свойство ItemData элемента управления ListBox для хранения идентификаторов

Часто при заполнении элемента управления ListBox информацией из базы данных бывает необходимо, чтобы этот компонент не только выводил описания элементов базы данных, но и хранил некоторые ключевые значения. Например, если окно списка содержит имена сотрудников, наверное, будет полезно хранить здесь также их персональные идентификаторы. В том случае, если вы используете числовые идентификаторы, VB предоставляет возможность осуществить это с помощью свойства ItemData компонента ListBox, которое позволяет хранить дополнительное число для каждого элемента списка. Проиллюстрируем это на таком примере. Поместите окно списка на стандартную форму и введите следующий код:

Запустите проект на выполнение — в окне списка выводятся только имена сотрудников. Щелкните мышью на любом из элементов, и на экране появится окно сообщения, содержащее имя выбранного сотрудника и его идентификатор.

Совет 235. Как правильно сгенерировать значения ADO RecordCount в VB

Как известно, свойство ADO RecordCount возвращает количество записей в наборе записей ADO. Однако в некоторых случаях данное свойство возвращает значение, равное –1. Почему так происходит? Дело в том, что значение, возвращаемое свойством RecordCount, зависит от типа курсора в наборе записей: –1 для курсора, перемещаемого только вперед; реальное количество записей — для статического курсора или курсора, управляемого клавишами на клавиатуре; –1 или реальное количество записей — для динамического курсора, в зависимости от источника данных.

Однако вам будет также интересно узнать, что значение RecordCount равно –1 для наборов записей, созданных с помощью метода Execute для объекта Connection или Command. Это происходит потому, что данный метод генерирует набор записей, перемещаться по которому можно только вперед и который возвращает, как мы уже упоминали выше, –1. В качестве примера создайте следующую подпрограмму внутри стандартного VB-проекта. (Не забудьте установить ссылку на Microsoft ActiveX Data Objects 2.1 Library и изменить путь к базе данных Biblio.mdb в соответствии с тем, где она хранится на вашем компьютере.) Запустите проект на выполнение, и вы увидите окно сообщения, содержащее такие значения: –1 для набора записей на базе myConRst и 6246 — для myKeyRst.

Совет 236. Пусть VB сам определяет, есть в дисководе CD-ROM компакт-диск или нет

Для того чтобы быстро определить, не забыл ли пользователь вставить компакт-диск в дисковод CD-ROM, используйте свойство IsReady для объекта Drive. Данное свойство возвращает значение True (Истина) только в том случае, если компакт-диск находится в устройстве CD-ROM. Рассмотрим следующий пример. Установите ссылку к библиотеке Microsoft Scripting Runtime (scrrun.dll), а затем создайте переменную Drive для дисковода CD-ROM. Протестируйте свойство IsReady, как показано ниже:

Совет 237. Как добавить новый элемент к системному меню формы

В некоторых случаях вам может понадобиться добавить дополнительный элемент к системному меню формы. (Кнопка системного меню находится в верхнем левом углу формы.) Для этого воспользуйтесь тремя API-функциями — GetSystemMenu, AppendItemMenu и DrawMenuBar:

Как видно из приведенного выше кода, подпрограмма находит указатель к копии системного меню текущей формы. Затем она добавляет строку «Свой элемент меню» к списку команд системного меню, и наконец перерисовывает меню, добавляя новый текст в конец списка. Команду DrawMenuBar следует всегда использовать при изменении системного меню, даже если в данный момент оно является невидимым.

То, что вы просто добавили новую команду к системному меню, совершенно не означает, что она будет выполнять какую-либо операцию: для этого необходимо написать соответствующий код. Функция AppendMenu предлагает несколько различных параметров, описывающих элемент, который вы хотите добавить к системному меню. Полный список этих параметров приводится в файле Справки.

Следует помнить также, что для функции AppendMenu имеется более мощный аналог — новая API-функция InsertMenuItem, которая, хотя и предлагает более широкие возможности управления, намного более сложна в использовании. Поэтому если вы просто хотите поместить дополнительный элемент в конец списка команд системного меню, для этого лучше всего подойдет функция AppendMenu.

Совет 238. Как быстро осуществить проверку на наличие определенного элемента в списке

Если вы хотите определить, находится ли в списке какой-либо определенный элемент, обычно вы создаете массив, в котором и осуществляете поиск. В качестве более быстрой альтернативы для коротких списков предлагаем использовать строку неограниченной длины вместо массива. Например, предположим, что у вас есть элемент управления ListBox и вы хотите проверить, содержится ли там заданный пользователем элемент. Для начала осуществите просмотр списка в цикле и создайте такую строку:

После этого с помощью функции Instr() определите, содержит ли новая строка искомый элемент:

Совет 239. Используйте для объектов ADO родные драйверы OLEDB вместо драйверов ODBC

При создании строки соединения (connection string) для объектов ADO имеется возможность задать драйвер источника данных либо как Driver, например, так:

либо как Provider, наподобие следующего:

Однако в первом случае объект ADO использует более старые драйверы ODBC для связи с источником данных, в то время как во втором применяется OLEDB, являющийся “родным” для ADO интерфейсом доступа к данным. Поэтому всегда, когда это возможно, пользуйтесь вариантом Provider. Напоминаем, что “родные” драйверы OLEDB существуют для SQL Server, Index Server, Site Server Search и Oracle.

Совет 240. Как модифицировать элемент управления DataGrid при помощи изменения набора записей

Элемент управления DataGrid, входящий в состав VB 6.0, является хорошим средством для представления данных в табличном виде. Однако в нем имеется несколько ошибок. Часть из них была исправлена в Service Patch 3, но некоторые из них все же остались. Например, если вы свяжете элементы управления DataGrid и DataEnvironment, затем измените набор данных, используемый в DataEnvironment, и обновите DataGrid с помощью метода Refresh, этот компонент останется неизменным. К сожалению, метод Refresh не работает, когда свойство DataSource элемента управления DataGrid установлено как DataEnvironment. Поэтому, чтобы отразить изменения, которые были сделаны в наборе данных элемента управления DataEnvironment, следует сначала обновить эти данные, а затем повторно связать DataGrid с DataEnvironment. Поэтому если у вас есть кнопка Refresh, событие Click для нее может выглядеть так:

Теперь, когда вы щелкнете мышью кнопку Refresh, приведенный выше код повторно свяжет элементы управления DataEnvironment и DataGrid, а затем заново заполнит последний из них обновленными данными.

Совет 241. Как запустить на выполнение VB-приложение в процессе инициализации Windows

В зависимости от версии Windows, в которой вы работаете, существуют два различных способа выполнить VB-приложение в процессе загрузки системы. Для Windows 9x поместите команду Shell в раздел [Boot] файла System.ini, например так:

Для Windows NT/2000 используйте ту же самую команду Shell в Системном Реестре (Registry) в разделе

Будьте, однако, осторожны, выполняя подобные модификации, поскольку это может привести к некорректной работе Windows.

Совет 242. Как восстановить короткое имя файла в VB без помощи API-функций

Во многих случаях может возникнуть необходимость сделать ссылку на файл в соответствии с соглашением об именах файлов 8.3. Вы, несомненно, неоднократно встречали такие имена в MS-DOS. Например, используя данное соглашение, папка Program Files превращается в Progra


1. Поэтому вам приятно будет узнать о том, что в VB 6.0 появилась возможность восстанавливать короткие имена файлов, не обращаясь к API-функции GetShortPathName. В качестве альтернативы новая библиотека Scripting Runtime предлагает свойство ShortPath для объектов File и Folder. Чтобы получить короткое имя файла, просто добавьте ссылку к Microsoft Scripting Runtime, а затем введите следующий код:

Совет 243. Создавайте временные VB-файлы с помощью API-функции

Если вы когда-либо работали с Word или другим приложением Office, вы, вероятно, обратили внимание, что каждый раз при открытии файла Office создает временный файл, в котором будут храниться все изменения. И тогда у вас мог возникнуть вопрос, как создавать произвольные временные файлы в своем собственном VB-приложении. Для этого воспользуйтесь API-функцией GetTempFileName:

Аргумент lpszPath передает полное имя файла (включая путь к нему), lpPrefixString позволяет добавить префикс из трех букв слева от имени файла, а wUnique дает команду Windows либо создать файл с произвольным именем (wUnique равен 0), либо использовать заданный номер. Параметр lpTempFileName, конечно же, содержит имя нового временного файла. В качестве примера поместите приведенное выше объявление API-функции в стандартный модуль, а затем напишите следующую функцию:

После этого откройте новую форму и введите следующий код в ее событие Click. (Замените D:\Articles\IVB на любой допустимый путь.)

Запустите проект на выполнение. Заданный вами каталог теперь содержит временный файл, имя которого было выведено в окне сообщения.

Обратите внимание: для того чтобы приведенная выше функция работала надлежащим образом, вы должны задать только допустимый путь. В противном случае функция GetTempFileName вернет 0 и нулевой параметр в качестве имени файла в Windows NT. В Windows 9x неправильно указанный путь также вернет 0, а параметр lpTempFileName не будет содержать имя временного файла.

Совет 244. Как преобразовать число в строку с фиксированным количеством цифр

Порой бывает нужно вывести числа с фиксированным количеством цифр, когда впереди добавляются нули: например, если требуется представить число 12345 в виде 0012345. Это легко осуществимо с помощью такой функции:

Совет 245. Используйте режим Option Explicit

Именно так назвался один из первых советов, опубликованных в самом начале цикла «Советы для тех, кто программирует на VB» четыре года назад (КомпьютерПресс 5/96). С тех пор мы неоднократно показывали на разных примерах пользу обязательного объявления переменных: затраченное на написание нескольких операторов Dim время многократно окупается ускорением отладки. И тем не менее вновь вернуться к этому вопросу нас заставило письмо читателя Игоря, который обратился к нам с «неразрешимой» проблемой.

Илон Маск рекомендует:  Что такое код complex

Игорь хотел подключить DLL-процедуру, написанную на Фортране, к VB. Вопрос корректной передачи параметров в DLL не совсем тривиален, поэтому мы посоветовали ему начать с отладки какого-нибудь простого случая, например с передачи имени файла, который нужно прочитать в DLL, в виде строковой переменной.

С внешней стороны тестовый пример выглядел правильно:

Прислав этот пример, Игорь сообщил, что он уже два дня безуспешно сражается с ним, причем обычно происходит аварийное завершение программы с «мгновенным исчезновением среды VB». Он испробовал разные варианты передачи имени файла, в том числе с использованием байтовых массивов и структур данных, но с тем же неудачным результатом. Распечатка переменной pfn упорно показывала отсутствие нужного имени файла. А может быть, тут проблема в путанице ANSI/Unicode? Или «глючит» Windows 98 Second Edition?

Однако «ларчик просто открывался». На самом деле в VB-программе Игоря используются две разные переменные: в первой и третьей строках указана переменная «cc» (обе буквы латинские), а во второй — «сc» (первая буква русская).

Определить это на взгляд просто невозможно. Но мы всегда применяем режим Option Explicit, поэтому компилятор сразу же сообщил, что во второй строке используется неопределенная переменная. Мы, конечно, сначала не поверили своим глазам, но потом вспомнили случай из времен DOS. Тогда у нас был установлен какой-то русификатор клавиатуры, у которого переключение клавиш на русский язык порой срабатывало только после нажатия первой клавиши. В результате при вводе такого текста
Andy спит
оказывалось, что в слове «спит» первая буква — английская. Заметить разницу было невозможно («с» и «с» находятся на одной клавише). В этой связи еще один совет: старайтесь использовать шрифты, которые используют различные начертания внешне похожих русских и латинских букв.

После исправления идентификатора пример стал нормально работать. Таким образом, для того чтобы не терять несколько дней на отладку, нужно было всего-навсего установить режим Option Explicit (который автоматически определяется командой Tools|Options|Editor|Required Variable Declaration).

Совет 246. Как сделать временную задержку

В версиях MS Basic для DOS имелся полезный оператор временной задержки
SLEEP Seconds
который приостанавливал выполнение программы на указанное число секунд. Такого оператора в VB не существует, но его нетрудно реализовать самостоятельно в виде следующей простой подпрограммы:

Здесь нужно обратить внимание на использование функции DoEvents, которая позволяет производить другие процессы параллельно с выполнением текущего цикла. (DoEvents передает управление операционной системе, а сама функция возвращает число открытых форм в данном VB-приложении.)

Старый оператор SLEEP осуществлял задержку выполнения на заданное число секунд или до нажатия любой клавиши клавиатуры. (В Basic/DOS с ним были свои проблемы, так как код нажатой клавиши оставался в буфере клавиатуры и автоматически использовался в последующих операциях ввода. Для предотвращения подобной ситуации после оператора SLEEP нужно было очищать буфер.)

При желании такой режим можно реализовать и в нашей функции SleepVB. Один из ее вариантов, а также необходимость применения функции DoEvents мы покажем в следующем примере.

Совет 247. Как сделать заставку при старте VB-программы или VBA-документа

Как сделать, чтобы при запуске VB-программы появлялась некая заставка-форма, которая бы автоматически исчезала после завершения загрузки программы? Для этого лучше всего использовать вариант старта приложения с подпрограммы Main (устанавливается командой Project Properties|General|Strartup Object), которая может выглядеть примерно следующим образом:

Обратите внимание, что форма-заставка появляется здесь только на очень короткое время (в данном случае — на время загрузки frmMain) и тут же исчезает. Как сделать временную задержку, мы покажем ниже.

А как создать заставку, которая бы появлялась при открытии офисного документа, например для Word 97/2000?

Откроем Word, создадим новый документ под названием Splash.doc и перейдем в среду VBA (Alt+F11). Затем создадим форму (Insert|UserForm), для которой установим свойства Name=frmSplash и Caption="Заставка нашей программы". На заставке можно показать разнообразную информацию о нашем приложении (название, логотип, имя автора и пр.). Мы же сейчас ограничимся только размещением небольшой GIF-картинки с помощью установки свойства Picture (рис. 1).

Теперь в окне Project откроем узел Microsoft Word Objects и дважды щелкнем появившийся в нем стандартный элемент ThisDocument (в Excel это соответственно Microsoft Excel Objects|ThisWorkbook). В открывшемся окне кода в списке предопределенных событийных процедур (в правом верхнем углу) найдем подпрограмму Open. Именно ей передается управление в момент открытия документа, и сюда можно поместить любой код для выполнения необходимых стартовых операций. Поместим в нее следующий программный код (рис. 2):

Для проверки работы этой процедуры нужно сначала сохранить и закрыть документ, а затем заново открыть его.

Совет. Чтобы избежать постоянного закрытия-открытия документа для проведения отладки, измените в описателе Sub Document_Open ключевое слово Private на Public. В этом случае данная процедура автоматически попадет в список макрокоманд документа, и вы сможете обращаться к ней любой момент без перезагрузки документа.

Однако, запустив процедуру Document_Open, мы обнаружим, что характер ее работы отличается от того, как она функционирует в обычном Visual Basic: здесь форма-заставка не исчезает до тех пор, пока пользователь сам не закроет ее.

Причина такого поведения заключается в том, что форма может открываться в двух разных режимах: модальном и немодальном. В первом случае управление полностью передается форме (остальные элементы интерфейса становятся недоступными пользователю) и возвращается обратно в вызывающую программу только после закрытия этой формы. В немодальном режиме форма открывается, и управление сразу возвращается в программу (форма начинает работать как бы в автономном режиме, параллельно со всеми остальными элементами программы). Различие в поведении формы-заставки в VB и VBA заключается в том, что благодаря используемому по умолчанию параметру метода Show в первом случае форма открывается в немодальном режиме, а во втором — в модальном.

Более того, в Office 97 был реализован только модальный режим работы форм. Поэтому для автоматического удаления формы-заставки нужно придумывать какой-нибудь программный трюк внутри ее модуля, который бы, например, отслеживал некую временную задержку и сам закрывал форму. В Office 2000 появилась возможность использования немодальных форм, но для этого нужно указать параметр Show в явном виде:

Как нам сделать, чтобы форма-заставка не мелькала на экране, а оставалась открытой некоторое минимальное время, например пять секунд? Для этого можно воспользоваться подпрограммой временной задержки SleepVB, приведенной в Совете 246, и тогда код открытия документа будет выглядеть следующим образом:


В этом варианте видны два недостатка. Во-первых, если дополнительные операции будут занимать 20 секунд, то к ним все равно добавятся дополнительные 10 секунд, что будет уже лишним. Во-вторых, пользователь никак не сможет повлиять на сокращение этой временной задержки, например, самостоятельно закрыв форму-заставку. Для устранения этих недочетов нам придется написать программный код временной задержки непосредственно внутри нашей стартовой процедуры:

Обратите внимание, что здесь мы вставили обращение к процедуре AllStartOperations после получения начального времени таймера. Таким образом, время появления заставки на экране будет оптимизировано с учетом длительности выполнения дополнительных операций, то есть первый недочет начального варианта мы устранили. Для понимания смысла функции DoEvents (см. Совет 246) временно заблокируйте обращение к ней, поставив знак комментария. Запустите процедуру на выполнение и вы увидите, что форма-заставка появится без рисунка! Объясняется это тем, что управление возвращается в вызывающую программу до полного завершения прорисовки формы, но этот процесс не может завершиться из-за выполнения цикла Do. Loop. Функция же DoEvents обеспечивает возможность выполнения других параллельных процессов, в том числе и завершения прорисовки заставки.

Как нам теперь дать возможность пользователю сократить время задержки, например, закрыв форму-заставку щелчком мыши? Тут могут быть два варианта реализации цикла ожидания.

1. Анализ числа открытых форм:

Этот вариант не очень хорош, так как к этому моменту могут быть открыты еще какие-либо другие формы приложения (в процедуре StartAllOperations). Поэтому лучше воспользоваться другим способом.

2. Анализ состояния формы-заставки:

Вот, собственно, и все по поводу создания стартовых заставок. Обратите внимание, что реализация этих программных конструкций в VB и VBA практически одинакова.

Совет 248. Как изучать программирование в среде VBA

Парадокс заключается в том, что освоение программирования в среде MS Office представляет определенные трудности как для начинающих программистов, так и для опытных разработчиков. Первым нужно изучить незнакомый мир программирования, а вторым — овладеть функциональными возможностями офисных пакетов. И как выясняется на практике, для этого нужно читать не только книги по «программированию в Office», но и литературу (уже давно опубликованную) по собственно программированию и работе с офисными пакетами.

Не менее половины вопросов о «MS Office как средство разработки», поступающих в российский центр технической поддержки, относится к теме «Как научиться программировать»: как перекодировать данные, как работать со строковыми переменными, как использовать базы данных и пр.

Ответ на подобные вопросы довольно прост: изучайте материалы по программированию в среде обычного VB. Что касается самого программирования, MS Office и VB пересекаются на 70-80 процентов. И не нужно удивляться тому, что в книгах по «Office/VBA» вопросы технологии написания кода зачастую освещаются довольно скупо. Просто эти темы более подробно рассматриваются в других книгах.

Информацию об информационных ресурсах по VB можно найти по адресу www.visual.2000.ru/develop/

Совет 249. Как обрабатывать строки на VBA и каковы преимущества для этого в MS Office 2000

Данный вопрос как раз относится к категории «Как изучать программирование». Строки в VBA обрабатываются точно так же, как и в обычном VB. «Обработка строк» рассматривается во многих книгах, но, как правило, это делается довольно бегло, в рамках отдельной главы.

Современные авторы не уделяют особого внимания этому вопросу, считая, что данная тема была досконально описана еще во времена Basic/DOS. Поэтому советуем заглянуть в архив, находящийся по адресу www.visual.2000.ru/develop/basicdos. Из современных публикаций рекомендуем прочитать соответствующую главу в книге «Использование Visual Basic 6.0» (www.visual.2000.ru/develop/vb/books-vb/), а также статью «Особенности работы со строковыми переменными в Visual Basic», опубликованную в журнале КомпьютерПресс 10/99 и 01/2000.

Совет 250. Как перекодировать почтовые сообщения

Проблемы с двойной перекодировкой почтовых сообщений встречаются не часто, но они все же существуют.

В библиотеке Office Extensions (www.microsoft.ru/offext/) имеется довольно большая группа решений этой проблемы. Дело в том, что включить макрос в Outlook 97/98 было не очень просто (там использовался механизм VBScript, а не VBA). Поэтому большинство решений основывалось на варианте, когда исходный текст копируется в среду Word, где и производится перекодирование. К счастью, Outlook 2000 содержит уже полнофункциональный VBA.

Если вы хотите написать собственный макрос перекодирования текста, то советуем посмотреть решение RusTextC в библиотеке Office Extensions, которое представлено в виде «открытого кода». А о том, как интегрировать макрос в среду Word, можно прочитать в статье «Разработка приложений в среде Office 97».

Аналог процедуры doEvents

Я yaroshenko_p

Доброго времени суток!

Вопрос у меня такой.
Есть УТ11 на клиент-сервере.
Для неё написана внешняя обработка, в которой запущен долгий цикл.
При выполнении этого цикла начинает подвисать сервер, начинаются лаги у других пользователей, работающих с другими базами на этом сервере.
Конечно, оптимизация кода цикла — само собой, я над этим работаю.
Но, когда я работал на Visual Basic, я в таких случаях использовал функцию DoEvents(), которая передает управление операционной системе для обработки событий и сообщений, ждущих в системной очереди и всех нажатий клавиш из очереди SendKeys. После обработки всех событий управление возвращается приложению (следующий за строкой DoEvents инструкции).
Подскажите, пожалуйста, есть ли в 1С8 какой-нибудь аналог этой функции? Или его нет и быть не может?
Заранее благодарю за помощь.

yaroshenko_p

А мне надо, чтобы управление временно передавалось операционной системе, а потом процесс выполнялся дальше, и чтобы это происходило без участия пользователя. Как, например, в таком коде на Visual Basic:

//Какие-то сложные действия, загружающие операционную систему
.

Функция doevents

Toggle off Design Mode in Excel, then run the Test() macro you added earlier. While the Test macro is running, you can click the CommandButton on the worksheet, and its associated macro will run as soon as DoEvents gives the Test() macro a break.

The danger here is if the CommandButton macro altered the data the Test() macro was working on, or triggered the Test() macro again. You can end up with some extremely messy results if you’re not careful.

Finally, you should be aware that DoEvents will cause your macro to suffer a performance impact when called. Inside a loop, this impact will add up quickly unless you limit how often DoEvents is called. Referring to our Test() example, try this:

This visibly reduces Excel’s responsiveness, but the performance impact will be lessened.

When to use DoEvents

Despite these dangers, DoEvents is a handy function that aids in testing and debugging. Consider adding DoEvents to long-running loops.

Another reason to include DoEvents is to allow for user feedback. For example, a macro might update a UserForm’s labels with progress indicators. Without DoEvents, Excel may not receive the messages to repaint the UserForm, giving a user the impression that the macro has stopped working – especially if you switch to another program and then try to switch back to Excel. With DoEvents however, the UserForm will continue to be repainted, and updates to the macro’s progress will continue to appear.

For the most part, DoEvents isn’t something you’ll want to include a lot in your code, and can often be omitted. If responsiveness is something your macro needs though, don’t count it out!


VBA DoEvents

Excel VBA DoEvents Function

When we write huge codes, we always fall into the trap of VBA. When the code is big, VBA takes its own time to finish the running and executing process. Which may take time from a minute to several minutes. This is the time frame when everyone gets irritated. And we cannot do anything else in this time period. But to avoid this, we have a function in VBA called DoEvents. By the help of DoEvents, we can run the code in the background and simultaneously we can do other kinds of stuff as well. We cannot only work on other tool or software but also we can interrupt the code or stop in between the process of execution.

Илон Маск рекомендует:  Ошибки IE8

Once we enter DoEvents in the code, then apart from VBA, we will also be having the control of work we want to do. The good thing about DoEvents is it doesn’t have any kind of syntax to write. We can directly place Doevents where we want to take control of VBA and perform the tasks as per our need.

Excel functions, formula, charts, formatting creating excel dashboard & others

How to Use DoEvents Function in Excel VBA?

Below are the different examples to use DoEvents function in excel using VBA code.

Excel VBA DoEvents – Example #1

Although to execute DoEvents we need a huge set of data where we can see how the code is getting interrupted. So, we will use a loop, where the numbers will get applied until the code is completed. For this, follow the below steps:

Step 1: Open a module in VBA from Insert menu tab as shown below.

Step 2: Write the subprocedure of VBA DoEvents or we can choose any name to define the code as per our need.

Code:

Step 3: Now define a variable in any name with data types Long. Purpose of considering the data type as Long is because we will be taking any length of data we want which is not possible if we consider Integer.

Code:

Step 4: Now open a For-Next loop where we will put the conditions.

Code:

Step 5: Consider the range of a number of your choice which can be seen getting implemented. Here we are taking the range 1 to 2000 in defined variable A.

Code:

Step 6: Once we define the range of numbers, we will select the range of cells where we will see the changes in numbers which we chose above. Let’s say the range of cells is A1 to A5. This could be a single cell as well.

Code:

Step 7: Now run the code by clicking on the Play button located below the menu bar.

We will see, the code has completed by printing the numbers from 1 to 20000 but we couldn’t stop it.

Step 8: To get full control of the code, apply DoEvents after the loop conditions as shown below.

Code:

Step 9: Now again run the code. And at this time we try to stop the code by clicking the stop button, we will notice that code will get stopped between the processes before completing the trial of 20000.

Excel VBA DoEvents – Example #2

There is another type of process for implementing DoEvents. But for this also we will need huge code as seen in example-1. For this, follow the below steps:

Step 1: Write the subprocedure of VBA DoEvents as shown below.

Code:

Step 2: Directly open a For-next loop without defining a variable.

Code:

Step 3: Choose a number range we will see running. Let the range be 1 to 20000 same as example-1.

Code:

Step 4: Now directly put any work for output, let’s say the output is as shown below. And the value range will be +1 of actual value.


Code:

Step 5: Now select the range where we want to see the output. Let the cell be A1.

Code:

Step 6: And at last we will put DoEvents at the end of For loop condition.

Code:

Step 7: And then run the code by pressing F5 key. We will see, we can do anything even when the code is running. For demonstration, I have selected the cells B1 and C1. The numbers reached at 4348 only which is quite less than the limit we set.

Step 8: If we remove the DoEvents and run the code, we will be not able to do anything until the code gets completes its process. Let’s see that also.

Code:

Step 9: Now run the code again. As we can see, while we tried to click on Stop, the code didn’t stop. And the Play feature was still ON.

Pros and Cons of Excel VBA DoEvents

  • We can work on any tool or file in the background while the VBA code will be running in parallel.
  • Using DoEvents doesn’t stop us doing the work we want when the code is running.
  • It overwrites the worksheet or workbook when we switch between the different worksheets or workbook.
  • The code stops when we write or change the cell for a moment and we don’t get notified.

Things to Remember

  • If we do anything without applying DoEvents, then there is a major possibility that the code makes the system and file freezed. And that we will either resume the files once the code is completely run or crash the file on multiple clicks.
  • We can see the change in the process while working on the other work simultaneously.
  • Once we complete the code, save the file in macro-enabled excel format to avoid losing code.
  • Try applying the code in a huge and big set of coding, there we will see the actual implementation and use.

This is a guide to VBA DoEvents. Here we discuss how to use DoEvents function in Excel using VBA code along with practical examples and downloadable excel template. You can also go through our other suggested articles –

All in One Excel VBA Bundle (120+ Courses, 30+ Projects)

Использование Application.DoEvents()

Может ли Application.DoEvents() использоваться в С#?

Является ли эта функция способом, позволяющим графическому интерфейсу догонять остальную часть приложения, во многом аналогично тому, как это делает VB6 DoEvents ?

Из моего опыта я бы посоветовал очень осторожно использовать DoEvents в .NET. Я испытал некоторые очень странные результаты при использовании DoEvents в TabControl, содержащем DataGridViews. С другой стороны, если все, с чем вы имеете дело, это небольшая форма с индикатором выполнения, тогда все может быть в порядке.

В нижней строке: если вы собираетесь использовать DoEvents, вам необходимо тщательно протестировать его перед развертыванием приложения.

Хмя, прочная мистика DoEvents(). Было огромное количество негативной реакции на него, но никто никогда не объясняет, почему это «плохо». Такая же мудрость, как «не мутировать структуру». Erm, почему среда выполнения и язык поддерживают мутацию структуры, если это так плохо? По той же причине: вы стреляете в ногу, если не делаете это правильно. Без труда. И делать это правильно требует, чтобы точно знать, что он делает, что в случае с DoEvents() определенно непросто перебирать.

С самого начала: практически любая программа Windows Forms фактически содержит вызов DoEvents(). Он хитро замаскирован, но с другим именем: ShowDialog(). Это DoEvents(), который позволяет диалогу быть модальным без его замораживания остальных окон в приложении.

Большинство программистов хотят использовать DoEvents, чтобы остановить их пользовательский интерфейс от зависания, когда они пишут свой собственный модальный цикл. Конечно, это так; он отправляет сообщения Windows и получает любые запросы на краску. Однако проблема состоит в том, что она не является выборочной. Он не только отправляет сообщения с краской, но и передает все остальное.


И есть набор уведомлений, которые вызывают проблемы. Они идут примерно на 3 фута перед монитором. Например, пользователь может закрыть главное окно, пока цикл, вызывающий DoEvents(), запущен. Это работает, пользовательский интерфейс ушел. Но ваш код не останавливался, он все еще выполняет цикл. Это плохо. Очень, очень плохо.

Там больше: пользователь может щелкнуть тот же элемент меню или кнопку, которая заставляет тот же цикл запускаться. Теперь у вас есть две вложенные петли, выполняющие DoEvents(), предыдущий цикл приостановлен и новый цикл начинается с нуля. Это может сработать, но у мальчика шансы тонкие. Особенно, когда заканчивается вложенная петля и возобновляется приостановление, пытаясь завершить работу, которая уже была завершена. Если это не бомбит с исключением, то, безусловно, данные скремблируются в ад.

Вернуться к ShowDialog(). Он выполняет DoEvents(), но заметьте, что он делает что-то еще. Он отключает все окна приложения, кроме диалога. Теперь, когда проблема в 3 фута решена, пользователь не может ничего сделать, чтобы испортить логику. Решатся и режимы с закрытыми окнами, и с началом работы. Или, говоря иначе, у пользователя нет возможности сделать код вашей программы в другом порядке. Он будет выполнять предсказуемо, точно так же, как и при тестировании вашего кода. Это делает диалоги крайне раздражающими; кто не ненавидит, что диалог активен и не может копировать и вставлять что-то из другого окна? Но что цена.

Это то, что нужно для безопасного использования DoEvents в вашем коде. Установка свойства Enabled всех ваших форм на false — быстрый и эффективный способ избежать проблем. Конечно, программисту никогда не нравится это делать. И нет. Вот почему вы не должны использовать DoEvents(). Вы должны использовать потоки. Даже при том, что они передают вам полный арсенал способов стрелять ногой красочными и непостижимыми способами. Но с тем преимуществом, что вы стреляете только своей ногой; он не будет (обычно) позволять пользователю стрелять в нее.

Diplom Consult.ru

При организации вычислительных процедур с циклами Visual Basic по умолчанию не реагирует на события. Негативные последствия этого наглядно проявляются при работе с движущимися графическими объектами: объект не меняет положение или не изменяется предусмотренный цвет и т. д. Чтобы избежать таких последствий необходим механизм отслеживания состояния операционной системы и реагирования на различного рода события.

Задачи такого рода выполняет функция DoEvents. В каком бы месте программы ни стоял данный оператор, он сигнализирует Visual Basic о том, что управление передано операционной системе для обработки всех событий.

Функцию DoEvents нельзя использовать в процедуре обработки

событий, которая вызывается несколько раз. Иначе можно легко организовать в программе бесконечный цикл.

4.3.6. Упражнения: графические объекты

Поместите в форму элемент управления PictureBox. Исследуйте графические методы Line, Circle, Point и Print и способы управления представлением текста и рисунков (ClipControls и AutoRedraw) (табл. 4.3, примеры 4.10).

Поместите в форму элемент управления PictureBox. Загрузите в него рисунок. Исследуйте влияние свойств AutoSize и Align на положение и размеры объекта. Результаты исследования представьте в виде таблицы.

Поместите в форму элементы управления Image. Загрузите в него рисунок. Исследуйте влияние свойства Stretch элемента управления на взаимодействие объекта с рисунком.

Поместите на форму элементы управления PictureBox и Image. Поместить в объект PictureBox рисунок и скопируйте его с уменьшением в элемент управления Image.

Исследуйте метод Point (пример 4.12).

4.3.7. Закрепление материала

1. Для чего предназначен графический объект PictureBox?

2. Какими свойствами обладает объект PictureBox?

3. Как влияет свойство AutoSize на размер рисунка, помещаемого в объект PictureBox?

4. Какие типы файлов можно загружать в VB?

5. Чем отличается растровое изображение от векторного?

6. Для чего предназначен элемент управления Image?

7. Поясните основные свойства элемента управления Image?

8. Какую функцию выполняет свойство AutoRedraw?

9. Для чего предназначен и как используется метод Refresh?

10. Как влияет свойство ClipControl на скорость выполнения программы?

11. Поясните назначение метода PaintPicture.

12. Поясните назначение метода Point.

4.4. Анимация

4.4.1. Элемент управления Animation

Элемент управления Animation позволяет легко включать в программу различные анимационные эффекты. Он используется для воспроизведения не озвученных видео роликов в формате AVI. Видео ролик в данном формате фактически представляет собой набор растровых изображений (кадров). Кадры выводятся последовательно через равные промежутки времени, за счет чего и создается анимационный эффект, почти как в обычных мультфильмах. Обычно элемент управления Animation применяется там, где нужно “создать видимость работы”, например в процедуре копирования файлов в Windows.

Другим способом создания анимационных эффектов является использование таймера. Через определенные промежутки времени нужно просто изменять положение на экране элемента управления Image или другого рисованного объекта.

Настройка элемента управления Animation

Чтобы настроить элемент управления, его нужно сначала поместить в Форму. При этом создается контейнер для воспроизведения последовательности анимационных изображений. Чтобы теперь просмотреть фильм, нужно открыть конкретный файл и запустить его на воспроизведение. Для этой цели в форму надо поместить кнопку и в процедуру Click этой кнопки написать текст программы, который открывает и проигрывает видеофильм.

Элемент управления Animation три метода: Open, Play, Stop.

Метод Open используется для открытия файла.

Animation1.Open “Спецификация файла”

М етод Play (или свойство AutoPlay элемента управления Animation) обеспечивает управление демонстрацией ролика. Этот метод имеет три параметра:

Repeat – определяет число повторных воспроизведений;

Start – определяет номер кадра, с которого должно начаться воспроизведение;

Stop – определяет номер кадра, на котором должно заканчиваться воспроизведение.

Animation1.Play Repeat, Start, Stop

Метод Stop используется для остановки видеофильма.

Animation1.Play 2,5, 15

В приведенном примере, и на рис. 4.5., дважды воспроизводятся кадры с №5 по №15.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL