我把一个窗体封装里了一个DLL中,窗体类实现了一个接口,对外提供服务。
当我在别的程序中调用这个DLL窗体后,Dll窗体中的TActionManager里的标准action也就是standard action,便失去了做用,不知道有什么方法可以解决?
当我在别的程序中调用这个DLL窗体后,Dll窗体中的TActionManager里的标准action也就是standard action,便失去了做用,不知道有什么方法可以解决?
不把把窗体放在DLL中,当个动行期的控件来使用好不好??
我就做人一个小文本辑编器,由于好几个窗体都要用到,所以我把这个文本编辑器放在一个窗里做成一个DLL用的时候把这个窗体创建,指定这个窗体的parent属性后这个文本编辑器就跟个组件似的到了我想要的窗体里了。不知道这样做好不好??有没有什么弊端?
控件我还不是很会做,唉,我还是试试frame吧!
在StdActns单元,
你可以在里面设置上断点跟踪一下,
看是否执行到.
还有猛禽大哥,也大致说说您的学习经验吧。给我们这些新手指指路。
霹雳剑,也来谈谈吧。您以前对加速COM+创建时对我说的对象池化,当时没有很在意,因为不知道什么是对象池化。现在感觉对象池化好象很有用的。但我对对象池化这个词概念上不是很理解,您能再给我解释一下吗?
你说的那个是TApplication.Idle,我可认为不见得同它有关系。当你在主线程调用进程内COM的时候,DLL在你应用程序的进程空间,
在主进程里面已经存在了应用程序的消息循环,是不需要另外的处理。standard action往往是以输入焦点落在哪个控件上就针对哪个控件进行操作,
你从这方面也思考一下,看是否有关系。-----------------------------------------------------TActionList可以看作一个容器,放置一系列Action..(继承自TBasicAction),
设计期加入标准ACTION的时候,是从StdActns创建了相应的ACTION,
然后串行化存入DFM文档。这是从源码里面可以读出来的,静态的看源码和动态跟踪两方面结合着分析,
就会明白ACTIONLIST和ACTION两种东西是什么关系。呵,我走了点弯路,跟踪的
时候找了半天哪儿是标准ACTION情况的处理。。翻完了没有找到才想到它应该只是
设计期创建的。到运行期,各种ACTION没有多大区别。
不过触发ACTION的代码看起来比较繁锁,它用了几种方式触发。。
有直接事件方式,也有SENDMESSAGE方式。。不过都应该不会是你问题的原因。
因为每种ACTION具体处理不一样,你还是具体跟踪分析一下。
Application.Idle(const Msg: TMsg)的确就是Action的源泉,但我觉得
只要把一开始把Application传给了DLL ,就没问题了
procedure TApplication.DoActionIdle;
var
I: Integer;
begin
for I := 0 to Screen.CustomFormCount - 1 do
with Screen.CustomForms[I] do
if HandleAllocated and IsWindowVisible(Handle) and
IsWindowEnabled(Handle) then
UpdateActions;
end;你自己写一个方法,实现和上面一样,自己调用一下就可以了UpdateActions是TCustomForm的protected方法,你自己在自己的单元里是调用不了的
你可以这样:
type
TCustomFormAccess = class(TCustomForm);然后用TCustomFormAccess(Screen.CustomForms[I]).UpdateActions就可以调用了你试试吧,我也不知道到底行不行