Практика использования Action в Delphi

Ну и самое интересное — для действия создаем обработчик события onupdate, в котором пишем:

 

procedure TForml.acExecUpdate(Sender: TObject);

begin

if ListViewl.Selectedonil then

acExec.Enabled:=true else

TAction(Sender).Enabled:=false;

end;

 

Данное событие вызывается каждый раз, когда нужно об­новить состояние компонента. Здесь мы проверяем, если свой­ство Selected у ListView не равно нулю, то значит есть вы­деленный файл и действие можно сделать доступным, иначе его делаем недоступ­ным. Для примера в обоих Случаях Я Обращаюсь К Action по-разному. Чтобы сделать действие доступным, я обра­щаюсь к нему напрямую:

acExec.Enabled:=true

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

TAction(Sender).Enabled:=false;

Практика использования Action в DelphiПервый вариант удобен тогда, когда обработчик события обрабатывает только одно действие, а второй — когда доступность нескольких действий определяется одним и тем же алгоритмом. В этом случае можно назначить обработчик события для всех действий, и все будет работать корректно.

 

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


Теперь добавьте обработчик события onExecute для добавления в избранное и в нем напишите следующий код:

 

procedure TFormi.acAddToFavori tiesExecute(Sender: TObject);

var

NewAc t ion :TAction;

Begin

// создаем действие

NewAction: =TAction. Create (ActionMainMenuBar 1) ; ;

NewAction.Caption:=DirectoryEdit.Text;

NewAction.Hint:=DirectoryEdit.Text;

NewAction.OoExecute:=GoToFavoriteDirectory;

// добавляем действие в меню

with ActionManagerl. ActionBars [0] . Items [FAVORITIES_INDEX] .

Items.Add do

begin

Action:=NewAction;

end;end;

Здесь объявляется одна пе­ременная типа TAction. В пер­вой строке кода создаем новое действие. В качестве параметра конструктору передаем панель меню, чтобы она владела дейст­вием. В следующих двух стро­ках заполняем свойство caption и Hint. В оба записываем теку­щий путь.

 

В четвертой строке устанав­ливается обработчик события OnExecute, ему присваивается процедура GoToFavoriteDirectory. Теперь когда пользователь выберет это действие, то сработает процедура GoToFavoriteDirectory. Мы ее пока не создали, но скоро сделаем это.

 

Двигаемся дальше. Действие полностью настроено, и теперь его нужно доба­вить в меню. Новое действие добавляется следующей строкой:

ActionManager1.ActionBars[0].Items[FAVORITIES_INDEX].Items.Add

Тут достаточно длинная строка, поэтому будем разбирать поэтапно. Самым пер­вым указан менеджер действий ActionManagerl. У него есть СВОЙСТВО ActionBars. Если вы сейчас выделите этот компонент и дважды щелкните по свойству, то от­кроется окно, в котором можно управлять всеми панелями и меню, добавленными в менеджер. Панель меню должна находиться сверху и будет иметь индекс 0 (маcсивы нумеруются с нуля). Именно поэтому после ActionBars в квадратных скобках указан 0, ведь мы добавляем новое действие в меню.

 

У панели меню есть свойство items, в котором находится массив из всех меню на панели. В нашем примере меню Избранное находится вторым слева, а т. к. мас­сивы нумеруются с нуля, то, правильнее будет сказать, — первым (меню Файл — нулевой). В квадратных скобках логично будет указать 1, но вдруг вы потом захо­тите добавить между меню Файл и Избранное что-то другое? В этом случае при­дется корректировать код везде, где происходит обращение к данному разделу ме­ню, и не факт, что вы все исправите и ничего не забудете. Поэтому я завел константу favoriтiеs_index, которая равна 1.

 

const

FAVORITIES_INDEX = 1;

 

Итак, мы уже добрались до объекта, который отвечает за раздел с пунктами нужного нам меню. У этого объекта есть еще одно свойство items, а у него уже нужный нам метод Add. Этот метод добавляет новый пункт меню и возвращает его в качестве результата.

 

Мы результат нигде не сохраняем, хотя он нам еще нужен для того, чтобы но­вому пункту меню назначить действие Action. Чтобы не заводить лишнюю пере­менную, стоит блок with, который говорит, что последующий код между begin и end нужно выполнять с результатом выполнения метода Add, т. е. с новым пунк­том меню. Чуть запутано? Но зато эффективно, т. е. следующая строка назначит новому пункту меню созданное нами действие:

Action:=NewAction;

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

procedure GoToFavoriteDirectory(Sender:TObject);

Реализация этой процедуры будет следующей:

 

procedure TForm1.GoToFavoriteDirectory(Sender: TObject);

begin

DirectoryEdit.Text:=TAction(Sender).Hint;

AddFile(TAction(Sender).Hint+'*.*', faAnyFile);

end;

 

В первой строке в поле ввода DirectoryEdit отображаем путь, по которому мы будем переходить, а во второй вызываем функцию AddFile, чтобы прочитать папку. Чтобы узнать путь, по которому мы собираемся перейти, обращаемся к свойству Hint объекта, который сгенерировал событие (TAction(sender) .Hint). Помните, что при создании действия для избранного мы помещали в это свойство путь. Вот его мы и читаем.

 

Тут необходимо заметить, что не стоит использовать свойство caption, в кото­ром мы также указали путь к папке. Почему? Помните, что для пунктов меню ав­томатически создаются буквы быстрого вызова? Перед одной из букв в пути может появиться символ &, а значит, путь С:\ в свойстве caption может превратиться в &С:\, что станет некорректным путем. А вот подсказка никак не корректируется, поэтому ее мы и используем.

 

И напоследок очень важная возможность— сохранение и загрузка меню из­бранного. Для ЭТОГО Я написал функции SaveFavorities И LoadFavorities, кото­рые вы можете увидеть в листинге 11.27.

 

procedure TForm1.SaveFavorities; var i:Integer; fav:TStringList; begin

fav:=TStringList.Create;

for i: =1 to ActionManagerl.ActionBars[0] .Items[FAVORITIES__INDEX] . Items.Count-1 do

fav.Add(TAction(ActionManagerl.ActionBars[0] . Items [FAVORITIES_INDEX] . Items.Action).Hint); fav.SaveToFile(ExtractFilePath(Application.ExeName)+ 1favorities.dat'); fav. Free; end;

procedure TFormi.LoadFavori t ies; var i:Integer; fav:TStringList; NewAc t i on:TAction; begin

if not FileExists (ExtractFilePath(Application.ExeName) + 'favorities.dat') then

exit;

while ActionManagerl .ActionBars [0] . Items [FAVORITIES_INDEX] . Items .Count> 3 do

ActionManagerl.ActionBars[0] .Items[FAVORITIES_INDEX] .Items.Delete(3) ; fav:=TStringList.Create;

fav.LoadFromFile(ExtractFilePath(Application.ExeName)+ 1favorities.dat');

for i:=0 to fav.Count-1 do begin

NewAction: =TAction. Create (ActionMainMenuBarl); ;

NewAction.Caption:=fav.Strings;

NewAction.Hint:=fav.Strings;

NewAction.OnExecute:=GoToFavoriteDirectory;

with ActionManagerl.ActionBars [0] .Items [FAVORITIES_INDEX] .Items. Add do

begin Ac t i on:=NewAct i on ; end; end;

fav.Free; end;

Этот код мы рассматривать не будем. Вся необходимая информация у вас уже есть, поэтому разбор оставим в качестве домашнего задания. Функцию загрузки можно вызывать по событию Onshow для главной формы, а сохранение — в обра­ботчике события OnClose.

 

dle

Помоги проекту! Расскажи друзьям об этом сайте: