Совершенствование приложений Oracle Forms

Меню в Oracle Forms

Разбить на страницы
Показывать лекцию целиком

Меню - это набор элементов, позволяющих пользователю осуществлять быстрый доступ к наиболее часто используемым командам: Execute_Query, Exit_Form, Next_Record, Enter_Query или Previous_Item. Если рассматривать стандартное меню - меню (рис. 8.1) по умолчанию, то большинство его команд ассоциировано с функциональными клавишами и встроенными процедурами. Меню Oracle Forms представлено отдельным модулем, который может быть использован совместно и одновременно любым количеством форм. В Forms вы можете не только применять меню по умолчанию, но и создавать свое собственное.

(рис 8.1) Меню Oracle Forms.

Использование меню по умолчанию

Как уже было сказано ранее, Oracle Forms имеет свое стандартное меню команд, которое еще называется "меню по умолчанию". Вы можете управлять отображением стандартного меню с помощью параметра DEFAULTSMARTBAR свойства "Menu Module" формы (рис. 8.2). Если вы сотрете это слово, то при последующем запуске формы меню и панель инструментов исчезнет. Для того чтобы отобразить только меню, без панели инструментов, сотрите сочетание " SMARTBAR ", оставив слово DEFAULT.

(рис 8.2) Свойство "Модуль меню" формы

Создание специальных меню

Несмотря на то что меню по умолчанию содержит солидный набор необходимых команд, все же в большинстве случаев оказывается, что было бы неплохо добавить ту или иную команду, например, запуск отчета, другой формы или выполнение команды операционной системы. Вы не можете изменить стандартное меню (рис. 8.3), поэтому для того чтобы добавить в меню новые команды, вам придется создать собственное меню. Чтобы не делать лишнюю работу и повторно не воспроизводить команды стандартного меню, вы можете править существующий шаблон - OFGMNUT.MMB, который находится в папке DevSuiteHome_1\cgenf61\ ADMIN\. Для подключения шаблона выполните следующие действия:

  • Найдите файл DevSuiteHome_1\cgenf61\ADMIN\OFGMNUT.MMB.
  • Откройте шаблон в форме.
  • Примечание: когда вы подключите к форме собственное меню, панель инструментов исчезнет и вам придется создавать собственную панель. (рис 8.3) Шаблон меню OFGMNUT.MMB

    Создание меню, пунктов меню и подменю

    Для того чтобы научится создавать меню, необходимо знать его структуру, а именно основные объекты, которые его составляют:

  • меню (menu) - это главное меню и подменю. Главное меню - это меню типа "Файл", "Правка", а подменю - это иерархическое меню, ассоциированное с определенным пунктом меню и возникающее при его выборе;
  • пункт, или элемент меню (menu item) - это элементы главного меню или подменю. Вы можете создавать программные единицы для элементов меню.
  • В зависимости от состояния меню могут быть динамическими и статическими. Правильнее, конечно же, пользоваться статическим меню, так как меню должно быть неизменным и не должно сбивать пользователя с толку. Когда нам нужно, чтобы элементы меню изменялись в зависимости от текущего состояния приложения или действий пользователя, мы используем динамическое меню. Примером такого меню может служить меню "Запрос" стандартного меню, в котором при выборе элемента "Enter Query" остальные пункты подменю становятся недоступными. Такой способ проектирования меню имеет преимущество над статическим, так как исключается выполнение пользователем команд, недопустимых в режиме запроса. Элемент меню, как и любой другой элемент Oracle Forms, имеет свое имя, которое уникально в пределах модуля и используется для обращения к нему в программных единицах.

    У каждого меню и пункта меню есть имя, которое однозначно определяет его в модуле меню.

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

    Редактор меню

    Проектировать меню в Forms не составляет особой сложности, так как все действия выполняются с помощью единственного инструмента - Menu Editor ("Редактор меню"), который имеет небольшой набор команд, позволяющих быстро создать меню. Поэтому прежде чем приступить к созданию своего первого меню, ознакомимся с основными характеристиками редактора (рис. 8.4).

    (рис 8.4) Редактор меню

    Рассмотрим более подробно управляющие элементы редактора, отображенные на рисунке.

  • Создать ниже (Create Down) - это специальная команда, которая добавляет подменю ниже выбранного пункта меню или подменю. Эта команда аналогична команде главного меню Forms - Edit | Create Down или комбинации клавиш Ctrl+Down.
  • Создать справа (Create Right) - это специальная команда, которая добавляет подменю справа от выбранного пункта меню или подменю. Она аналогична команде главного меню Forms - Edit | Create Right или комбинации клавиш Ctrl+Right.
  • Удалить (Delete) - это специальная команда, которая удаляет выбранный пункт меню. Если вы удаляете пункт меню, который содержит другие подменю, то они будут автоматически удалены вместе с элементом меню, к которому они принадлежат. Эта команда аналогична команде главного меню Forms - Edit | Delete или клавише Delete.
  • Развернуть (Expand) - это специальная команда, которая предназначена для развертывания (отображения) всех элементов подменю, относящихся к текущему элементу меню или подменю. Эта команда аналогична команде главного меню Forms -View | Expand.
  • Свернуть (Collapse) - это специальная команда, которая предназначена для свертывания (скрытия) всех элементов подменю, относящихся к текущему элементу меню или подменю. Эта команда аналогична команде главного меню Forms - View | Collapse.
  • Развернуть все (Expand All) - это специальная команда, которая предназначена для развертывания (отображения) всех элементов меню. Она аналогична команде главного меню Forms - View | Expand All.
  • Свернуть все (Collapse All) - это специальная команда, которая предназначена для свертывания (скрытия) всех элементов меню. Она аналогична команде главного меню Forms - View | Collapse All.
  • Переключить ориентацию (Switch Orientation) - это специальная команда, которая предназначена для изменения ориентации меню. Она позволяет превратить горизонтальное меню в вертикальное и наоборот одним нажатием кнопки.
  • Текущее меню (Display Menu) - это элемент список, который отражает текущее меню, отображаемое в редакторе меню. При выборе элемента появляется список доступных меню модуля меню. Этот элемент предназначен для быстрого переключения между меню модуля.
  • Создание меню

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

  • Создайте модуль меню с помощью команды главного меню File | New | Menu или командой "Create" навигатора объектов, находясь на узле Menus (Меню). Сохраните модуль как FMENU.MMB. По умолчанию после сохранения модуля его название в Навигаторе Объектов изменится со стандартного названия MODULE1 на имя, присвоенное при сохранении. Вы можете изменить имя модуля двойным щелчком левой кнопки мыши по названию модуля и ввести новое.

    Изменение имени модуля в Навигаторе Объектов не влияет на имя файла модуля меню. Модулей меню, как и модулей форм, можно создавать неограниченное количество.

  • Для того чтобы создать меню, выберите узел Menus модуля FMENU и нажмите кнопку "Create" навигатора объектов. Вы также можете создать меню командой главного меню Edit | Create или нажатием комбинации клавиш Ctrl+Insert. Так же как и имя модуля меню, вы можете изменить имя меню, поэтому, повторяя ранее описанные действия, переименуйте меню с MENU1 на MyMenu. В пределах одного модуля можно создавать неограниченное количество меню.
  • Щелкните правой кнопкой мыши по названию меню и выберите пункт "Menu Editor" из всплывающего меню для запуска Menu Editor (рис 8.5(рис 8.5) Структура меню
  • Выберите элемент <New_Item> в окне рисования редактора меню и назовите его "Форма". Нажатием кнопки "Create Right" для создания новых элементов меню справа от текущего элемента выберите (рис. 8.6):
  • Блок;
  • Запись.
  • (рис 8.6) Создание главных элементов меню
  • Вернитесь к элементу "Форма" и нажатием кнопки "Create Down" создайте подменю, состоящее из элементов:
  • Открыть;
  • Сохранить;
  • Отменить;
  • Вызвать отчет;
  • Выход.
  • Перейдите к элементу "Блок" и, повторяя действия, описанные в предыдущем примере, создайте подменю из элементов:
  • Следующий блок;
  • Предыдущий блок;
  • Очистить блок.
  • После создания подменю "Блока" перейдите на следующий элемент - "Запись" и создайте для него подменю следующего содержания:
  • Первая;
  • Последняя;
  • Следующая;
  • Предыдущая;
  • Удалить.
  • Перейдите в пункт подменю "Выход" элемента "Форма" и нажмите кнопку "Create Right" для создания еще одного подменю. Назовите новый элемент "Сохранить изменения", нажмите "Create Down" для создания пункта подменю ниже текущего и назовите его "Без сохранения изменений". На рис. 8.7 показана итоговая структура меню, которая должна была у вас получиться после выполнения упражнения.
  • Вы можете изменить ориентацию меню, то есть превратить его в вертикальное, нажав кнопку "Switch Orientation" (рис. 8.8).
  • (рис 8.7) Структура меню FMENU.(рис 8.8) Вертикальное меню.

    Удаление меню

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

  • Выбрать нужный элемент и нажать кнопку Del.
  • Выполнить команду главного меню Edit | Delete.
  • Нажать кнопку Delete навигатора объектов.
  • При удалении меню важно помнить, что если меню, которое вы собираетесь удалить, содержит подменю, то при удалении главного меню вложенное удалится автоматически.

    Свойства меню

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

    Свойства модуля меню

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

  • Главное меню (Main Menu) - имя главного меню, которое будет отображено при запуске.
  • Директория меню (Menu Directory) - место размещения исполняемого файла меню .MMX. Если директория не указана, то Forms при попытке запуска меню будет обращаться к той директории, из которой была запущена форма.
  • Имя файла меню (Menu File Name) - имя исполняемого файла меню .MMX, которое Oracle Forms будет искать при запуске формы.
  • Код запуска (Startup Code) - блок PL/SQL, который будет выполнен после загрузки модуля меню в память при запуске формы.
  • Использовать защиту (Use Security) - если значение этого свойства - "Yes", то Oracle Forms будет использовать схему защиты, определенную для меню в свойстве "Роли меню".
  • Роли модуля (Module Roles) - роль в базе данных, доступная для элементов этого меню.
  • (рис 8.9) Свойства модуля меню.

    В отличие от модуля объект меню имеет единственный функциональный атрибут - Tear-Off Menu (рис. 8.10). Меню в отдельном окне (Tear-Off Menu) - если свойство этого атрибута установлено в "Yes", то меню будет отрывным.

    (рис 8.10) Свойства меню.

    Свойства элемента меню

    Элементы меню являются функциональными объектами меню и, соответственно, имеют намного больше атрибутов, чем предыдущие объекты. Значения атрибутов элемента меню можно менять (рис. 8.11) как на этапе проектирования, так и во время выполнения формы.

  • Включен (Enabled) - это свойство управляет состоянием элемента. Если значение атрибута установлено на "Yes", то элемент включен и доступен для манипулирования мышью.
  • Метка (Label) - текстовая метка, выводимая для элемента меню. Старайтесь именовать пункты меню как можно короче и содержательнее, так, чтобы даже самый неосведомленный пользователь, прочитав наименование пункта меню, смог понять, какая команда с ним связана.(рис 8.11) Свойства элемента меню.
  • Тип элемента меню (Menu Item Type) - это свойство определяет тип элемента меню.
  • Магический элемент (Magic Item) - это свойство позволяет предопределить пункт меню, ассоциируя его с одной из предоставленных команд:
  • Вырезать;
  • Копировать;
  • Вставить;
  • Очистить;
  • Отменить;
  • Справка;
  • О (About);
  • Окно.
  • Радиогруппа элементов меню (Menu Item Radio Group) - имя радиогруппы, с которой ассоциирован данный пункт меню.
  • Тип команды (Command Type) - тип команды меню. Для элемента меню вы можете выбрать один из трех типов команд:
  • NULL;
  • Меню;
  • PL/SQL.
  • Код пункта меню - это блок PL/SQL, исполняемый при выборе элемента меню.
  • Имя подменю (Subclass Menu) - имя подменю, ассоциированное с элементом. Это свойство доступно, если свойство "Тип команды" имеет значение "PL/SQL".
  • Горячие клавиши (Keyboard Accelerator) - это свойство определяет "горячую" функциональную клавишу, которая будет соответствовать пункту меню. Это свойство доступно только в том случае, если значение атрибута "Тип команды" имеет значение " NULL ".
  • Виден в меню (Visible in Menu) - это свойство управляет отображением пункта меню, делая его невидимым во время выполнения, если значение установлено на "No".
  • Виден в горизонтальном меню (Visible in Horizontal Menu Bar) - если значение этого свойства - "Yes", то пункт меню появится в горизонтальной инструментальной панели меню.
  • Виден в вертикальном меню (Visible in Vertical Menu Bar) - если значение этого свойства - "Yes", то пункт меню появится в вертикальной инструментальной панели меню.
  • Иконка в меню (Icon in Menu) - если значение этого свойства установлено на "Yes", то иконка будет выводиться в раскрывающемся меню.
  • Имя файла иконки (Icon FileName) - имя файла картинки для отображения иконки в меню.
  • Роли меню (Item Roles) - это свойство определяет, какие роли меню имеют доступ к данному элементу меню.
  • Показывать без привилегий (Display Without Privilege) - если значение этого свойства установлено на "Yes", то пользователь, не имеющий привилегии доступа, сможет увидеть элемент.
  • Видимый (Visible) - если значение этого свойства установлено на "Yes", то элемент меню становится невидимым.
  • Программирование элементов меню

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

    Параметр Описание
    NULL Этот параметр означает, что никакие операции не выполняются. Данный тип применяется как разделитель или указатель временного элемента меню.
    PL/SQL Этот параметр означает, что в качестве команды пункта меню будет выполнен блок PL/SQL, который может включать в себя процедуры и функции модуля формы. Помните, что, создавая PL/SQL-команду в контексте меню, вы должны будете обращаться к элементам модуля косвенно, то есть через команды COPY и Name_In.
    Menu Этот параметр означает, что при выборе элемента меню будет вызвано подменю. Назначайте этот тип команды всем элементам меню, имеющим подменю.

    Для того чтобы приступить к выполнению следующего примера, загрузите модуль FMENU, который был создан в разделе "Создание меню".

  • Откройте меню FMENU.MMB.
  • Выберите элемент меню "Открыть". Наша задача - сделать так, чтобы при выборе этого элемента меню на экране появлялось окно выбора файлов. Находясь на элементе, вызовите всплывающее меню щелчком правой кнопки мыши и выберите пункт PL/SQL Editor.

    В теле редактора наберите и скомпилируйте следующий код:

    Вызов диалога "Открыть"

    DECLARE
     FileNM varchar2(300);
    BEGIN
     Filenm:=GET_FILENAME('');
     …
    END;
  • Далее выберите элемент "Сохранить". Наша задача - сделать так, чтобы при выборе этого элемента меню выполнялась фиксация всех изменений, сделанных в форме. Создайте PL/SQL-команду для этого элемента:

    Команда "Сохранить"

    BEGIN
     DO_KEY('COMMIT_FORM');
    END;
  • Выберите элемент "Отменить". Наша задача - сделать так, чтобы при выборе этого элемента меню выполнялся откат всех незафиксированных изменений в форме. Создайте PL/SQL-команду для элемента и наберите следующий код:

    Команда "Отмена"

    BEGIN
     DO_KEY('ROLLBACK');
    END;
  • Выберите элемент "Печать". Наша задача - сделать так, чтобы при выборе этого элемента вызывался отчет my_rep.rdf. Создайте PL/ SQL-команду для элемента и наберите следующий код:

    Команда "Печать"

    DECLARE
     rep_url varchar2(300);
    BEGIN
     rep_url:='Ошибка! Недопустимый объект гиперссылки.
      ||'Repsrvreport=my_rep.rdfdesformat=htmlcssdestype=cache '
      ||'userid=user/pw@databaseP_NAME ='
      ||:parameter.param_name
      ||'paramform=no';
     WEB.SHOW_DOCUMENT(rep_url,'_blank');
    END;
  • Выберите элемент "Выход | Сохранить изменения". Наша задача - сделать так, чтобы при выборе этого элемента форма закрылась с сохранением изменений, но без проверки формы. Создайте PL/SQL-команду для элемента и наберите следующий код:

    Команда "Выход|Сохранить изменения"

    BEGIN
     EXIT_FORM(do_commit, no_validate);
    END;
  • Выберите элемент "Выход | Без Сохранения изменений". Наша задача - сделать так, чтобы при выборе этого элемента форма закрылась. Создайте PL/SQL-команду для элемента и наберите следующий код:

    Команда "Выход|Без Сохранения изменений"

    BEGIN
     EXIT_FORM(no_commit, no_validate);
    END;
  • Перейдем к следующему меню - "Блок". Выберите элемент меню "Блок | Следующий". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на предыдущий блок.

    Команда "Блок | Предыдущий"

    BEGIN
     DO_KEY('NEXT_BLOCK');
    END;
  • Выберите элемент меню "Блок | Предыдущий". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на предыдущий блок.

    Команда "Блок | Предыдущий"

    BEGIN
     DO_KEY('PREVIOUS_BLOCK');
    END;
  • Выберите элемент меню "Блок|Отчистить". Наша задача - сделать так, чтобы при выборе этого элемента выполнялась очистка блока.

    Команда "Блок | Отчистить"

    BEGIN
     DO_KEY('CLEAR_BLOCK');
    END;
  • Перейдем к следующему, заключительному, меню - "Запись". Выберите элемент меню "Запись | Первая". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на первую запись в блоке.

    Команда "Запись | Первая"

    BEGIN
     FIRST_RECORD;
    END;
  • Выберите элемент меню "Запись | Последняя". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на последнюю запись в блоке.

    Команда "Запись | Последняя"

    BEGIN
     LAST_RECORD;
    END;
  • Выберите элемент меню "Запись | Следующая". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на следующую запись в блоке.

    Команда "Запись | Следующая"

    BEGIN
     DO_KEY('NEXT_RECORD');
    END;
  • Выберите элемент меню "Запись | Предыдущая". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на предыдущую запись в блоке.

    Команда "Запись | Предыдущая"

    BEGIN
     DO_KEY('PREVIOUS_RECORD'); 
    END;
  • Выберите элемент меню "Запись | Создать". Наша задача - сделать так, чтобы при выборе этого элемента выполнялась вставка новой записи в блок.

    Команда "Запись | Создать"

    BEGIN
     DO_KEY('CREATE_RECORD');
    END;
  • Выберите элемент меню "Запись | Дублировать". Наша задача - сделать так, чтобы при выборе этого элемента выполнялось дублирование записи.

    Команда "Запись | Дублировать"

    BEGIN
     DUPLICATE_RECORD;
    END;
  • Выберите элемент меню "Запись | Удалить". Наша задача - сделать так, чтобы при выборе этого элемента запись была удалена.

    Команда "Запись | Удалить"

    BEGIN
     DUPLICATE_RECORD;
    END;
  • Если вы запрограммировали все элементы меню, можно приступать к подключению меню, предварительно выполнив компиляцию PL/ SQL-кода - Program | Compile PL/SQL, а затем и компиляцию самого модуля. Cкомпилировать модуль меню можно командой Program | Compile Module.

    Использование PL/SQL в меню

    Как и в случае с формой, вы можете управлять поведением меню и объектами, которые его составляют, во время выполнения, используя PL/SQL и встроенные подпрограммы Forms Builder. Основным отличием PL/SQL-программы, написанной в меню, от программы, написанной в модуле формы, является возможность исключительно косвенного обращения к элементам меню.

    Когда вы проектируете и программируете меню, вы должны не забывать о том, что меню - это прежде всего средство быстрого доступа к наиболее часто выполняемым операциям, а не средство для реализации сложной логики приложения: проверки введенных значений, создания блокировок и так далее. Например, если вы создаете элемент меню, выполняющий команду COMMIT, то различные проверки перед сохранением изменений лучше выполнить в соответствующих триггерах модуля формы. Так, выполнение команды DO_KEY('COMMIT') меню аналогично срабатыванию триггера " KEY-COMMIT " формы, поэтому необходимые проверки вычисления можно выполнить в нем. Ниже перечислены основные операции, которые лучше всего отображать в меню:

  • взаимодействие с БД Oracle (операции DML и DDL);
  • выполнение предыдущих действий;
  • выполнение сортировки в блоке, то есть сортировка в блоке по убыванию или возрастанию;
  • исполнение команд операционной системы;
  • вызов другого продукта Developer (Oracle Reports, Oracle Graphics);
  • вызов встроенной подпрограммы DO_KEY для исполнения триггера клавиши;
  • вызов пользовательских триггеров встроенной подпрограммой EXECUTE_TRIGGER.
  • В этом случае использование пользовательских триггеров оправдано, так как в них вы можете выполнять анонимные PL/SQL-блоки с прямым обращением к элементам. Рассмотрим пример программирования элементов меню:

  • Взаимодействие с БД Oracle. Например, создайте пункт меню "Новая запись" и напишите для него следующий код:

    Команда "Новая запись"

    if :system.block_status!='NEW' then
     create_record; 
    ELSE 
     ...
    END IF;
  • Вызовите пользовательский триггер:

    Команда "Описание действия вашего триггера"

    EXECUTE_TRIGGER('my_trg');
  • Вызовите другие продукты Oracle Developer:

    Команда "Печать"

    DECLARE
    rep_url varchar2(300);
    BEGIN
     rep_url:='Ошибка! Недопустимый объект гиперссылки.
      ||'Repsrvreport=my_rep.rdfdesformat=htmlcssdestype=cache '
      ||'userid=user/pw@databaseP_NAME ='
      ||:parameter.param_name
      ||'paramform=no';
     WEB.SHOW_DOCUMENT(rep_url,'_blank');
    END;
  • Выполните команду операционной системы, например, запустите калькулятор:

    Команда "Калькулятор"

    HOST('calc.exe');
  • Выполнение сортировки в блоке. Например, выполните сортировку по возрастанию:

    Команда "Сортировка по возрастанию"

    set_block_property ('block_name', 
                   ORDER_BY, 
                   :system.current_item ||' asc');
  • "Магические" элементы

    Ранее в этой же главе мы уже затрагивали тему о магических элементах, теперь остановимся на ней подробнее. "Магические", или Мастер-элементы - это элементы, имеющие функциональность по умолчанию и не требующие дополнительной программной обработки. Мастер-элементы полностью соответствуют командам, выполняемым из стандартного меню, и не требуют дополнительного подключения клавиш акселератов и команд PL/SQL, так как Forms Builder выполняет все это автоматически. Ниже приведена табл. 8.2 всех типов Мастер-элементов.

    Типы Мастер-элементов
    Мастер-элемент Тип команды Функциональность
    Для того чтобы элемент выполнял нужную функцию, к нему
    ABOUT, UNDO Все кроме MENU обязательно и необходимо присоединить какую-либо команду, следовательно, функциональность по умолчанию отсутствует.
    Clear, Copy, Cut, Paste Null Все перечисленные команды выполняют функции, определен- ные их именами, и при этом не требуется присваивать команду элементу меню.
    Для этого Мастер-элемента функциональность по умолча-
    Help Menu нию недоступна, поэтому вам необходимо назначить команду этого типа подменю.
    Exit (Quit) Null Все перечисленные команды выполняют функции, определен- ные их именами, и при этом не требуется присваивать команду.
    Window Null или Menu Элемент Window вызывает подменю по умолчанию со списком всех открытых окон. Операторы могут активизировать окно, выбрав его из подменю. Этот элемент может работать с двумя типами команд: Null, Menu.

    Подключение меню к форме

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

  • Создайте новую форму.
  • Разместите хотя бы один элемент на форме, чтобы ее можно было запустить. Вы также можете открыть любую существующую форму для выполнения примера.
  • Вызовите палитру свойств модуля формы и установите значение свойств, как показано ниже:
  • Menu Module - FMENU ;
  • Initial Menu - MYMENY.
  • Примечание: даже если файл меню расположен в той же директории, что и вызывающая форма, указывайте не только имя меню, но и путь, например, C:\FMENU.
  • Откройте меню FMENU и выполните генерацию модуля для создания исполняемого файла FMENU.MMX. Если меню не будет сгенерировано, то при запуске формы вы получите ошибку чтения меню.
  • Откройте палитру свойств модуля меню FMENU и установите значение свойств, как показано ниже:
  • Main Menu - MYMENU ;
  • Menu Directory - c:\forms\example\menu.
  • Запустите форму на выполнение и попробуйте поработать с меню.

    Если при изменении свойств вы допустили ошибку или какой-либо элемент меню не будет содержать PL/SQL-команду, то при попытке запуска меню вы получите сообщение об ошибке (рис. 8.12) - "Невозможно читать файл FMENU".

    (рис 8.12) Сообщение об ошибке при попытке запуска меню

    Если вы работаете с многомодульным приложением, то можете назначить вызываемой форме текущее меню, используя параметр DO_REPLACE процедуры CALL_FORM при вызове формы процедурой CALL_FORM. По умолчанию при вызове формы процедурой CALL_ FORM применяется параметр NO_REPLACE, который означает, что вызываемая форма не будет наследовать меню родителя.

    Типы меню

    В предыдущих разделах мы с вами научились создавать стандартное меню, элементы которого имели вид текстовых ярлыков. В Oracle Forms вы можете изменять вид отображаемого элемента и его функциональность, изменяя его тип. Свойство "Тип элемента меню" используется для изменения типа отображаемого пункта меню. Создавая элемент меню, вы можете выбрать один из четырех типов (табл. 8.3).

    Типы элементов меню
    Значение Описание
    Простой (Plain) Стандартный тип меню - просто ярлык с текстовой меткой.
    Выбор (Check) Рядом с текстовой меткой отображается элемент CheckBox в виде галочки. Такой тип меню может находиться в одном из двух состояний: True или False.
    Радио (Radio) Элемент меню превращается в одну из радиокнопок радиогруппы, также принимая значения True или False.
    Разделитель (Separator) Элемент меню превращается в линию-разделитель, которая визуально разделяет группу элементов меню на группы.
    Магический (Magic) Элемент меню, для которого предусмотрены встроенные функциональные средства реализации. Такой элемент может превращаться в одну из часто используемых команд: Вырезать, Копировать, Вставить и т. д. Вид команды для магического элемента можно выбрать в свойстве "Магический элемент". Магические элементы позволяют избежать лишнего кодирования часто используемых команд. Внешний вид такого элемента зависит от платформы, на которой производится запуск меню.

    Для того чтобы установить новый тип элемента, достаточно изменить значение свойства "Тип элемента меню" (рис. 8.12).

    (рис 8.12) Типы элементов меню

    Радиокнопки и выключатели работают по такому же принципу, как и одноименные элементы модуля формы.

    Примечание: используйте элементы Check и Radio как переключатели каких-либо состояний, а не инициаторы каких-либо действий.

    Обращение к элементам меню

    Для обращения к элементам меню используйте синтаксис:

    имя_меню.имя_элемента

    Для получения значения состояния радиокнопки или выключателя (выбор) меню используйте функцию GET_MENU_ITEM_PROPERTY, а для установки значения - функцию SET_MENU_ITEM_PROPERTY.

    Создание срываемых меню

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

  • Находясь в Menu Editor или в навигаторе объектов, выберите меню, например, MYMENU.
  • Вызовите палитру свойств для этого меню и установите свойство Tear-off равным True.
  • Страницы:

    Меню - это набор элементов, позволяющих пользователю осуществлять быстрый доступ к наиболее часто используемым командам: Execute_Query, Exit_Form, Next_Record, Enter_Query или Previous_Item. Если рассматривать стандартное меню - меню (рис. 8.1) по умолчанию, то большинство его команд ассоциировано с функциональными клавишами и встроенными процедурами. Меню Oracle Forms представлено отдельным модулем, который может быть использован совместно и одновременно любым количеством форм. В Forms вы можете не только применять меню по умолчанию, но и создавать свое собственное.

    (рис 8.1) Меню Oracle Forms.

    Использование меню по умолчанию

    Как уже было сказано ранее, Oracle Forms имеет свое стандартное меню команд, которое еще называется "меню по умолчанию". Вы можете управлять отображением стандартного меню с помощью параметра DEFAULTSMARTBAR свойства "Menu Module" формы (рис. 8.2). Если вы сотрете это слово, то при последующем запуске формы меню и панель инструментов исчезнет. Для того чтобы отобразить только меню, без панели инструментов, сотрите сочетание " SMARTBAR ", оставив слово DEFAULT.

    (рис 8.2) Свойство "Модуль меню" формы

    Создание специальных меню

    Несмотря на то что меню по умолчанию содержит солидный набор необходимых команд, все же в большинстве случаев оказывается, что было бы неплохо добавить ту или иную команду, например, запуск отчета, другой формы или выполнение команды операционной системы. Вы не можете изменить стандартное меню (рис. 8.3), поэтому для того чтобы добавить в меню новые команды, вам придется создать собственное меню. Чтобы не делать лишнюю работу и повторно не воспроизводить команды стандартного меню, вы можете править существующий шаблон - OFGMNUT.MMB, который находится в папке DevSuiteHome_1\cgenf61\ ADMIN\. Для подключения шаблона выполните следующие действия:

  • Найдите файл DevSuiteHome_1\cgenf61\ADMIN\OFGMNUT.MMB.
  • Откройте шаблон в форме.
  • Примечание: когда вы подключите к форме собственное меню, панель инструментов исчезнет и вам придется создавать собственную панель. (рис 8.3) Шаблон меню OFGMNUT.MMB

    Создание меню, пунктов меню и подменю

    Для того чтобы научится создавать меню, необходимо знать его структуру, а именно основные объекты, которые его составляют:

  • меню (menu) - это главное меню и подменю. Главное меню - это меню типа "Файл", "Правка", а подменю - это иерархическое меню, ассоциированное с определенным пунктом меню и возникающее при его выборе;
  • пункт, или элемент меню (menu item) - это элементы главного меню или подменю. Вы можете создавать программные единицы для элементов меню.
  • В зависимости от состояния меню могут быть динамическими и статическими. Правильнее, конечно же, пользоваться статическим меню, так как меню должно быть неизменным и не должно сбивать пользователя с толку. Когда нам нужно, чтобы элементы меню изменялись в зависимости от текущего состояния приложения или действий пользователя, мы используем динамическое меню. Примером такого меню может служить меню "Запрос" стандартного меню, в котором при выборе элемента "Enter Query" остальные пункты подменю становятся недоступными. Такой способ проектирования меню имеет преимущество над статическим, так как исключается выполнение пользователем команд, недопустимых в режиме запроса. Элемент меню, как и любой другой элемент Oracle Forms, имеет свое имя, которое уникально в пределах модуля и используется для обращения к нему в программных единицах.

    У каждого меню и пункта меню есть имя, которое однозначно определяет его в модуле меню.

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

    Редактор меню

    Проектировать меню в Forms не составляет особой сложности, так как все действия выполняются с помощью единственного инструмента - Menu Editor ("Редактор меню"), который имеет небольшой набор команд, позволяющих быстро создать меню. Поэтому прежде чем приступить к созданию своего первого меню, ознакомимся с основными характеристиками редактора (рис. 8.4).

    (рис 8.4) Редактор меню

    Рассмотрим более подробно управляющие элементы редактора, отображенные на рисунке.

  • Создать ниже (Create Down) - это специальная команда, которая добавляет подменю ниже выбранного пункта меню или подменю. Эта команда аналогична команде главного меню Forms - Edit | Create Down или комбинации клавиш Ctrl+Down.
  • Создать справа (Create Right) - это специальная команда, которая добавляет подменю справа от выбранного пункта меню или подменю. Она аналогична команде главного меню Forms - Edit | Create Right или комбинации клавиш Ctrl+Right.
  • Удалить (Delete) - это специальная команда, которая удаляет выбранный пункт меню. Если вы удаляете пункт меню, который содержит другие подменю, то они будут автоматически удалены вместе с элементом меню, к которому они принадлежат. Эта команда аналогична команде главного меню Forms - Edit | Delete или клавише Delete.
  • Развернуть (Expand) - это специальная команда, которая предназначена для развертывания (отображения) всех элементов подменю, относящихся к текущему элементу меню или подменю. Эта команда аналогична команде главного меню Forms -View | Expand.
  • Свернуть (Collapse) - это специальная команда, которая предназначена для свертывания (скрытия) всех элементов подменю, относящихся к текущему элементу меню или подменю. Эта команда аналогична команде главного меню Forms - View | Collapse.
  • Развернуть все (Expand All) - это специальная команда, которая предназначена для развертывания (отображения) всех элементов меню. Она аналогична команде главного меню Forms - View | Expand All.
  • Свернуть все (Collapse All) - это специальная команда, которая предназначена для свертывания (скрытия) всех элементов меню. Она аналогична команде главного меню Forms - View | Collapse All.
  • Переключить ориентацию (Switch Orientation) - это специальная команда, которая предназначена для изменения ориентации меню. Она позволяет превратить горизонтальное меню в вертикальное и наоборот одним нажатием кнопки.
  • Текущее меню (Display Menu) - это элемент список, который отражает текущее меню, отображаемое в редакторе меню. При выборе элемента появляется список доступных меню модуля меню. Этот элемент предназначен для быстрого переключения между меню модуля.
  • Создание меню

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

  • Создайте модуль меню с помощью команды главного меню File | New | Menu или командой "Create" навигатора объектов, находясь на узле Menus (Меню). Сохраните модуль как FMENU.MMB. По умолчанию после сохранения модуля его название в Навигаторе Объектов изменится со стандартного названия MODULE1 на имя, присвоенное при сохранении. Вы можете изменить имя модуля двойным щелчком левой кнопки мыши по названию модуля и ввести новое.

    Изменение имени модуля в Навигаторе Объектов не влияет на имя файла модуля меню. Модулей меню, как и модулей форм, можно создавать неограниченное количество.

  • Для того чтобы создать меню, выберите узел Menus модуля FMENU и нажмите кнопку "Create" навигатора объектов. Вы также можете создать меню командой главного меню Edit | Create или нажатием комбинации клавиш Ctrl+Insert. Так же как и имя модуля меню, вы можете изменить имя меню, поэтому, повторяя ранее описанные действия, переименуйте меню с MENU1 на MyMenu. В пределах одного модуля можно создавать неограниченное количество меню.
  • Щелкните правой кнопкой мыши по названию меню и выберите пункт "Menu Editor" из всплывающего меню для запуска Menu Editor (рис 8.5(рис 8.5) Структура меню
  • Выберите элемент <New_Item> в окне рисования редактора меню и назовите его "Форма". Нажатием кнопки "Create Right" для создания новых элементов меню справа от текущего элемента выберите (рис. 8.6):
  • Блок;
  • Запись.
  • (рис 8.6) Создание главных элементов меню
  • Вернитесь к элементу "Форма" и нажатием кнопки "Create Down" создайте подменю, состоящее из элементов:
  • Открыть;
  • Сохранить;
  • Отменить;
  • Вызвать отчет;
  • Выход.
  • Перейдите к элементу "Блок" и, повторяя действия, описанные в предыдущем примере, создайте подменю из элементов:
  • Следующий блок;
  • Предыдущий блок;
  • Очистить блок.
  • После создания подменю "Блока" перейдите на следующий элемент - "Запись" и создайте для него подменю следующего содержания:
  • Первая;
  • Последняя;
  • Следующая;
  • Предыдущая;
  • Удалить.
  • Перейдите в пункт подменю "Выход" элемента "Форма" и нажмите кнопку "Create Right" для создания еще одного подменю. Назовите новый элемент "Сохранить изменения", нажмите "Create Down" для создания пункта подменю ниже текущего и назовите его "Без сохранения изменений". На рис. 8.7 показана итоговая структура меню, которая должна была у вас получиться после выполнения упражнения.
  • Вы можете изменить ориентацию меню, то есть превратить его в вертикальное, нажав кнопку "Switch Orientation" (рис. 8.8).
  • (рис 8.7) Структура меню FMENU.(рис 8.8) Вертикальное меню.

    Удаление меню

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

  • Выбрать нужный элемент и нажать кнопку Del.
  • Выполнить команду главного меню Edit | Delete.
  • Нажать кнопку Delete навигатора объектов.
  • При удалении меню важно помнить, что если меню, которое вы собираетесь удалить, содержит подменю, то при удалении главного меню вложенное удалится автоматически.

    Свойства меню

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

    Свойства модуля меню

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

  • Главное меню (Main Menu) - имя главного меню, которое будет отображено при запуске.
  • Директория меню (Menu Directory) - место размещения исполняемого файла меню .MMX. Если директория не указана, то Forms при попытке запуска меню будет обращаться к той директории, из которой была запущена форма.
  • Имя файла меню (Menu File Name) - имя исполняемого файла меню .MMX, которое Oracle Forms будет искать при запуске формы.
  • Код запуска (Startup Code) - блок PL/SQL, который будет выполнен после загрузки модуля меню в память при запуске формы.
  • Использовать защиту (Use Security) - если значение этого свойства - "Yes", то Oracle Forms будет использовать схему защиты, определенную для меню в свойстве "Роли меню".
  • Роли модуля (Module Roles) - роль в базе данных, доступная для элементов этого меню.
  • (рис 8.9) Свойства модуля меню.

    В отличие от модуля объект меню имеет единственный функциональный атрибут - Tear-Off Menu (рис. 8.10). Меню в отдельном окне (Tear-Off Menu) - если свойство этого атрибута установлено в "Yes", то меню будет отрывным.

    (рис 8.10) Свойства меню.

    Свойства элемента меню

    Элементы меню являются функциональными объектами меню и, соответственно, имеют намного больше атрибутов, чем предыдущие объекты. Значения атрибутов элемента меню можно менять (рис. 8.11) как на этапе проектирования, так и во время выполнения формы.

  • Включен (Enabled) - это свойство управляет состоянием элемента. Если значение атрибута установлено на "Yes", то элемент включен и доступен для манипулирования мышью.
  • Метка (Label) - текстовая метка, выводимая для элемента меню. Старайтесь именовать пункты меню как можно короче и содержательнее, так, чтобы даже самый неосведомленный пользователь, прочитав наименование пункта меню, смог понять, какая команда с ним связана.(рис 8.11) Свойства элемента меню.
  • Тип элемента меню (Menu Item Type) - это свойство определяет тип элемента меню.
  • Магический элемент (Magic Item) - это свойство позволяет предопределить пункт меню, ассоциируя его с одной из предоставленных команд:
  • Вырезать;
  • Копировать;
  • Вставить;
  • Очистить;
  • Отменить;
  • Справка;
  • О (About);
  • Окно.
  • Радиогруппа элементов меню (Menu Item Radio Group) - имя радиогруппы, с которой ассоциирован данный пункт меню.
  • Тип команды (Command Type) - тип команды меню. Для элемента меню вы можете выбрать один из трех типов команд:
  • NULL;
  • Меню;
  • PL/SQL.
  • Код пункта меню - это блок PL/SQL, исполняемый при выборе элемента меню.
  • Имя подменю (Subclass Menu) - имя подменю, ассоциированное с элементом. Это свойство доступно, если свойство "Тип команды" имеет значение "PL/SQL".
  • Горячие клавиши (Keyboard Accelerator) - это свойство определяет "горячую" функциональную клавишу, которая будет соответствовать пункту меню. Это свойство доступно только в том случае, если значение атрибута "Тип команды" имеет значение " NULL ".
  • Виден в меню (Visible in Menu) - это свойство управляет отображением пункта меню, делая его невидимым во время выполнения, если значение установлено на "No".
  • Виден в горизонтальном меню (Visible in Horizontal Menu Bar) - если значение этого свойства - "Yes", то пункт меню появится в горизонтальной инструментальной панели меню.
  • Виден в вертикальном меню (Visible in Vertical Menu Bar) - если значение этого свойства - "Yes", то пункт меню появится в вертикальной инструментальной панели меню.
  • Иконка в меню (Icon in Menu) - если значение этого свойства установлено на "Yes", то иконка будет выводиться в раскрывающемся меню.
  • Имя файла иконки (Icon FileName) - имя файла картинки для отображения иконки в меню.
  • Роли меню (Item Roles) - это свойство определяет, какие роли меню имеют доступ к данному элементу меню.
  • Показывать без привилегий (Display Without Privilege) - если значение этого свойства установлено на "Yes", то пользователь, не имеющий привилегии доступа, сможет увидеть элемент.
  • Видимый (Visible) - если значение этого свойства установлено на "Yes", то элемент меню становится невидимым.
  • Программирование элементов меню

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

    Параметр Описание
    NULL Этот параметр означает, что никакие операции не выполняются. Данный тип применяется как разделитель или указатель временного элемента меню.
    PL/SQL Этот параметр означает, что в качестве команды пункта меню будет выполнен блок PL/SQL, который может включать в себя процедуры и функции модуля формы. Помните, что, создавая PL/SQL-команду в контексте меню, вы должны будете обращаться к элементам модуля косвенно, то есть через команды COPY и Name_In.
    Menu Этот параметр означает, что при выборе элемента меню будет вызвано подменю. Назначайте этот тип команды всем элементам меню, имеющим подменю.

    Для того чтобы приступить к выполнению следующего примера, загрузите модуль FMENU, который был создан в разделе "Создание меню".

  • Откройте меню FMENU.MMB.
  • Выберите элемент меню "Открыть". Наша задача - сделать так, чтобы при выборе этого элемента меню на экране появлялось окно выбора файлов. Находясь на элементе, вызовите всплывающее меню щелчком правой кнопки мыши и выберите пункт PL/SQL Editor.

    В теле редактора наберите и скомпилируйте следующий код:

    Вызов диалога "Открыть"

    DECLARE
     FileNM varchar2(300);
    BEGIN
     Filenm:=GET_FILENAME('');
     …
    END;
  • Далее выберите элемент "Сохранить". Наша задача - сделать так, чтобы при выборе этого элемента меню выполнялась фиксация всех изменений, сделанных в форме. Создайте PL/SQL-команду для этого элемента:

    Команда "Сохранить"

    BEGIN
     DO_KEY('COMMIT_FORM');
    END;
  • Выберите элемент "Отменить". Наша задача - сделать так, чтобы при выборе этого элемента меню выполнялся откат всех незафиксированных изменений в форме. Создайте PL/SQL-команду для элемента и наберите следующий код:

    Команда "Отмена"

    BEGIN
     DO_KEY('ROLLBACK');
    END;
  • Выберите элемент "Печать". Наша задача - сделать так, чтобы при выборе этого элемента вызывался отчет my_rep.rdf. Создайте PL/ SQL-команду для элемента и наберите следующий код:

    Команда "Печать"

    DECLARE
     rep_url varchar2(300);
    BEGIN
     rep_url:='Ошибка! Недопустимый объект гиперссылки.
      ||'Repsrvreport=my_rep.rdfdesformat=htmlcssdestype=cache '
      ||'userid=user/pw@databaseP_NAME ='
      ||:parameter.param_name
      ||'paramform=no';
     WEB.SHOW_DOCUMENT(rep_url,'_blank');
    END;
  • Выберите элемент "Выход | Сохранить изменения". Наша задача - сделать так, чтобы при выборе этого элемента форма закрылась с сохранением изменений, но без проверки формы. Создайте PL/SQL-команду для элемента и наберите следующий код:

    Команда "Выход|Сохранить изменения"

    BEGIN
     EXIT_FORM(do_commit, no_validate);
    END;
  • Выберите элемент "Выход | Без Сохранения изменений". Наша задача - сделать так, чтобы при выборе этого элемента форма закрылась. Создайте PL/SQL-команду для элемента и наберите следующий код:

    Команда "Выход|Без Сохранения изменений"

    BEGIN
     EXIT_FORM(no_commit, no_validate);
    END;
  • Перейдем к следующему меню - "Блок". Выберите элемент меню "Блок | Следующий". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на предыдущий блок.

    Команда "Блок | Предыдущий"

    BEGIN
     DO_KEY('NEXT_BLOCK');
    END;
  • Выберите элемент меню "Блок | Предыдущий". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на предыдущий блок.

    Команда "Блок | Предыдущий"

    BEGIN
     DO_KEY('PREVIOUS_BLOCK');
    END;
  • Выберите элемент меню "Блок|Отчистить". Наша задача - сделать так, чтобы при выборе этого элемента выполнялась очистка блока.

    Команда "Блок | Отчистить"

    BEGIN
     DO_KEY('CLEAR_BLOCK');
    END;
  • Перейдем к следующему, заключительному, меню - "Запись". Выберите элемент меню "Запись | Первая". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на первую запись в блоке.

    Команда "Запись | Первая"

    BEGIN
     FIRST_RECORD;
    END;
  • Выберите элемент меню "Запись | Последняя". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на последнюю запись в блоке.

    Команда "Запись | Последняя"

    BEGIN
     LAST_RECORD;
    END;
  • Выберите элемент меню "Запись | Следующая". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на следующую запись в блоке.

    Команда "Запись | Следующая"

    BEGIN
     DO_KEY('NEXT_RECORD');
    END;
  • Выберите элемент меню "Запись | Предыдущая". Наша задача - сделать так, чтобы при выборе этого элемента выполнялся переход на предыдущую запись в блоке.

    Команда "Запись | Предыдущая"

    BEGIN
     DO_KEY('PREVIOUS_RECORD'); 
    END;
  • Выберите элемент меню "Запись | Создать". Наша задача - сделать так, чтобы при выборе этого элемента выполнялась вставка новой записи в блок.

    Команда "Запись | Создать"

    BEGIN
     DO_KEY('CREATE_RECORD');
    END;
  • Выберите элемент меню "Запись | Дублировать". Наша задача - сделать так, чтобы при выборе этого элемента выполнялось дублирование записи.

    Команда "Запись | Дублировать"

    BEGIN
     DUPLICATE_RECORD;
    END;
  • Выберите элемент меню "Запись | Удалить". Наша задача - сделать так, чтобы при выборе этого элемента запись была удалена.

    Команда "Запись | Удалить"

    BEGIN
     DUPLICATE_RECORD;
    END;
  • Если вы запрограммировали все элементы меню, можно приступать к подключению меню, предварительно выполнив компиляцию PL/ SQL-кода - Program | Compile PL/SQL, а затем и компиляцию самого модуля. Cкомпилировать модуль меню можно командой Program | Compile Module.

    Использование PL/SQL в меню

    Как и в случае с формой, вы можете управлять поведением меню и объектами, которые его составляют, во время выполнения, используя PL/SQL и встроенные подпрограммы Forms Builder. Основным отличием PL/SQL-программы, написанной в меню, от программы, написанной в модуле формы, является возможность исключительно косвенного обращения к элементам меню.

    Когда вы проектируете и программируете меню, вы должны не забывать о том, что меню - это прежде всего средство быстрого доступа к наиболее часто выполняемым операциям, а не средство для реализации сложной логики приложения: проверки введенных значений, создания блокировок и так далее. Например, если вы создаете элемент меню, выполняющий команду COMMIT, то различные проверки перед сохранением изменений лучше выполнить в соответствующих триггерах модуля формы. Так, выполнение команды DO_KEY('COMMIT') меню аналогично срабатыванию триггера " KEY-COMMIT " формы, поэтому необходимые проверки вычисления можно выполнить в нем. Ниже перечислены основные операции, которые лучше всего отображать в меню:

  • взаимодействие с БД Oracle (операции DML и DDL);
  • выполнение предыдущих действий;
  • выполнение сортировки в блоке, то есть сортировка в блоке по убыванию или возрастанию;
  • исполнение команд операционной системы;
  • вызов другого продукта Developer (Oracle Reports, Oracle Graphics);
  • вызов встроенной подпрограммы DO_KEY для исполнения триггера клавиши;
  • вызов пользовательских триггеров встроенной подпрограммой EXECUTE_TRIGGER.
  • В этом случае использование пользовательских триггеров оправдано, так как в них вы можете выполнять анонимные PL/SQL-блоки с прямым обращением к элементам. Рассмотрим пример программирования элементов меню:

  • Взаимодействие с БД Oracle. Например, создайте пункт меню "Новая запись" и напишите для него следующий код:

    Команда "Новая запись"

    if :system.block_status!='NEW' then
     create_record; 
    ELSE 
     ...
    END IF;
  • Вызовите пользовательский триггер:

    Команда "Описание действия вашего триггера"

    EXECUTE_TRIGGER('my_trg');
  • Вызовите другие продукты Oracle Developer:

    Команда "Печать"

    DECLARE
    rep_url varchar2(300);
    BEGIN
     rep_url:='Ошибка! Недопустимый объект гиперссылки.
      ||'Repsrvreport=my_rep.rdfdesformat=htmlcssdestype=cache '
      ||'userid=user/pw@databaseP_NAME ='
      ||:parameter.param_name
      ||'paramform=no';
     WEB.SHOW_DOCUMENT(rep_url,'_blank');
    END;
  • Выполните команду операционной системы, например, запустите калькулятор:

    Команда "Калькулятор"

    HOST('calc.exe');
  • Выполнение сортировки в блоке. Например, выполните сортировку по возрастанию:

    Команда "Сортировка по возрастанию"

    set_block_property ('block_name', 
                   ORDER_BY, 
                   :system.current_item ||' asc');
  • "Магические" элементы

    Ранее в этой же главе мы уже затрагивали тему о магических элементах, теперь остановимся на ней подробнее. "Магические", или Мастер-элементы - это элементы, имеющие функциональность по умолчанию и не требующие дополнительной программной обработки. Мастер-элементы полностью соответствуют командам, выполняемым из стандартного меню, и не требуют дополнительного подключения клавиш акселератов и команд PL/SQL, так как Forms Builder выполняет все это автоматически. Ниже приведена табл. 8.2 всех типов Мастер-элементов.

    Типы Мастер-элементов
    Мастер-элемент Тип команды Функциональность
    Для того чтобы элемент выполнял нужную функцию, к нему
    ABOUT, UNDO Все кроме MENU обязательно и необходимо присоединить какую-либо команду, следовательно, функциональность по умолчанию отсутствует.
    Clear, Copy, Cut, Paste Null Все перечисленные команды выполняют функции, определен- ные их именами, и при этом не требуется присваивать команду элементу меню.
    Для этого Мастер-элемента функциональность по умолча-
    Help Menu нию недоступна, поэтому вам необходимо назначить команду этого типа подменю.
    Exit (Quit) Null Все перечисленные команды выполняют функции, определен- ные их именами, и при этом не требуется присваивать команду.
    Window Null или Menu Элемент Window вызывает подменю по умолчанию со списком всех открытых окон. Операторы могут активизировать окно, выбрав его из подменю. Этот элемент может работать с двумя типами команд: Null, Menu.

    Подключение меню к форме

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

  • Создайте новую форму.
  • Разместите хотя бы один элемент на форме, чтобы ее можно было запустить. Вы также можете открыть любую существующую форму для выполнения примера.
  • Вызовите палитру свойств модуля формы и установите значение свойств, как показано ниже:
  • Menu Module - FMENU ;
  • Initial Menu - MYMENY.
  • Примечание: даже если файл меню расположен в той же директории, что и вызывающая форма, указывайте не только имя меню, но и путь, например, C:\FMENU.
  • Откройте меню FMENU и выполните генерацию модуля для создания исполняемого файла FMENU.MMX. Если меню не будет сгенерировано, то при запуске формы вы получите ошибку чтения меню.
  • Откройте палитру свойств модуля меню FMENU и установите значение свойств, как показано ниже:
  • Main Menu - MYMENU ;
  • Menu Directory - c:\forms\example\menu.
  • Запустите форму на выполнение и попробуйте поработать с меню.

    Если при изменении свойств вы допустили ошибку или какой-либо элемент меню не будет содержать PL/SQL-команду, то при попытке запуска меню вы получите сообщение об ошибке (рис. 8.12) - "Невозможно читать файл FMENU".

    (рис 8.12) Сообщение об ошибке при попытке запуска меню

    Если вы работаете с многомодульным приложением, то можете назначить вызываемой форме текущее меню, используя параметр DO_REPLACE процедуры CALL_FORM при вызове формы процедурой CALL_FORM. По умолчанию при вызове формы процедурой CALL_ FORM применяется параметр NO_REPLACE, который означает, что вызываемая форма не будет наследовать меню родителя.

    Типы меню

    В предыдущих разделах мы с вами научились создавать стандартное меню, элементы которого имели вид текстовых ярлыков. В Oracle Forms вы можете изменять вид отображаемого элемента и его функциональность, изменяя его тип. Свойство "Тип элемента меню" используется для изменения типа отображаемого пункта меню. Создавая элемент меню, вы можете выбрать один из четырех типов (табл. 8.3).

    Типы элементов меню
    Значение Описание
    Простой (Plain) Стандартный тип меню - просто ярлык с текстовой меткой.
    Выбор (Check) Рядом с текстовой меткой отображается элемент CheckBox в виде галочки. Такой тип меню может находиться в одном из двух состояний: True или False.
    Радио (Radio) Элемент меню превращается в одну из радиокнопок радиогруппы, также принимая значения True или False.
    Разделитель (Separator) Элемент меню превращается в линию-разделитель, которая визуально разделяет группу элементов меню на группы.
    Магический (Magic) Элемент меню, для которого предусмотрены встроенные функциональные средства реализации. Такой элемент может превращаться в одну из часто используемых команд: Вырезать, Копировать, Вставить и т. д. Вид команды для магического элемента можно выбрать в свойстве "Магический элемент". Магические элементы позволяют избежать лишнего кодирования часто используемых команд. Внешний вид такого элемента зависит от платформы, на которой производится запуск меню.

    Для того чтобы установить новый тип элемента, достаточно изменить значение свойства "Тип элемента меню" (рис. 8.12).

    (рис 8.12) Типы элементов меню

    Радиокнопки и выключатели работают по такому же принципу, как и одноименные элементы модуля формы.

    Примечание: используйте элементы Check и Radio как переключатели каких-либо состояний, а не инициаторы каких-либо действий.

    Обращение к элементам меню

    Для обращения к элементам меню используйте синтаксис:

    имя_меню.имя_элемента

    Для получения значения состояния радиокнопки или выключателя (выбор) меню используйте функцию GET_MENU_ITEM_PROPERTY, а для установки значения - функцию SET_MENU_ITEM_PROPERTY.

    Создание срываемых меню

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

  • Находясь в Menu Editor или в навигаторе объектов, выберите меню, например, MYMENU.
  • Вызовите палитру свойств для этого меню и установите свойство Tear-off равным True.
  • Вернуться к учебному плану