<连载>Protel二次开发从入门到精通
如果没有数据需要被传送,消息数据要么是一个指向一个数据结构的指针或一个c_NoEventData常量。软件开发者发送自定义的消息到PCB编辑器是可能的,然而内部机器将不响应自定义的消息,因为它们被设计为在PCB编辑器中仅响应预定义的PCB消息。一个消息ID号是Word类型,您必须声明一个自定义的Word类型消息,在当前PCB消息ID中,确保消息ID号不冲突,是您必须的责任,您能在PCBTypes单元中检测到已分配到PCB消息的常量值。
6.4.2如何扩展机器人链?
再说上面提到的模拟大家庭厦,这里有内部保姆机器人(厨房机器人、轻便小床机器人、车库机器人和地毯清洗机器人),现在此家庭想要雇用一个外部的监控机器人来在晚上保护住宅,那么,监控机器人仅响应 “我们离开此位置”的消息,并启动来监控住宅,一旦家庭在晚上外出,监控机器人则倾听指定的消息并且执行监控住宅任务。其它协助机器人完成不知道此任务,并且仅仅执行它们自己的任务。外部的记录监控机器人如其它内部机器人一样,监听所有的内部消息。
下图表示外部的监控机器人所连接到机器人的建造链表,外部机器人仅响应确定的消息。

图4-16 增加一个外部的机器人到PCB编辑器
外部机器人通过PCB API被连接到机器人系统。从图4-16中,外部机器人的优先级被设置为比所有已存在的内部机器人低,外部机器人通过回调机器人进程得到所有PCB消息。
为了创建一个外部的机器人,这里有您必须遵循的步骤,来创建并注册您的机器人到PCB编辑器中,首先,您必须在PCB内创建一个指定的机器人,以插件方式加入到消息系统,并且在相同时间连通您的机器人,通过调用函数PCBAPI_CreateRobot来完成,PCBAPI_CreateRobot返回机器人句柄,创建在PCB内。您必须提供一个机器人的名称、一个优先级和“机器人进程”地址,“机器人进程”将传送PCB消息到您的机器人,一个机器人进程必须有类型过程(Source, Destination : Pointer; MessageID : Word; Parameter : Pointer),它通过给定的消息传送所有携带的信息。下面例子显示了一般的机器人进程的例子。
然后您必须利用先前函数返回的句柄来创建您自己的机器人。这将连接您的机器人、在PCB内的机器人和进程内机器人。最后,通过注册机器人到系统中(调用RegisterWithSystem 和UnRegisterFromSystem),机器人被增到加到到机器人列表中。
PCBAPI_CreateRobot
|
参数 |
描述 |
|
Name |
表示一个外部机器人的名称。 |
|
ArobotProcedure |
ArobotProcedure是类型过程Procedure(Source, Destination : Pointer; MessageID : Word; Parameter : Pointer); |
|
Apriority |
设置一个在PCB编辑器的机器人系统中的机器人的优先级。 |
TPCBRobot 类
|
字段 |
描述 |
|
ObjectHandle |
表示一个机器人的句柄。 |
|
Name |
表示一个机器人的名称。 |
|
RobotProcedure |
表示PCB消息被传递到消息句柄的过程,这是一个回调函数。 |
|
方法 |
描述 |
|
RegisterWithSystem |
在PCB编辑器的机器人系统中注册一个机器人。 |
|
DeRegisterFromSystem |
在PCB编辑器的机器人系统中取消一个机器人的注册。 |
在下面见到代码片段中,我们看到了创造一个外部机器人的基本轮廓,外部机器人将会“钩”住PCB编辑器的机器人链。这个外部的机器人的优先级将会被设置来与在机器人列表中的所有机器人的优先级进行比较。
Implementation
Type
{................................................................................}
TMessageRobot = Class(TPCBRobot)//消息机器人从对象TPCBRobot(机器人)继承。
Procedure _OnBoardRego(Source : Pointer);
End;
{................................................................................}
Var
MessageRobot : TMessageRobot;//定义消息机器人变量。
{................................................................................}
Procedure TMessageRobot._OnBoardRego(Source : Pointer);
Begin
ShowInfo('做一些有趣的处理…(Doing something interesting...)');
//当图元被注册时做一些处理。
End;
{................................................................................}
Procedure RobotProcedure(Source, Destination : Pointer; MessageID : Word; Parameter : Pointer);
Begin
Case MessageID of
PCBM_BoardRegistration : MessageRobot._OnBoardRego(Source);
End;
End;
{................................................................................}
Procedure Command_RunRobotExample(Window : TServerWindow; Parameters : PChar);
Begin
End;
Initialization
MessageRobot := TMessageRobot.Create(
PCBApi_CreateRobot('Robot Example',RobotProcedure, 1000));
//PcbApi_CreateRobot函数使用给定的名称创建一个机器人,机器人过程抓取消息并且它的优先级设置被与在PCB编辑器机器人列表中的其它机器人的优先级比较。如果调用成功,则新的机器人的句柄被返回。
//TMessageRobot.Create创建一个消息机器人。
MessageRobot.RegisterWithSystem;
//注册机器人到在PCB编辑器的机器人列表中。
Finalization
MessageRobot.DeRegisterFromSystem;
//从PCB编辑器的机器人列表中删除此机器人。
MessageRobot.Free;//对象释放
End.
从此代码片段中,印制板图元消息处理被声明在TmessageRobot类中。此是独立的局部过程,RobotProcedure为回调过程,它捕捉所有PCB消息,然而,这里仅有一个消息处理者,印制板注册消息处理者,仅PCBM_BoardRegisteration消息将被此自定义的机器人“Robot Example”处理,此机器人的优先级为1000,因而任何优先级大于1000级别的机器人将被优先激活。