好像只能用Dispaching 了。 
不过你可以捕获消息嘛,非要自己定义么?

解决方案 »

  1.   

    很简单,把你的TComponent封装到一个单独的线程中,然后保存线程的ID;其他的线程如果要发消息的话用PostThreadMessage就搞定,具体查WinAPI帮助。还有些注意事项:一个线程只有调用了任何一个USER或GDI的函数之后才会建立消息队列,你需要很巧妙地完成这个过程。
      

  2.   

    TO Nicrosoft:没有窗口为什么不能接收消息呢?那线程没有窗口,也能接收消息啊!TO 小海:如何捕获?TO eDRVIE:实际上我正是在解决子线程和主线程的通信问题,象你这样两个线程倒是好通信,
    但你的线程又如何与主线程通信呢?
      

  3.   

      线程间的通信,可以用消息队列,
      消息队列,顾名思义是一个队列,实现了特定的队列存取规则,windows的消息队列也是如此,
      你要的是一个自定义消息队列,又何必用作一个跟系统相关的呢?而且会跟系统消息有冲突。  自定义消息队列可以用stringlist来实现,只是存取的时候要进行必要的同步!
     
      

  4.   

    to EvilRoach: 子线程和主线程通信当然没有任何问题。提示你一下:主线程有没有Form?有没有窗体?有没有窗体句柄?为什么不用PostMessage?to airhorse: 其实不需要那么麻烦,用Windows本身的PostThreadMessage就非常方便,而且系统会自动避免所有潜在的访问冲突
      

  5.   

    由于不是继承于TWinControl,没有窗体,确实不能用PostMessage , SendMessage or Perform , 但是,由于你用了TTable的派生类,如果你是想改变控件一些方法的执行,完全可以
    捕获VCL继承类的消息。别忘了,VCL包含了大量的内部消息,这些内部消息往往以CM_打头(不同于SM_)可以管理VCL内部事务,如焦点,颜色,拖放等。我不知道你向捕获的是那方面的消息。
    不过你可以试试看帮助 "Component Writer" 部分,当然也可以查找消息方面的。
    具体捕获方法与系统消息的捕获无异,你该知道吧?
      

  6.   

    不过你也可以试一试PostThreadMessage,应该也可以.
    不过你用PostThreadMessage是有点要注意的: 最好建立一个消息队列,否则,如果返回值她不会在处理了,也会随带一个错误。 当然不见里消息队列也有办法:
    如果返回值失败 调用Sleep函数然后再次调用PostThreadMessage直到成功。
      

  7.   

    to eDRIVE(EncoreUneFois):
    >>to EvilRoach: 子线程和主线程通信当然没有任何问题。提示你一下:主线程有没有Form?有没有窗体?有没有窗体句柄?为什么不用PostMessage?
    >>to airhorse: 其实不需要那么麻烦,用Windows本身的PostThreadMessage就非常方便,而且系统会自动避免所有潜在的访问冲突同意eDRIVED的后一个意见,我也更倾向于使用系统消息机制,好处不言而喻!
    对于您的前一个提示,老兄,想想我是在作组件,总不能让我的每个组件用户都去改他们的FORM吧,那我作组件干吗?
      

  8.   

    to hpn_cao(小海):
    >>由于不是继承于TWinControl,没有窗体,确实不能用PostMessage , SendMessage or Perform , 但是,由于你用了TTable的派生类,如果你是想改变控件一些方法的执行,完全可以
    >>捕获VCL继承类的消息。别忘了,VCL包含了大量的内部消息,这些内部消息往往以CM_打头(不同于SM_)可以管理VCL内部事务,如焦点,颜色,拖放等。我不知道你向捕获的是那方面的消息。
    >>不过你可以试试看帮助 "Component Writer" 部分,当然也可以查找消息方面的。
    >>具体捕获方法与系统消息的捕获无异,你该知道吧?
    其实,你说的这些“内部消息”都是通过Dispatch来传诵的,而我们现在正是不能使用Dispatch(因为多线程问题)。>>不过你也可以试一试PostThreadMessage,应该也可以.....
    我需要接受消息的对象是一个组件,你在另一个线程中怎么用PostThreadMessage向它发消息?
    PostThreadMessage只有几个参数:ThreadID,MessageID, wParam, lParam。
    Application收到你的消息之后,怎么就知道应该把这个消息送给我的组件?
      

  9.   

    我曾经在LMD的源程序中发现一些解决这类问题的办法,而且和你的情况完全相同(非WinControl组件接受消息)
    它的解决方法是内部生成一个隐含窗口实例(用API的CreateWindowEx),在窗口处理函数中完成消息Dispatch的功能,对外部而言(或者是对组件的其他部分),可以模拟给窗口发消息来完成。但是源程序的具体位置很早就遗忘了:(,所以我现在没法贴出来。不过看看LMD的源程序,很有帮助的。
      

  10.   

    哈哈哈哈!!!!
    我就是用的这个办法。
    而且非常简单,不用去看LMD的辕马。重新申明一个FORM类,比如叫TMsgForm,然后我的组件包括一个这样的TMsgForm对象,
    自始至终都不Show这个窗口,然后我想收什么消息就收什么消息。
    而且在我具体实现的代码中,TMsgForm不是继承自TForm,是TWinControl,已经足够了。还有哪位有高见呢?
      

  11.   

    to EvilRoach:
    幸亏你没有用FORM类继承,呵呵,否则拖泥带水又莫名其妙地让目标代码增大100多K可不是空想更好的方法就是CreateWindowEx,再加上一个窗口过程,加起来不会超过1K的代码,完成你的要求绰绰有余。