Subject:
小小 actionlist,门道不少
[Print This Page]
Author:
skyjacker
Time:
2007-3-16 10:07
Subject:
小小 actionlist,门道不少
小小 actionlist,门道不少
1、http://dn.codegear.com/article/27058 Effectively Using Action Lists
简介:
这篇文章详细的描述了如何在一个应用程序中使用 actions 和 actionlist
Action List 在 Delphi4 中已经被介绍。然而,它作为 Delphi 的一个强大的功能并没有被充分利用,并且被许多程序员滥用。
当然,这篇文章最重要的目的是指引大家如何在应用程序中有效的使用 Action 。
以一个模拟 CD Player 的界面来说明。
2、http://www.sicool.net/article/delphitechnic/200607/406.html Action高级开发
3、CnPack CnWizard SimpleWizards\CnComponentSelector.pas 组件选择工具
没看懂:
(1)、只在actSelInvert 中定义事件 procedure TCnComponentSelectorForm.DoActionListUpdate(Sender: TObject);
// Action 更新
procedure TCnComponentSelectorForm.DoActionListUpdate(Sender: TObject);
begin
actAdd.Enabled := lbSource.SelCount > 0;
actAddAll.Enabled := lbSource.Items.Count > 0;
actDelete.Enabled := lbDest.SelCount > 0;
actDeleteAll.Enabled := lbDest.Items.Count > 0;
actSelAll.Enabled := lbSource.SelCount < lbSource.Items.Count;
actSelNone.Enabled := lbSource.SelCount > 0;
actSelInvert.Enabled := lbSource.Items.Count > 0;
actMoveToTop.Enabled := lbDest.SelCount > 0;
actMoveToBottom.Enabled := lbDest.SelCount > 0;
actMoveUp.Enabled := lbDest.SelCount > 0;
actMoveDown.Enabled := lbDest.SelCount > 0;
end;
(2)、利用 procedure UpdateControls; 更新窗体控件
// 更新列表和控件状态
procedure TCnComponentSelectorForm.DoUpdateListControls(Sender: TObject);
begin
UpdateControls;
UpdateList;
end;
没看到在哪里调用 DoUpdateListControls 阿
// 更新控件状态
procedure TCnComponentSelectorForm.UpdateControls;
begin
if cbbFilterControl.ItemIndex < 0 then cbbFilterControl.ItemIndex := 0;
if cbbByClass.ItemIndex < 0 then cbbByClass.ItemIndex := 0;
if cbbByTag.ItemIndex < 0 then cbbByTag.ItemIndex := 0;
if cbbSourceOrderStyle.ItemIndex < 0 then cbbSourceOrderStyle.ItemIndex := 0;
if cbbSourceOrderDir.ItemIndex < 0 then cbbSourceOrderDir.ItemIndex := 0;
cbbFilterControl.Enabled := rbSpecControl.Checked;
cbIncludeChildren.Enabled := not rbCurrForm.Checked;
edtByName.Enabled := cbByName.Checked;
cbSubClass.Enabled := cbByClass.Checked;
cbbByClass.Enabled := cbByClass.Checked;
cbbByTag.Enabled := cbByTag.Checked;
seTagStart.Enabled := cbByTag.Checked;
seTagEnd.Enabled := cbByTag.Checked;
seTagEnd.Visible := cbbByTag.ItemIndex = 3;
lblTag.Visible := cbbByTag.ItemIndex = 3;
end;
(3)、Form 区
这三处居然没有找到在何处调用
procedure DoUpdateSourceOrder(Sender: TObject);
procedure DoUpdateListControls(Sender: TObject);
procedure DoUpdateList(Sender: TObject);
Action 与 窗体控件之间的关系,表面简单但是内部却并不清晰。
要搞明白也不是件易事阿。
[
本帖最后由 skyjacker 于 2007-3-16 10:14 编辑
]
Author:
skyjacker
Time:
2007-3-16 10:14
4、利用某一控件的 OnChange 也可以实现类似的控制按钮功能。
Author:
kendling
Time:
2007-3-16 11:43
哈,Action是好东东,最简单的是方便菜单和工具栏关联。没有在VC里要双向更新。
Author:
skyjacker
Time:
2007-3-16 11:57
明白点儿了
action.OnUpdate 与 actionlist.OnUpdate.
一般用 action.OnUpdate 就能实现想要的功能了.
反正它也是不断刷新的
不断刷新用个类似的 定时器也行啊.
原来都脱不了类似于定时器的思想
Author:
Passion
Time:
2007-3-16 12:04
实际上各个ActionList的Update和Action的Update,是在OnIdle的时候执行的。
相关部分查查VCL源码的WM_IDLE等等看看能查到不?
Author:
Passion
Time:
2007-3-16 12:11
procedure DoUpdateSourceOrder(Sender: TObject);
procedure DoUpdateListControls(Sender: TObject);
procedure DoUpdateList(Sender: TObject);
这三处是在dfm中赋值了的,比如OnClick等,目的是为了完成“窗体上的控件内容被用户操作改变后的状态更新”,虽然也是处理一些Enable的东西,但和Action的Idle时的更新完全不同,基本上可以说和Action无关。
一般一个Action的Update事件里头只用来设置自己这个Action的Enable;一个ActionList的Update事件里头只用来批量设置本ActionList中的Action的Enable。
Author:
skyjacker
Time:
2007-3-16 14:01
原来如此。
又学了一招。
我再查查 Idle 的知识。
行使我斑竹的权利,给你加了1分 ,以表感谢。
Author:
Passion
Time:
2007-3-16 14:25
哈三克油,我600多积分,太多也用不着啊嘿嘿。
Welcome to CnPack Forum (http://bbs.cnpack.org/)
Powered by Discuz! 5.0.0