На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Компоненты / Зачем нужен TAction ? Сделать домашней страницей Добавить в избранное Написать писмо

Зачем нужен TAction ?


Hужны они для синхронизации свойств Enable, Checked, ImageIndex, Caption, Hint, OnClick и т.п. различных контролов. Hаиболее часто применяется для кнопок и элементов меню. Сильно облегчает разработку дружественных сред, когда до какого-то действия можно добраться через кнопку toolbar'а, MainMenu'шку и PopupMenu'шку:
1. Создал Action, проставил св-ва (Caption, Hint, ImageIndex и т.п.)
2. Прописал действие на OnExecute (если не лениться и задавать нормальные имена Action'ам, то процедуры тоже будут иметь нормальные имена)
3. Прописал на TAction.OnUpdate условия для Enabled, Checked и т.п.:

procedure TForm1.DBConnectUpdate(Sender: TObject);
begin
Checked := Database1.Connected;
Enabled := (FUserName + FPassword) <> '';
end;

4. Проставил всем компонентам, активизирующим это действие, свойства Action и, если надо, ImageList.
Без экшинсов тебе пришлось бы всем контролам проставлять Caption'ы, хинты, имагиндексы и т.п.. Прописывать везде, где надо, куски типа

BtnConnect.Enabled := экспр
PUConnect.Enabled := экспр
PDConnect.Enabled := экспр
BtnConnect.Checked:= др.экспр
PUConnect.Checked := др.экспр
PDConnect.Checked := др.экспр

и следить за тем, чтобы все кнопки/меню итемы и т.п. соответствовали:
пользователь сделал изменение, хочет сохранить, а у него в менюшке по правой кнопке пункт Save - запрещен. И расскажи ему, что у него в MainMenu/File/Save - разрешился, а этот - "забыл".
Далее, можно спокойно "нарисовать" этот ActionList с Action'ами, набросать кнопок на один ToolBar, проработать функциональность, а уже потом не напрягаясь и не думая, где какой код вставить, "дорисовывать" менюшки и кнопки. При этом, когда надо одну кнопку грохнуть, а другую добавить - это не напрягает, т.к. ничего важного элемент кнопки не содержит. Всю информацию о поведении этой кнопки содержит соответствующий Action.
Вывод: снижает трудозатраты на разработку пользовательского интерфейса - снижает вероятность ошибки. Hакладные расходы оценить не пытался (они безусловно есть), но думаю, что они в большинстве случаев не существенны.

Комментарий от Max Rezanov

это правильно оценивать и не пытайся Ж:-)))
1. Открываем проект
%Delphi4%\Demos\Richedit\richedit.dpr
2. Форма MainForm
2.1 секция

private
FFileName: string;
FUpdating: Boolean;
FDragOfs: Integer;
FDragging: Boolean;
добавили
>> i1 : integer;

2.2 затем

procedure TMainForm.FormCreate(Sender: TObject);
var
ScreenLogPixels: Integer;
DC: HDC;
begin
... чик, чик.. просто проустили строки
добавили
>> i1 := 0;
end;

2.3. затем полный рулез

procedure TMainForm.ActionList2Update(Action: TBasicAction;
var Handled: Boolean);
begin
{ Update the status of the edit commands }
EditCutCmd.Enabled := Editor.SelLength > 0;
EditCopyCmd.Enabled := EditCutCmd.Enabled;
if Editor.HandleAllocated then
begin
EditUndoCmd.Enabled := Editor.Perform(EM_CANUNDO, 0, 0) <> 0;
EditPasteCmd.Enabled := Editor.Perform(EM_CANPASTE, 0, 0) <> 0;
end;
добавили
>> inc(i1);
>> StatusBar.Panels[2].Text := inttostr(i1);
end;

3. запуск
У меня после старта 1602 вызова ActionList2Update
повели мышкой по окну 32К вызвовов
на текущий момет пишу письмо, проект висит, я тама немного поелозил
мышей около 1М вызовов, 0.912М, если быть точным Ж:-((

Резуме:
1. Все выше перечисленное не значит что я не рекомендую использовать
ActionList.
2. Надо думать, что именно выносить на Update(SQL-запрос скорее всего
не надо Ж:-))))
3. О сколько нам открытий нудных.....

Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz