1楼例子的完整代码如下:
unit MainForm;
interface
uses
Business.System, Business.Forms, Business.Model;
type
TMainForm = class(TForm)
GroupBox1: TGroupBox;
btnAddHandlerToGlobal: TButton;
edtGlobal: TEdit;
ckbGlobal: TCheckBox;
Label1: TLabel;
btnRemoveHandlerFromGlobal: TButton;
ApplicationEvents1: TApplicationEvents;
GroupBox2: TGroupBox;
Label2: TLabel;
Button1: TButton;
edtFunc: TEdit;
CheckBox1: TCheckBox;
Button2: TButton;
GroupBox3: TGroupBox;
Label3: TLabel;
Button3: TButton;
edtPerson: TEdit;
CheckBox2: TCheckBox;
Button4: TButton;
ActionList1: TActionList;
actGlobalAddHandler: TAction;
actGlobalRemoveHandler: TAction;
actGlobalHandled: TAction;
actFuncAddHandler: TAction;
actFuncRemoveHandler: TAction;
actFuncHandled: TAction;
actPersonAddHandler: TAction;
actPersonRemoveHandler: TAction;
actPersonHandled: TAction;
Button5: TButton;
actGlobalSendMessage: TAction;
Button6: TButton;
actGlobalBroadcastToParent: TAction;
actFuncSendMessage: TAction;
actFuncBroadcastToParent: TAction;
actPersonBroadcastToParent: TAction;
actPersonSendMessage: TAction;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
actGlobalBroadcastToChildren: TAction;
actFuncBroadcastToChildren: TAction;
actPersonBroadcastToChildren: TAction;
Button11: TButton;
Button12: TButton;
Button13: TButton;
aa: TNotebook;
Button14: TButton;
procedure actGlobalAddHandlerUpdate(Sender: TObject);
procedure actGlobalAddHandlerExecute(Sender: TObject);
procedure actGlobalRemoveHandlerUpdate(Sender: TObject);
procedure actGlobalRemoveHandlerExecute(Sender: TObject);
procedure actGlobalHandledUpdate(Sender: TObject);
procedure actGlobalHandledExecute(Sender: TObject);
procedure actFuncAddHandlerUpdate(Sender: TObject);
procedure actFuncAddHandlerExecute(Sender: TObject);
procedure actFuncRemoveHandlerUpdate(Sender: TObject);
procedure actFuncRemoveHandlerExecute(Sender: TObject);
procedure actFuncHandledUpdate(Sender: TObject);
procedure actFuncHandledExecute(Sender: TObject);
procedure actPersonAddHandlerUpdate(Sender: TObject);
procedure actPersonAddHandlerExecute(Sender: TObject);
procedure actPersonRemoveHandlerUpdate(Sender: TObject);
procedure actPersonRemoveHandlerExecute(Sender: TObject);
procedure actPersonHandledUpdate(Sender: TObject);
procedure actPersonHandledExecute(Sender: TObject);
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
procedure actGlobalSendMessageExecute(Sender: TObject);
procedure actGlobalBroadcastToParentExecute(Sender: TObject);
procedure actFuncSendMessageExecute(Sender: TObject);
procedure actFuncBroadcastToParentExecute(Sender: TObject);
procedure actPersonSendMessageExecute(Sender: TObject);
procedure actPersonBroadcastToParentExecute(Sender: TObject);
procedure actGlobalBroadcastToChildrenExecute(Sender: TObject);
procedure actFuncBroadcastToChildrenExecute(Sender: TObject);
procedure actPersonBroadcastToChildrenExecute(Sender: TObject);
private
{private declarations}
procedure SendMessage(AContext: TContext);
procedure BroadcastToParent(AContext: TContext);
procedure BroadcastToChildren(AContext: TContext);
public
{public declarations}
FGlobalHandler: TMyMessageHandler;
FPersonHandler: TMyMessageHandler;
FFuncHandler: TMyMessageHandler;
constructor Create(AContext: TContext);
end;
TMyMessage = class(TBizMessage)
private
FContext: TContext;
public
constructor Create(AName: String; AContext: TContext);
end;
TMyMessageHandler = class(TBizMessageHandler)
private
FText: String;
FHandled: Boolean;
public
procedure DoExecute(AMessage: TBizMessage; const AParam: THandleParam;
var Handled: Boolean); override;
end;
implementation
const
MsgName='MyMessage.Test';
constructor TMyMessage.Create(AName: String; AContext: TContext);
begin
inherited Create(AName);
FContext := AContext;
end;
procedure TMyMessageHandler.DoExecute(AMessage: TBizMessage; const AParam: THandleParam;
var Handled: Boolean);
var
s: String;
begin
case AParam.SendTo of
TSendToKind.stChildren: s := 'BroadcastToChildren';
TSendToKind.stParent: s := 'BroadcastToParent';
TSendToKind.stSelf: s := 'SendMessage';
else s := '[Unknown]';
end;
s := SysUtils.Format('%s'#13#10'消息由 %s 执行 %s 方法发送的。', [FText, TMyMessage(AMessage).FContext.IsolationLevel, s]);
Dialogs.Showmessage(s);
Handled := FHandled;
end;
constructor TMainForm.Create(AContext: TContext);
begin
inherited;
end;
procedure TMainForm.SendMessage(AContext: TContext);
var
msg: TMyMessage;
begin
msg := TMyMessage.Create(MsgName, AContext);
try
if AContext.SendMessage(msg) then
Dialogs.Showmessage('消息已经被处理!')
else
Dialogs.Showmessage('消息没有被处理!');
finally
msg.Free;
end;
end;
procedure TMainForm.BroadcastToParent(AContext: TContext);
var
msg: TMyMessage;
begin
msg := TMyMessage.Create(MsgName, AContext);
try
if AContext.BroadcastToParent(msg) then
Dialogs.Showmessage('消息已经被处理!')
else
Dialogs.Showmessage('消息没有被处理!');
finally
msg.Free;
end;
end;
procedure TMainForm.BroadcastToChildren(AContext: TContext);
var
msg: TMyMessage;
begin
msg := TMyMessage.Create(MsgName, AContext);
try
if AContext.BroadcastToChildren(msg) then
Dialogs.Showmessage('消息已经被处理!')
else
Dialogs.Showmessage('消息没有被处理!');
finally
msg.Free;
end;
end;
procedure TMainForm.actGlobalAddHandlerUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := FGlobalHandler=nil;
end;
procedure TMainForm.actGlobalAddHandlerExecute(Sender: TObject);
begin
if FGlobalHandler=nil then
begin
FGlobalHandler := TMyMessageHandler.Create;
FGlobalHandler.FText := '这是全局环境的Handler';
FGlobalHandler.FHandled := False;
end;
Context.GetParentContext(BizSys.IL_GLOBAL).AddMessageHandler(MsgName, FGlobalHandler);
end;
procedure TMainForm.actGlobalRemoveHandlerUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := FGlobalHandler<>nil;
end;
procedure TMainForm.actGlobalRemoveHandlerExecute(Sender: TObject);
begin
Context.GetParentContext(BizSys.IL_GLOBAL).RemoveMessageHandler(msgName, FGlobalHandler);
FreeAndNil(FGlobalHandler);
end;
procedure TMainForm.actGlobalSendMessageExecute(Sender: TObject);
begin
SendMessage(Context.GetParentContext(BizSys.IL_GLOBAL));
end;
procedure TMainForm.actGlobalBroadcastToParentExecute(Sender: TObject);
begin
BroadcastToParent(Context.GetParentContext(BizSys.IL_GLOBAL));
end;
procedure TMainForm.actGlobalBroadcastToChildrenExecute(Sender: TObject);
begin
BroadcastToChildren(Context.GetParentContext(BizSys.IL_GLOBAL));
end;
procedure TMainForm.actGlobalHandledUpdate(Sender: TObject);
begin
TACtion(Sender).Enabled := FGlobalHandler<>nil;
TAction(Sender).Checked := (FGlobalHandler<>nil) and (FGlobalHandler.FHandled)
end;
procedure TMainForm.actGlobalHandledExecute(Sender: TObject);
begin
if FGlobalHandler<>nil then
FGlobalHandler.FHandled := TAction(Sender).Checked;
end;
procedure TMainForm.actFuncAddHandlerUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := FFuncHandler=nil;
end;
procedure TMainForm.actFuncAddHandlerExecute(Sender: TObject);
begin
if FFuncHandler=nil then
begin
FFuncHandler := TMyMessageHandler.Create;
FFuncHandler.FText := '这是功能环境的Handler';
FFuncHandler.FHandled := False;
end;
Context.AddMessageHandler(MsgName, FFuncHandler);
end;
procedure TMainForm.actFuncRemoveHandlerUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := FFuncHandler<>nil;
end;
procedure TMainForm.actFuncRemoveHandlerExecute(Sender: TObject);
begin
Context.RemoveMessageHandler(msgName, FFuncHandler);
FreeAndNil(FFuncHandler);
end;
procedure TMainForm.actFuncSendMessageExecute(Sender: TObject);
begin
SendMessage(Context);
end;
procedure TMainForm.actFuncBroadcastToParentExecute(Sender: TObject);
begin
BroadcastToParent(Context);
end;
procedure TMainForm.actFuncBroadcastToChildrenExecute(Sender: TObject);
begin
BroadcastToChildren(Context);
end;
procedure TMainForm.actFuncHandledUpdate(Sender: TObject);
begin
TACtion(Sender).Enabled := FFuncHandler<>nil;
TAction(Sender).Checked := (FFuncHandler<>nil) and (FFuncHandler.FHandled)
end;
procedure TMainForm.actFuncHandledExecute(Sender: TObject);
begin
if FFuncHandler<>nil then
FFuncHandler.FHandled := TAction(Sender).Checked;
end;
procedure TMainForm.actPersonAddHandlerUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := FPersonHandler=nil;
end;
procedure TMainForm.actPersonAddHandlerExecute(Sender: TObject);
begin
if FPersonHandler=nil then
begin
FPersonHandler := TMyMessageHandler.Create;
FPersonHandler.FText := '这是人员环境的Handler';
FPersonHandler.FHandled := False;
end;
Context.GetParentContext(BizSys.IL_PERSON).AddMessageHandler(MsgName, FPersonHandler);
end;
procedure TMainForm.actPersonRemoveHandlerUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := FPersonHandler<>nil;
end;
procedure TMainForm.actPersonRemoveHandlerExecute(Sender: TObject);
begin
Context.GetParentContext(BizSys.IL_PERSON).RemoveMessageHandler(msgName, FPersonHandler);
FreeAndNil(FPersonHandler);
end;
procedure TMainForm.actPersonSendMessageExecute(Sender: TObject);
begin
SendMessage(Context.GetParentContext(BizSys.IL_PERSON));
end;
procedure TMainForm.actPersonBroadcastToParentExecute(Sender: TObject);
begin
BroadcastToParent(Context.GetParentContext(BizSys.IL_PERSON));
end;
procedure TMainForm.actPersonBroadcastToChildrenExecute(Sender: TObject);
begin
BroadcastToChildren(Context.GetParentContext(BizSys.IL_PERSON));
end;
procedure TMainForm.actPersonHandledUpdate(Sender: TObject);
begin
TACtion(Sender).Enabled := FPersonHandler<>nil;
TAction(Sender).Checked := (FPersonHandler<>nil) and (FPersonHandler.FHandled)
end;
procedure TMainForm.actPersonHandledExecute(Sender: TObject);
begin
if FPersonHandler<>nil then
FPersonHandler.FHandled := TAction(Sender).Checked;
end;
procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
if FGlobalHandler<>nil then
edtGlobal.Text := FGlobalHandler.FText
else
edtGlobal.Text := '[空]';
if FFuncHandler<>nil then
edtFunc.Text := FFuncHandler.FText
else
edtFunc.Text := '[空]';
if FPersonHandler<>nil then
edtPerson.Text := FPersonHandler.FText
else
edtPerson.Text := '[空]';
end;
end. |