CnPack Forum


 
Subject: 小小 actionlist,门道不少
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-3-16 10:07  Profile | Blog | P.M.  | QQ
小小 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 编辑 ]




一壶清茶煮青春.
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-3-16 10:14  Profile | Blog | P.M.  | QQ
4、利用某一控件的 OnChange 也可以实现类似的控制按钮功能。




一壶清茶煮青春.
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-3-16 11:43  Profile | Site | Blog | P.M.  | QQ | Yahoo!
哈,Action是好东东,最简单的是方便菜单和工具栏关联。没有在VC里要双向更新。




小冬
http://MyvNet.com
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-3-16 11:57  Profile | Blog | P.M.  | QQ
明白点儿了

action.OnUpdate 与 actionlist.OnUpdate.
一般用 action.OnUpdate 就能实现想要的功能了.
反正它也是不断刷新的

不断刷新用个类似的 定时器也行啊.
原来都脱不了类似于定时器的思想




一壶清茶煮青春.
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-3-16 12:04  Profile | Blog | P.M. 
实际上各个ActionList的Update和Action的Update,是在OnIdle的时候执行的。

相关部分查查VCL源码的WM_IDLE等等看看能查到不?
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-3-16 12:11  Profile | Blog | P.M. 
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。
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-3-16 14:01  Profile | Blog | P.M.  | QQ
原来如此。
又学了一招。
我再查查 Idle 的知识。

行使我斑竹的权利,给你加了1分 ,以表感谢。




一壶清茶煮青春.
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6838
Posts 3591
点点分 6838
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-3-16 14:25  Profile | Blog | P.M. 
哈三克油,我600多积分,太多也用不着啊嘿嘿。
Top
 




All times are GMT++8, the time now is 2024-11-22 13:26

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.009948 second(s), 9 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP