Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MB_REF_7.pdf
Скачиваний:
25
Добавлен:
13.02.2015
Размер:
2.96 Mб
Скачать

Оператор ProgressBar

Оператор ProgressBar

Назначение:

Показывает диалог, иллюстрирующий выполнение процесса с кнопкой остановки и шкалой выполнения.

Синтаксис:

ProgressBar status_message

Calling handler [ Range n ]

где

status_message – срока для сообщения в диалоговом окне; handler – имя процедуры-обработчика диалога;

n – число для правого предела шкалы.

Предупреждение:

Вы не можете использовать оператор ProgressBar в окне MapBasic.

Описание:

Оператор ProgressBar используется для создания диалогового окна-индикатора выполнения процесса. Такой диалог снабжен процентной шкалой и кнопкой "Отменить". Диалог сопровождает определенные действия и показывает, насколько они выполнены. Выполнение можно прервать, нажав кнопку "Отменить". Информацию о том, как завершился процесс – самостоятельно или был прерван – можно узнать при помощи функции CommandInfo(CMD_INFO_DLG_OK), вызвав ее после оператора ProgressBar.

Строковый параметр status_message может задавать поясняющий текст, который будет отображен внутри диалога процесса над шкалой. Например, это может быть: "Идет процесс копирования...".

Параметр handler является именем процедуры-обработчика, выполняющей те действия, которые сопровождаются диалогом процесса. Процедура-обработчик является sub-процедурой на MapBasic.

Параметр n задает число, которое будет стоять справа у шкалы в окне диалога. Например, процедура handler обрабатывает 7000 строк в таблице. Вы задаете параметр n равным семи тысячам. Теперь шкала отображает информацию о построчном выполнении процедуры. Если предложение Range отсутствует, то по умолчанию устанавливается значение 100.

Когда программа выполняет оператор ProgressBar, MapBasic вызывает подпрограмму handler. Работа, выполняемая этой процедурой, должна быть разбита на небольшие по длительности отрезки, не более нескольких секунд каждый. Это делается для того, чтобы пользователь мог нажать на кнопку "Отмена", после чего MapBasic убирает с экрана диалог, и выполнение программы передается следующему после ProgressBar оператору. Если же пользователь не нажимал на эту кнопку, MapBasic продолжает выполнение процедуры-обработчика handler. Если пользователь ни разу не нажал кнопку отмены, то процедура-обработчик благополучно завершает свое дело.

Поэтому в тексте процедуры-обработчика handler должны быть предусмотрены средства для разбиения процесса на небольшие отрезки, а также средства слежения за возобновлением процесса. Пока оператор ProgressBar работает, MapBasic периодически обращается к процедуре-обработчику до тех пор, пока пользователь не нажмет кнопку отмены, либо процедура не закончит работу. Для контроля за этими событиями поддерживается специальная переменная, имеющая имя ProgressBar. Если обработчик присвоит этой переменной значение "минус единица"

416

Справочник MapBasic

Оператор ProgressBar

ProgressBar = 1,

то MapBasic прерывает процесс и убирает диалог с экрана. И, наоборот, любое положительное значение переменной ProgressBar, например,

ProgressBar = 50

используется MapBasic для отображения "процента выполнения" в диалоге. MapBasic вычисляет "процент выполнения" делением текущего значения переменной ProgressBar на значение переменной Range. Например, если переменной Range присвоено значение

Range 400,

то, если значение ProgressBar равно 100, "процент выполнения" будет равен 25% и это будет отображено в диалоге.

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

CommandInfo(CMD_INFO_DLG_OK),

возвращающая значение TRUE, если процесс завершился нормально, и FALSE, если процесс был прерван пользователем.

Пример:

Этот пример демонстрирует, как должна быть написана процедура, вызываемая оператором Pro gressBar. Процесс в этом примере состоит из 600 итераций, это может быть однотипная обработка 600 строк таблицы. Оператор ProgressBar вызывает из основной процедуры sub-процедуру "write_out". Sub-процедура "write_out" обрабатывает записи в течение 2 секунд. Затем она возвращает управление, и MapBasic проверяет, не была ли нажата кнопка отмены. Если пользователь не нажимал на кнопку отмены, то MapBasic возвращает управление в процедуру-обработчик. Такая последовательность действий повторяется до тех пор, пока не будет выполнена вся задача.

Include ”mapbasic.def”

Declare Sub Main

Declare Sub write_out

Global next_row As Integer

Sub Main

next_row = 1

ProgressBar ”Мы записываем...” Calling write_out Range 600

If CommandInfo(CMD_INFO_STATUS) Then

Note ”Запись завершена! Спасибо за терпение.”

Else

Note ”Запись прервана!”

End If

End Sub

 

Sub write_out

 

Dim start_time As Float

 

start_time = Timer()

 

Справочник MapBasic

417

Оператор ProgressBar

'Записи обрабатываются до тех пор, пока (a) задача

'не будет выполнена, или (b) пока не пройдут 2 секунды

Do While next_row <= 600 And Timer() start_time < 2

'''''''''''''''''''''''''''''''''''''''''''''''''''''

''' Здесь может быть любой другой продолжительный '''

''' процесс, а сейчас мы просто тянем время '''

'''''''''''''''''''''''''''''''''''''''''''''''''''''

next_row = next_row + 1 Loop

'Далее определяется причина остановки процесса:

'нормальное окончание работы или истечение

'двухсекундного срока на одну итерацию

If next_row > 600 Then

ProgressBar = 1 ' tell caller "Все сделано!"

Else

ProgressBar = next_row ' tell caller "Сделано отчасти"

End If

End Sub

Смотрите также:

CommandInfo( ), Note, Print

418

Справочник MapBasic

Функция Proper$( )

Функция Proper$( )

Назначение:

Возвращает строку, преобразуя все первые буквы слов в прописные, а остальные в строчные.

Синтаксис:

Proper$(string_expr)

где

string_expr – строковое выражение.

Величина, полученная в результате:

Строка. Величина типа String.

Описание:

Функция Proper$( ) возвращает строку, полученную из строки, представленной выражением string_expr, преобразованием всех первых букв слов в прописные и остальных в строчные. Такое преобразование имеет смысл для собственных имен и названий.

Пример:

Dim name, propername As String

name = "нижний новгород" propername = Proper$(name)

'

' переменная propername равна "Нижний Новгород"

name = "AБВ 123" propername = Proper$(name)

'

' переменная propername теперь равна "Aбв 123" name = "a б в г"

propername = Proper$(name)

'

' переменная propername теперь равна "A Б В Г"

Смотрите также:

LCase$( ), UCase$( )

Справочник MapBasic

419

Функция ProportionOverlap( )

Функция ProportionOverlap( )

Назначение:

Вычисляет процент перекрытия одного объекта другим.

Синтаксис:

ProportionOverlap(object1, object2)

где

object1 – объект снизу (не может быть точечным или текстовым); object2 – объект сверху (не может быть точечным или текстовым).

Величина, полученная в результате:

Величина типа Float.

Описание:

Функция ProportionOverlap( ) возвращает число, представляющее процент пересечения двух объектов по отношению к площади первого. Функцию можно заменить формулой Area(Over lap(object1, object2) ) / Area(object1).

Смотрите также:

AreaOverlap( )

420

Справочник MapBasic

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]