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

MB60UG

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

Глава 6: Интерфейс пользователя

На практике добавление нового меню может породить неудобства. Длина строки заголовков ограничена и, действуя таким образом, Вы ее быстро переполните. Поэтому в программе TEXTBOX используется другой прием: меню не добавляется в строку заголовков, а встраивается как подменю в другое меню "Программы" с помощью оператора

Alter Menu.

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

"(-",

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

В результате получается меню "Программы" следующего вида:

Программы из комплекта поставки, такие как SCALEBAR ("Масштаб") и OVERVIEW ("Обзор"), встраиваются в систему меню MapInfo тем же способом: добавляются в меню ПРОГРАММЫ. Так, если будут запущены программы "Рамка", "Масштаб" и "Обзор", то меню в ПРОГРАММЫ добавятся три новых элемента.

Если бы каждая новая программа добавлялась в строку заголовков меню, то последняя бы быстро переполнилась. Размещая новые элементы меню в меню ПРОГРАММЫ, Вы экономите много места. Однако, нужно заметить, что иерархическое построение меню не кажется удобным многим пользователям. Например, в системе Macintosh пользователь должен держать нажатой кнопку мыши во время всего процесса выбора команды.

Каким из способов Вы воспользуетесь, зависит от самой Вашей программы. Если нужно, Вы можете, конечно, добавить много новых меню. Однако, куда бы Вы не поместили новые меню, помните о том, что в MapInfo допускается не более 96 определений меню. Другими словами, в одно и то же время MapInfo может поддерживать 86 меню, включая свои стандартные меню. Это ограничение никак не связано с количеством показанных меню на экране.

Изменение элемента меню

Язык MapBasic позволяет Вам совершать следующие действия с отдельными элементами меню:

Вы можете показать элемент серым цветом, то есть сделать его недоступным.

75

Глава 6: Интерфейс пользователя

Вы можете сделать доступным ранее недоступный (серый) элемент.

Вы можете пометить галочкой команду в меню; задать эту возможность нужно заранее на этапе определения. Для этого нужно перед первым символом в имени меню поставить восклицательный знак. Более подробные сведения см. в описании оператора Create Menu â Справочнике MapBasic.

Галочку у элемента меню можно убрать.

Команду можно переименовать.

Оператор Alter Menu Item используется для изменения элемента меню. Оператор Alter Menu Item содержит несколько предложений (Enable, Disable, Check, UnCheck и др.), манипулируя которыми Вы можете вносить перечисленные выше изменения.

Программа из комплекта поставки OVERVIEW ("Обзор") содержит пример создания и последующего изменения нового меню. Программа OVERVIEW задает следующее новое меню:

Create Menu "Обзор" As "&Настройка" Calling OverView,

"(Фиксировать рамку" Calling MenuToggler, "(Стиль рамки" Calling PickFrame,

"(-",

"Закрыть программу Обзор" Calling Bye, "(-",

"О программе Обзор..." Calling About

Ìåíþ ÑТИЛЬ РАМКИ вначале недоступно. (Этот режим задается с помощью символа “(”, предшествующего имени команды.)

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

Alter Menu Item PickFrame Enable

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

Alter Menu Item PickFrame Disable

"PickFrame" – это имя подпрограммы (sub-процедуры) в OVERVIEW.MB. Обратите внимание на то, что "PickFrame" появляется как в операторе Create Menu (в предложении Calling), так и в операторе Alter Menu Item. В операторе Alter Menu Item Вы должны задать, какой элемент меню будет изменен. Если Вы определите имя процедуры (например, "PickFrame"), MapInfo изменит ту команду, которая ее вызывает.

Таким же образом, для изменения команды ФИКСИРОВАТЬ РАМКУ можно воспользоваться следующим оператором:

Alter Menu Item MenuToggler Enable

Оператором Alter Menu Item можно также изменить имя команды меню. Например, программа OVERVIEW сначала задает команду под названием ФИКСИРОВАТЬ РАМКУ. Как только эта команда будет выбрана, то программа изменит название команды на НОВАЯ РАМКА, для чего используется следующий оператор:

Alter Menu Item MenuToggler Text "Новая рамка"

76

Глава 6: Интерфейс пользователя

MapInfo изменяет команды из стандартной системы меню самостоятельно. Например, команда ОÊÍÎ > ÊÀÐÒÀ активна только тогда, когда открыта хотя бы одна таблица, содержащая графические объекты. Рекомендуется оставить право изменения стандартного меню за MapInfo и не пытаться делать это из программы на языке MapBasic.

Переопределение строки меню

Для удаления меню из строки заголовков используется оператор Alter Menu Bar. Например, следующий оператор удаляет с экрана меню ЗАПРОС:

Alter Menu Bar Remove "Запрос"

Вы можете также с помощью оператора Alter Menu Bar добавить меню в строку заголовков. Например, следующий оператор добавляет меню КÀÐÒÀ è ÑПИСОК. (Обычно эти меню не показываются одновременно; меню КÀÐÒÀ появляется при открытом окне Карты, а меню СПИСОК – при открытом Списке)

Alter Menu Bar Add "Карта", "Список"

Оператор Alter Menu Bar Add всегда добавляет меню в правую часть строки заголовков. В связи с этим возникает небольшое неудобство из-за того, что строка меню заканчивается меню СПРАВКА (Help). В большинстве программ принято, чтобы меню СПРАВКА (Help)

было последним в строке заголовков. Если Вы хотите поместить новое меню слева от меню СПРАВКА, то последнее надо сначала удалить. Например, в программе TEXTBOX используется следующий прием:

Alter Menu Bar Remove ID 6, ID 7

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

Первый оператор удаляет меню СПРАВКА (меню с ID-номером 7). Второй добавляет два меню сразу: ПРОГРАММЫ è ÑПРАВКА. В результате меню СПРАВКА снова оказывается последним в строке заголовков.

Более радикально упорядочивает строку меню оператор Create Menu Bar. Например, следующий оператор переопределяет строку меню, оставляя в ней заголовки ФÀÉË, ÏРАВКА, ÊÀÐÒÀ, ÇАПРОС, ÑПРАВКА (в приведенном порядке):

Create Menu Bar As

"Файл", "Правка", "Карта", "Запрос", "Справка"

Список стандартных заголовков меню MapInfo (ФÀÉË, ÇАПРОС и т.д.) приведен в описании оператора Create Menu Bar â Справочнике MapBasic.

Восстановить стандартную строку меню MapInfo можно оператором Create Menu Bar As Default.

Задание элементов меню на разных языках

В большинстве предыдущих примеров к меню обращались по имени (ФÀÉË и т.д.). Есть другой способ обратиться к стандартному заголовку меню MapInfo: по его номеруидентификатору. Например, в любом операторе, обращающемся к меню ФÀÉË, можно вместо слова "Файл" использовать "ID 1". Следующий оператор удаляет меню ЗАПРОС

(которому соответствует идентификатор 3) из строки заголовков:

Alter Menu Bar Remove ID 3

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

77

Глава 6: Интерфейс пользователя

версии MapInfo обращение к меню “File" не пройдет (как и в любой другой локализованной версии), и будет порождена ошибка.

Список идентификаторов, которые соответствуют стандартным меню MapInfo, приведен в описании оператора Create Menu Bar â Справочнике MapBasic.

Настройка быстрых меню MapInfo

MapInfo 5.0 обеспечивает быстрые меню – меню, которые появляются, если пользователь нажимает правую кнопку мыши. Чтобы манипулировать такими меню, используйте те же самые операторы, которые Вы использовали бы, чтобы работать со стандартными меню:

Alter Menu, Alter Menu Item, è Create Menu.

Каждое быстрое меню имеет уникальное имя и ID-номер. Например, быстрое меню, которое появляется, когда Вы нажимаете правую кнопкой мышки на Карте, называется "MapperShortcut" и имеет ID 17. Состав этих меню и ID-номера составляющих его команд, приведен в описании оператора Alter Menu â Справочнике MapBasic.

Чтобы отключить быстрое меню, используйте оператор Create Menu , который переопределяет систему меню MapInfo, и задайте управляющий код " (- " как новое определение меню. Например:

Create Menu ”MapperShortcut” ID 17 As ”(-”

Назначение одной обрабатывающей процедуры нескольким элементам

ìåíþ

Операторы Create Menu è Alter Menu могут содержать предложение ID, которое назначает уникальный ID-номер, т.е. идентификатор, каждому новому элементу меню. Этот номер задавать не обязательно; однако с его помощью можно устроить так, чтобы разные команды вызывали одну и ту же процедуру.

В ситуации, когда одна или две команды меню вызывают одну и ту же процедуруобработчик, то в эту процедуру обычно помещается обращение к функции CommandInfo( )

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

Alter Menu "Запрос" Add

"Годовой отчет" ID 201 Calling report_sub, "Квартальный отчет" ID 202 Calling report_sub

Обе команды обращаются к процедуре "report_sub", но имеют разные ID-номера; поэтому, вызвав из тела обработчика функцию CommandInfo( ), Вы можете определить, какая из команд была выбрана, и поступить соответственно:

Sub report_sub

If CommandInfo(CMD_INFO_MENUITEM) = 201 Then

'

' ... значит, выбрали Годовой отчет...

'

ElseIf CommandInfo(CMD_INFO_MENUITEM) = 202 Then

'

' ... значит, выбрали Квартальный отчет...

'

End If End Sub

78

Глава 6: Интерфейс пользователя

Номера-идентификаторы элементов меню также помогают при изменении элемента меню. Если оператор Alter Menu Item обращается к элементу меню по имени соответствующей процедуры-обработчика, то MapBasic изменит âñå элементы меню, которые обращаются к той же процедуре. Так, следующий оператор отключает активность обеих команд из предыдущего примера (а это, может быть, совсем не то, что нужно):

Alter Menu Item report_sub Disable

В зависимости от характера Вашей программы, Вы можете захотеть изменить только одну из команд. Следующий оператор отключает активность только команды ГОДОВОЙ ОТЧЕТ, но не действует на другие:

Alter Menu Item ID 201 Disable

Номером-идентификатором может быть любое положительное число.

Задание клавишных комбинаций

Клавишные комбинации позволяют пользователю открывать меню, выполнять команды и операции прямо с клавиатуры. В меню обычно применяются клавишные сокращения,

представленные подчеркнутой буквой в названии меню или команды. Например, клавишным сокращением для меню ÔÀÉË является ALT+Ф, что явствует из подчеркивания под буквой Ф. При создании элемента меню можно добиться подчеркивания буквы, поместив перед ней знак амперсанда (&). Амперсанд автоматически задает клавишное сокращение как в Windows, так и в Macintosh.

В следующем фрагменте программы создается команда ÑОЗДАТЬ РАМКИ, вызываемая с клавиатуры комбинацией ALT+ C:

Create Menu "Рамка" As

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

...

"Горячие" клавиши (èëè акселераторы на жаргоне программистов) являются другой разновидностью клавишных комбинаций. "Горячие" клавиши позволяют выполнять некоторые команды и операции напрямую, без обращения к меню. В следующем примере команде меню сопоставляется "горячая" клавишная комбинация CTRL+Z:

Alter Menu "Запрос" Add

"Новый отчет" + Chr$(9) + "CTRL-Z/W^%122" Calling new_sub

Текст "CTRL+Z" появляется в меню, и пользователь может видеть, что команда снабжена "горячими" клавишами.

Инструкция "+ Chr$(9)" вставляет пробел размером в один табулятор между командой и клавишной комбинацией. Табуляторы позволяют единообразно выравнивать "горячие" комбинации с правой стороны меню.

Инструкция "/w^%122" определяет клавишную комбинацию как одновременное нажатие на клавиши CTRL и Z. Код "/w^%122" MapInfo интерпретирует следующим образом: "/w" говорит о том, что это код для MapInfo для Windows, символ "^" определяет нажатие клавиши CTRL, а код "%122" определяет нажатие клавиши “z" (122 – это ASCII-номер буквы "z"). При задании "горячей" клавиши нужно ориентироваться на английские буквы, которые им соответствуют стандартно; при этом действующая в системе Windows

79

Глава 6: Интерфейс пользователя

раскладка клавиатуры может быть другой, даже русской; например, в русской версии MapInfo комбинация CTRL+Я будет работать так же, как CTRL+Z.

Список кодов, управляющих созданием “горячих” клавиш, приведен в описании оператора

CreateMenu â Справочнике MapBasic.

Управление системой меню через файл MAPINFOW.MNU

Стандартная система меню MapInfo версии 3 содержится в специальном текстовом файле. При желании Вы можете настроить меню MapInfo по своему вкусу, изменив этот файл.

В системе UNIX этот файл называется MAPINFO.MNU; â MapInfo äëÿ Machintosh – Mapinfo.Menus; â MapInfo äëÿ Windows – MAPINFO.MNU.

Если Вы откроете этот файл в текстовом редакторе, то увидите, что он построен как фрагмент программы MapBasic. Если Вы измените описание элемента меню в файле MAPINFOW.MNU, то этот элемент будет выглядеть по-новому при следующем запуске MapInfo. Таким образом, манипулируя текстами в файле MAPINFOW.MNU, Вы можете переопределять стандартную систему меню напрямую, без участия программ MapBasic.

Внимание: Прежде чем изменять что-либо в файле MAPINFOW.MNU, сохраните его резервную копию, например, в файле BACKUP.MNU. Ибо, если файл MAPINFOW.MNU будет испорчен или уничтожен, то MapInfo, возможно, не запустится. Запустить MapInfo можно будет только восстановив файл MAPINFOW.MNU из резервной копии. Если же файл MAPINFOW.MNU поврежден, а резервной копии нет, то Вам придется полностью переустановить пакет MapInfo.

Файл MAPINFOW.MNU содержит несколько операторов Create Menu; они и задают стандартную систему меню MapInfo (ФÀÉË, ÏРАВКА и т.д.). Чтобы удалить один или несколько элементов меню, можно просто удалить соответствующую строку из оператора

Create Menu.

Например, команда MapInfo ТАБЛИЦА > ÈЗМЕНИТЬ обычно открывает подменю с командами ПЕРЕСТРОИТЬ, ÓДАЛИТЬ, ÏЕРЕИМЕНОВАТЬ è ÓПАКОВАТЬ.

Изучив файл MAPINFOW.MNU, Вы обнаружите, что меню ИЗМЕНИТЬ определено следующим образом:

Create Menu "&Изменить" As "&Перестроить..." calling 404, "У&далить..." calling 409, "Пере&именовать..." calling 410, "&Упаковать..." calling 403

...

80

Глава 6: Интерфейс пользователя

Команда УДАЛИТЬ может быть Вам не нужна, и Вы хотите удалить ее из меню ИЗМЕНИТЬ. Для этого можно просто удалить соответствующую строку (“У&далить..." Calling 409) из файла MAPINFOW.MNU; в результате оператор Create Menu, описывающий меню ИЗМЕНИТЬ, примет следующий вид:

Create Menu "&Изменить" As "&Перестроить..." calling 404, "Пере&именовать..." calling 410, "&Упаковать..." calling 403

...

При следующем запуске MapInfo меню ТАБЛИЦА > ÈЗМЕНИТЬ предстанет в сокращенном виде:

Аналогично, чтобы удалить меню полностью, со всеми командами, нужно найти соответствующий оператор Create Menu Bar в меню MAPINFOW.MNU и удалить его.

Если пакет MapInfo установлен на сети и Вы изменили файл MAPINFOW.MNU в том же каталоге, в котором установлена программа MapInfo, то изменения в системе меню распространятся на всех пользователей MapInfo в сети. Этим можно воспользоваться, например, для придания единообразия интерфейсу или для сокрытия от не в меру активных пользователей потенциально опасных команд типа УДАЛИТЬ.

Иногда требуется лишить пользователей некоторых прав, но оставить эти права за собой или за администратором сети. Например, команду УДАЛИТЬ можно скрыть от пользователей, но оставить в распоряжении администратора.

Для того, чтобы создать персональный вариант файла MAPINFOW.MNU для отдельного пользователя, поместите его в личный каталог пользователя. В системе Windows личный каталог – это тот, в котором содержится файл WIN.INI.

Как только пользователь запускает MapInfo, то сначала проверяется наличие файла MAPINFOW.MNU в личном каталоге пользователя. Если файл MAPINFOW.MNU присутствует в личном каталоге, MapInfo загружает из него систему меню. Если же в личном каталоге MAPINFOW.MNU не найден, то MapInfo загружает систему меню из каталога, в котором установлен пакет MapInfo.

Таким образом, Вы можете добиться того, чтобы один вариант файла MAPINFOW.MNU был доступен всем пользователям, а другие – индивидуальным пользователям. Версия MAPINFOW.MNU, предназначенная для общего пользования, помещается в один каталог с MapInfo, а версии для индивидуальных пользователей – в их личные каталоги.

81

Глава 6: Интерфейс пользователя

Команда MapBasic, эквивалентная выбору команды в меню

Чтобы симулировать событие выбора пользователем команды из меню MapInfo, используйте оператор Run Menu Command. Например, следующий оператор эквивалентен выбору в меню MapInfo команды ФÀÉË > ÎТКРЫТЬ и открывает диалог "Открыть таблицу":

Run Menu Command M_FILE_OPEN

Код M_FILE_OPEN определен в файле MENU.DEF.

Стандартные диалоговые окна

Диалоговые окна (или диалоги) являются существенным элементом интерфейса. В арсенале MapBasic содержится несколько операторов и функций, украшающих Вашу программу диалоговыми окнами:

Показ простого сообщения

Оператор Note показывает простейшее диалоговое окно с сообщением и кнопкой OK.

Показ диалога с двумя кнопками

Функция Ask( ) показывает диалог с вопросом и двумя кнопками. На двух кнопках обычно написано "OK" и "Cancel", но Вы можете использовать свои надписи. Если пользователь

82

Глава 6: Интерфейс пользователя

выберет кнопку "OK", функция вернет логическую истину (TRUE) или вернет логическую ложь (FALSE) в противном случае.

Диалог открытия файла

Функция FileOpenDlg( ) показывает стандартный диалог команды ФÀÉË > ÎТКРЫТЬ. Если пользователь выберет один из файлов, то функция вернет его имя. Если пользователь нажмет кнопку "Отмена", функция возвратит пустую строку.

В Windows 3.1 диалог имеет вид

Функция FileSaveAsDlg( ) показывает диалог команды ФÀÉË > ÑОХРАНИТЬ и возвращает имя файла, выбранного пользователем.

83

Глава 6: Интерфейс пользователя

Показ диалога-индикатора процента выполнения

Оператор ProgressBar показывает диалог с процентом выполнения и кнопкой "Отмена".

Показ только одной записи

В MapInfo нет стандартного диалога, который показывает только одну запись из таблицы. Для этого можно использовать окно Информация. Ниже в этой главе описано, как управлять этим окном из программы MapBasic.

Переносимость диалогов на другие вычислительные платформы

Каждый диалог, создаваемый MapBasic, следует правилам, принятым в данной операционной среде. Например, если MapBasic-программа, запущенная в среде Windows, содержит функцию FileOpenDlg( ), то открывается стандартный диалог открытия файла в Windows. Та же программа, запущенная в среде Macintosh, покажет при выполнении функции FileOpenDlg( ) диалог, построенный по стандартам системы Macintosh.

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

84

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