6. 源程序代码例子
6.1 前言
SDK提供一些源代码例子,来对在您设计资源管理器中的文档操作进行指导,再次强调,强列地建议您,不要用开发程序方式实际地创建一个设计数据库的新的记录或维护记录,即不要编写程序来在设计数据库中维护记录,除非您绝对地确信您知道您要做什么。所有的下面展示的例子,有一个共同目标,那就是给您作示范,如何来有效地使用强大的客户端API和Protel运行时间库。
有下列一些代码例子。
·“迭代并且显示”工程示范一个设计数据库的文档实体的抽象地址。项目在“\SAMPLES\NO2\API\Client\Iterate and Show”目录中。
·“Search and Open” 工程查找一个有文档名称的实体(不是一个抽象地址,然后打开设计实体)。项目在”\SAMPLES\NO2\API\Client\SearchAndOpenDocuments”目录中。
·“Import a document” 工程示范如何输入外部文件到一个设计数据库的文档实体。项目在“\SAMPLES\NO2\API\Client\Import External File”目录中。
·“Export a document” 工程示范如何把数据库中文档实体输出为外部文件。项目在“\SAMPLES\NO2\API\Client\Export a DDB document”目录中。
·“Report Schematic sheets” 工程示范了如何快速地查找原理图图表中是否有子图表,无需采取原理图API,此例子说明了一个TDDBItem类的ChildList字段的用途。项目在“\SAMPLES\NO2\API\Client\Report Child Schematic Sheets”目录中。
在此例子中方法的实现使用下列来自CSRTL运行时间库包单元之一:
迭代程序Iterators(ClientProcs 单元)。
AssignDDB 函数(DDB_StandardIO 单元)。
DDB_ImportFile函数(DDB_Import单元)。
DDB_ExportToFile(DDB_Export单元)。
DDBItem.ChildList和Streaming 函数(DDB_Item单元)。
6.2 迭代和显示程序例子
此代码例子把当前打开的文档所在的容器名称作为输出文本文件的名称,扩展名称为TXT,创建一个文本文件,文本文件中存放在当前打开的文档所属容器中,所有的实体文档的抽象地址。
请见SDK例子\SAMPLES\NO2\API\Client\Iterate and Show。
{................................................................................}
Procedure WriteToATextDocument(Binderhandle : TObjecthandle;StringList : TstringList);
Var
F : TextFile;//文本文档。
I : Integer;
S : TString;//抽象地址字符串。
DDBAddress : TDDBAddress;//抽象地址对象。
Begin
ClientApi_GetDocumentEntityAbsoluteAddress(BinderHandle, S);
//把实体BinderHandle的抽象地址赋予抽象地址字符串S。
DDBAddress := TDDBAddress.Create(S);
//根据抽象地址字符串S来创建一个抽象地址对象。
DDBAddress.Offset.Name := ExtractFileNameFromPath(DDBAddress.Offset.Name) + '.TXT';
//ExtractFilenameFromPath函数提取DDBAddress.Offset.Name字符串中文件名称和扩展名称。
//文本文档名称为抽象地址中偏移地址名称,但扩展名称为TXT。
ClearIOResult;
//ClearIOResult过程复位IOResult,IOResult返回最后的I/O操作执行状态。
AssignDDB(F,DDBAddress.AsParameters,'Admin');
//AssignDDB过程联合F到一个设计数据库的实体直到F被关闭为止。此过程调用常被用于当您需要产生一个文本文件时,通过在设计资源管理器中一个服务器作用输出文档。三个参数分别为文本文件、输出文件名称、用户ID号。
Rewrite(F); //写文件。
Writeln(F,'Absolute address of an entity');//向文本文件中输出内容。
Writeln(F,'-----------------------------');
For I := 0 To Stringlist.Count - 1 Do
Writeln(F,StringList.Strings[i]);
//把列表中内容输出到文本文件中。
Writeln(F);
CloseFile(F);//关闭文件。
ClientApi_RepopulateDocumentEntity(BinderHandle,False);
//ClientApi_RepopulateDocumentEntity 过程在封装对象中刷新文档实体的内容依赖于Recursive参数值,如果参数为false,当前实体被刷新,否则实体的封装对象被刷新。它在当文档被增加到一个封装对象中您需要刷新封装对象来让设计资源管理器知道有新的文档时情况下很有用。
DDBAddress.Free;//释放抽出地址对象。
End;
{................................................................................}
//主程序,在容器中查找文档实体,查找到后把其完整抽象地址加到一个列表中,然后调用一个WriteToATextDocument过程把列表中内容输出到一个文本文件。此程序是把当前实体所在的容器,即上一级文件夹下所有的文档抽象地址信息输出。当前实体不同,输出结果可能不一样。
Procedure FindEntitiesInDDB;
Var
EntityHandle : TObjectHandle;//当前窗体中实体句柄。
Iterator : TObjectHandle;//迭代程序对面。
BinderHandle : TObjectHandle;//容器句柄。
DocumentEntity : TDocumentEntity;//文本实体。
Stringlist : TStringList;//子图表列表。
Begin
EntityHandle :=
ClientApi_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);
//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。
//ClientApi_FindEntityByDataHandle函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。
If EntityHandle = 0 Then Exit; //如果无实体对象则退出。
BinderHandle := ClientApi_GetDocumentOwnerBinder(EntityHandle);
//得到当前实体对象的容器对象句柄。