有一个对象a,当其中某个字段得到更新后立即通知对象b并把这个更新值传送给b,该怎么实现呢?

解决方案 »

  1.   

    看一下观察者模式,应该有帮助!
    TA=class
    private
      f1: integer;
    public
      procedure update_notify(b:TB);
    end;TB=class
    public
      procedure update_access(a:TA);
    end;procedure TA.update_notify(b:TB);
    begin
      b.update_access(self);
    end;procedure TB.update_access(a.TA);
    begin
      //接受到a对象了,随便变化吧!
      ...
    end;这样可以吗?累死我了,呵呵!
      

  2.   

    hehe,多谢,对这种模式略有耳闻,不过这个属于一对多吧,如果b类有很多实例,那么a更新会通知所有的b啊,我不想这样,我要有选择的,而且这种模式是不是a对象有任何的变化都会引起所有b的反应呢?
      

  3.   

    你可以设计在A类里面搞个对象列表,列出你要通知的对象,能够解决你的一对多问题!
    至于a对象变化之后调用update的实际,要看调用者,就是使用A对象的那个用户(UML图上的那个小人,哈哈),ok?
    另外,这个设计可以重构啊,我想如果你的要求真的很多,重构的方向可能会是观察者模式。
      

  4.   

    顶,我也遇到类似问题现在我是这样的实现,虽然达到一些效果,但不是我最想要的。你可以参考一下:unit TempMessageControl;interface
     uses
          Windows, Messages,SysUtils, Classes,Graphics,Controls,Forms,Dialogs,ExtCtrls;
    Const
      FmyMessage=WM_User+$346;
    type
      TMyControl   =   class(TPanel)
      private
         
      protected
          procedure   DoSome(Msg:TMessage);
          procedure   WndProc(var   Msg:TMessage);
      public
           FHandle:HWND;
          Constructor   Create(Aowner:TComponent);override;
          Destructor   Destroy;override;
          property    Handle:HWnd   read   FHandle;
          procedure   OnMyMessage(var Msg: TMessage); message FmyMessage;
      published end;procedure   Register;implementation
        
    procedure   Register;
     begin
       RegisterComponents('Samples',   [TMyControl]);
     end;
        
    {   TMyControl   }
        
    constructor   TMyControl.Create(Aowner:   TComponent);
     begin
       inherited Create(AOwner);
       FHandle:=Classes.AllocateHwnd(WndProc);
     end;destructor   TMyControl.Destroy;
     begin
        DeallocateHWnd(FHandle);
        inherited;
     end;procedure TMyControl.DoSome(Msg:TMessage);
    begin
     Caption:=Pchar(LongInt(MSg.LParam));
    end;procedure TMyControl.OnMyMessage(var Msg: TMessage);
    begin
       Caption:=Pchar(LongInt(MSg.LParam));
    end;procedure   TMyControl.WndProc(var   Msg:   TMessage);
    begin
     try
       if   Msg.Msg=FMyMessage then
          OnMyMessage(Msg)
        else   msg.Result:=   DefWindowProc(FHandle,   Msg.msg,   msg.wParam,   msg.lParam);
      except
         Application.HandleException(Self);
      end;
     end;end.
    //在使用的时候发送消息procedure TForm1.Button1Click(Sender: TObject);
    var
     msg:TMessage;
    begin
      Msg.Msg:=WM_User+$346;
      Msg.WParam:=0;
      Msg.LParam:=LongInt(Pchar('已接收'));
      Msg.Result:=0;
      BroadCast(Msg); //子控件无法接收到
    end;