Задача 2. Создать диалог с использованием элементов ListBox и PopupMenu

Создать диалог с использованием элементов ListBox и PopupMenu.

Проект диалога имеет вид (рис. 2)

Рис 2 – Вид проекта диалога

Программа строит диалог, состоящий из трех списков. Верхний, реализованный в виде PopupMenu, представляет собой фиксированный список типов слоев. Далее идет ListBox со списком слоев. Список заполняется после того как выбран тип слоя. Последним идет ListBox со списком полей выбранного слоя. Этот список заполняется после двойного клика мышью на имени слоя.

Код программы с диалогом

'Блок описаний Include "MAPBASIC.DEF" Declare sub Main Declare Sub ListDemo Declare Sub lbDblClick Declare Sub pmClick Declare Sub CreateListLayerNames(byval id as smallint) Declare Sub CreateListFieldsNames(ByVal Table as string) Declare function ItsMap as integer 'Идентификатор окна карты dim idWinMap as integer dim i_lrType,i_lrName,i_fldName as smallint 'Список слоев. dim ListLayers() as string 'Список полей в выбранном слое. dim ColList as string 'Главная процедура sub Main 'Проверка: окно карты д.б. активно. idWinMap=ItsMap() if idWinMap=0 then exit sub end if call ListDemo end sub 'Диалог sub ListDemo Dialog Title "ПРИМЕР 2" Width 144 Height 213 'Раскрывающийся список типов слоев. Control PopupMenu Width 126 Height 10 Position 9, 20 ID 1002 Title "Нормальный;Косметический;Растровый;Тематический;Поверхность" Value 1 Into i_lrType 'Обработчик события (клик мышью на элементе списка) Calling pmClick 'Список слоев выбранного типа Control ListBox Width 126 Height 54 Position 8, 52 ID 1001 Title "Не определен!" Value 1 Into i_lrName 'Обработчик события (двойной клик мышью на элементе списка) Calling lbDblClick 'Список полей для выбранного слоя Control ListBox Width 123 Height 70 Position 8, 128 ID 1003 Title "Не определен!" Value 1 Into i_fldName 'Подпись к раскрывающемуся списку Control StaticText Title "Тип слоя" Width 50 Height 8 Position 10, 7 'Подпись к списку Control StaticText Title "Список слоев" Width 50 Height 8 Position 10, 40 'Подпись к списку Control StaticText Title "Список полей" Width 50 Height 8 Position 10, 117 end sub 'Обработчик события (клик мышью на элементе списка типов слоев) Sub pmClick dim ind as smallint 'Определяем идентификатор типа слоя ind = ReadControlValue(1002)-1 'Определяем список слоев заданного типа Call CreateListLayerNames(ind) if UBound(ListLayers)=0 Then Alter Control 1001 Title "Нет" Else 'Заполняем список слоев Alter Control 1001 Title From Variable ListLayers end if end sub 'Обработчик события (двойной клик мышью на элементе списка) Sub lbDblClick dim ind as smallint 'Определяем тип слоя ind = ReadControlValue(1002)-1 'Проверяем условие: двойной клик мышью и тип слоя нормальный If CommandInfo(CMD_INFO_DLG_DBL)=TRUE And ind=LAYER_INFO_TYPE_NORMAL Then 'Определяем индекс для слоя ind = ReadControlValue(1001) if ubound(ListLayers)=0 then exit sub end if 'Формируем список полей для выбранного слоя и записываем его в 'соответствующий ListBox диалога call CreateListFieldsNames(ListLayers(ind)) Alter Control 1003 Title ColList else Alter Control 1003 Title "Нет" End If end sub 'Формирование списка слоев выбранного типа в массиве ListLayers. Sub CreateListLayerNames(byval id as smallint) Dim s As String Dim j, n, m As Integer Dim t As Integer ReDim ListLayers(0) t=0 n =MapperInfo(idWinMap,MAPPER_INFO_LAYERS) For j = 0 To n s = LayerInfo(idWinMap, j,LAYER_INFO_NAME) m =LayerInfo(idWinMap,j,LAYER_INFO_TYPE) If m = id Then t =t+1 ReDim ListLayers(t) ListLayers(t) = s End If Next End Sub 'Формирование списка полей для таблицы TableName. Список формируется 'в виде строки с разделителем (;). Sub CreateListFieldsNames(ByVal TableName as string) Dim iColNum as SmallInt ColList = ColumnInfo(TableName,"col1",COL_INFO_NAME) For iColNum = 2 to NumCols(TableName) ColList = ColList & ";" & ColumnInfo(TableName,"col" & Str$(iColNum),COL_INFO_NAME) Next end sub 'Выполняется проверка: активное окно это окно карты. 'Если ДА то возвращается идентификатор окна, иначе – 0. function ItsMap() as integer dim map_id as integer ItsMap=0 map_id = FrontWindow() If WindowInfo(map_id, WIN_INFO_TYPE) <> WIN_MAPPER Then Note "Окно карты должно быть активным!" Exit function End If ItsMap=map_id end function

Порядок выполнения работы:

1. Изучить теорию.

2. Выполнить примеры из теоретической части

3. В отчете отобразить теоретическую часть код программ и модулей

4 Выполненную работу показать преподавателю и сдать отчет на подпись.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: