Iterator := ClientApi_CreateIterator(Binderhandle,[eDocument],eAll);
//创建一个迭代程序对象,在容器Binderhandle中查找文档实体,eDocument表示文档对象。
EntityHandle := ClientApi_GetFirstEntity(Iterator);//查找第一个文档实体。
StringList := TStringList.Create;//建立列表实体对象。
DocumentEntity := TDocumentEntity.Create(0);//建立文档实体对象。
While EntityHandle <> 0 Do//查找文件对象循环。
Begin
DocumentEntity.Handle := EntityHandle;//查找到的文件句柄赋予新建的文档实体句柄。
DocumentEntity.QueryDatabase(eGetState);//客户端内部服务器数据同步外部服务器数据。
StringList.Add('一个实体的抽象地址(Absolute address of an entity) = ' + DocumentEntity.FullAddress);
//把文档的完整抽象地址加到列表中。
EntityHandle := ClientApi_GetNextEntity(Iterator);//查找下一个对象。
End;
ClientApi_DestroyIterator(Iterator);//销毁迭代程序对象。
DocumentEntity.Free;//释放文档实体对象。
WriteToATextDocument(Binderhandle,StringList);//把容器中存在的所有文档抽象地址列表中内容输出到一个文本文件。
StringList.Free;//释放列表对象。
End;
这段代码做什么?
此代码片段中重要的函数。
|
ClientApi_CreateIterator |
ClientApi_GetFirstEntity |
|
ClientApi_GetNextEntity |
ClientApi_DestroyIterator |
|
MessageRouter_SendCommandToModule |
ClientApi_GetDocumentOwnerBinder |
|
MessageRouter_GetState_CurrentEditorWindow |
ClientApi_FindEntityByDataHandle |
|
AssignDDB |
这个例子显示如何输出查找结果到一个文本文档中。为实现输出,在DDB_StandardIO单元提供了AssignDDB函数。AssignFile把文件名称变量关联一个设计文档的抽象地址。
一个迭代程序被使用来从一个设计数据库中提取实体,对每一个提取到的实体,调用一个Querydatabase(eGetState)过程来同步数据,用DocumentEntity对象来提取实体对象的完整地址,此实体的抽象地址字符串被传递到一个StringList列表对象中。一旦所有的实体都被迭代程序对象抽取完毕,调用WriteToATextDocument过程,把当前打开文档所在的容器对象句柄Binderhandle和Stringlist列表对象作为参数传递,并输出列表中字符串内容到一个文本文件,文本文件的名称与当前打开的文档所属的容器(上级)名称相同,扩展名称为TXT。
6.3 改进迭代和显示程序例子
在容器中查找文档实体,查找到后把其完整抽象地址加到一个列表中,然后调用一个WriteToATextDocument过程把列表中内容输出到一个文本文件。此程序是把当前实体所在的容器,即上一级文件夹下所有的文档抽象地址信息输出。当前实体不同,输出结果可能不一样。
“迭代程序和显示例子”程序存在的问题是,必须要把当前DDB文档关闭再打开一次,才能看到输出的文本文档。能否直接在设计资源管理器中打开呢?
这个程序已解决输出文本文件显示问题。实现方法是通过在当前文档往上遍历整个DDB文件,直到找到最上一级。在最上一级执行刷新。
请见SDK例子\SAMPLES\NO2\API\Iterate and Show amend。
{....................................................................................}
//在一个循环中不断刷新当前新增实体,直到得到新增实体句柄,得到后中断退出。
Function WaitForCommit(BinderHandle : TObjectHandle; Docname : TString) : TObjectHandle;
Var
I : Integer;
Begin
Result := 0;
For I := 1 to 50 Do
Begin
ClientAPI_RepopulateDocumentEntity(BinderHandle,False);
//ClientApi_RepopulateDocumentEntity 过程在封装对象中刷新文档实体的内容依赖于Recursive参数值,如果参数为false,当前实体被刷新,否则实体的封装对象被刷新。它在当文档被增加到一个封装对象中您需要刷新封装对象来让设计资源管理器知道有新的文档时情况下很有用。
Result := ClientAPI_FindChildDocumentInBinder(Binderhandle,Docname);
//ClientApi_FindChildDocumentInBinder过程在容器Binderhandle查找文档Docname,查找到返回其句柄,否则返回零。
If Result <> 0 Then Break;//如果找到,则中断循环,找到表示新增加的文档句柄已得到,可以使用了。
WaitForSingleObject(GetCurrentThread,100);
//GetCurrentThread得到当前的线程
//WaitForSingleObject等待100毫秒。
End;
End;
{....................................................................................}
Procedure WriteToATextDocument(Binderhandle : TObjecthandle;StringList : TstringList);
Var
F : TextFile;//文本文档。
I : Integer;
S : TString;//抽象地址字符串。
NewTextDocHandle : TObjectHandle;//要新建的新的实体文件句柄。
DDBItem: TDDBItem;//项目实体。
AbsoluteString : TString;
BinderEntity: TEntity; //临时容器实体对象。
BinderParentHandle : ClientTypes.TObjectHandle;//父实体对象。
EntityHandle : ClientTypes.TObjecthandle;//实体对象。
Begin
EntityHandle :=
ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);
//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。
//ClientApi_FindEntityByDataHandle函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。
if EntityHandle = 0 then Exit; //如果无实体对象则退出。
ClientApi_GetDocumentEntityAbsoluteAddress(BinderHandle, S);
//把当前实体所在的容器实体即BinderHandle参数所指示的实体抽象地址赋予S。
DDBItem:= TDDBItem.Create('Admin',S);//根据S创建一个项目
DDBItem.Address.Offset.Name := ExtractFileNameFromPath(DDBItem.Address.Offset.Name) + '.TXT';
//输出文件名称。
AbsoluteString := DDBItem.Address.Offset.Name;
//输出文件名称赋予抽象地址变量AbsoluteString。
DDBItem.Address.EditorKind := 'TEXT';
//编辑器类型。
DDBITem.Address.Id := cUnassignedID;
DDBITem.Address.Attributes := 0;
DDBITem.Write;
//创建文件
ClearIOResult;
//ClearIOResult过程复位IOResult,IOResult返回最后的I/O操作执行状态。
AssignDDB(F,DDBItem.Address.AsParameters,'Admin');
//AssignDDB过程联合F到一个设计数据库的实体直到F被关闭为止。此过程调用常用于当
//您需要产生一个文本文件,通过在设计资源管理器中一个服务器作用输出文档。三个参
//数分别为文本文件、输出文件名称、用户ID号。
Rewrite(F); //写文件。
Writeln(F,'一个实体的所在的上级容器中包含的所有文档的抽象地址(Absolute address of an entity)');//向文本文件中输出内容。