Диспетчеризация действий на основе компонента ActionList

1.Создайте новое приложение и командой Сохранить все сохраните файл модуля и проект. В свойство Caption формы впишите Тест нестандартных действий.

2.Перенесите на форму со страницы Стандарт компонент ActionList1. Перенесите также со страницы Дополнительно компонент ImageList1 и сошлитесь на него в свойстве Images компонента ActionList1.

3.Загрузите в компонент ImageList1 не менее трех изображений. Изображения в компонент ImageList1 могут быть загружены в процессе проектирования с помощью редактора списков изображений. Окно редактора вызывается двойным щелчком на компоненте ImageList1 или щелчком правой кнопки мыши и выбором команды контекстного меню Редактор ImageList. В окне редактора можно добавить в списки изображение (кнопка Добавить), удалить изображение из списка кнопкой Удалить, очистить весь список кнопкой Очистить.

При добавлении изображения в список, которое начинается с нажатия кнопки Добавить, открывается окно открытия файлов изображений, в котором можно выбрать нужный файл. Множество изображений, размещаемых обычно на кнопках, содержится в папке …\Program Files\Common Files\Borland Shared\Images\Buttons.

Следует помнить, что размер всех изображений в списке должен быть одинаковым. Как правило, это размер, используемый для пиктограмм в меню, списках, кнопках. При добавлении в список изображений для кнопок надо иметь в виду, что они часто содержат не одно, а два и более изображений. В этих случаях после выбора имени файла изображений при щелчке на кнопке Открыть задается вопрос: “Bitmap dimensions for … are greater then imagelist dimensions. Separate into … separate bitmaps?” (“Размерность изображения … больше размерности списка. Разделить на … отдельные изображения?”). Если ответить отрицательно, то все изображения уменьшатся в горизонтальном размере и лягут как одно изображение. Использовать его в дальнейшем будет невозможно. Поэтому на заданный вопрос надо ответить положительно. Тогда загружаемая битовая матрица автоматически разделится на отдельные изображения, а затем те из них, которые не нужны, удаляют.

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

4.Сделайте на компоненте ActionList1двойной щелчок, чтобы попасть в Редактор Действий (окно Редактирование Form1->ActionList1), позволяющий вводить и упорядочивать действия. Колонка Категории: пока не будет иметь отношения к проектированию приложения. Щелчок правой кнопкой мыши или щелчок на маленькой кнопке со стрелкой вниз правее первой быстрой кнопки окна редактирования позволяет выбрать одну из команд: Новое действие или Новое стандартное действие. Первая из них относится к вводу нового действия любого типа. Пока будем пользоваться только командой Новое действие. Трижды выберите эту команду. В колонке Действия: появятся имена действий по умолчанию: Action1, Action2, Action3.

5.Выделите Action1. В Инспекторе Объектов указанным ниже свойствам объекта действия Action1присвойте следующие значения: Caption –&Формирование, Hint –размер 3х5, ImageIndex –0, Name –AMatr, ShortCut –Ctrl+A. Для Action2: Caption –&Транспонирование, Hint –однократное, ImageIndex –1, Name –ATrans, ShortCut –Ctrl+B. И для Action3: Caption –&Стереть, Hint –очистка Memo1, ImageIndex –2, Name –ADel, ShortCut –Ctrl+C.

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

7.Со страницы Стандарт перенесите на форму компонент Memo1. Установите шрифт (Font) Courier, полужирный, размер – 12.

8.В файле реализации модуля поместите следующие объявления и обработчики событий OnExecute(курсив):

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

int r[50][50],a[50][50],n=3,m=5;

AnsiString s[50][50],s1[50];

//---------------------------------------------------------------------------

void __fastcall TForm1::AMatrExecute(TObject *Sender)

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<m;j++)

r[i][j]=random(10);

Memo1->SetFocus();

Memo1->Clear();

for(i=0;i<n;i++){

s1[i]="";

for(j=0;j<m;j++){

s[i][j]=" "+IntToStr(r[i][j]);

s1[i]+=s[i][j];}

Memo1->Lines->Add(s1[i]);}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ATransExecute(TObject *Sender)

{

int i,j;

for(i=0;i<n;i++)

for(j=0;j<m;j++)

a[j][i]=r[i][j];

i=n;n=m;m=i;

Memo1->SetFocus();

Memo1->Clear();

for(i=0;i<n;i++){

s1[i]="";

for(j=0;j<m;j++){

s[i][j]=" "+IntToStr(a[i][j]);

s1[i]+=s[i][j];}

Memo1->Lines->Add(s1[i]);}

i=n;n=m;m=i;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::ADelExecute(TObject *Sender)

{

Memo1->Clear();

}

//---------------------------------------------------------------------------

7.Перенесите на форму со страницы Стандарт компонент MainMenu1. В свойство Images внесите ImageList1. Двойным щелчком на компоненте MainMenu1 перейдите в окно Form1-> MainMenu1 Конструктора Меню. В свойство Caption головного раздела меню впишите &МАТРИЦА. В трех создаваемых затем разделах в свойство Action вносите соответственно значения: AMatr, ATrans, ADel. Как показывает Инспектор Объектов, при этом в разделы меню переносятся свойства соответствующего объекта действия. Более того, в событие – щелчок на разделе – подставится обработчик, предусмотренный для данного действия. Таким образом, если в свойстве Action раздела указать имя объекта действия, то свойства и обработчики событий объекта действия будут перенесены на этот раздел меню.

8.Со страницы Win32 перенесите на форму инструментальную панель – компонент ToolBar1. По умолчанию он расположится вверху, поскольку его свойство Align по умолчанию равно alTop. Установите Align=alNone, чтобы панели можно было придать любую форму и расположить ее в любом месте.

9.В свойство Hint впишите инструментальная панель, в свойство Imagesвнесите ImageList1, в свойства ShowCaptions и ShowHint – true. Щелкните правой кнопкой мыши на компоненте ToolBar1 и из всплывшего меню выберите команду Новая кнопка. В свойство Actionкнопки внесите AMatr, а в свойство ShowHint – true. Повторите эту команду еще для двух кнопок, внося в свойство Actionсоответственно ATrans, ADel, в свойство ShowHint – true. Отметим, что свойства и обработчики событий объекта действия будут перенесены на соответствующие кнопки инструментальной панели.

10.Со страницы Дополнительно перенесите на форму три кнопки BitBtn. Кнопка BitBtn отличается от кнопки Button возможностью отобразить на ее поверхности изображение. В свойство Action кнопок внесите значения AMatr, ATrans, ADel соответственно, в свойство ShowHint – true. При этом свойства и обработчики событий объекта действия будут перенесены на соответствующие кнопки BitBtn.

11.После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь в работоспособности приложения.

Примечание. Связь между свойствами объекта действия и свойствами управляющих элементов выполняется классом TActionLink и его наследниками. Передаются такие свойства действия, как Caption, Checked,HelpContext,Hint,ImageIndex,ShortCut,Visible. Однако в любом компоненте разработчик может изменить переданное в него свойство. Обратной связи TActionLink с компонентами нет, так что эти изменения будут локальными и не отразятся на других компонентах. Если же требуется изменить свойства всех связанных с одним действием компонентов, надо изменять свойство объекта действия. Это облегчает программное управление компонентами, связанными с одним и тем же действием.

Перейдем к рассмотрению другой команды окна Редактора Действий–Новое стандартное действие. Она открывает окно Стандартные Классы Действия, в котором можно выбрать из списка необходимое стандартное действие (или сразу несколько действий). Действия в списке сгруппированы по категориям. Список включает 26 действий. Стандартные действия охватывают операции редактирования текстов (категория Правка), форматирования текстов (категория Формат), поиска в текстах (категория Поиск), работу со справками (категория Помощь), с файлами (категория Файл) и другие. Выполним эксперимент, который позволит понять отличие стандартных действий от нестандартных.

1.Создайте новое приложение и командой Сохранить все сохраните файл модуля и проект. В свойство Caption формы впишите Тест стандартных действий.

2.Перенесите на форму компоненты ActionList1иImageList1. Сошлитесь в свойстве Images компонента ActionList1 на список ImageList1. Перейдите в окно Редактора Действий, вызовите окно Стандартные Классы Действия, выделите в нем все действия категории Правка и действие TFileExit категории Файл, нажмите кнопку OK.

3.В окне Редактора Действий увидите, что в список автоматически занеслись выбранные действия, причем большинство из них имеют пиктограммы, хотя в компоненте ImageList1 пиктограмм не было. Выделите ImageList1 и убедитесь, что в нем находятся пиктограммы выбранных действий.

4.Обратите внимание на то, что каждый вид стандартного действия имеет класс, производный от TAction. Названия этих классов даны в окне Стандартные Классы Действия. В Инспекторе Объектов также видно, что в стандартные действия заложены общепринятые значения множества свойств: надписи (Caption), подсказки (Hint), «горячие» клавиши (ShortCut). Но самое главное отличие стандартных объектов действий от нестандартных заключается в том, что для стандартных действий не надо писать обработчики событий OnExecute. Все операции, необходимые для выполнения стандартных действий, уже заложены в их объекты. Они не только не требуют обработчиков событий OnExecute, но могут реализовываться через «горячие» клавиши даже без инициаторов действий – разделов меню, кнопок и т.п. Чтобы убедиться в этом, продолжите эксперимент. Добавьте на форму инструментальную панель ToolBar1 и свяжите ее свойством Imagesсо списком изображений ImageList1. Установите в ToolBar1 свойство ShowHintв true.

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

6.Добавьте на форму окна редактирования RichEdit1 и Edit1.

7.После ввода команды Сохранить все запустите приложение на выполнение. Убедитесь, что вначале доступна только кнопка выхода. Причины такого состояния: выделенного текста нет, поэтому нечего копировать или вырезать; редактирования не было, поэтому нечего отменять. Если выделить текст в одном из окон редактирования, то, пока это окно находится в фокусе, будут доступны кнопки Копировать (Copy), Вырезать (Cut), Удалить (Delete). Проведите какую-либо операцию редактирования и убедитесь, что стала доступной кнопка Отменить (Undo). Но если переместить курсор в другое окно редактирования, где нет выделения и не было редактирования, то эти кнопки станут недоступны.

8.Чтобы убедиться в том, что доступ к стандартным действиям через «горячие» клавиши сохраняется, даже если в приложении отсутствуют их инициаторы или они недоступны, задайте для действия FileExit1, обеспечивающего выход из приложения, «горячие» клавиши Ctrl+E. Сделайте невидимой инструментальную панель ToolBar1 (Visible = false) и снова запустите приложение. Ни один управляющий элемент не будет доступен. Но все «горячие» клавиши будут действовать. Нажмите Ctrl+E, и приложение закроется.

Наши рекомендации