我利用FindWindowEx 查找到了Button 的 Handle 我用EnableWindow(Handle,True); 想让Enable为false  的按键变为Enable为true 如果Button的类是TButton 这种操作是没有问题的但是如果Button的类是TRzButton 这种操作不起作用如果使用SendMessage 改变TRzButton的Caption 是起作用的.想请问这是什么原因,为什么Enable 改变不过来? 有其它的办法吗? 非常感谢!

解决方案 »

  1.   

    就是为了防止这样随意修改Enabled属性,而进行的技术处理.
      

  2.   

    TGraphicControl继承下来的控件是没有Handle的。TRzButton 应该是吧
      

  3.   

    就是为了防止这样随意修改Enabled属性,而进行的技术处理.
    程序是有设计逻辑和业务逻辑的,不要随意去改变,否则得到的结果将会与本意相违背.
    顶了!
      

  4.   

    只是想研究一下,为什么这样不可以,难道没有其它办法了吗?或者说可以强制执行RzButton 的 Click 事件
    TRzButton 是有Handle 的,要不然怎么可以更改Caption 呢?
      

  5.   

    看过源码了,里面有一段procedure TRzCustomButton.CMEnabledChanged( var Msg: TMessage );
    begin
      if not Enabled and (Parent <> nil) then
        RemoveFocus( False );
      if HandleAllocated and not ( csDesigning in ComponentState ) then
        EnableWindow( Handle, Enabled );
      Invalidate;
    end;
    难道其它就没有什么办法了吗?
      

  6.   

    呵呵
    现在有点空闲时间,所以就研究一下WIN API 
      

  7.   

    有办法,自定义消息,外部程序向本程序发送,在本程序的消息处理中控制TRzButton的属性,
      

  8.   

    如果这样的话我就不用TRzButton 就可以了我是想知道如果使用TRZButton 外部程序该怎么操作
      

  9.   

    该按扭的Enable状态并不重要,直接发一个postmessage (按扭句柄,BM_CLICK,0,0);
      

  10.   

    我试过了,还试过SendMessage(按扭句柄,BM_CLICK,0,0);都是不行的
      

  11.   


    那你再试试这个:PostMessage(按扭句柄,WM_KEYDOWN,VK_RETURN,0);//在该句柄上按回车键
      

  12.   

    楼上的,如果已经Disabled, 这样的操作有可能被忽略。
    看过源码了,里面有一段 procedure TRzCustomButton.CMEnabledChanged( var Msg: TMessage ); 
    begin 
      if not Enabled and (Parent <> nil) then 
        RemoveFocus( False ); 
      if HandleAllocated and not ( csDesigning in ComponentState ) then 
        EnableWindow( Handle, Enabled ); 
      Invalidate; 
    end; 
    通过这个CM消息找到它处理的消息编号,再试试吧。