信息化 频道

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

例子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
相关文章