CnPack Forum » 技术板块灌水区 » 小小 actionlist,门道不少


2007-3-16 10:07 skyjacker
小小 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 与 窗体控件之间的关系,表面简单但是内部却并不清晰。
要搞明白也不是件易事阿。

[[i] 本帖最后由 skyjacker 于 2007-3-16 10:14 编辑 [/i]]

2007-3-16 10:14 skyjacker
4、利用某一控件的 OnChange 也可以实现类似的控制按钮功能。

2007-3-16 11:43 kendling
哈,Action是好东东,最简单的是方便菜单和工具栏关联。没有在VC里要双向更新。

2007-3-16 11:57 skyjacker
明白点儿了

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

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

2007-3-16 12:04 Passion
实际上各个ActionList的Update和Action的Update,是在OnIdle的时候执行的。

相关部分查查VCL源码的WM_IDLE等等看看能查到不?

2007-3-16 12:11 Passion
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。

2007-3-16 14:01 skyjacker
原来如此。
又学了一招。
我再查查 Idle 的知识。

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

2007-3-16 14:25 Passion
哈三克油,我600多积分,太多也用不着啊嘿嘿。

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.