信息化 频道

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

  4. 客户端API函数和过程
  4.1实体迭代程序

迭代程序目的是提供顺序地访问一个集合对象单元的方法,无需暴露它的底层的表现。对于设计资源管理器的设计数据库,通过使用迭代程序提供了一个紧密的访问设计数据库实体的方法,无需跨越API来创建一个镜像数据库。迭代程序主要功能是通过数据库遍历来读取每一个实体对象,实体对象可以为文档、文档集合、项目和抽象实体。

  4.1.1 ClientApi_CreateIterator函数

声明(来自ClientProcs单元):

Function ClientApi_CreateIterator(ADesignEntity : TObjectHandle; AFilter : SetOfEntityId; AnIterationMethod : TClientIterationMethod) : TObjectHandle;

描述:

ClientApi_CreateIterator函数返回一个迭代程序对象的句柄。三个参数描述在下面的列表中。如果迭代程序不能被创建,函数返回值是空(nul)。如果设计实体的句柄是0,即ADesignEntity参数值是0,那么迭代程序将遍历在设计资源管理器中加载的所有设计数据库,您能从容器层或从一个文件夹层向下迭代,所以ADesignEntity句柄代表您希望来从哪里进行来迭代程序的处理。

参数

描述

ADesignEntity

表示一个设计实体的句柄。

AFilter

表示迭代程序机制要查找的实体的类型。

AnIterationMethod

表示要使用哪一个迭代程序方法:可用的方法有:eAll, eFirstLevelOnly和eBinderItems。

参见其它:

TObjectHandle类型

TClientIterationMethod类型

SetOfEntityId类型

ClientApi_DestroyIterator过程

  4.1.2 ClientApi_DestroyIterator过程

声明(来自ClientProcs单元):

Procedure ClientApi_DestroyIterator(AnIterator : TObjectHandle);

描述:

ClientApi_DestroyIterator过程销毁一个迭代对象。

参见其它:

TObjectHandle类型

ClientApi_CreateIterator函数

  4.1.3 ClientApi_GetFirstEntity函数

声明(来自ClientProcs单元):

Function ClientApi_GetFirstEntity(AnIterator : TObjectHandle) : TObjectHandle;

描述:

ClientApi_GetFirstEntity函数用给定的迭代程序句柄返回第一个查找到的实体,此函数将被在ClientApi_CreateIterator函数后和在ClientApi_GetNextObject函数前调用。

例子:

Var

DocumentName: String;//抽象地址字符串。

DocumentAddress: TDDBAddress;

Iterator: ClientTypes.TObjectHandle;

DocHandle: ClientTypes.TObjectHandle;

Begin

DocumentAddress := TDDBAddress.Create('');//建立一个地址对象。

Iterator:= ClientApi_CreateIterator(0, [eDocument], eAll);//建立对当前在设计资源管理器中打开的DDB进行迭代的迭代对象。

DocHandle := ClientApi_GetFirstEntity(Iterator);//查找第一个文档。

While DocHandle <> 0 Do

Begin

ClientApi_GetDocumentEntityAbsoluteAddress(DocHandle, DocumentName);

//ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档实体的绝对地址,绝对地址字符串赋值到DocumentName字符串变量。

DocumentAddress.Import_FromParameters(DocumentName);//把绝对地址字符串输入到DocumentAddress中,即表示DocumentAddress对象现成为迭代程序查找到的文档对象。

If StringsEqual(DocumentAddress.EditorKind, 'Sch') Then //如果文档对象的是原理图,DocumentAddress的EditorKind属性中存放文档的类型。

ShowInfo(DocumentAddress.Root.Name + ' 有一个原理图文档');

//DocumentAddress.Root.Name表示当前原理图所在的DDB包的名称。

DocHandle := ClientApi_GetNextEntity(Iterator);//查找下一个文档对象。

End;

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

DocumentAddress.Free;//释放DocumentAddress对象。

End;

此代码片段在设计资源管理器中所有打开的设计数据库中查找原理图文档。DocumentAddress对象是一个定义在DDB_Address单元中的TDDBAddress类,DDB_Address单元来自Protel 99运行时间库,TDDBAddress类提供了关于一个设计数据库中一个特定文档的信息,例如一个作为外部文档的OLE文档,并提供了此文档在它所属的设计数据库的有关位置信息,在此代码例子中,ClientApi_GetDocumentEntityAbsoluteAddress函数提取了文档的抽象地址并赋抽象地址字符串变量DocumentName,Import_FromParameters函数为TDDBAddress对象填充明细,然后再根据TDDBAddress对象的EditorKind属性来判断文档的类型。

参见其它:

TObjectHandle类型

ClientApi_GetDocumentEntityAbsoluteAddress函数

ClientApi_CreateIterator函数

ClientApi_GetNextObject函数

ClientApi_DestroyIterator函数

 

  4.1.4 ClientApi_GetNextEntity函数

声明(来自ClientProcs单元):

Function ClientApi_GetNextEntity(AnIterator : TObjectHandle) : TObjectHandle;

描述:

ClientApi_GetNextEntity函数通过给定的迭代程序句柄返回下一个查找到的对象句柄。

参见其它:

TObjectHandle类型

ClientApi_CreateIterator函数

ClientApi_GetFirstObject函数

ClientApi_DestroyIterator函数

  4.2 实体处理函数
  4.2.1 ClientApi_AddEntity过程

声明(来自ClientProcs单元):

Procedure ClientApi_AddEntity(AParent, AEntity : TObjectHandle; AnIconIndex : Integer);

描述:

ClientApi_AddEntity过程通过父(parent)句柄增加一个实体到设计数据库中,并显示在设计资源管理器的导航器面板中。AnIconIndex参数表示此实体对象图标的内部索引,设计资源管理器有一个按图标索引分类的图标列表。

例子:

Var

BinderHandle : TObjectHandle;//当前实体所在的容器的句柄。

EntityHandle : TObjectHandle;//当前实体句柄。

DesignEntity : TDocumentEntity;//程序临时所用文档实体。

ParentEntity : TObjectHandle;//父实体。

EntityId: TEntityID;//实体文档的类型。

Begin

EntityHandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

If Entityhandle = 0 Then Exit;//如果当前无实体则退出。

Binderhandle := ClientApi_GetDocumentOwnerBinder(EntityHandle);

//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。

ParentEntity := BinderHandle;//和到当前实体所在容器的句柄,赋予ParentEntity句柄。

EntityId:= eDocument;//实体的类型是文档型eDocument。

EntityHandle := ClientApi_CreateEntity(EntityId);//建立一个文档型实体。

DesignEntity := TDocumentEntity.Create(EntityHandle);//建立实体对象。

DesignEntity.Querydatabase(eGetState);//用内部服务器同步外部服务器数据,即对新建的文档对象初始化。

DesignEntity.EditorKind := 'Text';//文档为文本文件。

DesignEntity.Name := 'MyText';//名称名称为MyText。

DesignEntity.Querydatabase(eSetState);//用外部服务器新建的外部文档来同步内部服务器。

ClientApi_AddEntity(ParentEntity,EntityHandle,-1);//把新建的文档增加到设计数据库中,加到当前文档所在的容器中。

DesignEntity.Free;//释放文档

ClientApi_RepopulateDocumentEntity(EntityHandle,False);//刷新当前文档所在的容器。

End;

当您使用此代码例子时,实体被放置的位置与您在设计数据库中打开的是哪一层文档相关,实体将会被放置在当前实体所在的容器对象中,例如,如果文档文件夹被打开,那么此实体将被连同其它实体一起增加到文档文件夹中。

在您能传递要增加的实体对象的句柄给ClientAPI_AddEntity过程前,您需要创建一个实体对象并且分配编辑器种类和名称,如果您不想要指定一个图标,传递-1值,设计资源管理器将分配一个默认的图标。如果您想要使用您的服务器的图标,您需要调用能返回您的图标索引的函数ClientApi_RegisterEntityIcon。

当新的实体被加入后,ClientApi_RepopulateDocumentEntity被调用来刷新设计资源管理器的内容。

参见其它:

ClientApi_RegisterEntityIcon函数

ClientApi_Create 过程

ClientApi_DestroyEntity过程

  4.2.2 ClientApi_CreateEntity函数

声明(来自ClientProcs单元):

Function ClientApi_CreateEntity(AEntityID : TEntityId) : TObjectHandle;

描述:

ClientApi_AddEntity函数创建一个AEntityID参数所指定类型的实体对象,并返回实体对象的句柄。这里有两个实体类型,您可以创建并使用在设计资源管理器中,如果一个使用eNoEntity或eItem参数,那么一个抽象的实体被创建,如果使用一个eDocument参数,那么文档对象被创建。如果AEntityID参数是此三个值以外的其它值,ClientAPI_AddEntity将返回一个空值(nil)。

参见其它:

ClientApi_AddEntity过程

ClientApi_DestroyEntity过程

  4.2.3 ClientApi_DestroyEntity过程

声明(来自ClientProcs单元):

Procedure ClientApi_DestroyEntity(AEntityHandle : TObjectHandle);

描述:

ClientApi_DestroyEntity过程销毁实体对象。

参见其它:

ClientApi_CreateEntity过程

ClientApi_AddEntity过程

  4.2.4 ClientApi_QueryEntity过程

声明(来自ClientProcs单元):

Procedure ClientApi_QueryEntity(...);

描述:

ClientApi_QueryEntity过程依赖于查询模式(eGetState或eSetState)为实体返回或设置值,参见下表的过程的参数。当eGetState参数被传入,数据集被传出客户端到您的服务器中。当eSetState参数被传入,数据集从您的服务器被传入到客户端中。结果在您的服务器抽取了客户端服务器数据并修改后情况下,使您的服务器和客户端之间的数据完整性得到了保证,因而AModeQuery参数对确保从客户端到您的服务器的数据集同步得到了保证。

参数

类型

描述

AnEntityHandle

TObjectHandle

表示当前实体。

AModeQuery

TQueryMode

表示查询模式,对一个实体要么是eGetState取值或eSetState设置值。

AParentHandle

TObjecthandle

表示一个实体的上一层实体句柄。

AnEntityId

TEntityId

表示实体类型。

AOwnerDesign

TObjectHandle

表示到一个binder的句柄(是一个包含实体的容器)。

AKind

TString

表示编辑器种类。

AName

TString

表示实体名称。

AObjectHandle

TObjectHandle

表示窗体句柄。

参见其它:

TObjectHandle,TQueryMode和TEntityId类型

TEntity和TDocumentEntity类

  4.3 文档处理函数
  4.3.1 ClientAPI_CreateDocumentLoader函数

声明(来自ClientProcs单元):

Function ClientAPI_CreateDocumentLoader : TObjectHandle;

描述:

ClientAPI_CreateDocumentLoader函数在设计资源管理器内创建一个内部的列表,将通过过程ClientAPI_LoadDocument来管理文档的加载。当您使用完文档时,您必须调用过程ClientApi_DestroyDocumentLoader或ClientApi_DestroyDocumentLoaderEx来销毁此内部列表。

参见其它:

ClientAPI_LoadDocument

ClientApi_DestroyDocumentLoader

ClientApi_DestroyDocumentLoaderEx

  4.3.2 ClientApi_DestroyDocumentLoader过程

声明(来自ClientProcs单元):

Procedure ClientApi_DestroyDocumentLoader(DocumentLoader : TObjectHandle);

描述:

ClientAPI_DestroyDocumentLoader过程销毁一个通过ClientAPI_CreateDocumentLoader过程创建的内部列表。

参见其它:

ClientAPI_CreateDocument过程

ClientApi_LoadDocument过程

ClientApi_DestroyDocumentLoaderEx过程

  4.3.3 ClientApi_DestroyDocumentLoaderEx过程

声明(来自ClientProcs单元):

Procedure ClientApi_DestroyDocumentLoaderEx(DocumentLoader : TObjectHandle; Parameters : PChar);

描述:

ClientAPI_DestroyDocumentLoaderEx过程控制文档的工作情况,Parameter参数是以一个空(Null)终止字符串为结尾,此参数由一个名称和一个值组成,名称组成是“Action =”,其值有两个可能,View或Save来分别控制文档是查看还是保存。

例子:

...

GetMem(P,256);//申请一个内存。

SetState_Parameter(P,’Action’,’Save’);//动作为保存。

ClientAPI_DestroyDocumentLoaderEx(Loaderhandle,P);

FreeMem(P,256);//释放内存。

此代码片段在文档加载对象被销毁前保存文档,参数是一个空字符串结尾的字符串,因而,您需要从如“Action = View”或“Action = Save”来传递一个字符串,使用完参数后,需要释放为参数需分配的内存。

参见其它:

ClientAPI_CreateDocument过程

ClientApi_LoadDocument过程

ClientApi_DestroyDocumentLoader过程

  4.3.4 ClientApi_FindChildDocumentInBinder函数

声明(来自ClientProcs单元):

Function ClientApi_FindChildDocumentInBinder(ADocumentEntity : TObjectHandle; DocName : TString): TObjectHandle;

描述:

ClientApi_FindChildDocumentInBinder过程返回一个名称为Docname参数的文档,ADocumentEntity是包含容器的句柄,此函数作用是在ADocumentEntity句柄所表示的实体中查找名称为Docname的文档。

参见其它:

ClientApi_GetDocumentOwnerBinder函数

ClientApi_FindBinderFromAnyDataHandle函数

  4.3.5 ClientApi_FindDocumentByNameInSameFolder函数

声明(来自ClientProcs单元):

Function ClientApi_FindDocumentByNameInSameFolder(ADocumentEntity : TObjectHandle; DocName : TString): TObjectHandle;

描述:

ClientApi_FindDocumentByNameInSameFolder函数返回参考文件所在的相同文件夹中的文档实体的句柄,举个实际的例子,如果您知道一个文档存在于一个特定的文件夹中,且您需要在参考文件所在的相同文件夹内的其它文档的句柄,您需要调用此函数。

两个参数分别表示参考文档的句柄和想要查找的某个文档的名称。

例子:

Var

EntityHandle : TObjectHandle;//参照实体的句柄。

NewHandle: TOBjectHandle;//想要知道某文档的文档句柄。

Entity: TDocumentEntity;//临时文档实体对象。

Name: TString;//想要知道某文档句柄的文档名称。

Begin

EntityHandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

If Entityhandle = 0 Then Exit;//如果当前无实体则退出。

Entity := TDocumentEntity.Create(EntityHandle);//创建一个文档实体。

Entity.Querydatabase(eGetState);//用内部服务器数据同步外部服务器数据。

ClientApi_FindDocumentByNameInSameFolder(Entityhandle,Entity.Name);//得到当前实体的文档句柄。

NewHandle := ClientApi_FindDocumentByNameInSameFolder(Entityhandle,'Documents.rep');

//得到文档“Documents.rep”的实体句柄。

ShowInfo(Entity.Name + ' 有 ' + '实体句柄= ' + IntToStr(entityhandle) + '新文档句柄= '+IntTostr(newhandle));

Entity.Free;//释放实体。

End;

如果您有一个叫作“documents.rep”名称的文本文档在设计数据库中,此代码被在实体上激活后,您将得到两个不同的句柄,Entityhandle是当前在设计数据库中激活的实体,newhandle变量是“documents.rep”文档的句柄,现在,如果您在当前激活文档“documents.rep”上运行此代码,那么实体文件和新文档句柄值是相同的,在您已有一个文档的名称和参考文档的实体的句柄情况下,想要知道此文档实体的句柄时特别有用。

  4.3.6 ClientApi_FindDocumentInstanceAlreadyOpen函数

声明(来自ClientProcs单元):

Function ClientApi_FindDocumentInstanceAlreadyOpen(ADocumentEntity : TObjectHandle) : TObjectHandle;

描述:

ClientApi_FindDocumentInstanceAlreadyOpen函数查找已经在设计资源管理器中打开的设计文档,此函数检查文档窗体现在是否打开。此函数常在如果您有一个快捷键指向一个特定的文档,且您想要检查快捷键指向的文档是否已打开的情况下使用。然而,它能被使用在来检查一个特定的文档是否已被打开在一个窗体中,如果句柄返回值是零,意味着文档没有被打开。

  4.3.7 ClientApi_FindBinderFromAnyDataHandle函数

声明(来自ClientProcs单元):

Function ClientApi_FindBinderFromAnyDataHandle(ADataHandle : TObjectHandle) : TObjectHandle;

描述:

ClientApi_FindBinderFromAnyDataHandle函数使用一个数据句柄(可能是一个设计文档窗体或文档本身等等)来返回容器(binder)的句柄。

例子:

BinderHandle := ClientApi_FindBinderFromAnyDataHandle(DocumentWindowHandle);

ClientApi_RepopulateDocumentEntity(BinderHandle, False);

ClientApi_FindBinderFromAnyDataHandle函数从一个在设计资源管理器中的文档窗体句柄得到其容器的句柄,然后把容器的句柄传递到ClientApi_RepopulateDocumentEntity函数来刷新容器(binder)内容。

  4.3.8 ClientApi_FindEntityByStorageName函数

声明(来自ClientProcs单元):

Function ClientApi_FindEntityByStorageName(AAddress: TString; AFilter : SetOfEntityId) : TObjectHandle;

描述:

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

例子:

AbsAddress := DocumentEntity.GetAbsoluteAddress;//得到文档抽象地址。

...

EntityHandle := ClientApi_FindEntityByStorageName(AbsAddress, [eDocument]);

//根据抽象地址和文档种类查找实体。

If EntityHandle <> 0 Then //有实体

Begin

ClientApi_OpenDocumentEntity(EntityHandle, False);//打开实体。

ClientApi_SetAsCurrentDocument(EntityHandle);//设置为当前文档。

End;

这代码片段检索一个文档实体的句柄并且打开它,设置它是设计资源管理器中当前激活文档。

 

  4.3.9 ClientApi_FindEntityByDataHandle函数

声明(来自ClientProcs单元):

Function ClientApi_FindEntityByDataHandle(ADataHandle : TObjectHandle) : TObjectHandle;

描述:

ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。此实体可为设计资源管理器编辑器窗体内的一个文档。您能通过使用ClientAPI_QueryEntity 或ClientAPI_QueryDocumentEntity 查询此实体来检查文档类型,名称等等。

例子:

EntityHandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

MessageRouter_Getstate_CurrentEditorWindow函数从Protel 99运行时间库中获取在设计资源管理器中当前编辑器窗体的句柄。ClientAPI_FindEntityByDataHandle函数返回此窗体中打开的文档的句柄。

参见其它:

ClientApi_FindBinderFromAnyDataHandle函数

ClientApi_GetDocumentOwnerBinder函数

ClientApi_FindChildDocumentInBinder函数

  4.3.10 ClientApi_GetCurrentUserID过程

声明(来自ClientProcs单元):

Procedure ClientApi_GetCurrentUserID(AEntityHandle : TObjectHandle; Var UserID : TString);

描述:

ClientApi_GetCurrentUserID过程使用实体参数句柄返回一个有效实体的用户ID号字符串。用户ID号字符串是在一个设计数据库中工作的用户成员(如系统管理员、普通访客或一个指定的项目组成员)。

  4.3.11 ClientApi_GetDocumentEntityAbsoluteAddress过程

声明(来自ClientProcs单元):

Procedure ClientApi_GetDocumentEntityAbsoluteAddress(AEntity : TObjectHandle; Var AbsoluteStorageName : TString);

描述:

ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档实体的绝对地址。

一个绝对地址包含如下表按次序所显示的标识符。

标识符

备注

D>

表示数据库存储类型,能为MSACCESS或MSSQL数据库格式。

$RP

表示一个设计数据库的根路径。

$RN

表示一个设计数据库的根文件名称。

$OP

表示关于一个设计数据库的实体的偏移路径。

$ON

表示一个实体的偏移名称。

$ID

表示用户ID号(只读)。

$ATTR

表示一个项目的属性。属性能表现为:Shortcut、NoChildItem 、ActiveDoc、OLEDoc、LinkedOLEDoc标记。

$E

表示编辑器种类。

$STF

表示到一个文件的快捷键(一个到外部文件的连接,举例来说如在设计数据库外部的文件)

例子:

Entityhandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

ClientAPI_GetDocumentEntityAbsoluteAddress(Entityhandle, ddBAddressString);

//ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档实体的绝对地址,并把绝对地址赋予字符串变量ddBAddressString。

ShowInfo(ddBAddressString);//显示绝对地址字符串。

一个典型的设计数据库地址字符串看起来这个样子:

D>MSACCCESS:$RP>D:\Program Files\Design Explorer 99 SE $RN>MyDesign.ddb$OP>Documents$ON>Control.pcb$ID>65$ATTR>0$E>PCB$STF>

这个“MyDesign.ddb”设计数据库放在硬盘或网络“D:\Program Files\Design Explorer 99 SE”目录下。“Control.pcb”PCB文档放在此设计数据库“MyDesign.ddb”中的一个“‘Documents”文件夹下。

注意,以下这段代码是给定一个DDB文件名,从DDB文件中得到一般文件对象的完整路径和文件名称(Fullname),即全路径名称

Function GetNormalFileNamefromDDBFileName(DDBFileName : TString) TString;

Var

Address : TDDBAddress;

Begin

Result := DDBFileName;

If DDB_IsDatabaseFileName(DDBFileName) Then

Begin

Address := TDDBAddress.Create(DDBFileName);

//根据DDB文件名称创建一个绝对地址对象。

Result := Address.Root.Path + ‘\’ + Address.OffSet.Name;

//从绝对地址中取出文件全路径名称。

Address.Free;//释放地址对象。

End;

End;

此代码片段从一个实体的绝对地址中提取出一般的文件名称(Fullname)。

  4.3.12 ClientApi_GetDocumentKindDetails过程

声明(来自ClientProcs单元):

Procedure ClientApi_GetDocumentKindDetails(DocumentKind : PChar; Var IconName,ServeDLLPath : PChar);

描述:

ClientApi_GetDocumentKindDetails过程返回相关联的图标名称和特定文档种类的服务器DLL路径。

例子1:

请参见\SAMPLES\NO6\API\Client\GetDocumentKindDetails代码。

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

Var

EntityHandle : TObjectHandle;

Entity : TDocumentEntity;

DocumentKind : PChar;

IconName: PChar;

ServeDLLPath : PChar;

DocumentName : TChar;//文档实体的编辑器种类即文档的类型字符串变量。

Begin

EntityHandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

If Entityhandle = 0 Then Exit;//如果无实体则退出。

Entity := TDocumentEntity.Create(EntityHandle);//创建一个文档实体。

Entity.Querydatabase(eGetState);//用内部服务器数据同步外部服务器数据。

StrPCopy(DocumentName,Entity.EditorKind);//把文档实体的编辑器种类即文档的类型字符串赋予文档名称变量DocumentName。

GetMem(IconName ,255);//申请内存。

GetMem(ServeDllPath,255);

ClientApi_GetDocumentKindDetails(Documentname,IconName,ServeDLLPath);

ShowInfo(StrPas(IconName) + ' ' + StrPas(ServeDllPath));//显示编辑器的图标名称和DLL文件的完整路径。

FreeMem(IconName ,255);

FreeMem(ServeDllPath,255);

Entity.Free;//释放实体。

End;

此代码片段示范ClientApi_GetDocumentKindDetails处理来返回当前图标的图标和服务器的完整路径。例如,如果您有设计资源管理器在X:\Program Files\Design Explorer 99目录下并且容器文件夹被激活,此代码将显示图标名称为“FOLDER”和服务器完整路径与名称“X:\Program Files \Design Explorer 99\System\Binder.DLL”。

例子2:

Procedure GetState_IconFromFile(FilePath : TString; IconName : TString; Icon: TIcon);

//第一个参数是服务器DLL完整路径,第二个参数是图标的名称,第三个参数是图标对象。

Var

szPath: Array[0..255] Of Char;//服务器DLL文件的名称。

szIconName : Array[0..255] Of Char;//编辑器种类图标的名称。

hModule: THandle;

IconHandle : HIcon;

Index: Integer;

Begin

IconHandle := 0;

If Not FileExists(FilePath) Then Exit;//如果服务器DLL文件不存在,则退出。

StrPCopy(szPath , FilePath);//把服务器DLL文件的名称赋予szPath。

StrPCopy(szIconName, IconName);//把编辑器种类图标名称赋予szIconName。

hModule := LoadLibraryEx(szPath, 0, LOAD_LIBRARY_AS_DATAFILE);

//LoadLibraryEx函数影射一个指定的可执行模块到调用进程的地址空间,可执行模块可以是DLL或EXE,指定的模块如果有关联的其它模块,可会被影射。

IconHandle := LoadIcon(hModule, szIconName);

//函数从与应用事例关联的可执行模块中装载限定的图标资源。把图标名称为szIconName的图标装载

FreeLibrary(hModule);//释放装载到内存中的DLL文件。

If IconHandle = 0 Then

Begin

IconHandle := ExtractIcon(HInstance, szPath, 0);

// ExtractIcon函数从限定的可执行文件,动态链接库(DLL)或者图标文件中恢复图标句柄。

If IconHandle = 0 Then IconHandle := LoadIcon(HInstance, 'MainIcon');//如果还是找不到图标就用主图标MainIcon。

End;

If IconHandle = 0 Then Exit;

Icon.Handle := IconHandle;//把图标对象的句柄赋予Icon对象的Handle属性,即Icon对象现指向从服务器DLL文件中获取的图标文件的句柄。

End;

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

Procedure ExtractIcons;

Var

DocumentIcon : TIcon;//图标对象。

P1,P2 : PChar;//内存变量。

DocumentKind : TChar;//编辑器类型名称。

Begin

GetMem(P1,255);//申请内存

GetMem(P2,255);

DocumentIcon := TIcon.Create;//建立一个图标对象。

StrPCopy(DocumentKind,Addr.EditorKind);//把编辑器类型名称赋予文档种类。Addr是根据当前实体对象建立的地址对象。

ClientApi_GetDocumentKindDetails(DocumentKind,P1,P2); //把图标名称赋予P1,服务器DLL文件的完整路径赋予P2。

GetState_IconFromFile(StrPas(P2),StrPas(P1),DocumentIcon);//根据服务器DLL文件完整路径和编辑器种类名称把这种编辑器所对应的图标对象查找出来。

IconImage.Picture.Graphic := DocumentIcon;//显示编辑器的图标。

DocumentIcon.Free;//释放图标对象。

FreeMem(P1,255);

FreeMem(P2,255);//内存释放。

End;

此例子示范如何提取出一个服务器DLL模块中给定编辑器种类名称的图标,并且显示在一个图形对象中。IconImage变量是一个TImage图形对象,您可以分配服务器的图标给此图形控件。GetState_IconFromFile过程能做很多图形的抽取工作。

  4.3.13 ClientApi_GetDocumentOwnerBinder函数

声明(来自ClientProcs单元):

Function ClientApi_GetDocumentOwnerBinder(AEntity : TObjectHandle) : TObjectHandle;

描述:

ClientApi_GetDocumentOwnerBinder函数获得内部存有文档的封装对象的句柄,一个封装对象可表现为一个包含实体的容器,一个实体可表现为一个设计文档或文件。

例子:

Binderhandle := ClientApi_GetDocumentOwnerBinder(Entityhandle);

AnEntityHandle := ClientAPI_FindChildDocumentInBinder(Binderhandle,DocumentName)

//ClientApi_FindChildDocumentInBinder过程返回一个名称为DocumentName参数的文档,Binderhandle是包含容器的句柄。在Binderhandle句柄所表示的实体中查找名称为DocumentName的文档。

此代码片段示范如何得到一个文档所在的容器的句柄和通过此容器句柄,您可得到任何在此容器中的句柄。

参见其它:

ClientAPI_FindChildDocumentInBinder函数

ClientApi_FindBinderFromAnyDataHandle函数

  4.3.14 ClientApi_GetEditorKindByAddress过程

声明(来自ClientProcs单元):

Procedure ClientApi_GetEditorKindByAddress(Address : TString; Var EditorKind : TString);

描述:

ClientApi_GetEditorKindByAddress过程返回编辑器的种类(印制板PCB、原理图SCH、文本等等),编辑器的种类代表使用在设计资源管理器中控制文档服务器的种类。

例子:

Var

Entityhandle : TObjecthandle;//当前实体文档句柄。

Documentname : TString;//当前文档的绝对地址。

EditorKind : TString;//编辑器种类字符串。

Begin

EntityHandle :=

ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);

//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在项层在文档的窗体句柄。

//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。

If Entityhandle = 0 Then Exit;//如果当前没有文档则退出。

ClientApi_GetDocumentEntityAbsoluteAddress(EntityHandle, DocumentName);

//ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档实体的绝对地址。

ClientApi_GetEditorKindByAddress(Documentname, EditorKind);//根据文档的绝对地址来获取编辑器种类。

ShowInfo(EditorKind);//显示编辑器种类。

End;

此代码片段示范ClientApi_GetEditorKindByAddress如何工作来返回编辑器的种类字符串,如果您有一个文本文档打开在设计资源管理器中,并且您在此文档上执行此代码,此代码将显示一个“Text”,表示当前编辑器是文本服务器。(e-works)

0
相关文章