Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

MB60UG

.pdf
Скачиваний:
12
Добавлен:
13.02.2015
Размер:
1.47 Mб
Скачать

Приложение B: Текст программы TEXTBOX

Программа TEXTBOX и ее фрагменты используются в этом Руководстве в качестве

примеров. Ниже приводится полный текст этой программы.

'********************************************************************

'Программа MapBasic: TEXTBOX.MB

'Эта программа рисует рамку вокруг выбранного текста

'в виде прямоугольника или сглаженного прямоугольника.

'Работает она следующим образом:

'(1) пользователь создает один или несколько текстовых объектов

'в окне Карты или Отчета,

'(2) затем пользователь выбирает один или несколько текстовых

'(3) объектов, затем выбирает один или несколько текстовых

'

объектов, выбирает в диалоге цвета, формы и др. атрибуты рамки

'

После нажатия на кнопку OK программа рисует рамки

'

вокруг всех выбранных текстовых объектов.

' ЗАМЕЧАНИЕ:Текстовые объекты должны находиться на изменяемом слое

'

Карты, на изменяемом Косметическом слое или в окне Отчета.

'

Слой Карты не должен быть открыт только для чтения.

'

 

'В программе иллюстрируется использование следующих

'операторов и процедур MapBasic:

'Create Menu, Alter Menu Item

'Dialog

'SelectionInfo()

'ObjectGeography()

'ObjectInfo()

'Alter Object

'Update

'ProgressBar

'OnError

'Использование функций из библиотеки AUTO_LIB позволяет программе

'устанавливать себя в стартовый Рабочий Набор MapInfo.

'

Приложение B: Текст программы TEXTBOX

'*********************************************************************

'

Объявления sub-процедур

Declare Sub Main

Declare Sub About

Declare Sub create_sub

Declare Sub next_box

Declare Sub Bye

'*********************************************************************

'

Include-файлы и стандартные определения

'

Include "mapbasic.def" 'стандартные определения

Include "auto_lib.def" 'доступ к библиотеке AUTO_LIB, текст которой 'находится в файле AUTO_LIB.MB

'*********************************************************************

' Объявления глобальных переменных

Global on_layout As Logical Global table_name As String Global pstyle As Pen Global bstyle As Brush

Global box_type, num_rows, next_row, num_drawn As Integer

Global reset_color As Logical

'TRUE=сменить цвет текста на цвет рамки

Global line_color As Integer

'RGB-цвет рамки

Global shift_ok As

SmallInt

'Сдвиг кнопки "OK" вправо

Global shift_cancel

As SmallInt

'Сдвиг кнопки "Отмена" вправо

'*********************************************************************

'Основная процедура: Main

'В процедуре Main добавляется меню в строку меню,

'Затем пользователь выбирает одну из команд

'

'*********************************************************************

Sub Main

' Присвоение переменных, используемых при организации самозагрузки

gsAppFilename = "textbox.mbx" ' название файла с текстом программы gsAppDescription = """Рамка""" ' Название MB-программы

If SystemInfo(SYS_INFO_PLATFORM) = PLATFORM_MAC Then

shift_ok = 45 'В среде Macintosh расположить 'кнопки по-другому

shift_cancel = 0

Else

shift_ok = 0

shift_cancel = 45 'В среде Windows поместить кнопку '"Отмена" справа от "OK"

256

Приложение B: Текст программы TEXTBOX

End If

Create Menu "Рамка" As

"&Создать рамки..." Calling create_sub,

"Â&ûõîä" Calling Bye,

 

"&О программе ""Рамка""..."

Calling About

Alter Menu "Программы" Add

 

 

"(-",

 

 

 

"Рамка" As "Рамка"

 

 

Alter Menu Bar Remove ID 6, ID 7

 

Alter Menu Bar Add "Программы", ID 6, ID 7

 

Menu Bar Show

 

' показать новый вариант строки меню

pstyle = MakePen(1, 2, BLACK)

' создать стандартный стиль линии

bstyle = MakeBrush(1, 0, 0)

' создать пустое заполнение

box_type = 1

' стандартные прямоугольники - несглаженные

reset_color = FALSE

' Стандартный режим - не менять цвет текста

End Sub

'*********************************************************************

'Sub-процедура: About

'Вызывается командой Рамка > О программе "Рамка"

'Демонстрирует диалог с объяснениями.

'*********************************************************************

Sub About

Dialog

Title "О программе ""Рамка""" Control StaticText

Title "Эта программа рисует декоративные рамки вокруг" Position 10, 10

Control StaticText

Title "текстовых объектов в окне Карты или Отчета." Position 10, 18

Control StaticText

Title "Выберите сначала один или несколько" Position 10, 40

Control StaticText

Title "текстовых объектов, затем выполните команду" Position 10, 48

Control StaticText

Title """Создать Рамки"" из меню ""Рамка""." Position 10, 56

Control StaticText

Title "Внимание: Программа ""Рамка"" не поддерживает" Position 10, 80

Control StaticText

Title "непроецированные карты (планы)." Position 10, 88

Control Button

Title "Самозапуск..." Calling HandleInstallation Width 80

257

Приложение B: Текст программы TEXTBOX

Position 30, 110

Control OKButton

Title "OK"

Position 130, 110

'Внимание: Нажатие на кнопку ""Самозапуск"" вызывает процедуру

'HandleInstallation() из библиотеки AUTO_LIB. Эта процедура

'открывает диалог, в котором пользователь может сделать так,

'чтобы "Рамка" загружалась автоматически при старте MapInfo.

End Sub

'*********************************************************************

'Sub-процедура create_sub

'Вызывается командой Программы > Рамка > Создать рамки.

'Эта процедура показывает диалог, в котором пользователь

'устанавливает разные режимы.

'*********************************************************************

Sub create_sub

' Объявление локальных переменных

Dim i As SmallInt, text_objs As Logical

Dim destination_table As String

'Если ничего не выбрано или если выбрана запись в таблице,

'не имеющая графического объекта, то предлагается сделать выбор.

num_rows = SelectionInfo(SEL_INFO_NROWS) If num_rows > 0 Then

table_name = SelectionInfo(SEL_INFO_TABLENAME)

If TableInfo(table_name, TAB_INFO_MAPPABLE) = FALSE Then Note "Выберите один или несколько текстовых" + Chr$(13)

+ "объектов перед рисованием рамок." Exit Sub

End If

Else

'(если количество выбранных записей равно нулю) Note "Нужно выбрать один или несколько текстовых "

+Chr$(13) + " объектов перед рисованием рамок." Exit Sub

End If

'Теперь нужно затратить время на определение того, какие из выбранных

'объектов являются текстовыми (в выборке их может не быть вообще).

'Если в выборке нет текстовых объектов, выдается сообщение пользователю.

'

'Пользователь может также выбрать очень много объектов, и проверка может

'затянуться. Поэтому проверяются первые 20 и, если среди них нет

'текстовых объектов,выдается сообщение пользователю.

258

Приложение B: Текст программы TEXTBOX

i = 1

text_objs = FALSE

Do While i <= num_rows

Fetch Rec i From Selection

If Str$(Selection.obj) = "Text" Or i > 20 Then text_objs = TRUE

Exit Do End If

i = i + 1

Loop

If Not text_objs Then

Note "Нужно выбрать один или несколько текстовых " + Chr$(13) + "объектов перед рисованием рамок."

Exit Sub

End If

'Определить, где мы находимся: в Отчете или в Карте

'и установить различающую переменную.

on_layout = FALSE

If TableInfo(table_name, TAB_INFO_TEMP) = TRUE And Left$(table_name, 6) = "Layout" Then

on_layout = TRUE Else

'Если это не Отчет, проверить, не открыта ли таблица

'в режиме "только-для-чтения". Если это так, выйти. If TableInfo(table_name, TAB_INFO_READONLY) Then

Note "Вы выбрали объекты из таблицы," + Chr$(13) + "открытой только для чтения." + Chr$(13) + Chr$(13) +

"Откройте таблицу " + table_name + " в обычном режиме " + "или выберите объекты из другой таблицы."

Exit Sub End If

End If

If on_layout Then

destination_table = "в окно Отчета"

ElseIf InStr(1, table_name, "Cosmetic") > 0 Then destination_table = "на Косметический слой окна Карты"

Else

destination_table = "в таблицу " + table_name

End If

 

Dialog

Title "Создание рамок"

Control StaticText

Title "Создать рамки вокруг выбранных текстов"

Position 15, 5

Control GroupBox

Title "Форма рамки:"

Position 10,20

Width 160 Height 40

Control RadioGroup

Title "&Прямоугольник;&Сглаженный прямоугольник"

Position 20,32

Value box_type

Into box_type

Control StaticText

259

Приложение B: Текст программы TEXTBOX

Title "Стиль линии:"

Position 20,70

Control PenPicker

Value pstyle

Into pstyle

Position 70,70

Width

20

Height 20

Control

GroupBox

Title "Рамки будут помещены:"

Position 10,100

Width

160

Height 40

Control

StaticText

Title destination_table Position 20,120

Control CheckBox

Title "Сделать одинаковыми цвета текста и рамки" Position 10, 150

Value reset_color Into reset_color

Control OKButton

Title "OK"

Position 90 + shift_ok, 180 Control CancelButton

Title "Отмена"

Position 90 + shift_cancel, 180

'Диалог определен. Нажатие на кнопку "Отмена" заканчивает работу. If Not CommandInfo(CMD_INFO_DLG_OK) Then

Exit Sub End If

line_color = StyleAttr(pstyle, PEN_COLOR)

num_drawn = 0 ' инициализация счетчика нарисованных рамок next_row = 1 ' следующая обрабатываемая запись

'В окне Отчета перед работой с объектами

'нужно выполнить оператор Set CoordSys If on_layout Then

Set CoordSys Layout Units "mm" Else

Set CoordSys Earth End If

'Далее используется шкала выполнения (диалог "Минуточку").

'Оператор ProgressBar последовательно вызывает процедуру NEXTBOX,

'пока не будут сделаны все работы или пока не будет нажата кнопка "Отмена".

ProgressBar "Создание рамок вокруг текстов..." Calling next_box Range num_rows

If CommandInfo(CMD_INFO_DLG_OK) Then

Note "Процесс завершен. " + Chr$(13) + Chr$(13) + "Создано рамок: " + Str$(num_drawn)

Else

Note "Процесс прерван! " + Chr$(13) + Chr$(13) + "Создано рамок: " + Str$(num_drawn)

End If Exit Sub

End Sub

260

Приложение B: Текст программы TEXTBOX

'*****************************************************************' Subпроцедура: next_box

'

'Процедура next_box рисует одну рамку вокруг одного текста.

'Оператор ProgressBar (выше) вызывает эту процедуру

'до тех пор, пока процесс не завершится или не прервется '*****************************************************************Sub next_box

'Declare local variables Dim objcopy, tbox As Object Dim oldfont, newfont As Font

Dim center_x, center_y, dx, dy, radius, x1, y1, x2, y2 As Float

'Переход к следующему объекту из выборки

Fetch Rec next_row From Selection

' Рамка рисуется только вокруг текстовых объектов If Str$(Selection.obj) = "Text" Then

' Определение размеров текстового объекта objcopy = Selection.obj

x1 = ObjectGeography(objcopy, OBJ_GEO_MINX)

x2 = ObjectGeography(objcopy, OBJ_GEO_MAXX)

y1 = ObjectGeography(objcopy, OBJ_GEO_MINY)

y2 = ObjectGeography(objcopy, OBJ_GEO_MAXY) center_x = (x1 + x2) / 2

center_y = (y1 + y2) / 2 dx = Abs(x2 - x1) / 2 dy = Abs(y2 - y1) / 2

dx = dx + .3 * Minimum(dx, dy) dy = dy + .3 * Minimum(dx, dy) x1 = center_x - dx

x2 = center_x + dx

y1 = center_y - dy

y2 = center_y + dy If box_type = 1 Then

Create Rect

Into Variable tbox (x1, y1) (x2, y2)

Pen pstyle Brush bstyle

Else

' Вычисление радиуса закруглений для углов сглаженной рамки radius = .6 * Minimum(dx, dy)

Create RoundRect

Into Variable tbox

261

Приложение B: Текст программы TEXTBOX

(x1, y1) (x2, y2) radius Pen pstyle Brush bstyle

End If

Insert Into table_name (obj) Values (tbox) num_drawn = num_drawn + 1

If reset_color Then

'...далее, поскольку пользователь установил флажок

'"Сделать одинаковыми цвета рамки и текста",

'производятся следующие действия:

'сначала считывается стиль шрифта текстового объекта,...

'

oldfont = ObjectInfo(objcopy, OBJ_INFO_TEXTFONT)

'

' затем создается новый стиль с новым цветом,...

newfont = MakeFont( StyleAttr(oldfont, FONT_NAME), StyleAttr(oldfont, FONT_STYLE), Maximum(StyleAttr(oldfont, FONT_POINTSIZE), 1), line_color,

StyleAttr(oldfont, FONT_BACKCOLOR) )

'

'затем новый стиль назначается переменной Object...

'Alter Object objcopy Info OBJ_INFO_TXTFONT,newfont

'Наконец, записываем изменный объект в таблицу

'

Update Selection Set Obj= objcopy Where RowID=next_row

End IF

 

End If

 

If next_row >= num_rows Then

'Если считана последняя запись

ProgressBar = -1

'сигнал: процесс завершен

Else

 

ProgressBar = next_row

'сигнал: процесс продолжается

End If

 

next_row = next_row + 1

 

End Sub

'**************************************************************************

'Sub procedure: Bye

'Вызывается командой Рамка > Выход.

'Закрывает программу. '************************************************************************** Sub Bye

262

Приложение B: Текст программы TEXTBOX

End Program

 

 

End Sub

 

 

'///////////

Конец программы TEXTBOX.MB

////////////

263

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