Как сделать прогресс бар в visual studio

Добавил пользователь Alex
Обновлено: 04.10.2024

Что такое ActiveX?
Мой дорогой друг. Когда ты устанавливал на жесткий диск Visual Basic 6.0, то в твой компьютер скачалось много всякого добра, и в том числе куча файлов средств управления ActiveX. Эти файлы лежат в c:\Windows\System или c:\Windows\System32 и имеют расширение .ocx. Большинство этих файлов представляют собой отдельные средства ActiveX, но например, тот, что мы будем рассматривать сегодня (Microsoft Windows Common Controls 6.0) включает в себя аж девять средств управления ActiveX. Некоторые средства ActiveX перечислены на странице "Элементы ActiveX". Сегодня мы поговорим о некоторых.

Начнем с самых нужных и используемых. Одним из таких средств является индикатор хода выполнения - Progress Bar. Если ты достаточно наблюдателен,то наверняка заметил,что при выполнении длительных процессов (копирование файлов, загрузка программ и т.п.) Windows выводит на экран окошко, где синенькая полосочка (индикатор хода выполнения процесса), постепенно увеличиваясь в длине, показывает, какой объем процесса выполнен, и вообще скорость процесса. Индикатор хода выполнения позволяет юзеру не нервничать и утешаться тем, что процесс худо-бедно идет, что он успеет раза два покурить и что компьютер не завис.

Элемент ActiveX: ProgressBar.
Чтобы приступить к использованию Progress Bar, его надо сперва добавить в панель инструментов нашего нового exe-проекта (по-скольку это средство управления ActiveX храниться в файле mscomctl.ocx). Сделать это - раз плюнуть. Для этого надо создать exe-проект, затем в меню Проект надо щелкнуть по строке Компонеты (Рис.22)

Рисунок 22.
Затем, в открывшемся окне списка средств управления найди строку Microsoft Windows Common Controls 6.0 , щелкни в этой строке по полю флажка, поставив галочку и нажми кнопку OK на окне (Рис.23).

Рисунок 23.
У тебя в панели инструментов появилось сразу несколько объектов. И в том числе ProgressBar (Рис.24). Аналогично добавляются и другие средства ActiveX из других файлов.

Рисунок 24.
Теперь ты можешь перетащить его на форму и начать с ним работать. Он будет называться ProgressBar1. Основными свойствами, которыми мы будем пользоваться являются:
.Min - минимальное числовое значение, с которого шкала начнет работать
.Max - максимальное числовое значение, на котором шкала дойдет до конца.
.Value - текущее числовое значение шкалы
кроме того можно использовать
.Scrolling - меняет прерывистую шкалу (0-ccScrollingStandard) на непрерывную (1-ccScrillingSmooth)
.Orientation - установка в вертикальное (если приспичило) или горизонтальное положение
Кроме того, понятно, что имеются всякие стандартные свойства (типа высота-длина, видимый-невидимый и т.п), о которых и говорить-то нечего.

Вообще использовать ProgressBar имеет смысл только в циклах (любых). Ты задаешь начальное и конечное значение, а значение ProgressBar.Value меняется именно в цикле. Собственно именно оно и заставляет шкалу изменяться. Использование этого объекта рассмотри на примере программы Generator, которая иммитирует игрушки-гадалки. Знаешь такие китайские игрушки: загадаешь желание, крутанешь шарик, а он потом остановится и лампочка зажжется у слова типа "Никогда" или "Скоро". Так вот, у нас у аналогичных слов (они заданы в окне свойств, а не в коде) будет останавливаться шкала ProgressBar со свойством .Scrolling - 1-ccScrillingSmooth (неперывная).
Объявим две переменные: первая для хранения сгенерированного случайного числа, вторая - просто для цикла.

Dim MyValue As Long
Dim x As Long

Положим на форму командную кнопку Command1 и в ней напишем процедурку

Private Sub Command1_Click()

Здесь мы используем генератор случайных чисел. Мы уже использовали генерирование случайных чисел в Главе 3 при создании программы "Однорукий бандит", хоть и без оператора Randomize. Этот оператор просто генерирует число и передает его в качестве опорного в функцию Rnd, которая в свою очередь на основе этого числа генерирует случайное число от 0 до 1.

Randomize ' Инициализирует генератор случайных чисел.

Поскольку, функция Rnd возвращает число, меньшее единицы, мы умножаем его на 10000, а чтобы избежать нулевого значения, прибавляем единицу. Кроме того, получившийся результат округляем до целого числа с помощью функции Int. Эта функция просто отбрасывает дробную часть (а на самом деле не округляет). Синтаксис ее: Int(число). Аналогична ей функция Fix(число), которая работает так же, как и Int, но при округлении отрицательного числа приближает его к числу большему или равному, в то время как Int - к меньшему или равному.

MyValue = Int((10000 * Rnd) + 1) ' Возвращает случайное число от 1 до 10000.

Далее уже задаем начальное (1) и конечное (10000) значение ProgressBar1.

ProgressBar1.Min = 1
ProgressBar1.Max = 10000

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

For x = 1 To MyValue
ProgressBar1.Value = x
Next x
End Sub

При загрузке файла средств управления общего назначения в панели инструментов появились и другие объекты ActiveX. Обратим наши взоры на средство Slider, которое располагается через один и ниже ProgressBar'а, думаю, найдешь.

Элемент ActiveX: Slider.
По сути своей этот элемент очень похож на объект "полоса прокрутки ScrollBar", который мы разбирали в Главе 4. Главными отличиями его являются внешний вид: Slider представляет собой линейку с бегунком и отметками-маркерами (тиками), а также то, что его максимальное значение не ограничено, как у ScrollBar'а значением 32767. Элемент этот простой, я не буду повторять описание его свойств .Min, .Max, .Value и т.п. Если пропустил, посмотри выше на этой странице. Однако у Slider'а есть и другие свойства:

.LargeChange - величина, на которую изменится положение бегунка при щелчке мышью по слайдеру
.TickFrequency - определяет с какой частотой на слайдере будут располагаться маркеры (тики). Например, если у нас Slider1.Min=0, Slider1.Max=1000, а Slider1.TickFrequency=100, то на всем слайдере будут равномерно располагаться (1000-0)/100+1 = 11 тиков, первый из которых будет обозначать 0, второй - 100 и т.д., до последнего - 1000.

Как работать со слайдером, мы разберем примере программки SliderPic (скачать ее можно вверху страницы). Практического применения ей я не вижу, но она иллюстрирует, как с помощью слайдера можно изменять объекты. В нашем случае мы с помощью двух слайдеров - горизонтального и вертикального будем менять, соответственно, ширину и высоту Picture для того, чтобы в нее влезла картинка. Сразу оговорюсь, что поскольку единица измерения размеров объектов в VB принята почему-то в твипах, я все в твипах и оставлю. Если тебе охота перевести в другие единицы, например, в пиксели,- пожалуйста (в Главе 6 мы использовали методы ScaleX и ScaleY для перевода в из одного измерения в другое).
Итак, создадим exe-проект, положим на него Picture1 любого размера, но желательно позиционировать его ближе к верхнему левому углу формы (а то куда ж мы его расширять будем), и два слайдера -Slider1 (горизонтальный) и Slider2 (вертикальный). Чтобы Slider2 стал горизонтальным, надо его свойство .Orientation в окне свойств установить в 1-ccOrientationVertical.
Теперь пишем код.

Option Explicit

В процедуре загрузки формы привяжем начало каждого слайдера к положению Picture

Private Sub Form_Load()

Устанавливаем левую границу Slider1 вровень с левой границей Picture1

Slider1.Left = Picture1.Left - 150

Также устанавливаем верхнюю границу Slider2 вровень с верхней границей Picture1

Slider2.Top = Picture1.Top - 150

Как видишь, мы здесь используем свойства .Top и .Left, которые есть практически у всех объектов. Они показывают расстояние от края формы до границы объекта сверху (.Top) и снизу (.Left).
Поскольку бегунок слайдера в нулевой позиции отстоит от начала самого слайдера где-то на 150 твипов, я из значения положения картинки вычел это расстояние.
Далее загружаем картинку в Picture1. Прошу прощения, за ее пошлость, просто под руку попалась.

Picture1.Picture = LoadPicture(App.Path & "\Lopes.jpg")

Затем устанавливаем свойства для каждого слайдера. Значения .Max слайдеров я взял от фонаря, исходя из того на сколько можно расширить картинку, чтобы она в экран влезала.

Slider1.Min = 0
Slider1.Max = 10215
Slider1.LargeChange = 500
Slider1.Value = Picture1.Width
Slider1.TickFrequency = 500

Slider2.Min = 0
Slider2.Max = 6975
Slider2.LargeChange = 500
Slider2.Value = Picture1.Height
Slider2.TickFrequency = 500

Для каждого слайдера создаем процедурку, где присваиваем значению ширины (или длины) Picture1 значение слайдера.

Private Sub Slider1_Click()
Picture1.Width = Slider1.Value
End Sub

Private Sub Slider2_Click()
Picture1.Height = Slider2.Value
End Sub

В этом примере показано, как использовать ProgressBar, чтобы показать ход выполнения долгого задания. Это очень простой пример, который выполняет синхронную задачу.

Я создал ProgressBar во время разработки. Я оставил свойство Minimum равным 0 и его свойство Maximum установлено равным 100, хотя вы можете изменить эти значения, если хотите.

Этот код читает номер, введенный в текстовое поле, и делит его на 10. Затем он выполняет 9 циклов. Во время каждого цикла программа обновляет ProgressBar, чтобы отобразить объем выполняемой задачи, а затем подсчитывает до 1/10 значения, которое вы ввели.

После завершения 9 циклов программа подсчитывает все оставшиеся числа, которые вы указали. Если общее число равномерно делится на 10, то это последний 1/10 числа. Если сумма не делится на 10, то это все, что осталось после 9 циклов.

Все эти петли просто моделируют длительную задачу. В реальной программе вы бы сделали что-то более полезное, как обработка записей в базе данных.

После этого последнего цикла программа завершена, чтобы скрыть ProgressBar. К сожалению, если вы это сделаете, ProgressBar исчезает так быстро, что пользователь не видит его на 100%, и это кажется немного неудобным. (Попробуйте и посмотрите.)

Чтобы этого избежать, программа включает Timer с именем tmrHideProgressBar. В следующем коде показан обработчик события Tick таймера.

только одно но, форму с прогрессбаром в этом случае можно вызывать только frm.Show(), то есть если её сделать модальной не сработает

так что же делать?
мне как раз и надо вызывать ее
Form2.ShowDialog();
кроме того а визуально нельзя проектировать или только вручную угадывая длину, ширину, положение на форме?

З.Ы. я привык, конечно, к Form1->ProgressBar1->. по C++ Builder'у, но похоже это теперь в прошлом



sivsoft, я в одной своей программе вышел из положения следующим образом, у формы с прогрессбаром выставил следующие свойства

ProgressBar – создание полосы загрузки на VBA

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

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

В данной статье описано, как создать окно загрузки (или по-другому прогресс бар) для Ваших процедур без загромождения их кодом.

Состав прогресс бара

Строится окно загрузки на основе простой пользовательской формы UserForm, которая содержит следующие элементы:

Если вывести все элементы на форму, то она будет иметь такой вид:


Описание класса и способов создания окна загрузки

Для начала рассмотрим доступные методы данного класса, не концентрируясь на коде, а только на его функциональности:

Это сделано по двум причинам.

Первая причина. При выводе в форму оставшегося времени обработки, его расчет производится, исходя из среднего времени, затраченного на один этап процесса, а затем умноженного на число оставшихся процессов. Данный способ является достаточно простым и понятным, но так как этапы выполняются не всегда с одной и той же скоростью, то время постоянно перепрыгивает с одного показателя на другой, что не позволяет адекватно его оценивать. Особенно данный эффект заметен в начале, когда прошедших этапов для оценки не так много. Установив интервал, Вы можете смягчить данный эффект. Рекомендуемого интервала в данном случае нет, так как все зависит от конкретного процесса.

Второй причиной является производительность. Не смотря на то, что идея вывода информации по загрузке является вполне обоснованной, само ее использование сильно замедляет процесс. Например, с использованием ProgressBar время обработки нижеприведенного примера составляет 1 минута 17 секунд при установленном интервале обновления в секунду. При обновлении формы на каждом этапе, за 2 минуты обработалось чуть больше 2 сотых процента. Без использования на все ушло 8 секунд. Поэтому старайтесь использовать прогресс бар только в случаях, когда это действительно важно и применяйте к нему оптимальный интервал – секунды достаточно, свыше данного значения особых изменений в производительности не наблюдается.

Также предусмотрена возможность остановить выполнение всех процессов, закрыв окно загрузки. Предварительно пользователю будет выведено окно с подтверждением.

Пример подключения прогресс бара к макросу

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

' Объявляем переменную для загрузки строки

D im strC As String

s trC = Cells(1, 1).Value

' увеличиваем ее содержание

s trC = strC & strC & strC & strC & strC

s trC = strC & strC & strC & strC & strC

s trC = strC & strC & strC & strC & strC

s trC = strC & strC & strC & strC & strC

s trC = strC & strC & strC & strC & strC

' создаем экземпляр класса прогресс бара

D im bar As ProgressBar

S et bar = New ProgressBar

' создаем элементы формы прогресс бара

' последовательность создания элементов не имеет никакого значения, т.к.

' перед его создание проверяется наличие остальных. Если элементы найдены, то они сдвигаются

b ar.createtimeFinish ' вывод строки для оставшегося времени

b ar.createLoadingBar ' вывод полосы загрузки

b ar.createString ' вывод строки пройденных этапов из общего количества с указанием процента

b ar.createtimeDuration ' текущая время обработки процесса

b ar.createTextBox ' вывод пустого текстового поля

b ar.setParameters Len(strC), 0, 5 ' Задание параметров для последующей обработки:

' 1 - указание числа этапов процесса;

' 2 - интервал обновления формы, в данном случае ноль, но можно вовсе опустить

' 3 - интервал обновления в секундах, применяется, только если предыдущий аргумент равен нулю или опущен

b ar.Start ' запускаем прогресс бар перед началом процесса

F or i = 1 To Len(strC)

ch = Mid(strC, i, 1)

bar.Update i ' обновляем прогресс бар и передаем ему номер текущего этапа процесса

' вторым аргументом можно передать строку для текстового поля, но она попадет туда только в случае,

' если интервал это позволяет, поэтому к элементу формы можно обратиться по его имени "Text"

b ar.exitBar ' Закрываем прогресс бар

S et bar = Nothing ' удаляем экземпляр класса прогресс бара

Многоуровневая полоса загрузки

Применение описанного в статье класса позволяет создавать независимые друг от друга окна загрузки для многоуровневых процессов.

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

Рекомендация: Для дочерних процессов добавляйте к формам загрузок уникальные заголовки (ProgressBar.Start Заголовок). Это уведомит пользователя программы о том, что сейчас выполняется подпроцесс.

Специальный элемент Microsoft ProgressBar Control

Выше было сказано о том, что саму полосу загрузки можно заменить дополнительным элементом управления формы, который специально предназначен для этого и называется Microsoft ProgressBar Control, version 6.0. Чтобы применить его, достаточно нажать правой кнопкой мыши на панели Tollbox и выбрать пункт "Additional Control. ".


Для ее устранения сначала проверьте наличие на Вашем компьютере файла MSCOMTCL.ocx. Это библиотека содержащая общие элементы управления Windows 6.0. Он должен располагаться в папке \Windows\SysWOW64 для 64-разрядных ОС либо \Windows\Sistem32 для 32-разрядных. В случае необходимости скачайте его и разместите в требуемую папку.

После того, как Вы убедились в наличии библиотеки, следует ее зарегистрировать. Запустите командную строку от имени администратора (Пуск -> Все программы -> Стандартные -> Командная строка) и выполните команду regsvr32 MSCOMTCL.ocx .

Читайте также: