10 июня 2010

Компонент ActionList

Компонент ActionListОсновное его предназначение - это хранение в одном месте некоторых действий, которые должны выполняться тем или иным способом.
Компонент ActionList расположен на вкладке Standard Палитры компонентов:

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

При этом ваше действие может быть, скажем, временно недоступно - и в этом случае вы хотите, чтобы соответствующий пункт меню и соответствующая кнопка были недоступны. Так вот, если действие одно, а способов его выполнения много, то и надо использовать компонент ActionList. В этом случае обработчик пишется только в одном месте, и если вам, скажем, надо отключить возможность выполнения этого действия во всех местах или во всех местах изменить его название (например, со Start на Stop), то вам не придется изменять много мест в вашем коде - достаточно только внести изменения в соответствующее действие для ActionList'а.
Посмотрим на примере, как это делается. Разместите на форме компонент MainMenu, обычную кнопку и компонет ActionList. Свойство name оставьте для всех компонентов без изменений. Для меню создайте одно меню верхнего уровня с заголовком Actions и в нем одно подменю (для этого просто щелкните на компоненте MainMenu1 на нашей форме).
Теперь добавим для компонента ActionList1 действие. Для этого сделайте на нем двойной щелчок. Появится окно Editing Form1->ActionList1 специального редактора. Нажмите в нем на кнопку New Action. В правой части появится новое действие Action1:
Добавление действия
Сделайте двойной щелчок на Action1 для перехлда в окно кода. В полученной заготовке добавьте следующую строку:
void __fastcall TForm1::Action1Execute(TObject *Sender)
{
  ShowMessage("Некоторое действие");
}
}
Таким образом нашим действием просто будет появление MessageBox'а.
Теперь припишем наше действие к подпункту меню и кнопке. Для этого надо просто задать для них свойство Action (т. е. выбрать из ниспадающего списка Action1 - оно там будет одно):
Добавление действия к компонентам
Это надо сделать как для кнопки, так и для пункта меню.
Можно запустить программу и проверить - при выборе нашего пункта меню и нажатии на кнопке должен появиться MessageBox с надписью "Некоторое действие".
Теперь посмотрим, как мы можем вносить одновременные изменения во все компоненты, связанные с нашим действием Action1. Для этого снова переходим в редактор для ActionList1 (для чего сделайте на расположенном на форме компонете ActionList1 двойной щелчок), выделяем наше действие Action1 и в Инспекторе объектов на вкладке Events делаем двойной щелчок на OnUpdate:
Инспектор объектов
В появившуюся заготовку для кода внесите следующие строки:
void __fastcall TForm1::Action1Update(TObject *Sender)
{
  if(b){
    ((TAction *)Sender)->Caption = "New caption";
    ((TAction *)Sender)->Enabled=false;
  }
}
Что мы тут делаем? В зависимости от значения некоторой переменной b (которую мы еще добавим) мы меняем у нашего действия заголовок на "New caption" и делаем его отключенным.
Объявление переменной b добавьте в заголовочный файл нашей формы:
class TForm1 : public TForm
{
...
public:
  bool b;      
  ...

Осталось еще где-то вызывать обновление нашего Action1. Например, это можно сделать при нажатии на вторую кнопку. Добавьте на форму вторую кнопку и в ее обработчик внесите следующий код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  b=true;
  //Обновляем Action1
  ActionList1->Actions[0]->Update();
}


После запуска программы и нажатии на вторую кнопку и у пункта меню, и у первой кнопки одновременно поменяется заголовок и они станут недоступны:
Обновление меню и кнопки

Комментариев нет:

Отправить комментарий

Темы