有一个对象a,当其中某个字段得到更新后立即通知对象b并把这个更新值传送给b,该怎么实现呢?
解决方案 »
- delphi 线段重叠
- 100分求教:DBGridEH中选中的行的某一列如何自动求和?
- 2个问题请教
- 计算字段数值
- 为什么我安装的控件都找不到.dcu文件呀
- D7+QReport做报表,如何让文字都躺倒打印?紧急
- 在动态生成控件时,如何做到像在Delphi环境下那样用鼠标来确定它的大小?
- Delphi ADO 连接 Excel 2010
- 如何使用QReport制作复杂报表
- 请问在delphi随机文件怎样读写?送分啦
- Delphi 是否能编写外挂,如何编写,有没有高手实现过的,请教?
- 在win2000中装的delphi7企业版,弹出"Delphi Help或 Delphi Tool"帮助的时候会"闪动"一下, 有人有解决办法吗?
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;这样可以吗?累死我了,呵呵!
至于a对象变化之后调用update的实际,要看调用者,就是使用A对象的那个用户(UML图上的那个小人,哈哈),ok?
另外,这个设计可以重构啊,我想如果你的要求真的很多,重构的方向可能会是观察者模式。
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;