解决方案 »

  1.   

    消息脱离窗体就啥也不是,TObject不是个窗体。继承它的子类需要整容,添加所有窗体必要的一切。
    其他的不说,你至少得整个窗体句柄出来,否则你如何发这个自定义消息。
    还是至少从TControl继承吧,别给自己找麻烦
      

  2.   

    TObject有个虚函数Dispatch用于发送消息,有个DefaultHandler用于接收消息。
    举个例子:type
      TChild = class(TObject)
        procedure MSG2000(var msg: TMessage); message 2000;
      end;implementationprocedure TChild.MSG2000(var msg: TMessage);
    begin
      ShowMessage('This is message 2000');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      child : TChild;
      msg: Integer;
    begin
      child := TChild.Create;
      msg := 2000;
      child.Dispatch(msg);
      child.Free;
    end;结果是弹出一个框,说明Delphi从TObject就支持消息机制
      

  3.   

    如果要句柄的话可以从wincountrol继承下来,或是用下面的代码uses
      Messages, Dialogs, Classes, Windows, SysUtils;
    const
      My_Message = WM_USER+100;
    type
       TMyObject = class(Tobject)
       private
         FHandle: Thandle;
         procedure CMmessage(var Message: TMessage); Message My_Message;
       protected
         procedure WndProc(var Message: TMessage); virtual;
       public
         constructor Create;
         destructor Destroy; override;
         property Handle: Thandle read FHandle write FHandle;
       end;implementation{ TMyObject }procedure TMyObject.CMmessage(var Message: TMessage);
    begin
      if Message.Msg = My_Message then
        ShowMessage(Format('消息:%d',[Message.Msg]))
      else
        Message.Result := DefWindowProc(FHandle, Message.Msg, Message.wParam, Message.lParam);
    end;constructor TMyObject.Create;
    begin
      FHandle := AlLocateHWnd(WndProc);
    end;destructor TMyObject.Destroy;
    begin
      DealLocateHWnd(FHandle);
      inherited;
    end;procedure TMyObject.WndProc(var Message: TMessage);
    begin
      Dispatch(Message);
    end;var
      MyObject: TMyObject;
    begin
      MyObject := TMyObject.Create;
      try
        SendMessage(MyObject.Handle,My_Message, 0, 0);
      finally
        MyObject.Free;
      end;
    end;
      

  4.   

    就像LS那样整容,注册窗体类、创建实例、添加窗体过程,加入消息循环,这些窗体必要的条件都整上去。
    不过写那么多东东完全没必要,从twincontrol继承就得了
    btw
    因为forms和classes单元都有AlLocateHWnd和DealLocateHWnd,而AlLocateHWnd、DealLocateHWnd最早定义在forms单元,默认是调用forms单元的,不过forms单元的AlLocateHWnd、DealLocateHWnd都都标记为废弃了的,而建议用classes单元的,所以最好明确指明
    classes.AlLocateHWnd(WndProc);
    classes.DealLocateHWnd(FHandle);
      

  5.   

    的确,消息因窗体而生。但TObject着实封装了消息