Vba таймер в цикле
Цикл как в роли таймера
Модераторы: Ramzes, Sebas
RadioHAM-433 Начинающий
Сообщения: 15 Зарегистрирован: 28.10.2010 (Чт) 22:51
Цикл как в роли таймера
RadioHAM-433 » 08.02.2011 (Вт) 14:35
Добрый всем день! Просьба не смеяться! Мне нужно получить частоту синхронизации 200-500 Гц что таймер не обеспечит да и это отдельный поток вообще. Я хочу применить цикл. А вот как слип то указать? Как в VB.6 я попробовал но такое не работает.
Подскажите уж кто знает буду очень признателен!
iGrok Артефакт VBStreets
Сообщения: 4267 Зарегистрирован: 10.05.2007 (Чт) 16:11 Откуда: Сетевое сознание
Re: Цикл как в роли таймера
iGrok » 08.02.2011 (Вт) 15:12
Идеальных 500Гц и даже 200Гц – никак не получишь. Максимум, около 60Гц, и то далеко не идеальные – частота будет часто сбиваться.
label:
cli
jmp label
Debugger Продвинутый гуру
Сообщения: 1667 Зарегистрирован: 17.06.2006 (Сб) 15:11
Re: Цикл как в роли таймера
Debugger » 08.02.2011 (Вт) 15:12
Вообще Sleep(1000/нужная частота).
Но у тебя же по этому “таймеру” какая-то функция будет выполняться, верно? И причём она будет выполняться какое-то ненулевое время. Предположим, 1мс. Тогда (для частоты 500Гц) выполнение программы будет выглядеть так:
Задержка 2мс
Выполнение 1мс
Задержка 2мс
Выполнение 1мс
Короче, ты получить не 500 выполнений в секунду, а меньше. И, сюрприз, так просто с этим не разобраться. Нужно использовать API queryperformancecounter/подобные.
Added:
iGrok писал(а):Идеальных 500Гц и даже 200Гц – никак не получишь. Максимум, около 60Гц, и то далеко не идеальные – частота будет часто сбиваться.
Да, точно.
queryperformancecounter – единственный выход.
iGrok Артефакт VBStreets
Сообщения: 4267 Зарегистрирован: 10.05.2007 (Чт) 16:11 Откуда: Сетевое сознание
Re: Цикл как в роли таймера
iGrok » 08.02.2011 (Вт) 15:21
Выход ли?
https://www.devdoc.ru/index.php/content/ … ounter.htm
Это всё подходит для измерения времени. Для синхронизации тоже, если допустим “пропуск” моментов синхронизации, т.е. если нужна только привязка моментов к временным интервалам, но не обязательно чёткое следование моментов друг за другом.
А точную синхронизацию на такой частоте можно получить только железом, но не программно.
label:
cli
jmp label
Debugger Продвинутый гуру
Сообщения: 1667 Зарегистрирован: 17.06.2006 (Сб) 15:11
Re: Цикл как в роли таймера
Debugger » 08.02.2011 (Вт) 15:38
Теперь вопрос: как это сделать в .NET?
RadioHAM-433 Начинающий
Сообщения: 15 Зарегистрирован: 28.10.2010 (Чт) 22:51
Re: Цикл как в роли таймера
RadioHAM-433 » 08.02.2011 (Вт) 16:10
Но точно базовая точность частоты не так важна главное что бы она была стабильна и известна что бы сделать привязки по в времени: то есть в этой процедуре можно было учитывать время. Главное знать частоту и всё.
Процедура в ней цикл
Public Sub СинхронЯдра()
Цикл
Ядро()
повтор
End Sub
А по поводу выполнения всё проще. Нужно просто инициализировать процедуру что бы она могла проверять условия.
А на попытку вписать куда угодно Sleep(время) ругается.
А временная нестабильность тоже не важна, думаю что если на 10 с +/- 1с то нормально будет. Будет работать частотомер и будет корректироваться частота.
И синтаксис записи цикла со слипом подскажите тогда.
Так что это не часы а просто так сказать эмуляция постоянного (бездисретного) контроля что то такое. Данные изменились сразу отреагировать.
Так же не говорите про что а если за это время код не успеет выполниться это всё предусмотрено.
А про таймеры то я знаю я даже использую таймеры для контроля стабильности (слежение за частотой).
А базовая частота это только для контроля времени: скажем переуд выполнения 1 мс 10 выполнений значит 10 мс.
Так что только цикл которые бы мог инциализировать процедуру и всё больше не чего не надо.
Debugger Продвинутый гуру
Сообщения: 1667 Зарегистрирован: 17.06.2006 (Сб) 15:11
Re: Цикл как в роли таймера
Debugger » 08.02.2011 (Вт) 16:42
RadioHAM-433 писал(а):Данные изменились
Так никто не делает.
В общем-то, это признак незнания чего-то/кривости архитектуры. Короче, опиши проблему подробнее, и мы тебе расскажем, как сделать круче.
Ну а пока:
Код: Выделить всё Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Const Sleep = 50 ‘1000/(нужная частота). 50 – для 20Гц.
‘Sleep не гарантирует точность для частот выше ~40Гц.
Const rStep = 0.05 ‘Вариант с r. Должен работать нормально на меньше ~15Гц.
‘Этот вариант хорош тем, что если в эти 50мс входит время выполнения ядра.
…
‘Вариант A
Do While True
‘Ядро
‘Задержка
Sleep Sleep
DoEvents
Loop
‘Вариант B
Dim Next As Currency
Next = r
Do While True
‘Ядро
‘Задержка
Do While r < Next
Loop
Next = r + rStep
DoEvents
Loop RadioHAM-433 Начинающий
Сообщения: 15 Зарегистрирован: 28.10.2010 (Чт) 22:51
Re: Цикл как в роли таймера
RadioHAM-433 » 08.02.2011 (Вт) 16:53
Не подскажете однозначно как это решение не для простой программы. Это ядро согласовывает чисто логические данные, но а сели речь идёт о физических то и это сможет. Аналогичным методом я решал задачу кое где всё отлично работает автоматом. А подсказать как сделать круче в данном случае нельзя чисто по определению как мало данных о том даже как должно работать. Короче это сложные логические (интеллектуальные может так сказать) операции. Задача ядра видеть работу других алгоритмов и контроль их данных. Да всё отлично спс огромное я дальше работать больше не чего не требуется!
Вопросик а зачем DoEvents? Вот при значении 1 мс выдаёт 512-513 Гц всё норма, колебания в переделах 20-40 Гц не критичны.
Последний раз редактировалось RadioHAM-433 08.02.2011 (Вт) 17:11, всего редактировалось 1 раз.
Debugger Продвинутый гуру
Сообщения: 1667 Зарегистрирован: 17.06.2006 (Сб) 15:11
Re: Цикл как в роли таймера
Debugger » 08.02.2011 (Вт) 17:09
А подсказать как сделать круче в данном случае нельзя чисто по определению как мало данных о том даже как должно работать. Короче это сложные логические операции.
Единственное, что более-менее понятно из твоего сообщения. Остальное – поток сознания в чистом виде. Перепиши.
Число путей решений стремится к бесконечности. Наиболее элегантный способ можно выбрать только после тщательного разбора условий задачи.
Ты же знаешь, что у тебя за задача. Расскажи нам о ней побольше.
Короче это сложные логические операции.
Зачем их выполнять с такой периодичностью? Такая необходимость может возникнуть только при написании какого-нибудь очень, очень специфичного. Вроде автоматического детектора влажности, который извещает пользователя, если влажность в комнате выше 50%. И то, там такие частоты не нужны.
Даже работа с нетривиальными внешними устройствами обходится без высокочастотного таймера. Даже работа с камерой (определение наличия объекта на изображении с веб-камеры) обходится без такого изврата.
Обычно подобные задачи – винтики в сложной программе. И, чтобы избежать лишних вопросов, вопрос ставится о частной реализации этого винтика (“Высшие Силы мне сказали, что мне нужен таймер с ~300Гц точностью. Как мне это сделать”?). И тебе говорят, как это сделать. Но тут абсолютно четко видно, что ты что-то делаешь не так. Тебе не нужен таймер.
Added:
Задача ядра видеть работу других алгоритмов и контроль их данных.
Тебе абсолютно точно не нужен таймер.
FireFenix Продвинутый гуру
Сообщения: 1640 Зарегистрирован: 25.05.2007 (Пт) 10:24 Откуда: Mugen no Sora
Re: Цикл как в роли таймера
FireFenix » 08.02.2011 (Вт) 17:17
Птицей Гермеса меня называют, свои крылья пожирая… сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる
RadioHAM-433 Начинающий
Сообщения: 15 Зарегистрирован: 28.10.2010 (Чт) 22:51
Re: Цикл как в роли таймера
RadioHAM-433 » 08.02.2011 (Вт) 17:20
Эмуляция бездискретности! Но частота то еще не определена какая будет использоваться. Чем выше тем меньше будет дискретность относительно. Блин это алгоритмы цифрового разума. Я не такой програмист что бы придумывать низкоуровневые реализации. Нужен был язык максимально миним кода в котором. А по поводу как что да сейчас неизвестно потом в результате экспериментов думаю станет известно. Если я буду думать как тут на низком реализовать лучше я с логикой застряну.
Joo Постоялец
Сообщения: 762 Зарегистрирован: 14.08.2008 (Чт) 11:55 Откуда: Казахстан
Re: Цикл как в роли таймера
Joo » 08.02.2011 (Вт) 18:47
Debugger писал(а):Вообще Sleep(1000/нужная частота).
Но у тебя же по этому “таймеру” какая-то функция будет выполняться, верно?
Можно типа того
Код: Выделить всё Цикл
ЗамерПродолжительностиСинхронизации
Синхронизация
Задержка (1000/Частота)-ПродолжительностьСинхронизации
Повтор
“Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины”
Джеральд Месси, Египтолог
RadioHAM-433 Начинающий
Сообщения: 15 Зарегистрирован: 28.10.2010 (Чт) 22:51
Re: Цикл как в роли таймера
RadioHAM-433 » 08.02.2011 (Вт) 18:51
Всем спс вопрос решён всё отлично! Тему можно удалять или закрывать.
Хакер Телепат
Сообщения: 16331 Зарегистрирован: 13.11.2005 (Вс) 2:43 Откуда: Казахстан, Петропавловск
Re: Цикл как в роли таймера
Хакер » 12.02.2011 (Сб) 23:19
Joo писал(а):
Debugger писал(а):Вообще Sleep(1000/нужная частота).
Но у тебя же по этому “таймеру” какая-то функция будет выполняться, верно?
Можно типа того
Код: Выделить всё Цикл
ЗамерПродолжительностиСинхронизации
Синхронизация
Задержка (1000/Частота)-ПродолжительностьСинхронизации
Повтор
Вот где у дотнетчиков течёт абстракция. Они не знают, как работает Sleep и придумывают всякую чушь с нахождением фактора коррекции.
Sleep гарантирует, что поток проспит не менее X миллисекунд. Sleep никак не регламентирует, сколько на самом деле проспит поток. Sleep не гарантирует, что поток проспит примерно X миллисекунд, что поток проспит X с небольшим миллисекунд. Поток может проспать 1.1*X, может проспать 7*X, может проспать 1000*X. Как повезёт.
-We separate their smiling faces from the rest of their body, Captain.
-That’s right! We decapitate them.
Joo Постоялец
Сообщения: 762 Зарегистрирован: 14.08.2008 (Чт) 11:55 Откуда: Казахстан
Re: Цикл как в роли таймера
Joo » 13.02.2011 (Вс) 5:49
Хакер писал(а):Вот где у дотнетчиков течёт абстракция. Они не знают, как работает Sleep и придумывают всякую чушь с нахождением фактора коррекции.
Где ты увидел своим больным взглядом, что я писал о Sleep, скажи мне пожалуйста!
Хакер писал(а):Sleep гарантирует, что поток проспит не менее X миллисекунд…….Поток может проспать 1.1*X, может проспать 7*X, может проспать 1000*X. Как повезёт.
Я без тебя прекрасно знаю как работает Sleep, так что не чего нового ты не поведал, извини.
p.s. Какого фига тебя вообще занесло в .NET, ладно занесло, так и еще и писать вздумал в этом “отвратительном” разделе? Опускаешься….
“Им будет не просто, тем кто полагается на истину авторитета, вместо того чтобы полагаться на авторитет Истины”
Джеральд Месси, Египтолог
Вернуться в Visual Basic .NET
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 0
Источник
Пользовательская функция Micror предназначена для более точного определения времени выполнения процедур VBA Excel, чем с помощью функции r.
Функция Micror
Micror – это пользовательская функция, которая использует вызовы Windows API для получения значений системного таймера высокого разрешения, который встроен в большинство процессоров. Автор функции – Чарльз Уильямс.
Пользовательская функция Micror позволяет более точно определять время работы макросов и отдельных участков кода VBA Excel, чем функция r.
Объявление функций Windows API
Код объявления функций Windows API «getFrequency» и «getTickCount» для вставки в раздел «Declarations» модуля VBA Excel:
Private Declare getFrequency Lib “kernel32” _ Alias “QueryPerformanceFrequency” (cyFrequency As Currency) As Long Private Declare getTickCount Lib “kernel32” _ Alias “QueryPerformanceCounter” (cyTickCount As Currency) As Long |
Код функции Micror
Код пользовательской функции Micror для размещения в любом месте программного модуля ниже раздела «Declarations»:
Micror() As Double Dim cyTicks1 As Currency ic cyFrequency As Currency ‘Обнуление МикроТаймера Micror = 0 ‘Получение частоты, равной количеству тактов («тиков») ‘таймера, встроенного в процессор, в секунду If cyFrequency = 0 Then getFrequency cyFrequency ‘Получение количества тактов («тиков») таймера с полуночи ‘до текущего времени getTickCount cyTicks1 ‘Вычисление количества секунд, прошедших с полуночи, где ‘количество секунд = количество тактов / частота If cyFrequency Then Micror = cyTicks1 / cyFrequency End |
Пример размещения функции Micror в стандартном модуле
Частота встроенного в процессор таймера – постоянная величина, зависящая только от вашего процессора. Узнать эту частоту можно с помощью следующего кода (функция Windows API «getFrequency» уже должна быть объявлена в разделе Declarations):
Sub Frequencyr() Dim cyFrequency As Currency getFrequency cyFrequency MsgBox cyFrequency End Sub |
Код определения времени
Шаблон кода VBA Excel для определения времени работы процедур и отдельных участков кода с помощью функции Micror:
Dim Start As Double, Elapsed As Double Start = Micror ‘Здесь размещаем тестируемый код Elapsed = Micror – Start |
Переменные:
- Start – значение функции Micror перед началом работы тестируемого кода.
- Elapsed – время работы тестируемого кода в секундах.
Пример кода с Micror
Пример кода VBA Excel для сравнения точности измерения времени работы цикла For… Next с помощью функций r и Micror:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | Sub VremyaRabotyMakrosa() Dim t As , i1 As Long, i2 As Long, n As Long, m As Double Dim Start As Double, Elapsed As Double For i1 = 1 To 3 n = 10 ^ i1 * 1000 Cells(1, i1) = “n = ” & n ‘Функция r m = 0 t = r For i2 = 1 To n m = m + i2 Next t = r – t Cells(2, i1) = t & ” r” ‘Функция Micror m = 0 Start = Micror For i2 = 1 To n m = m + i2 Next Elapsed = Micror – Start Cells(3, i1) = CDec(Elapsed) & ” Micror” Next End Sub |
Значение переменной Elapsed преобразуется в тип данных Decimal (CDec), чтобы значение меньше единицы не преобразовывалось автоматически в экспоненциальную форму.
Один из результатов работы кода:
Сравнение точности измерений с помощью функций r и Micror
Как видно на скриншоте, при количестве итераций цикла 10000 и 100000, определить время выполнения цикла с помощью функции r не удалось.
Источник
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | Всем привет) Пришел за помощью – мне необходимо сделать таймер обратного отсчета 2 минуты и чтобы по факту его окончания книга закрывалась, таймер запускается при открытии книги. Заранее спасибо. |
RAN Пользователь Сообщений: 6334 Регистрация: 21.12.2012 | #2 02.08.2014 18:19:54
+F1 | ||
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | Не совсем понял ваш ответ, т.к. новичок в этом деле) |
Пользователь Сообщений: 6334 Регистрация: 21.12.2012 |
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | Можете русским языком написать чего вам не хватает, а не просто блестать умением подкидывать ссылки без объяснений! |
Модератор Сообщений: 58256 Регистрация: 14.09.2012 Контакты см. в профиле | ALFA , Вам в #2 дан совет посмотреть справку по Application.On. Не помогло? |
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | К сожалению не разобрался как с ним справиться.. |
Модератор Сообщений: 58256 Регистрация: 14.09.2012 Контакты см. в профиле | Если не получается, то в #4 RAN подсказывает – нужен Ваш файл (согласно Правил), где было бы видно, ЧТО конкретно у Вас не получилось. А теперь перечитайте свой #5 – к чему он? |
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | Я не понял к чему меня тыкнули в правила… Фаил посчитал не нужным выкладывать, т.к. данная операция не связана ни с какими данными, можно открыть новую книгу и все… |
RAN Пользователь Сообщений: 6334 Регистрация: 21.12.2012 | #10 02.08.2014 19:35:54
Все дополнительные вопросы к автору
Изменено: RAN – 14.08.2014 21:05:12 | ||||
Юрий М Модератор Сообщений: 58256 Регистрация: 14.09.2012 Контакты см. в профиле | #11 02.08.2014 19:38:05
Ну показали бы тогда свой неудачный вариант кода… | ||
Пользователь Сообщений: 4180 Регистрация: 23.12.2012 |
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | Спасибо всем за помощь, все работает) |
Пользователь Сообщений: 243 Регистрация: 13.09.2013 | А можно ли данный таймер поместить в Label1 формы? Изменено: ALFA – 03.08.2014 11:18:46 |
Модератор Сообщений: 58256 Регистрация: 14.09.2012 Контакты см. в профиле | Варианты предложили RAN и ZVI – Вы про какой “данный” сейчас? |
Пользователь Сообщений: 6334 Регистрация: 21.12.2012 | Юр, да хоть какой. Как его в лейбл засунуть? Точнее что? |
Модератор Сообщений: 58256 Регистрация: 14.09.2012 Контакты см. в профиле | Ну, раз нет разницы, то такой вариант)) |
ALFA Пользователь Сообщений: 243 Регистрация: 13.09.2013 | #18 03.08.2014 21:10:10 Круто)) то что нужно! Спасибо огромное всем за помощь! | |||
Источник
Аннотация: В этой лекции вы узнаете, как многократно исполнять блок операторов с помощью циклов; как с помощью оператора конкатенации строк (&) выводить в объекте текстового поля более одной строки текста и как для исполнения кода вашей программы через заданные интервалы времени использовать объект таймер
В этой лекции вы узнаете, как:
- использовать цикл For…Next для многократного повторения операторов;
- отображать вывод в многострочном текстовом поле с помощью конкатенации строк;
- использовать цикл Do для выполнения операторов до тех пор, пока не выполнится заданное условие;
- использовать объект таймера для выполнения кода в заданное время;
- создать собственные цифровые часы и утилиту для работы с паролями, имеющими срок действия.
В этой лекции вы узнаете, как многократно исполнять блок операторов с помощью циклов. Для исполнения операторов заданное число раз вы будете использовать цикл For…Next, а для исполнения операторов до тех пор, пока не выполнится условное выражение – цикл Do. Вы также узнаете, как с помощью оператора конкатенации строк (&) выводить в объекте текстового поля более одной строки текста. Наконец, вы узнаете, как для исполнения кода вашей программы через заданные интервалы времени использовать объект таймер.
Что нового в Visual Basic .NET?
- В Visual Basic 6 с помощью метода вы могли выводить текст непосредственно в форму – это было наследием оператора из GW-BASIC и Microsoft QuickBasic. В Visual Basic .NET метод может использоваться только для записи данных на диск. В этой лекции показан альтернативный метод вывода в форме больших фрагментов текста – в объекте многострочного текстового поля с помощью оператора конкатенации строк (&).
- В Visual Basic 6 цикл While был определен с помощью следующего синтаксиса: While…Wend. В Visual Basic .NET закрывающий оператор изменился на While…EndWhile, чтобы быть больше похожим на другие аналогичные структуры.
- Элемент управления r в Visual Basic .NET аналогичен, но не идентичен элементу управления r из Visual Basic 6. Например, процедура события r1_r (которая исполняется через каждый предустановленный интервал времени) была в Microsoft Visual Studio .NET переименована в r1_Tick. В дополнение к этому, вы больше не можете отключать таймер установкой его свойства Interval на значение 0.
Циклы For … Next
С помощью цикла For…Next вы можете выполнять группу операторов программы в процедуре события или модуле кода заданное число раз. Этот подход полезен в том случае, если вы выполняете несколько связанных вычислений, работаете с элементами на экране или обрабатываете несколько фрагментов данных, введенных пользователем. Цикл For…Next является на самом деле просто кратким способом записать длинный список операторов программы. Так как каждая группа операторов в таком списке будет делать одно и то же, Visual Basic позволяет определить одну такую группу операторов и выполнить ее столько раз, сколько вы захотите.
Синтаксис цикла For…Next имеет следующий вид:
For переменная = начальное_значение To конечное_ значение повторяемые операторы Next [переменная]
В этом описании синтаксиса For, To и Next – это обязательные ключевые слова, оператор присвоения (=) также обязателен. Вы должны заменить переменная именем числовой переменной, которая хранит текущее значение счетчика циклов (переменную после Next указывать необязательно), а начальное_значение и конечное_значение заменить числовыми значениями, представляющими начальную и конечную точки цикла. (Заметьте, что вы должны объявить переменную до того, как станете использовать ее в операторе For…Next.) Строка или строки между операторами For и Next – это операторы, которые повторяются при каждом исполнении цикла.
Например, следующий цикл For…Next воспроизводит в виде быстрой последовательности четыре звуковых сигнала:
Dim i As Integer For i = 1 To 4 Beep() Next i
Этот цикл эквивалентен написанию в процедуре оператора Beep четыре раза. Компилятор воспринимает его точно так же, как и
Beep() Beep() Beep() Beep()
Переменная, используемая в цикле – это i, единственная буква, которая, по соглашению, обозначает первый счетчик цикла For…Next и объявляется как переменная типа Integer. При каждом исполнении цикла переменная счетчика увеличивается на единицу. (При первом проходе через цикл переменная содержит значение 1 – значение, заданное параметром начальное_значение; при последнем проходе она содержит значение 4 – конечное_значение.) Как вы увидите в следующих примерах, в циклах можно эффективно использовать эту переменную-счетчик.
Отображение переменной-счетчика в элементе управления TextBox
Переменная-счетчик аналогична любой другой переменной процедуры события. Ее значение может быть присвоено свойству, использовано в вычислениях или отображено в программе. Одним из практических применений переменной-счетчика является ее отображение в элементе управления TextBox. Ранее в этой книге вы использовали элемент управления TextBox для отображения одной строки, но в этой лекции вы будете выводить в элемент управления TextBox несколько строк текста. Фокус при отображении более чем одной строки заключается в том, что вы просто устанавливаете свойство Multiline элемента управления TextBox на значение True, а свойство Bars – на значение Vertical. При использовании этих простых настроек объект однострочного текстового поля становится объектом многострочного текстового поля с полосами прокрутки для облегчения доступа к нему.
Отображение информации с помощью цикла For … Next
- Запустите Visual Studio и создайте в папке c:vbnet03sbsГл.7 новый проект Windows Application (Приложение Windows) на Visual Basic с именем My For Loop. В Windows Forms Deer (Конструкторе Windows Forms) появится пустая форма. Прежде всего вы добавите в форму элемента управления Button, но на этот раз новым способом.
- Дважды щелкните мышью в окне области элементов на элементе управления Button (он находится на закладке Windows Forms). Visual Studio поместит объект кнопки в верхний левый угол формы. В случае с элементом управления Button, а также и со многими другими, двойной щелчок мышью позволяет быстро создать в форме объект со стандартными размерами. Теперь можно перетащить этот объект кнопки в нужное место и настроить его свойства.
- Перетащите объект кнопки вправо и поместите его в центре верхней части формы.
- Откройте окно Properties (Свойства), а затем установите свойство Text кнопки на значение Цикл.
- В области элементов щелкните дважды на элементе управления TextBox. Visual Studio создаст небольшое текстовое поле.
- Установите свойство Multiline этого объекта текстового поля на значение True, а свойство Bars на значение Vertical. Эти настройки подготавливают текстовое поле к отображению более чем одной строки текста.
- Сделайте свойство Text объекта текстового поля пустым (empty).
- Переместите текстовое поле под кнопку и увеличьте его так, чтобы оно заняло большую часть формы.
- Щелкните дважды на кнопке Цикл формы. В Редакторе кода появится процедура события Button1_Click.
Введите в этой процедуре следующие операторы программы:
Dim i As Integer Dim Wrap As String Wrap = Chr(13) & Chr(10) For i = 1 To 10 TextBox1.Text = TextBox1.Text & “Строка ” & i & Wrap Next i
Эта процедура события объявляет две переменные – одну типа Integer (i), а вторую – типа String (Wrap), а затем присваивает второй переменной строковое значение, представляющее символ перевода строки. В терминах программирования символ перевода строки является эквивалентом нажатия на клавишу (Enter) на клавиатуре. Чтобы сделать его менее громоздким, я создал для этого символа специальную переменную, которая состоит из элементов “возврат каретки” (return) и “прокрутка строки” (linefeed).
После объявления переменной и присвоения, я использую цикл For…Next для десятикратного отображения в объекте текстового поля строки “Строка X”, где X – это текущее значение переменной-счетчика (другими словами, со “Строка 1” до “Строка 10”). Символы конкатенации строк (&) объединяют в текстовом поле части каждой строки воедино. В начале в объект добавляется все значение текстового поля, которое хранится в свойстве Text, так, что предыдущие строки при добавлении новых не удаляются. Затем для отображения новой строки и перевода курсора влево и на следующую строку объединяются строка “Строка”, текущий номер строки и символ возврата каретки (Wrap). Оператор Next завершает цикл.
Обратите внимание, что Visual Studio автоматически добавляет оператор Next в конец цикла, когда вы вводите For в его начале. В данном случае я отредактировал оператор Next так, чтобы включить в него имя переменной i – это необязательное пояснение синтаксиса, которое мне нравится использовать.
- Чтобы сохранить изменения, щелкните на кнопке Save All (Сохранить все) на стандартной панели инструментов. Теперь запустите эту программу.
- Щелкните на кнопке Start (Начать) стандартной панели инструментов.
Щелкните на кнопке Цикл.
Примечание. Готовая программа For Loop находится в папке c:vbnet03sbs Гл.7for loop.
Цикл For…Next отображает в текстовом поле 10 строк, как показано ниже.
Снова щелкните на кнопке Цикл. Цикл For…Next отображает в форме еще 10 строк, и вы можете увидеть невидимые строки, используя вертикальную полосу прокрутки. При каждом повторении цикла он добавляет в объект текстового поля 10 новых строк.
Совет. Боитесь, что в объекте текстового поля не останется места? Если вы отображаете только 10 строк, это случится очень нескоро. Объект многострочного текстового поля имеет практическое ограничение на размер текста в 32 Кб. Для текстов большего объема или для форматирования попробуйте использовать элемент управления RichTextBox.
Чтобы завершить выполнение программы, щелкните на кнопке Закрыть формы.
Совет. Если требуется исполнять набор операторов много раз, цикл For…Next значительно упростит ваш код и уменьшит общее число операторов, которые нужно вводить. В предыдущем примере цикл For…Next длиной в три строки выполнил ту же работу, что и его десятистрочный эквивалент без использования цикла.
Источник