Russian Belarusian English German Japanese Ukrainian
  • Главная
  • Технология разработки приложений

4.55

Приложения C++Builder можно, конечно, разрабатывать в любой последовательности, как бог на душу положит. Компонентов в C++Builder множество, функции многих из них понятны. Так что стоит ли мудрствовать: переноси компоненты на форму, пиши обработчики их событий и получай награду за прекрасно сделанное приложение.
В данном интернет учебнике CuBook.pro, приведенные примеры так и строились. Это были тестовые приложения, единственной задачей которых было показать возможности различных компонентов.

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

Поэтому, чтобы избежать в дальнейшем лишней работы и нареканий в ваш адрес со стороны коллег, которым выпало несчастье модернизировать ваше приложение, лучше сразу приучить себя придерживаться определенной технологии разработки. Благо, в C++Builder имеются для этого все возможности. Речь идет, прежде всего, о проектировании на основе списков действий, управляемых специальными компонентами.

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

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

Когда список действий составлен, можно начать размышлять над исполнительными элементами интерфейса, с помощью которых пользователь сможет инициировать действия. И здесь могут возникнуть определенные сложности. Обычно для одного и того же действия предусматривается несколько инициаторов. Например, как правило, некоторые разделы главного меню дублируются быстрыми кнопками инструментальных панелей, разделами контекстных меню, «горячими» клавишами, иногда обычными кнопками. Такое дублирование удобно пользователю. Но независимая разработка всех этих управляющих элементов часто приводит к неоправданному дублированию кодов, а главное снижает возможности модернизации и сопровождения приложения. Действительно, если вы надумаете что-то изменить в одном из действий, вы должны будете вносить изменения сразу в нескольких местах программы. И не дай бог что-то пропустить: согласованная работа управляющих элементов нарушится.

Чтобы избежать подобных сложностей, в C++Builder предусмотрены компоненты, осуществляющие централизованное управление действиями, их диспетчеризацию. Составленный вами список действий вы заносите в специальный компонент «диспетчер». Для каждого действия при этом вы можете задать множество свойств: надписи на соответствующих элементах управления, пиктограммы, тексты ярлычков подсказок, «горячие» клавиши и многое другое. Вы можете также написать обработчик, обеспечивающий выполнение задуманного действия. Разработчики C++Builder создали множество классов таких стандартных действий, в которых необходимые функции реализуются автоматически. Так что, не ознакомившись в деталях с этими возможностями, вы рискуете «изобрести велосипед». Вы потратите время и силы на их реализацию, а потом окажется, что то же самое можно было сделать несколькими движениями мыши, причем много лучше, чем вы это придумали сами.

Если вы сформировали подобный список действий, то последующее проектирование управляющих элементов существенно упрощается. В большинстве элементов имеется свойство Action. Достаточно сослаться в этом свойстве на одно из действий, как все свойства этого действия и обработчик, реализующий его, перенесутся в данный управляющий элемент. И вам не придется для каждого элемента задавать все это заново. Представляете, сколько времени вы сэкономите? А если вы в дальнейшем что-то измените в реализации действия или в его свойствах (например, смените «горячие» клавиши или пиктограмму), то вам даже не надо будет вспоминать, какие элементы в различных формах вашего приложения инициируют это действие. Все эти элементы автоматически воспримут внесенные изменения.

В C++Builder предусмотрена подобная централизация управления приложением на нескольких уровнях. Для диспетчеризации действий, начиная с С++Вuilder 4, имеется компонент ActionList. Он упростил создание меню и инструментальных панелей, позволил делать программы более понятные и структурированные. Уже в C++Builder 5 число стандартных действий, к которым можно обращаться из ActionList, было свыше двадцати. А в C++Builder 6 их число резко возросло и превысило 60.

Представляете, сколько стандартных операций реализовали за вас создатели C++Builder?

Кроме того, в C++Builder 6 появилась группа гораздо более мощных компонентов, предназначенных для управления событиями: ActionManager, ActionMainMenuBar, ActionToolBar, CustomizeDlg. Они не только обеспечивают новые возможности визуального проектирования, но и решают, например, такую задачу, как настройка меню и инструментальных панелей пользователем. Правда, надо оговориться, что ActionList можно использовать в кросс-платформенных приложениях CLX, a ActionManager только в приложениях Windows.

Пока мы рассматривали только диспетчеризацию действий. Но централизация управления приложением имеет еще несколько уровней. Во-первых, надо упомянуть список изображений ImageList, который может централизованно снабжать изображениями и пиктограммами различные элементы приложения. Во-вторых, в C++Builder имеется такой объект, как Application (приложение). Этот объект управляет наиболее общими свойствами вашего проекта. А для перехвата множества событий компонента Application имеется компонент ApplicationEvents, который позволяет осуществить диспетчеризацию сообщений о событиях. Наконец, в каждом приложении имеется объект Screen (экран), который позволяет управлять отображением различных форм на мониторе.

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

Перечисленные примеры относились к стандартным действиям. В действительности таких действий много больше, чем перечислено выше. Все стандартные действия реализованы в C++Builder классами, наследующими базовому классу действий TAction. Обработчики подобных действий в ряде случаев вам писать вообще не надо, так как они реализованы в соответствующих классах.

Помимо стандартных действий в реальных приложениях имеются, конечно, и нестандартные, связанные с какими-то расчетами, обработкой данных и т.п. Объекты таких действий вам надо создать самим (делается это очень просто методами визуального программирования) и для них надо написать обработчики, реализующие данные действия.

Таким образом, как уже говорилось, прежде чем начинать программирование приложения, вам надо составить для себя список действий, которые должны быть доступны будущему пользователю через разделы меню, инструментальные панели, кнопки и другие элементы управления. При программировании этот список реализуется специальными компонентами, обеспечивающими диспетчеризацию действий. В C++Builder 4 и 5 был только один такой диспетчер действий компонент ActionList. Редактор этого компонента позволял сформировать список действий, написать обработчики, выполняющие задуманные действия, задать основные свойства будущих интерфейсных компонентов пиктограммы, надписи, быстрые кнопки, тексты подсказок и т.п. В C++Builder 6 появился еще один диспетчер действий компонент ActionManager, который намного мощнее ActionList.

После того, как список действий создан, надо сформировать полосы действий. Это компоненты, на которых располагаются интерфейсные компоненты действий. Такими полосами действий являются, полоса главного меню и инструментальные панели. При использовании ActionList эти полосы действий надо добавлять на форму в виде отдельных компонентов, создавать на них инициаторы действий (разделы меню, быстрые кнопки), а затем связывать инициаторы с соответствующими действиями из списка ActionList. При таком связывании свойства, заложенные в действия, автоматически передаются интерфейсным компонентам. В АсtionManager создание полос действий упрощается. Они создаются и формируются непосредственно из редактора ActionManager простым перетаскиванием мышью.

Интерфейсные компоненты действий обычно должны содержать поясняющие их изображения. Эти изображения собираются в списке изображений компоненте ImageList. Для нестандартных действий эти изображения вы должны загрузить в ImageList сами. А изображения для стандартных действий загружаются в него автоматически по мере формирования списка в диспетчере действий.

Таким образом, последовательность формирования списка действий и проектирования меню и инструментальных панелей сводится к следующим шагам:
1. Продумывается и составляется список действий, которые должны быть доступны будущему пользователю через разделы меню, инструментальные панели, кнопки и другие элементы управления.
2. Для тех нестандартных действий, которые должны быть доступны из быстрых кнопок инструментальной панели, готовится список пиктограмм на кнопках в компоненте ImageList.
3. На главную форму приложения переносится компонент диспетчеризации действий: ActionList или ActionManager. Компонент связывается с ImageList. Формируется список стандартных и нестандартных действий.
4. Каждому действию задается набор характеристик: Name (имя), Caption (надпись, в которой выделяется символ быстрого доступа), Shortcut (горячие клавиши), Imagelndex (номер изображения в ImageList), Hint (тексты подсказок), HelpContext или HelpKeyword (ссылка на тему справки) и др. Для нестандартных действий все эти характеристики вы записываете сами. Для стандартных действий они заносятся автоматически. Вам надо только перевести надписи и подсказки на русский язык и, может быть, исправить ссылки на не устраивающие вас стандартные изображения и комбинации горячих клавиш. А если у вас предусмотрена в приложении контекстная справка, то надо задать ссылки на соответствующие темы. Впрочем, в начале проектирования справки, конечно, еще нет. Так что свойства HelpContext и HelpKeyword вы можете задать позднее.
5. Записываются обработчики событий выполнения для всех нестандартных действий. Стандартные действия обрабатываются автоматически и для многих из них достаточно задать некоторые свойства обработки. Впрочем, как будет видно позднее, иногда надо писать обработчики и для стандартных действий. Дальнейшие шаги зависят от того, используете ли вы компонент ActionList,
или ActionManager. Для ActionList далее надо сделать следующее:
6. На форму переносится компонент MainMenu (главное меню), связывается с ImageList, в компоненте формируется меню и в его разделах даются ссылки на действия, описанные в ActionList.
7. На форме создается инструментальная панель (обычно, компонент ToolBar). Панель связывается с ImageList, а в ее кнопках даются ссылки на действия, описанные в ActionList.

Если вы используете компонент ActionManager, то эти шаги выглядят иначе:

6. На форму переносится компонент ActionMainMenuBar (полоса главного меню). Она связывается с диспетчером ActionManager. Затем из редактора ActionManager перетаскиваются мышью на полосу меню категории разделов, которые должны входить в меню как головные разделы, или отдельные действия.

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

Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий


Поиск по сайту