Ну и самое интересное — для действия создаем обработчик события onupdate, в котором пишем:
procedure TForml.acExecUpdate(Sender: TObject);
begin
if ListViewl.Selectedonil then
acExec.Enabled:=true else
TAction(Sender).Enabled:=false;
end;
Данное событие вызывается каждый раз, когда нужно обновить состояние компонента. Здесь мы проверяем, если свойство Selected у ListView не равно нулю, то значит есть выделенный файл и действие можно сделать доступным, иначе его делаем недоступным. Для примера в обоих Случаях Я Обращаюсь К Action по-разному. Чтобы сделать действие доступным, я обращаюсь к нему напрямую:
В противном случае обращение происходит через переменную sender, которая передается событием в качестве параметра, и в ней находится указатель на действие, которое требует обновления:
Первый вариант удобен тогда, когда обработчик события обрабатывает только одно действие, а второй — когда доступность нескольких действий определяется одним и тем же алгоритмом. В этом случае можно назначить обработчик события для всех действий, и все будет работать корректно.
Усложним пример и добавим в него возможность сохранения путей в избранном. Для этого нам понадобится пункт меню Добавить в избранное и соответствующее действие 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. Мы ее пока не создали, но скоро сделаем это.
Двигаемся дальше. Действие полностью настроено, и теперь его нужно добавить в меню. Новое действие добавляется следующей строкой:
Тут достаточно длинная строка, поэтому будем разбирать поэтапно. Самым первым указан менеджер действий ActionManagerl. У него есть СВОЙСТВО ActionBars. Если вы сейчас выделите этот компонент и дважды щелкните по свойству, то откроется окно, в котором можно управлять всеми панелями и меню, добавленными в менеджер. Панель меню должна находиться сверху и будет иметь индекс 0 (маcсивы нумеруются с нуля). Именно поэтому после ActionBars в квадратных скобках указан 0, ведь мы добавляем новое действие в меню.
У панели меню есть свойство items, в котором находится массив из всех меню на панели. В нашем примере меню Избранное находится вторым слева, а т. к. массивы нумеруются с нуля, то, правильнее будет сказать, — первым (меню Файл — нулевой). В квадратных скобках логично будет указать 1, но вдруг вы потом захотите добавить между меню Файл и Избранное что-то другое? В этом случае придется корректировать код везде, где происходит обращение к данному разделу меню, и не факт, что вы все исправите и ничего не забудете. Поэтому я завел константу favoriтiеs_index, которая равна 1.
const
FAVORITIES_INDEX = 1;
Итак, мы уже добрались до объекта, который отвечает за раздел с пунктами нужного нам меню. У этого объекта есть еще одно свойство items, а у него уже нужный нам метод Add. Этот метод добавляет новый пункт меню и возвращает его в качестве результата.
Мы результат нигде не сохраняем, хотя он нам еще нужен для того, чтобы новому пункту меню назначить действие Action. Чтобы не заводить лишнюю переменную, стоит блок with, который говорит, что последующий код между begin и end нужно выполнять с результатом выполнения метода Add, т. е. с новым пунктом меню. Чуть запутано? Но зато эффективно, т. е. следующая строка назначит новому пункту меню созданное нами действие:
Теперь переходим к рассмотрению процедуры GoToFavoriteDirectory, которая назначается обработчиком события для действий меню избранного. Эту процедуру нужно описать в разделе private нашей формы:
Реализация этой процедуры будет следующей:
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.