|
|
|
|
Зачем
нужен 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
|
|