我把一个窗体封装里了一个DLL中,窗体类实现了一个接口,对外提供服务。
当我在别的程序中调用这个DLL窗体后,Dll窗体中的TActionManager里的标准action也就是standard action,便失去了做用,不知道有什么方法可以解决?

解决方案 »

  1.   

    很少用ACTION。。看一下再说。
      

  2.   

    没碰过,不过一般来说,把窗体放到DLL里都是会有问题的,最好把主程序的APPLICATION的HANDLE传给DLL中APPLICATION的HANDLE,可以解决一部分问题
      

  3.   

    Action由Application来分发,把主程序的Application值传给DLL,就没问题了
      

  4.   

    我传了可是还不行,是把application传进去还是把Application.Handle传进去?这两个我都试了,都不行!!
    不把把窗体放在DLL中,当个动行期的控件来使用好不好??
    我就做人一个小文本辑编器,由于好几个窗体都要用到,所以我把这个文本编辑器放在一个窗里做成一个DLL用的时候把这个窗体创建,指定这个窗体的parent属性后这个文本编辑器就跟个组件似的到了我想要的窗体里了。不知道这样做好不好??有没有什么弊端?
      

  5.   

    我这里传递Application给DLL,DLL窗体的Action都正常我觉得你没必要搞 DLL,做成一个控件,或者Frame就行了
      

  6.   

    如果不是必须在运行期创建,完全可以用Frame
      

  7.   

    自己建的action是正常,但delphi提供的标准action,也就是standard action不正常。
    控件我还不是很会做,唉,我还是试试frame吧!
      

  8.   

    如果做成控件或frame的话,那岂不是每次我对这个编辑窗体的改变都会导致原程序重新编译后才能看到效果吗??我是想对编辑窗体改变后不想再去调用程序进行重新的编译了!还有没有别的方法?
      

  9.   

    那就放弃Standard Action,全部自己实现(应该也不是太复杂)
      

  10.   

    看了看Actionlist这东东,大致明白它是怎么回事,但还是想不明白你那儿为什么会出现STANDARD ACTION失效,,标准ACTION实际是预先定义好的一些ACTION类,
    在StdActns单元,
    你可以在里面设置上断点跟踪一下,
    看是否执行到.
      

  11.   

    我在delphi6从入门到精通中看到有一段注释写这方面的,可惜书忘家了,大致意思是说封装里dll的窗体的application无法维护他的消息,也就是说application.ldie(ldie可能拼错了,不过应该就这几个字母)没有被调用,只要手工用一个函数调用DLL窗体的application.ldie就行了,但书上并没有说怎么手工调用,用哪个方法来调用application.ldie!我查了application的方法,没有找到application.ldie。应该是有特定的函数来调用它的,但不知道是哪个函数?哈欠大哥,能介绍你下你的学习方法吗??ACtion我看了几天也只不过会基本的使用,你怎么会这么快知道他的来龙去脉的!!
    还有猛禽大哥,也大致说说您的学习经验吧。给我们这些新手指指路。
    霹雳剑,也来谈谈吧。您以前对加速COM+创建时对我说的对象池化,当时没有很在意,因为不知道什么是对象池化。现在感觉对象池化好象很有用的。但我对对象池化这个词概念上不是很理解,您能再给我解释一下吗?
      

  12.   

    你该不会是这个DLL注册进了组件服务吧?呵呵。
    你说的那个是TApplication.Idle,我可认为不见得同它有关系。当你在主线程调用进程内COM的时候,DLL在你应用程序的进程空间,
    在主进程里面已经存在了应用程序的消息循环,是不需要另外的处理。standard action往往是以输入焦点落在哪个控件上就针对哪个控件进行操作,
    你从这方面也思考一下,看是否有关系。-----------------------------------------------------TActionList可以看作一个容器,放置一系列Action..(继承自TBasicAction),
    设计期加入标准ACTION的时候,是从StdActns创建了相应的ACTION,
    然后串行化存入DFM文档。这是从源码里面可以读出来的,静态的看源码和动态跟踪两方面结合着分析,
    就会明白ACTIONLIST和ACTION两种东西是什么关系。呵,我走了点弯路,跟踪的
    时候找了半天哪儿是标准ACTION情况的处理。。翻完了没有找到才想到它应该只是
    设计期创建的。到运行期,各种ACTION没有多大区别。
    不过触发ACTION的代码看起来比较繁锁,它用了几种方式触发。。
    有直接事件方式,也有SENDMESSAGE方式。。不过都应该不会是你问题的原因。
    因为每种ACTION具体处理不一样,你还是具体跟踪分析一下。
      

  13.   

    我想也应该是别的问题,因为我这里standard action也正常的很
    Application.Idle(const Msg: TMsg)的确就是Action的源泉,但我觉得
    只要把一开始把Application传给了DLL ,就没问题了
      

  14.   

    关于COM+的对象池化,我想最好还是自己去看书,因为我也只是一般了解,怕我说错了反而误导你了
      

  15.   

    各位,到底调用什么方法可以去调application,不管是不是application.Idle的事,我都想在代码中加上它试一试,还望各位能告诉我怎么样启启用application.Idle
      

  16.   

    你可以这么试试,不需要启用Idle,因为Idle里和Action有关的应该就是下面的代码:
    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就可以调用了你试试吧,我也不知道到底行不行