C++ Builder 使用动作
2008-03-08 21:51:39 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備浇顕栭崹搴ㄥ礃閿濆棗鐦遍梻鍌欒兌椤㈠﹤鈻嶉弴銏犵闁搞儺鍓欓悘鎶芥煛閸愩劎澧曠紒鈧崘鈹夸簻闊洤娴烽ˇ锕€霉濠婂牏鐣洪柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝搴e垝椤栫偛桅闁告洦鍨扮粻鎶芥倵閿濆簼绨藉ù鐘荤畺濮婃椽妫冨☉娆愭倷闁诲孩鐭崡鎶芥偘椤曗偓瀹曞爼顢楁径瀣珫婵犳鍣徊鍓р偓绗涘洤绠查柛銉墮閽冪喖鏌i弬鎸庢喐闁荤喎缍婇弻娑⑩€﹂幋婵囩亪濡炪値鍓欓悧鍡涒€旈崘顔嘉ч幖绮光偓鑼嚬缂傚倷绶¢崰妤呭箰閹间焦鍋╅柣鎴f绾偓闂佺粯鍔曠粔闈浳涢崘顔兼槬闁逞屽墯閵囧嫰骞掗幋婵愪紑閻庤鎸风粈渚€鍩為幋锔藉亹闁圭粯甯╂导鈧紓浣瑰劤瑜扮偟鍒掑▎鎾宠摕婵炴垶鐭▽顏堟煙鐟欏嫬濮囨い銉︾箞濮婃椽鏌呴悙鑼跺濠⒀傚嵆閺岀喖鎼归锝呯3闂佹寧绻勯崑娑㈠煘閹寸姭鍋撻敐搴樺亾椤撴稒娅婇柡灞界У濞碱亪骞忕仦钘夊腐闂備焦鐪归崐鏇㈠箠閹邦喗顫曢柟鎯х摠婵挳鏌涢幘鏉戠祷闁告挸宕—鍐Χ閸℃浠搁梺鑽ゅ暱閺呮盯鎮鹃悜钘壩ㄧ憸澶愬磻閹剧粯鏅查幖绮瑰墲閻忓秹姊虹紒妯诲鞍婵炲弶锕㈡俊鐢稿礋椤栨氨鐤€闂傚倸鐗婄粙鎰姳閼测晝纾藉ù锝堟閻撴劖鎱ㄥΟ绋垮婵″弶鍔欓獮妯兼嫚閼碱剦妲伴梻浣稿暱閹碱偊宕愭繝姣稿洭寮舵惔鎾存杸濡炪倖姊婚妴瀣啅閵夛负浜滄い鎾跺仜濡插鏌i敐鍥у幋妤犵偞甯¢獮瀣籍閳ь剟鎮楁繝姘拺閻熸瑥瀚崕妤呮煕濡 鍋撻悢鎻掑緧婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缁炬儳顭烽弻鐔煎礈瑜忕敮娑㈡煃闁垮鐏﹂柕鍥у楠炴帡宕卞鎯ь棜缂傚倸鍊风粈渚€藝闁秴鏋佸┑鐘虫皑瀹撲線鏌涢埄鍐姇闁稿﹦鍏橀弻娑樷攽閸℃浼€濡炪倖姊归崝鏇㈠煘閹达附鍊婚柛銉㈡櫇鏍¢梻浣告啞閹稿鎮烽敂鐣屸攳濠电姴娲﹂崵鍐煃閸濆嫬鏆熼柨娑欑矒濮婇缚銇愰幒鎴滃枈闂佸憡鐟ユ鎼佸煝閹炬枼鍫柛顐ゅ枔閸樻悂鏌h箛鏇炰户缁绢厼鐖煎畷鎴﹀箻鐠囪尙鐤€婵炶揪绲介幉锟犲磹椤栫偞鈷戠痪顓炴噹娴滃綊鎮跺☉鏍у姦闁糕斁鍋撳銈嗗笒閸燁偊鎯冨ú顏呯厸濞达絽婀辨晶顏堟煃鐟欏嫬鐏撮柟顔界懇瀵爼骞嬮悩杈敇闂傚倷绀佸﹢杈ㄧ仚闂佺濮ょ划搴ㄥ礆閹烘绫嶉柛顐ゅ枎娴犺櫣绱撴担鍓插創妞ゆ洘濞婇弫鍐磼濞戞艾骞堥梻浣告惈濞层垽宕濆畝鍕€堕柣妯肩帛閻撴洟鏌熼懜顒€濡煎ù婊勫劤閳规垿鏁嶉崟顐℃澀闂佺ǹ锕ラ悧鐘茬暦濠靛鏅濋柍褜鍓熼垾锕傚锤濡も偓閻掑灚銇勯幒宥堝厡缂佺姴澧介埀顒€鍘滈崑鎾斥攽閻樿京绐旈柛瀣殔閳规垿顢欑涵鐑界反濠电偛鎷戠徊鍨i幇鏉跨闁瑰啿纾崰鎾诲箯閻樼粯鍤戦柤绋跨仛濮f劙姊婚崒姘偓鐑芥嚄閼哥數浠氭繝鐢靛仜椤曨參宕楀Ο渚殨妞ゆ劑鍊栫€氭氨鈧懓澹婇崰鏍р枔閵婏妇绡€闁汇垽娼ф牎缂佺偓婢樼粔鐟邦嚕閺屻儱绠甸柟鐑樼箘閸炵敻鏌i悩鐑橆仩閻忓繈鍔岄蹇涘Ψ瑜夐崑鎾舵喆閸曨剙纰嶅┑鈽嗗亝缁诲倿锝炶箛娑欐優闁革富鍘鹃敍婊冣攽閳藉棗鐏犻柟纰卞亰閿濈偛顓奸崶鈺冿紳婵炶揪缍侀ˉ鎾诲礉瀹ュ鐓欑紒瀣仢閺嗛亶鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷鎴濆暟妤犲洭鎮楃憴鍕碍缂佸鎸抽垾鏃堝礃椤斿槈褔鏌涢埄鍏狀亪妫勫鍥╃=濞达絽澹婇崕鎰版煕閵娿儱顣崇紒顔碱儏椤撳吋寰勭€n亖鍋撻柨瀣ㄤ簻闁瑰搫绉堕ˇ锔锯偓娈垮枛閻忔繈鍩為幋锕€鐓¢柛鈩冾殘娴狀垶姊洪崨濠庣劶闁告洦鍙庡ú鍛婁繆閵堝繒鍒伴柛鐕佸灦瀹曟劙宕归锝呭伎濠碘槅鍨抽崢褎绂嶆ィ鍐╁€垫慨妯煎亾鐎氾拷

核心提示:4.9.2 使用动作可以从组件面板的Standard页将动作列表加入窗体或数据模块,双击动作列表可显示ActionList编辑器,C++ Builder 使用动作,在其中可增加、删除或重排动作,每个动作的属性(Name除外)值都将应用于其客户控件,OnUpdate事件处理程序在应用程序空闲时执行,若事件处理程序需要太多
4.9.2 使用动作
可以从组件面板的Standard页将动作列表加入窗体或数据模块。双击动作列表可显示ActionList编辑器,在其中可增加、删除或重排动作。每个动作的属性(Name除外)值都将应用于其客户控件。可在对象观察器中设置每个动作的属性。Name定义动作,而其他属性与事件(Caption、Checked、Enabled、HelpContext、Hint、ImageIndex、ShortCut、Visible和Execute)则对应于客户控件的属性。它们通常(不一定全是)和客户属性同名。例如动作的Checked属性对应于TToolButton的Down属性。
1.集中处理程序代码
所有控件都包括一个公共的属性Action,它使控件可作为动作对象的客户使用。一般用做动作对象的客户的控件,如TToolButton、TSpeedButton、TMenuItem和TButton会发布Action属性以便可在设计时建立客户/动作的关系。当为动作列表的某个动作设置Action属性时,动作的对应属性值将复制到客户控件中。动作对象的所有公共属性与事件(除Name和Tag之外)都动态地链接到客户控件。例如,当需要禁用按钮和菜单项时,可将相应的程序代码集中在动作对象内,而不必去为按钮和菜单项重复编制程序代码;这样,当动作被禁用时,所有对应的按钮和菜单项都会被禁用。
注重 假如使用工具按钮或菜单项,必须用手工方式将对应的工具栏或菜单组件的Images属性设置为动作列表的Images属性。即使ImageIndex属性已动态地链接到客户,也必须如此。
2.链接属性
当设置了客户的Action属性后,建立了客户控件和动作之间的链接。这种链接由客户的动作链接治理,它可将客户的属性与动作的属性关联起来。当动作改变时,动作链接更新客户属性。
可有选择地重载客户的某一属性与相关动作对应属性的链接。在设计时设置客户的某值,只影响该属性的链接,客户的属性改变,而相关动作对应的属性值不变,客户与相关动作其他的链接也不受影响。应用程序并不需要显式处理动作链接来使用动作。动作链接自动治理客户与动作相应属性的链接。
每个独立的客户控件都使用不同的动作链接类,每个类中都有一组可用于与动作链接的属性。
注重可通过查阅VCL参考的动作链接类部分来决定要与动作链接的客户控件的属性。
3.执行动作
当客户组件或控件被按下之后,其相关动作的OnExecute事件将会发生。下列程序代码介绍的
OnExecute事件处理程序,可在动作执行时显示或隐藏工具栏:

当用户点击客户控件时,客户会为其相关动作生成OnExecute事件。若该事件存在事件处理程序,用户点击动作将直接被处理。除非需要与其他事件处理程序共享代码或编写定制的、可重用的动作,否则只需加入动作到动作列表,设置其属性,编写OnExecute事件处理程序代码,并通过设置Action属性将其与所有相关控件链接。
若要编写一个事件处理程序包含对多个动作的响应,可编写一个响应动作列表甚或应用程序层的事件处理程序。C++Builder遵循一个分发流程以搜索响应用户动作的方法。
考虑一个例子,组件显示在图4-11中。客户Speedbutton1链接Cut1动作(Speedbutton1的Action属性为Cut1)。图4-11显示当用户单击Speedbutton1后的发送(dispatching)流程。

1) 因为Speedbutton1的Action属性为Cut1,Cut1接收到OnExecute事件,若Cut1存在OnExecute事件处理程序,进程在此终止。若Cut1不存在OnExecute事件处理程序,则进程继续。
2) 因为Cut1不存在OnExecute事件处理程序,流程顺延由其动作列表(ActionList1)处理事件。ActionList1接收到OnExecute事件(动作列表的OnExecute事件,在其中任一动作没有OnExecute事件处理程序用以处理事件时发生),动作列表的OnExecute事件处理程序有一参数Handled,其缺省返回值为false,若处理程序存在并处理了事件,返回true,且进程在此终止。
例如:

若动作列表的OnExecute事件未被处理,则进程继续。
3)全局对象application接收到OnActionExecute事件(该事件在应用程序中所有的动作列表都无法处理事件时发生),与动作列表的OnExecute事件处理程序相同,OnActionExecute事件处理程序也有一参数Handled,其缺省返回值为false。若处理程序存在并处理了事件,返回true,且进程在此终止。例如:

4)对于可用事件处理程序响应的动作,进程到此终止。但对于预定义的动作类,如Cut1,则进程并未结束。你可使用内置的动作类或自行生成知道如何确定目标的动作类(如编辑控件)。当所有层次都未发现事件处理程序时,应用程序将试图搜索动作执行的目标,当应用程序找到哪个动作知道如何定位的目标时,将激活动作。参见4.9.4节的“动作如何搜索其目标”可获得关于应用程序如何找到那些预定义的动作类的目标的更多内容。
4.更新动作
当应用程序空闲时,所有与当前正显示的控件或菜单链接的动作的OnUpdate事件发生。这给应用程序代码集中处理提供了可用与禁用或复选与否等等的时机。例如,下列代码举例说明当菜单栏可见时OnUpdate处理动作的“复选”的事件处理程序。

更新动作的分发流程与本节中讨论的“执行动作”中的分发流程相同。
警告 不要把费时的代码加到OnUpdate事件处理程序中。OnUpdate事件处理程序在应用程序空闲时执行。若事件处理程序需要太多时间,会影响整个应用程序的执行。
更多精彩
赞助商链接