信息化 频道

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

本程序是一个使用一个参数进程在设计资源管理器中查找并打开一个设计文档的功能强大的例子。您仅需按下列格式应用参数字符串。

DocumentName1 = ‘’ | DocumentName2 = ‘’ ...

请见SDK例子\SAMPLES\NO2\API\Client\SearchAndOpenDocuments。

{....................................................................................}

//查找并打开文件

Procedure SearchAndOpenADocument(Filename : String);

Var

EnteredFileName : TString;

DocumentEntity : TDocumentEntity;//文档实体对象。

Iterator: ClientTypes.TObjectHandle;//迭代程序对象。

AbsoluteStorageName : TString;//抽象地址字符串。

EntityHandle : ClientTypes.TObjectHandle;//查找到的实体句柄变量。

Begin

AbsoluteStorageName := '';

EnteredFileName := Uppercase(FileName);//文件名称转换为大写。

Iterator := ClientApi_CreateIterator(0,[eDocument],eAll);

//建立迭代程序对象查找所有文档。

EntityHandle := ClientApi_GetFirstEntity(Iterator);

//查找第一个文档。

While EntityHandle <> 0 Do

Begin

DocumentEntity := TDocumentEntity.Create(EntityHandle);

//根据查找到的文档句柄建立文档对象。

DocumentEntity.QueryDataBase(ClientTypes.eGetState);//同步数据。

If EnteredFileName = UpperCase(DocumentEntity.Name) Then AbsoluteStorageName :=DocumentEntity.GetAbsoluteAddress;

//如果文档实体的名称与要查找的文档参数名称一样,即说明当前查找到的文档就是要找的文档。把查找到的文档实体的抽象地址赋予AbsoluteStorageName字符串。

EntityHandle := ClientApi_GetNextEntity(Iterator);//查找下一个文档实体。

End;

ClientApi_DestroyIterator(Iterator);//销毁迭代程序对象。

If AbsoluteStorageName = '' Then Exit;

//如果AbsoluteStorageName为空,说明没有找到与查找参数相同的文档实体对象,退出。

EntityHandle := ClientApi_FindEntityByStorageName(AbsoluteStorageName,

[eDocument]);

//ClientApi_FindEntityByStorageName函数使用一个实体的抽象地址和实体种类参数返回一个实体的句柄。

ClientApi_OpenDocumentEntity(EntityHandle,False);//在窗体中打开文档实体。

End;

{....................................................................................}

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

Var

Value : TString;

I : Integer;

Begin

i := 1;

While Getstate_Parameter(Parameters,'DocumentName' + GetStringFromInteger(i),Value) do

//从参数中一个一个地读取参数和参数值,直到完成。

Begin

SearchAndOpenADocument(Value);

Inc(i);

End;

End;

这段代码做什么?

这段代码片段中重要的函数和类。

ClientApi_CreateIterator

ClientApi_GetFirstEntity

ClientApi_GetNextEntity

ClientApi_DestroyIterator

DocumentEntity.Querydatabase(eGetstate)

GetAbsoluteAddress

在此例子中,参数字符串的输入可以按下列格式, “DocumentName1= XXX.YYY | DocumentName2 = AAA.BBB”…, XXX.YYY和AAA.BBB是文档名称,在进程,用一个While语句来提取每一个参数。只要您喜欢,您能够输入许许多多参数,不要忘记在每一组参数之间用“|”符号来间隔。

使用一个迭代程序读取每一个设计数据库中实体,读取到每一个实体名称与从进程参数提取的文件名称相比较,如果两个名称完全匹配,则DocumentEntity对象调用过程GetAbsoluteAddress来提取此实体的完整抽象地址,停止迭代程序执行,并且把抽象地址被传递到ClientAPI_FindEntityByStorageName函数,此函数根据实体的抽象地址和实体种类参数返回实体的句柄。

如果要查找的文档没有被打开,使用ClientAPI_OpenDocumentEntity函数来在窗体中打开设计文档。

此过程继续处理,直到所有进程参数被处理完,即完成所有的查找任务。

  6.5 查找并打开一个文档改进例子

此程序是对6.4程序的改进,主要是为了可靠地解决无论程序是在原理图编辑器还是在印制板、或文件夹,每次都能准确地查找并打开要查找的文档对象。

请见SDK例子\SAMPLES\NO2\API\SearchAndOpenDocumentsAmend。

{....................................................................................}

Procedure SearchAndOpenADocument(Filename : String);

Var

EnteredFileName : TString;

DocumentEntity: TDocumentEntity;//文档实体对象。

Iterator: ClientTypes.TObjectHandle;//迭代程序对象。

AbsoluteStorageName : TString;//抽象地址字符串。

EntityHandle : ClientTypes.TObjectHandle;//查找到的实体句柄变量。

Document: TObjectHandle;

AbsolutePath : TString;//查找到的文档的抽象地址路径。

DDBItem: TDDBItem;//查找到的文档通过建立临时项目方式取得一些信息。

Params: PChar;//传递给客户端服务器命令参数。

Begin

AbsoluteStorageName := '';

EnteredFileName := Uppercase(FileName);//文件名称转换为大写。

Iterator := ClientApi_CreateIterator(0,[eDocument],eAll);

//建立迭代程序对象查找所有文档。

EntityHandle := ClientApi_GetFirstEntity(Iterator);

//查找第一个文档。

While EntityHandle <> 0 Do

Begin

DocumentEntity := TDocumentEntity.Create(EntityHandle);

//根据查找到的文档句柄建立文档对象。

DocumentEntity.QueryDataBase(ClientTypes.eGetState);//同步数据。

If EnteredFileName = UpperCase(DocumentEntity.Name) Then

AbsoluteStorageName :=DocumentEntity.GetAbsoluteAddress;

//如果文档实体的名称与要查找的文档参数名称一样,即说明当前查找到的文档就是要

//找的文档。把查找到的文档实体的抽象地址赋予AbsoluteStorageName字符串。

EntityHandle := ClientApi_GetNextEntity(Iterator);//查找下一个文档实体。

End;

ClientApi_DestroyIterator(Iterator);//销毁迭代程序对象。

If AbsoluteStorageName = '' Then Exit; //如果抽象地址为空则退出。

//下面的代码与原有程序不同,请您仔细对照学习。

DDBItem:= TDDBItem.Create('Admin',AbsoluteStorageName);

//根据查找到的文档的抽象地址创建一个项目。

If DDBItem <> Nil Then

Begin

GetMem(Params,1024);//分配内存。

StrPCopy(Params,'FileName ='+ DDBItem.Address.Root.Path +'\'+ DDBItem.Address.Root.Name);

//合成命令参数"FileName=根路径+根名称",合成后,FileName是当前DDB包的全路径名称。

MessageRouter_SendCommandToModule('Client: OpenDocument',Params,255,0);

//把参数发送到客户端服务器,打开DDB包文档。

AbsolutePath := DDBItem.Address.AsParameters;

//查找到的文档的抽象地址路径。

Document := ClientApi_FindEntityByStorageName(AbsolutePath,[eDocument]);

//ClientApi_FindEntityByStorageName函数使用一个实体的抽象地址和实体种类参数返回一个实体的句柄。

ClientApi_OpenDocumentEntity(Document,False);//在窗体中打开文档。

ClientApi_SetAsCurrentDocument(Document);//置为当前激活。

Freemem(Params,1024);//释放内存。

End;

DDBItem.Free;//释放DDB对象。

End;

{....................................................................................}

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

Var

Value : TString;

I : Integer;

Begin

i := 1;

While Getstate_Parameter(Parameters,'DocumentName' + GetStringFromInteger(i),Value) do

//从参数中一个一个地读取参数和参数值,直到完成。

Begin

SearchAndOpenADocument(Value);

Inc(i);

End;

End;

0
相关文章