<连载>Protel二次开发从入门到精通

--正文篇——第七章第10节

发表时间:2007-9-9  特约撰稿人: 张浩 白二平 来源:e-works
本服务器根据用户在定制进程菜单时所输入的参数来产生一个不同格式的网络连线表。此服务器是本章中难度最大的一个服务器,如果您没有读第9小节,建议您先搞清楚第9小节后再来读本小节。作者邮箱:bullzhanghao@yahoo.com.cn 如有疑问,可直接与作者联系!
10. 创建网络连线表
10.1 服务器功能

本服务器根据用户在定制进程菜单时所输入的参数来产生一个不同格式的网络连线表。此服务器是本章中难度最大的一个服务器,如果您没有读第9小节,建议您先搞清楚第9小节后再来读本小节。

用户输入的参数格式可以为以下两种格式:

RunMode = Hierachical

RunMode = Flat

这两种不同的格式表示产生的网络连线表格式不同。如果没有输入参数默认的格式为Flat。

在第三章中,我们曾学习过如何从当前原理图中提取出元器件清单。本小节,让我们学习一种新的实现方法,功能也是从原理图中提取数据。但此进程的实现与前面章节有些不同,前面章节主要是利用SCH、Client、RTL API来实现,本小节使用的API是用从AdvSch.dll文件中直接暴露的函数或过程,采用的是底层调用。

此服务器提供从当前原理图的顶层父原理图开始,遍历此原理图种下属原理图,其它文件夹中的原理图不被处理。

请见代码例子\SAMPLES\NO7\Servers\CreateNetListServer。

AdvSch.dll文件中直接暴露的函数或过程清单在\SAMPLES\NO7\Servers\CreateNetListServer目录下的“AdvSch.dll输出的过程和函数.txt”文件中。

10.2 代码分析
10.2.1 main单元

这个main单元中很简单,定义了TCreateNetListServerModule类,此类从TServerModule类继承。此类实现CreateServer和DestroyServer方法,在CreateServer中,创建类的实例并加载命令表。在GetState_ModuleName函数中,设置服务器的名称。

1.设置服务器名称。

Function TCreateNetListServerModule.GetState_ModuleName : String;

Begin

Result := 'CreateNetList';

End;

2.构造方法

Procedure CreateServer;

Begin

ServerModule :=TCreateNetListServerModule.Create;

LoadCommandLauncherTable;//加载命令启动表。

End;

LoadCommandLauncherTable定义在ComTable单元中。

10.2.2ComTable单元

在TCreateNetListServerModule类的CreateServer方法中,调用了LoadCommandLauncherTable过程。LoadCommandLauncherTable过程定义在单元ComTable中,过程增加了CreateNetList进程到命令表中,代码实现如下:

Procedure LoadCommandLauncherTable;

Begin

CreateCommandLauncherTable;

CommandLauncherTable_State_AddCommand('CreateNetList',@Command_CreateNetList);

SortCommandLauncherTable;

End;

10.2.3 Commands单元

在Commands单元中定义了Command_CreateNetList过程。

Procedure Command_CreateNetList(Window : TServerWindow; Parameters : PChar);

Var

SchematicServerHandle : THandle;//原理图服务器句柄。

S : TString; //从用户在定制菜单项时输入的参数块内容中检索中参数值。

RunMode : TRunModes; //产生连线表的模式。

Begin

SchematicServerHandle :=MessageRouter_ModuleHandle('Sch');

//MessageRouter_ModuleHandle函数返回指定名称模块的句柄,如果成功返回句柄,否则返回零值,当发送消息时,对此函数来说,目标服务器模块的句柄是必需的。返回原理图服务器的句柄,如果当前不是原理图,返回0。

If SchematicServerHandle = 0 Then //返回0表示当前服务器不是原理图。

Begin

ShowError('进程不能被完成,请启动原理图服务器并重试。');

Exit;

End;

NetListOptions := TNetListOptions.Create;//创建TNetListOptions类的实例。

SetAllProcAddresses(SchematicServerHandle);

//过程分配和类型转换所有的被原理图编辑器动态连接库所暴露的函数指针到实际的函数和过程。SetAllProcAddresses过程在NetApi单元中被定义,NetApi是开发protel软件中的源代码单元名称,现其被封装在dcp文件中。

If Getstate_Parameter(Parameters,'RunMode',S) Then

RunMode :=GetState_RunModeFromString(S);

//GetState_RunModeFromString根据S不同来返回不同的运行模式。从用户在定制菜单项时,在参数中所指定的参数块中检索是否有RunMode参数,如果有,把其值放置到S中。并根据从参数块中检索出的参数值来返回表示运行模式的字符串。GetState_Parameter函数从参数块中检索一个参数值,如果找到返回True,否则返回False,参数以一个空终止符结尾的数组形式被传递到进程中。文本格式为:Name1=Value1|name2=Value2|…|等等,此函数对大小写不敏感。

NetListOptions.SetState_Options;

//设置网络连接表对象的默认选项,默认的格式是eProtel,即输出格式是eRunModeFlat,而不是eRunModeHierachical。

If RunMode = eRunModeHierachical Then

NetListOptions.NetListFormat := eProtel_H;

//如果运行模式字符串是eRunModeHierachical,则把NetListOptions对象的NetListFormat属性设置为eProtel_H。

RunNetListGenerate(NetListOptions,Parameters);

//根据前面设置的网络连线表选项和用户在定制此服务器进程菜单项中输入参数来生成接连表。RunNetListGenerate定义在NetForms单元中。

End;

本文为e-works原创投稿文章,未经e-works书面许可,任何人不得复制、转载、摘编等任何方式进行使用。如已是e-works授权合作伙伴,应在授权范围内使用。e-works内容合作伙伴申请热线:editor@e-works.net.cn tel:027-87592219/20/21。

责任编辑:王阳