суббота, 19 сентября 2009 г.

Главное меню. Создаём "блокнот".

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

Надеюсь, HiAsm у вас уже запущен. Нам понадобится вкладка компонентов "интерфейс". Главное меню там находится недалеко от дочерней формы (перед ней). Когджа вы его поставите на рабочее поле, то увидите, что точек и параметров у него очень мало. Более того, меню не отображается в редакторе форм! Однако это не ошибка, так и должно быть. Меню, хоть и визуальный элемент, но оконным элементом не является. А потому вы увидите его в уже готовой программе.

Коль скоро мы решили сделать свой блокнот, то и пункты меню должны быть соответствующими. Зайдите в параметр Menu. Это простой редактор строк. Каждая строка в нём - отдельный пункт меню. Однако так можно задать только саму строку меню, а для вложенных пунктов нужно пользоваться следующим синтаксисом. Внимательно рассмотрите код.



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

С синтаксисом более или менее понятно, а теперь необходимо как-то обрабатывать нажатия меню, ведь сейчас меню не работает, а только отображается.

Первым делом поставим на форму многострочное поле, сделав его параметр Align=caClient, а ScrollBars=Vertical. Ведь мы же делаем блокнот. Вы можете теперь запустить программу и убедиться, что действительно она уже напоминает блокнот.

При выборе пункта меню в программе у компонента срабатывает событие onSelectStr, на которое в потоке выдаётся текст щёлкнутого пункта, а также событие onSelectNum (вы его найдёте на вкладке "точки"), которое выдаёт номер щёлкнутого пункта.

Мне лично удобнее пользоваться именно номерами пунктов, потому что их проще обрабатывать. Для обработки нам понадобится специальный компонент со вкладки "инструменты" - "индекс в канал". Если на его единственный метод doEvent подать число, то вызвано будет то событие, точка которого имеет соответствующий номер. Но пока события у него всего два. Чтобы увеличить их число, нужно укзать параметр Count. Всего может быть до 100 событий.

Теперь остаётся только соединить меню и этот компонент.



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

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

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



Стоит сказать пару слов и компонентах диалоговых окон. У каждого из них есть параметр Filter, где задаются возможные типы файлов для открытия. Внимательно посмотрите, как они заполнены. А также в дургих параметрах диалогов можно задать их заголовки и не только.

Осталось лишь реализовать выход из программы. Однако вы помните, что если текст был изменён, то программа перед выходом спрашивает, нужно ли сохранять. Нужно и нам такое реализовать.
Но как узнать, изменился ли текст? Очень просто: у многострочного поля есть событие onChange, которое как раз происходит при изменении текста.



Если вы посмотрите в параметр компонента Memory, то увидите там 0 типа integer. В компоненте DoData данные в параметре - 1. Про эти компоненты я уже писал ранее. В этой связке при изменении текста в Memory попадает значение 1. При попытке выхода из программы его-то и нужно проверять.



Конструкция сложна лишь на первый взгляд. На самом деле всё очень просто: при попытке закрытия программы через наше меню идёт проверка Memory. Здесь вы видите уже знакомый IndexToChanel с верхней точкой Index: индекс желаемого события можно подать и на точку данных, а не только в потоке методу.
Если в компоненте Memory содержится 0 (текст не изменён), то происходит закрытие программы. Если 1, то выдаётся вопрос о сохранении. При отрицательном ответе программа закрывается. При положительном - сначала файл сохраняется, а потом программа закрывается.

Незнакомы вы здесь лишь в разветвителем - компонентом Hub. Он как раз предназначен для вызова одним событием нескольких методов или, наоборот, много событий могут вызывать одни и те же методы. Главное - настроить количество входных и выходных точек в его параметрах.

Ну и, конечно, необходимо настроить сообщение: кнопки в нём, иконку (это всё делается в параметрах компонента). А также не забыть вывести точки событий со вкладки "точки" для обработки нажатия разных кнопок в сообщении.

6 комментариев:

  1. Тема видеоурока - создание главного меню программы по индексу, а блокнот - всего лишь иллюстративный пример, взятый из стандартного набора компонентов.
    Вопрос 1. В итоговой конструкции, приведенной в блоге, у Вас присутствуют два компонента "Редактор текста", а в видеоуроке - один. Здесь нет ошибки?
    Вопрос 2. В Справке к HiAsm говорится: "Пользуйтесь ссылками на компонент, это очень удобно. Для этого выделите компонент, зайдите в правка - копировать ссылку. Дальше жмите правой кнопкой - вставить. Ссылка имеет квадратик в правом нижнем углу. При изменении свойств у ссылки они меняются у оригинала и наоборот". Но ничего не сказано, как пользоваться ссылками. Для чего они удобны?

    ОтветитьУдалить
  2. При вставке каждого нового кода предыдущий надо удалять, тогда получится правильно. Это не очень удобно, и поэтому последние статьи используют файлы, а не код. Наверно, и здесь придётся заменить.

    Компоненты-ссылки используются, если нужно сделать два абсюлоютно одинаковых компонента, чтобы все свойства были одинаковыми. Это как бы клон компонента. Ссылку можно использовать так же, как и обычный компонент.

    ОтветитьУдалить
  3. Я тут вообще не понял из видеоурока, как проверить, изменён ли текст, или нет.

    ОтветитьУдалить
  4. Это проверяется по событию OnChange. Если оно произошло - значит, текст изменён.

    ОтветитьУдалить
  5. Извините, а у Вас случайно нет готового Блокнота? Задали в институте сделать на HiAsm-е текстовый редактор...
    Очень буду благодарен, если Вы мне поможете.
    E-mail: akimov.rf (гаф) ya.ru
    ICQ: 453928200

    ОтветитьУдалить
  6. Нет, готового нет. Но ведь из имеющейся схемы собрать его несложно! Кроме того, всегда есть форум hiasm.com, там-то уж наверняка найдётся множество нужных схем.

    ОтветитьУдалить