张浩、白二平Protel二次开发从入门到精通(正文篇-第5章)
Protel二次开发从入门到精通 作者:张浩、白二平
(第五章)
第五章 Spread服务器API ............................................................................................................................ 260
1. 前言 ............................................................................................................................................................ 260
2. Spread服务器初始化函数 ....................................................................................................................... 261 2.1 SetupApiCalls过程 ....................................................................................................................... 261 2.2 SpreadAPI_GetCurrentSpreadHandle函数 ................................................................................. 261 2.3 SpreadAPI_GetSpreadHandleFromFileName函数 ....................................................................... 261
3. Spread 编辑器函数 .................................................................................................................................. 261 3.1 SpreadAPI_AddPageBreak过程 ............................................................................................. 261 3.2 SpreadAPI_AddSelection过程 ............................................................................................. 261 3.3 SpreadAPI_CancelEditMode过程 ......................................................................................... 262 3.4 SpreadAPI_Clear过程 ........................................................................................................... 262 3.5 SpreadAPI_ClearClipboardContents过程 ......................................................................... 262 3.6 SpreadAPI_Copy过程 ............................................................................................................. 262 3.7 SpreadAPI_CopyDown过程 ..................................................................................................... 263 3.8 SpreadAPI_CopyRight过程 ................................................................................................... 263 3.9 SpreadAPI_Cut过程 ............................................................................................................... 263 3.10 SpreadAPI_DefaultColors过程 ......................................................................................... 263 3.11 SpreadAPI_Delete过程 ....................................................................................................... 264 3.12 SpreadAPI_EndEditMode过程 ............................................................................................. 264 3.13 SpreadAPI_FormatCellAlignment过程 ............................................................................. 264 3.14 SpreadAPI_FormatColumn过程 ........................................................................................... 264 3.15 SpreadAPI_GetActiveCell过程 ......................................................................................... 265 3.16 SpreadAPI_GetCellValue过程 ........................................................................................... 265 3.17 SpreadAPI_GetCellValueType过程 ................................................................................... 265 3.18 SpreadAPI_GetColName过程 ............................................................................................... 265 3.19 SpreadAPI_GetLastCol过程 ............................................................................................... 266 3.20 SpreadAPI_GetlastRow过程 ............................................................................................... 266 3.21 SpreadAPI_GetRowName过程 ............................................................................................... 266 3.22 SpreadAPI_GetTabdelimitedText过程 ............................................................................. 266 3.23 SpreadAPI_Insert过程 ....................................................................................................... 266 3.24 SpreadAPI_InsertTabDelimitedText过程 ....................................................................... 267 3.25 SpreadAPI_JumpTo过程 ....................................................................................................... 267 3.26 SpreadAPI_Paste过程 ......................................................................................................... 267 3.27 SpreadAPI_PrintDocument过程 ......................................................................................... 268 3.28 SpreadAPI_RecalcDocument过程 ....................................................................................... 268 3.29 SpreadAPI_RemovePageBreak过程 ..................................................................................... 268 3.30 SpreadAPI_SaveTransaction过程 ..................................................................................... 268 3.31 SpreadAPI_SetActiveCell过程 ......................................................................................... 269 3.32 SpreadAPI_SetCellFormula过程 ....................................................................................... 269 3.33 SpreadAPI_SetCellNumericValue过程 ............................................................................. 269 3.34 SpreadAPI_SetCellText过程 ............................................................................................. 270 3.35 SpreadAPI_SetCellValue过程 ........................................................................................... 270 3.36 SpreadAPI_SetColumnName过程 ......................................................................................... 270 3.37 SpreadAPI_SetDefinedName过程 ....................................................................................... 271 3.38 SpreadAPI_SetRowName过程 ............................................................................................... 271
第 1 页
Protel二次开发从入门到精通 作者:张浩、白二平
3.39 SpreadAPI_SetSelection过程 ........................................................................................... 271
3.40 SpreadAPI_SetSelectionFromFormula过程 ..................................................................... 271
3.41 SpreadAPI_SetTopLeftText过程 ....................................................................................... 272
3.42 SpreadAPI_SetupPrinter过程 ........................................................................................... 272
....................................................................................... 272 3.43 SpreadAPI_ShowActiveCell过程
3.44 SpreadAPI_StartEditMode过程 ......................................................................................... 272
3.45 SpreadAPI_StartTransaction过程 ................................................................................... 273
3.46 SpreadAPI_StopTransaction过程 ..................................................................................... 273
3.47 SpreadAPI_UndoTransaction过程 ..................................................................................... 273
............................................................................... 274 3.48 SpreadAPI_UpdateAllDocuments过程
3.49 SpreadAPI_Zoom过程 ........................................................................................................... 274
4.例子代码 ...................................................................................................................................................... 274 4.1 输出印制板信息到电子表格 .......................................................................................................... 274 4.2 提取印制板元器件信息到电子表格 .............................................................................................. 281
第 2 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
第五章 Spread服务器API
1. 前言
Spread服务器是一个电子
自动化(EDA)服务器,此服务器把EXCEL电子表格软件功能拿到了设计资源管理器99环境中,Spread能被使用来准备一个项目预算,来编辑印制板网络列表或来创建一个物料清单(BOM),任何用户请求的电子表格处理软件任务都能被在Spread中执行。
Spread能被作为一个单独的电子表格处理编辑器来使用,兼容EXCEL 5.0,有读写EXCEL 5.0文件的能力,然而Spread也允许用户在不离开设计资源管理器环境下打开一个工作图表,因而,此工作与原理图和印制板设计可以是并行的。
当使用在通常的方式下时,数据能被
在
的列表表格中,格式、字体、公式、颜色和边框能被应用,单元能被存储,并且工作图表能被打印,然而,工作图表数据也能被通过使用一个宏或用户的动态连接库(DLL)来记录,这样,可平滑并无缝地在多种多样的EDA服务器之间传送数据,DLL能提取原理图元件信息,信息包括元件和库字段,可格式化数据并按任何预先设定的风格加载到一个Spread工作图表中。
Spread包括许多唯一的特征:
?在工作图表中最多有四个不同的视图。
?从一个视图移动或复制数据到其它视图。
?不受限制的格式选项,字体、排列、边框、格调。
?最快的数据放置和公式计算。
?支持元文件图片对象。
?用户定义的行和列抬头。
?用户为参考单元定义的名称。
?10%-400%显示和打印范围。
?数据的图形显示。
Spread API函数请求一个文档的句柄,文档在设计资源管理器99中被打开,这样在此文档上,能执行某些操作。
使用Spread API有关注意事项。
当您想要使用一个特定常量或一个类时,您需要增加相应的单元到您的服务器
代码的Uses子句中,例如,使用SetupApiCalls过程,您需要来增加SpAPI单元到Uses子句中,否则编译器将提示说找不到单元。
第 260 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 2. Spread服务器初始化函数
2.1 SetupApiCalls过程
声明(来自SpAPI单元):
Procedure SetupApiCalls;
描述:
当一个服务器调用SetupApiCalls过程时,此过程设置一个Spread API调用,接下来,此服务器Spread的功能就可以使用了。
2.2 SpreadAPI_GetCurrentSpreadHandle函数
声明(来自SpAPI单元):
Function SpreadAPI_GetCurrentSpreadHandle : TSPHandle;
: 描述
SpreadAPI_GetCurrentSpreadHandle函数返回一个当前在设计资源管理器99中打开的spread文档的句柄。
2.3 SpreadAPI_GetSpreadHandleFromFileName函数
声明(来自SpAPI单元):
Function SpreadAPI_GetSpreadHandleFromFileName(FileName : String) : TSPHandle;
描述:
SpreadAPI_GetSpreadHandleFromFileName函数返回一个通过Filename参数表示的spread文档的句柄。
3. Spread 编辑器函数
3.1 SpreadAPI_AddPageBreak过程
声明(来自SpAPI单元):
Procedure SpreadAPI_AddPageBreak(Spread : TSPHandle; R,C : Integer);
: 描述
SpreadAPI_AddPageBreak过程增加垂直和水平页中断接近到当前活动单元,行和列参数设置到活动单元。
3.2 SpreadAPI_AddSelection过程
声明(来自SpAPI单元):
第 261 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 Procedure SpreadAPI_AddSelection(Spread : TSPHandle; R1,C1,R2,C2 : Integer );
描述:
SpreadAPI_AddSelection过程增加一个新的选择到当前选择列表,Spread文档的句柄被随着定义的行/列矩阵的R1、C1、R2、C2 参数一起传递。
3.3 SpreadAPI_CancelEditMode过程
声明(来自SpAPI单元):
Procedure SpreadAPI_CancelEditMode(Spread : TSPHandle);
: 描述
SpreadAPI_CancelEditMode过程中止单元编辑并且退出编辑模式,不修改活动单元的内容。 参见其它:
SpreadAPI_StartEditMode函数 SpreadAPI_EndEditMode函数
3.4 SpreadAPI_Clear过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Clear(Spread : TSPHandle; R1,C1,R2,C2 : Integer; ClearType : Integer );
描述:
如果参数R1、C1、R2、C2值为-1,SpreadAPI_Clear过程清除在spread文档中所有选择单元的内容,否则一个指定范围被清除。“ClearType”参数显示指定清除的范围是什么,如果“ClearType”值是1,那么所有数据类型(“Values”, “Formats”和“Objects”)被清除,如果值是2,那么仅“Formats”类型被清除,如果值是3,那么仅“Values”类型(包括公式formulas)被清除,如果“ClearType”参数没有被指定,那么清除对话框将被显示出来。
3.5 SpreadAPI_ClearClipboardContents过程
声明(来自SpAPI单元):
Procedure SpreadAPI_ClearClipboardContents(Spread : TSPHandle);
描述:
SpreadAPI_ClearClipboardContents过程清除剪贴板的内容。
3.6 SpreadAPI_Copy过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Copy(Spread : TSPHandle); 描述:
SpreadAPI_Copy过程复制一个spread文档中所有选择的单元内容到剪贴板。
第 262 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 参见其它:
SpreadAPI_CopyDown过程 SpreadAPI_CopyRight过程
3.7 SpreadAPI_CopyDown过程
声明(来自SpAPI单元):
Procedure SpreadAPI_CopyDown(Spread : TSPHandle);
: 描述
SpreadAPI_CopyDown过程复制一个选择区的顶行内容到选择区的其它行。
参见其它:
SpreadAPI_Copy过程 SpreadAPI_CopyRight过程
3.8 SpreadAPI_CopyRight过程
声明(来自SpAPI单元):
Procedure SpreadAPI_CopyRight(Spread : TSPHandle); 描述:
SpreadAPI_CopyRight过程复制一个选择区的左列单元到选择区的其它列。
参见其它:
SpreadAPI_Copy过程 SpreadAPI_CopyDown过程
3.9 SpreadAPI_Cut过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Cut(Spread : TSPHandle); 描述:
SpreadAPI_Cut过程剪切一个文档中选择的单元的内容到剪贴板。
参见其它:
SpreadAPI_Copy过程
3.10 SpreadAPI_DefaultColors过程
声明(来自SpAPI单元):
Procedure SpreadAPI_DefaultColors(Spread : TSPHandle);
描述:
SpreadAPI_DefaultColors过程显示颜色面板对话框,此面板颜色对话框允许您来编辑面板的颜色或使用默认的颜色,对每一个spread文档,颜色customisations是局部的。
第 263 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 3.11 SpreadAPI_Delete过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Delete(Spread : TSPHandle; R1,C1,R2,C2 : Integer; Shift: String);
: 描述
SpreadAPI_Delete过程删除单元,位移(Shift)指定的删除位置,通过R1、C1、R2、C2参数指定的单元被删除,位移(Shift)类型被指定为“Right”、“Down”、“Columns”、“Rows”字符串。 3.12 SpreadAPI_EndEditMode过程
声明(来自SpAPI单元):
Procedure SpreadAPI_EndEditMode(Spread : TSPHandle); 描述:
SpreadAPI_EndEditMode过程结束单元编辑活动,并于编辑模式在单元中活动时,应用任何修改编辑模式。
参见其它:
SpreadAPI_CancelEditMode函数 SpreadAPI_StartEditMode函数 3.13 SpreadAPI_FormatCellAlignment过程
声明(来自SpAPI单元):
Procedure SpreadAPI_FormatCellAlignment(Spread : TSPHandle; Horizontal,WordWrap,Vertical :
Integer );
描述:
SpreadAPI_FormatCellAlignment过程指定在选定的范围内数据水平和垂直的排列,另外,自动换行能被激活或失效。
参数 类型 描述
Horizontal Integer 这里有几个值,如果horizontal = 1,为一般排列,2为左排列,3为中
心排列,4为右排列,5为填满,6为整版排列,7为中心交叉单元。 Wordwrap Integer 分配一个零值,设置自动换行为假,否则分配一个1值,来设置自动换行
为真。
Vertical Integer 这里有三个值,如果是1,顶对齐,2为中心对齐,3为底对齐。 3.14 SpreadAPI_FormatColumn过程
声明(来自SpAPI单元):
Procedure SpreadAPI_FormatColumn(Spread : TSPHandle; C1,C2,Width : Integer );
描述:
第 264 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
SpreadAPI_FormatColumn过程指定选择列宽,宽度被通过指定的宽度单位设置,单位等于默认字体情况下0字符的1/256宽度。
参数 类型 描述
C1 Integer 指定开始的要被修改的列。
C2 Integer 指定结束的要被修改的列。
Width Integer 新的列的宽度,如果宽度被设置为-1,则列的宽度大小自动改变。 3.15 SpreadAPI_GetActiveCell过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetActiveCell(Spread : TSPHandle; Var R,C : Integer);
描述:
SpreadAPI_GetActiveCell过程返回活动单元的行和列的值。
3.16 SpreadAPI_GetCellValue过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetCellValue(Spread : TSPHandle; R,C : Integer; Formula : Boolean; Var
Value : String);
描述:
SpreadAPI_GetCellValue过程依赖于formula的状态来返回一个活动单元或指定单元的值,如果R和C的值是-1,则formula或文档的文本值被返回。
3.17 SpreadAPI_GetCellValueType过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetCellValueType(Spread : TSPHandle; R,C: Integer; Var TheType: Integer);
描述:
SpreadAPI_GetCellValueType过程返回一个指定单元的数据类型。
3.18 SpreadAPI_GetColName过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetColName(Spread : TSPHandle; C : Integer; Var Name : String);
描述:
SpreadAPI_GetColName过程返回指定列的名称,如果C=-1,那么活动单元名称被返回。
第 265 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 3.19 SpreadAPI_GetLastCol过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetlastCol(Spread : TSPHandle; Var LastCol : Integer);
: 描述
SpreadAPI_GetlastCol过程返回在此文档中最后使用的列的数目。
3.20 SpreadAPI_GetlastRow过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetlastRow(Spread : TSPHandle; Var LastRow : Integer);
描述:
SpreadAPI_GetlastRow过程返回最后使用的行的数目。
3.21 SpreadAPI_GetRowName过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetRowName(Spread : TSPHandle; R : Integer; Var Name : String);
描述:
SpreadAPI_GetRowName过程返回一个指定行的名称,如果R=-1,那么活动单元名称被返回。 3.22 SpreadAPI_GetTabdelimitedText过程
声明(来自SpAPI单元):
Procedure SpreadAPI_GetTabdelimitedText(Spread : TSPHandle; R1,C1,R2,C2 : Integer; Var
TextHandle : Integer);
描述:
SpreadAPI_GetTabdelimitedText过程返回指定的用TAB分隔的块的句柄,指定的块用R1、 C1、R2 和 C2参数来设置。
3.23 SpreadAPI_Insert过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Insert(Spread : TSPHandle; R1,C1,R2,C2 : Integer; Shift : String);
描述:
SpreadAPI_Insert过程插入单元、行或列到选择的范围或到给定的范围,如果整个spread被选择,一个警告对话框将被显示,且插入操作将不能被完成。
参数 类型 描述
C1 Integer 初始列数。
第 266 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 R1 Integer 初始行数。
C2 Integer 最末列数。
R2 Integer 最末行数。
Shift String Shift表示将出现什么样的插入。Shift能有下列值:
Right– 指定范围的单元被右移来为插入单元让出位置。
Down – 指定范围的单元被下移来为插入单元让出位置。
Rows – 指定范围所在的行被下移来为插入单元让出位置。
Columns - 指定范围所在的列被右移来为插入单元让出位置。 3.24 SpreadAPI_InsertTabDelimitedText过程
声明(来自SpAPI单元):
Procedure SpreadAPI_InsertTabDelimitedText(Spread : THandle; R,C : LongInt; TabbedText :
PChar);
描述:
SpreadAPI_InsertTabDelimitedText过程插入一个用TAB来确定界限的文本块到一个活动的工作图表中,TabbedText参数是一个以null为终止符的字符串,R/C参数是文本块被放置的开始行和列。 3.25 SpreadAPI_JumpTo过程
声明(来自SpAPI单元):
Procedure SpreadAPI_JumpTo(Spread : TSPHandle; R,C : Integer);
描述:
SpreadAPI_JumpTo过程跳跃到通过R和C指定的一个单元,如果没有参数被指定,或如果R和C相等或小于-1,则Goto对话框将被显示,此对话框允许您选择活动的单元来显示。 参数 类型 描述
R Integer R是行数目,如果仅R被指定,它跳跃到指定的行(相当于C = -1)。 C Integer C是列数目,如果仅C被指定,它跳跃到指定的列(相当于R = -1)。 3.26 SpreadAPI_Paste过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Paste(Spread : TSPHandle); 描述:
SpreadAPI_Paste过程从剪贴板中粘贴内容到文档中。
第 267 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 3.27 SpreadAPI_PrintDocument过程
声明(来自SpAPI单元):
Procedure SpreadAPI_PrintDocument(Spread : TSPHandle; ShowPrintDialogBox : Boolean);
: 描述
SpreadAPI_PrintDocument过程打印文档或通过用户指定的内容,如果ShowPrintDialogBox参数是False,那么打印对话框在打印前不显示,如果为True,打印对话框出现,并且允许用户来设置打印参数,如页范围和打印份数。
3.28 SpreadAPI_RecalcDocument过程
声明(来自SpAPI单元):
Procedure SpreadAPI_RecalcDocument(Spread : TSPHandle);
描述:
SpreadAPI_RecalcDocument过程在一个工作图表中重新计算所有的公式。
3.29 SpreadAPI_RemovePageBreak过程
声明(来自SpAPI单元):
Procedure SpreadAPI_RemovePageBreak(Spread : TSPHandle; R,C : Integer);
描述:
SpreadAPI_RemovePageBreak过程从一个spread文档中删除分页符。
参数 类型 描述
R Integer 如果R > -1 且 C <= -1,那么水平分页符被删除。
C Integer 如果C > -1 且 R <= -1,那么垂直分页符被删除。
如果R和C<= -1,那么活动单元被使用且水平和垂直分页符都被删除。
参见其它:
SpreadAPI_AddPageBreak过程
3.30 SpreadAPI_SaveTransaction过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SaveTransaction(Spread : TSPHandle);
描述:
SpreadAPI_SaveTransaction过程保存事务,事务允许您来执行多重操作,如果所有的操作没有成功,事务有撤消修改的能力,每一个在一个事务的开始(StartTransaction)和一个事务的结束之间的操作能被通过启动一个UndoTransaction撤消,如果所有的操作成功,SaveTransaction被启动来保存持久的改变并且释放事务相关的资源,每一个StartTransaction将被要么一个StopTransaction 或一个
第 268 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 UndoTransaction来结束。
参见其它:
SpreadAPI_StartTransaction过程 SpreadAPI_StopTransaction过程 SpreadAPI_UndoTransaction过程
3.31 SpreadAPI_SetActiveCell过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetActiveCell(Spread : TSPHandle; R,C : Integer);
描述:
SpreadAPI_SetActiveCell过程设置活动单元到通过R和C参数指定的行和列上。 3.32 SpreadAPI_SetCellFormula过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetCellFormula(Spread : TSPHandle; R,C : Integer; Formula : String);
描述:
SpreadAPI_SetCellFormula过程放置一个公式到一个指定的单元,此公式不可以以等号开头。 参数 类型 描述
R Integer R是公式被放置的单元的行号。
C Integer C是公式被放置的单元的列号。
Formula String Formula是包含要被放置到单元中的公式字符串。
3.33 SpreadAPI_SetCellNumericValue过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetCellNumericValue(Spread : TSPHandle; R,C : Integer; Number : Single);
描述:
SpreadAPI_SetCellNumericValue过程设置一个单元中内容为一个新的数字值,如果此单元包含一个公式,当数字值被放置时公式被删除。
参数 类型 描述
R Integer R是数字值被放置到的单元的行号。
C Integer C是数字值被放置到的单元的列号。
Number Single Number是要被放置到此单元中的数值。
如果R和C都是-1,那么当前活动单元中值将被设置为Number。
第 269 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 3.34 SpreadAPI_SetCellText过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetCellText(Spread : TSPHandle; R,C : Integer; Text : String);
: 描述
SpreadAPI_SetCellText过程设置一个单元为新的文本值,如果指定的单元包含一个公式,当文本被放置到单元中时公式被删除。
参数 类型 描述
R Integer R是文本被放置到的单元的行号。
C Integer C是文本被放置到的单元的列号。
Text String Text是包含要被放置到单元中的文本字符串。
如果R和C都是-1,那么当前活动单元中值将被设置为text。
3.35 SpreadAPI_SetCellValue过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetCellValue(Spread : TSPHandle; R,C : Integer; Value : String);
描述:
SpreadAPI_SetCellValue过程基于一个给定的格式来设置一个单元的值,此过程自动检测数据实体的种类(例如,数值、文本、公式),它也能识别日期、时间、百分比、货币、分数和科学符号。 参数 类型 描述
R Integer R是值要被放置的单元的行号。
C Integer C是值要被放置的单元的列号。
Value String Value是包含要被放置到此单元中的一个字符串的值。
如果R和C都是-1,那么当前活动单元值将被设置为value。
3.36 SpreadAPI_SetColumnName过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetColumnName(Spread : TSPHandle; C : Integer; Name : String);
: 描述
SpreadAPI_SetColumnName过程设置一个指定列的名称,此列被命名来反映在列中的数据(例如,也许column 1被命名为公司名称(Company Name)),新的列名称被显示在列标题并且仅作为显示目的使用,列在公式中仍然通过列引用来进行,即通过列的名称引用,而不是列的显示名称引用。 参数 类型 描述
C Integer C指定要被命名的列数(哪一个列)。
ColumnText String ColumnText是新的列名称。
第 270 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 3.37 SpreadAPI_SetDefinedName过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetDefinedName(Spread : TSPHandle; Name,Formula : String);
: 描述
SpreadAPI_SetDefinedName过程允许一个用户自定义的名称来被定义、修改或删除,一个名称能引用到一个单元、一个单元组、一个值或一个公式。
参数 类型 描述
Name String Name是用户自定义的名称。
Formula String Formula是描述名称引用的项的公式(例如,“A1:C3”)。此公式将不能
以等号符号开头。
如果仅给出名称参数,那么自定义名称将被删除,如果没有参数被指定,则定义名称对话框将被显示出来。
3.38 SpreadAPI_SetRowName过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetRowName(Spread : TSPHandle; R : Integer; Name : String);
描述:
SpreadAPI_SetRowName过程命名一个行来反映行中的数据(例如行2也许被命名为Central Region)。新的行的名称被显示在行标题,并且仅被作为显示目的使用,行仍然被通过常规的单元引用来进行引用。
参数 类型 描述
R Integer RowNumber是要被命名的行。
Name String RowText是行的新的名称。
3.39 SpreadAPI_SetSelection过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetSelection(Spread : TSPHandle; R1,C1,R2,C2 : Integer );
描述:
SpreadAPI_SetSelection过程选择指定的单元范围,并且移动活动的单元到范围内的左上单元,为选择在工作图表中的所有单元设置R1为-1,C1为-1,R2为0,C2为0。
3.40 SpreadAPI_SetSelectionFromFormula过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetSelectionFromFormula(Spread : TSPHandle; Formula : String);
第 271 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 描述:
SpreadAPI_SetSelectionFromFormula过程从一个公式中设置当前的选择,并且返回一个或多个范围,例如“A1:C2,D4”选择两个范围,第一个范围包括左上角为A1,右下角为C2选择区域,第二个范围包括单独的第4行第4列单元。公式参数能指定一个或多个范围。
3.41 SpreadAPI_SetTopLeftText过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetTopLeftText(Spread : TSPHandle;TopLeftText : String);
: 描述
SpreadAPI_SetTopLeftText过程设置左上单元的文本,文本被放置在spreadsheet的左上角仅作为显示目的用,TopLeftText字符串参数是左上单元的文本。
3.42 SpreadAPI_SetupPrinter过程
声明(来自SpAPI单元):
Procedure SpreadAPI_SetupPrinter(Spread : TSPHandle); 描述:
SpreadAPI_SetupPrinter过程允许您来选择工作图表要被发送到的打印机、页方向、页尺寸,此进程总是显示打印设置对话框。
3.43 SpreadAPI_ShowActiveCell过程
声明(来自SpAPI单元):
Procedure SpreadAPI_ShowActiveCell(Spread : TSPHandle);
描述:
SpreadAPI_ShowActiveCell过程重新配置文档,这样活动单元是可视化的。
3.44 SpreadAPI_StartEditMode过程
声明(来自SpAPI单元):
Procedure SpreadAPI_StartEditMode(Spread : TSPHandle; Clear, InCellEditFocus,
ArrowsExitEditMode : Boolean);
描述:
SpreadAPI_StartEditMode过程对活动单元开始编辑模式,并且允许您来指定单元如何被编辑。 参数 类型 描述
Clear Boolean 如果Clear为True,作为编辑模式的开始,编辑条被清除。 InCellEditFocus Boolean 如果InCellEditFocus为True,编辑焦点被给予in-cell编辑;
第 272 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
如果为false,编辑焦点被给予编辑条。
ArrowsExitEditMode Boolean 如果ArrowsExitEditMode为True,如果您按下一个在键盘上的
箭头键,编辑模式被退出。
参见其它:
SpreadAPI_CancelEditMode函数 SpreadAPI_EndEditMode函数
3.45 SpreadAPI_StartTransaction过程
声明(来自SpAPI单元):
Procedure SpreadAPI_StartTransaction(Spread : TSPHandle);
描述:
SpreadAPI_StartTransaction过程开始一个编辑事务,事务允许您来执行多重操作,如果所有的操作没有成功,事务有撤消修改的能力,每一个在一个事务的开始(StartTransaction)和一个事务的结束之间的操作能被通过启动一个UndoTransaction撤消,如果所有的操作成功,SaveTransaction被启动来保存持久的改变并且释放事务相关的资源,每一个StartTransaction将被要么一个StopTransaction 或一个 UndoTransaction来结束。
参见其它:
SpreadAPI_SaveTransaction过程 SpreadAPI_StopTransaction过程 SpreadAPI_UndoTransaction过程
3.46 SpreadAPI_StopTransaction过程
声明(来自SpAPI单元):
Procedure SpreadAPI_StopTransaction(Spread : TSPHandle);
描述:
SpreadAPI_StopTransaction过程结束一个编辑事务,事务允许您来执行多重操作,如果所有的操作没有成功,事务有撤消修改的能力,每一个在一个事务的开始(StartTransaction)和一个事务的结束之间的操作能被通过启动一个UndoTransaction撤消,如果所有的操作成功,SaveTransaction被启动来保存持久的改变并且释放事务相关的资源,每一个StartTransaction将被要么一个StopTransaction 或一个 UndoTransaction来结束。
参见其它:
SpreadAPI_SaveTransaction过程 SpreadAPI_StartTransaction过程 SpreadAPI_UndoTransaction过程
3.47 SpreadAPI_UndoTransaction过程
声明(来自SpAPI单元):
Procedure SpreadAPI_UndoTransaction(Spread : TSPHandle);
第 273 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 描述:
SpreadAPI_UndoTransaction过程撤消所有从事务开始以来的修改,事务允许您来执行多重操作,如果所有的操作没有成功,事务有撤消修改的能力,每一个在一个事务的开始(StartTransaction)和一个事务的结束之间的操作能被通过启动一个UndoTransaction撤消,如果所有的操作成功,SaveTransaction被启动来保存持久的改变并且释放事务相关的资源,每一个StartTransaction将被要么一个StopTransaction 或一个 UndoTransaction来结束。
参见其它:
SpreadAPI_SaveTransaction过程 SpreadAPI_StartTransaction过程 SpreadAPI_UndoTransaction过程
3.48 SpreadAPI_UpdateAllDocuments过程
声明(来自SpAPI单元):
Procedure SpreadAPI_UpdateAllDocuments(Spread : TSPHandle);
描述:
SpreadAPI_UpdateAllDocuments过程更新或许被延时的每件事,包括通过把AutoRecalc属性设置为True来重新计算任何工作图表并且更新滚动条位置。
3.49 SpreadAPI_Zoom过程
声明(来自SpAPI单元):
Procedure SpreadAPI_Zoom(Spread : TSPHandle; Scale : Integer );
描述:
SpreadAPI_Zoom过程取得一个spread文档的句柄,并且通过缩放参数scale为一个文档设置当前显示缩放比例, 缩放比例从10%到400%值,100%是通常的显示比例。
4.例子代码
4.1 输出印制板信息到电子表格
这个“输出到Spread(Export To Spread)”例子示范了提取一个编辑器服务器文档信息并输出到一个Spread文档是可能的,使用下面的例子,在一个印制板文档中查找到的焊盘(pad)对象的属性并输出到一个spread文档。
请见SDK例子\SAMPLES\NO5\API\Spread\ExportDataToSpread。
{................................................................................}
//主程序。
Function Exporter : PCBTypes.TObjectHandle; Var
第 274 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
BoardHandle : PCBTypes.TObjecthandle;//印制板对象句柄。
BoardFileName : TString;//印制板DOS型路径名称。
SpreadHandle : TSPHandle;//Spread型文档句柄。
PadHandle : TObjectHandle;//焊盘对象句柄。
IteratorHandle : TObjectHandle;//迭代程序。
Board : TPCBBoard;//印制板对象句柄。
PadRowNumber : Integer;//焊盘统计总数。
Padlist : TStringlist;//存放焊盘信息的列表。
BoardUnit : TUnit;
P : PChar;
Begin
SetAllPCBProcAddresses;
SetAllPCBProcAddresses过程初始化并且设置所有PCB编辑器调用。即取得所有AdvPcb.dll中输//
出的函数和过程的地址指针。
BoardHandle := PcbApi_GetCurrentBoardHandle; //PcbApi_GetCurrentBoardHandle函数返回当前在设计资源管理器中的PCB文档的句柄,如果印制板没有找到则返回值是空(nil)。
If BoardHandle = 0 Then Exit;
//得到印制板的文件名称getting board's Filename。
Board := TPCBBoard.Create(Boardhandle);//建立一个印制板对象。
Board.QueryDatabase(PCBTypes.eGetState);//用内部服务器数据同步外部服务器数据。 BoardFileName := ExtractFileName(ConvertToNormalFilePath(Board.FileName));
//ConvertToNormalFilePath函数转换一个抽象的地址到一个常规的DOS文件路径。 //ExtractFileName获取文件名称和扩展路径。
BoardFileName := ForceFileNameExtension(BoardFileName,'XLS');
//ForceFileNameExtension函数用新的扩展名称替代已存在的文件扩展名称。 BoardUnit := Board.DisplayUnit;
Board.Free;
GetMem(P, 4048);//申请内存。
SetState_Parameter(P,'Server','Spread');//设置命令参数。
SetState_Parameter(P,'Action','Start'); //设置命令参数。
MessageRouter_SendCommandToModule('Client:SetupEDAServers', P, 4048, 0);
//发送命令给Client服务器的SetupEDAServers过程,命令参数存在P中,内存大小为4048。此过程设置EDA服务器。
FreeMem(P, 4048);//释放内存。
第 275 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
SetupApiCalls;//设置一个Spread API调用。
SpreadHandle := CreateASpreadDocument(BoardFileName);//创建一个XLS型的spread文档。 If SpreadHandle = 0 Then Exit;
IteratorHandle := PcbApi_CreateIterator(BoardHandle,//当前印制板句柄。
ePadObject,//要查找的对象为焊盘对象。
eProcessAll,
eIgnoreLayer);
//建立对象迭代程序。
PadHandle := PcbApi_GetFirstObject(IteratorHandle);//查找第一个焊盘对象。
PadRowNumber := 0;//焊盘统计总数初始化为0。
While(PadHandle <> 0) Do//查找到有焊盘对象。
Begin
Inc(PadRowNumber);//焊盘对象数目统计。
PadList := TStringList.Create;//建立存放当前焊盘对象的列表。
ExtractAttributesOfAPadObject(PadRowNumber,BoardUnit,PadHandle,PadList);
//调用ExtractAttributesOfAPadObject过程来把当前焊盘中信息输出到列表PadList中。
ExportToSpread(SpreadHandle,PadRowNumber,PadList);
//把PadList列表中信息输出到一个XLS型的spread文档中。
Padlist.Free;//列表释放。
PadHandle := PcbApi_GetNextObject(IteratorHandle);//查找下一个焊盘对象。
End;
PcbApi_DestroyIterator(IteratorHandle);//销毁迭代程序。
RefreshDesignDatabase(SpreadHandle);//刷新spread文档。
End;
{................................................................................}
//CreateASpreadDocument函数创建一工作表。
Function CreateASpreadDocument(Filename : TString) : TSPHandle;
Var
EntityHandle : TObjectHandle;
BinderHandle : TObjectHandle;
NewDocHandle : TObjectHandle;
DocumentEntity : TDocumentEntity;
DDBItem : TDDBItem;
S : TString;
第 276 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
Begin
Result := 0;
EntityHandle :=
ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);
//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在
项层在文档的窗体句柄。
//ClientApi_FindEntityByDataHandle函数使用一个编辑器窗体句柄来返回查找返回一个实体的句
柄。
If Entityhandle = 0 Then Exit;
BinderHandle := ClientAPI_GetDocumentOwnerBinder(EntityHandle); //ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,一个封装对
象表现为包含实体的容器,一个实体可为一个设计文档或文件来。
NewDocHandle := ClientAPI_FindChildDocumentInBinder(BinderHandle,Filename);
//ClientApi_FindChildDocumentInBinder过程在容器中查找文档。
If NewDocHandle <> 0 Then ClientApi_DestroyEntity(NewDocHandle); //文件如果找到,则销毁NewDocHandle句柄。
ClientAPI_GetDocumentEntityAbsoluteAddress(EntityHandle,S); //ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档实体的绝
对地址,即得到当前文档的绝对地址。
DDBItem:= TDDBItem.Create('Admin',S);//创建一个文件。
DDBItem.Address.Offset.Name := Filename;//文件名称为Filename。
DDBItem.Address.EditorKind := 'Spread';//文件类型为Spread。
DDBItem.Address.Id := cUnassignedID;//地址ID为cUnassignedID。
DDBItem.Address.Attributes := 0;
DDBItem.Write;//写。
DDBItem.Free;//释放。
NewDochandle := WaitForCommit(BinderHandle,Filename); ClientAPI_OpenDocumentEntity(NewDocHandle,False);//打开实体,但不在窗体中。
Result := SpreadAPI_GetCurrentSpreadHandle;
//SpreadAPI_GetCurrentSpreadHandle函数返回一个当前在设计资源管理器99中打开的spread文
档的句柄。
End;
{....................................................................................}
Function WaitForCommit(BinderHandle : TObjectHandle; Docname : TString) : TObjectHandle;
Var
I : Integer;
第 277 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
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过程返回一个名称为Docname参数的文档,
ADocumentEntity是包含容器的句柄。在ADocumentEntity句柄所表示的实体中查找名称为Docname的
文档。
If Result <> 0 Then Break;
WaitForSingleObject(GetCurrentThread,100);
//GetCurrentThread得到当前的线程。
//WaitForSingleObject等待100毫秒。
End;
End;
{................................................................................} //ExtractAttributesOfAPadObject过程把焊盘的参数加到列表PadList中。
Procedure ExtractAttributesOfAPadObject(PadNumber : Integer;BoardUnit : TUnit; PadHandle :
PCBTypes.TObjectHandle;PadList : TStringList);
Var
Pad : TPCBPad;
S : TString;
Begin
Pad := TPCBPad.Create(PadHandle);//建立焊盘对象
Pad.QueryDatabase(PCBTypes.eGetState);//用内部服务器数据同步外部服务器数据
PadList.Add('Pad : ' + IntToStr(PadNumber));//焊盘N。
PadList.Add('TopXSize = ' + CoordUnitToString(Pad.TopXsize,BoardUnit)); //增加焊盘TopXsize参数。
PadList.Add('TopYsize = ' + CoordUnitToString(Pad.TopYsize,BoardUnit)); //增加焊盘TopYsize参数。
PadList.Add('MidXsize = ' + CoordUnitToString(Pad.MidXsize,BoardUnit)); //增加焊盘MidXsize参数。
PadList.Add('MidYsize = ' + CoordUnitToString(Pad.MidYsize,BoardUnit));
第 278 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
//增加焊盘MidYsize参数。
PadList.Add('BotXsize = ' + CoordUnitToString(Pad.BotXsize,BoardUnit));
//增加焊盘BotXsize参数。
PadList.Add('BotYsize = ' + CoordUnitToString(Pad.BotYsize,BoardUnit));
//增加焊盘BotYsize参数。
PadList.Add('HoleSize = ' + CoordUnitToString(Pad.HoleSize,BoardUnit));
//增加焊盘HoleSize参数。
PadList.Add('TopShape = ' + ShapeToString(Pad.TopShape)); //增加焊盘TopShape参数。
PadList.Add('MidShape = ' + ShapeToString(Pad.MidShape)); //增加焊盘MidShape参数。
PadList.Add('BotShape = ' + ShapeToString(Pad.BotShape)); //增加焊盘BotShape参数。
PadList.Add('Name = ' + Pad.Name);
//增加焊盘Name参数。
Case Pad.DaisyChainStyle of
eDaisyChainLoad : S := 'DAISYCHAINLOAD';
eDaisyChainTerminator : S := 'DAISYCHAINTERMINATOR';
eDaisyChainSource : S := 'DAISYCHAINSOURCE';
End;
PadList.Add('DaisyChainStyle = ' + S);
//增加DaisyChainStyle参数。
PadList.Add('Angle = ' + FloatToStr(Pad.Angle));
//增加焊盘Angle参数。
If Pad.Plated Then S := 'True' Else S := 'False'; PadList.Add('Plated = ' + S);
//增加焊盘Plated参数。
Pad.Free;
End;
{................................................................................}
// ExportToSpread过程完成把存放焊盘信息的APadList列表中内容输出到一工作图表中,并用Tab
分隔。SpreadHandle为电子表格句柄,ARow为开始行,APadList为存放焊盘信息的列表。
Procedure ExportToSpread(SpreadHandle : TSPHandle; ARow : Integer; APadList : TStringList);
Const
cTab = #9;//换行
cEnter = #13;//回车
第 279 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 var
Buffer : PChar;
TempBuffer : PChar;
I : Integer;
Begin
If SpreadHandle <> 0 Then//当前有电子表。
Begin
GetMem(Buffer,1024); //申请1024字节内存。
GetMem(TempBuffer,1024); //申请1024字节内存。
StrPCopy(TempBuffer,'');//用空字符初始化内存。
StrPCopy(Buffer,''); //用空字符初始化内存。
For I := 0 to APadList.Count - 1 do //APadList为存放焊盘信息的列表。
Begin
StrPCopy(TempBuffer,APadList.Strings[i]);//把焊盘列表中信息放在内存中。
StrCat(Buffer,TempBuffer);//把TempBuffer中内存追加到Buffer中。
StrCat(Buffer,cTab);//把Buffer中内容加上换行符。
End;
StrCat(Buffer,cEnter);//焊盘列表中数据全部输出后,Buffer中追加回车符
SpreadAPI_InsertTabDelimitedText(SpreadHandle,ARow,1,Buffer);
//把SpreadHandle指向的工作图用TAB来确定界限的文本块分隔,从ARow行,1列开始。ARow参数是在当前印制板中第几个焊盘对象,即第一个焊盘对象从1行开始,第N个焊盘对象是N行开始。
FreeMem(TempBuffer,1024);//释放内存。
FreeMem(Buffer,1024); //释放内存。
End;
End;
{................................................................................}
//RefreshDesignDatabase过程刷新spread文档,使其每一列内容和宽度相适应。 Procedure RefreshDesignDatabase(SpreadHandle : TObjectHandle);
Var
Binderhandle : TObjecthandle;
Entityhandle : TObjecthandle;
P : PChar;
Begin
EntityHandle :=
ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);
//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。当前在
第 280 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 项层在文档的窗体句柄。
//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。
If EntityHandle = 0 Then Exit;
BinderHandle := ClientAPI_GetDocumentOwnerBinder(EntityHandle);
//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。
ClientAPI_RepopulateDocumentEntity(BinderHandle,False);
//刷新当前实体。
//Spread单元自动格式化auto formatting of Spread cells GetMem(P,1024);//申请1024字节内存
StrPCopy(P,'');//用空字符初始化内存
SetState_Parameter(P,'C1','-1');
//SetState_Parameter过程插入一个参数到指定的参数文本块中。
{初始列 Initial column }
SetState_Parameter(P,'C2','0');
{ 最后的列Final column }
SetState_Parameter(P,'ColumnWidth','AUTO');//宽度为自动适应。
MessageRouter_SendCommandToModule('Spread:FormatColumn',P,1024,SpreadHandle);
//发送命令给Spread服务器的FormatColumn过程,命令参数为P中存放的参数,内存大小为1024,目标对象句柄为SpreadHandle。
FreeMem(P,1024);
EntityHandle := ClientAPI_FindEntityByDataHandle(SpreadAPI_GetCurrentSpreadHandle);
//SpreadAPI_GetCurrentSpreadHandle函数返回一个当前在设计资源管理器99中打开的spread文档的句柄。
End;
此代码清单被完全地包含在创建一个新的spread文档代码中。此代码基本功能是创建一个spread文档,这里有一个WaitForCommit函数,此函数执行等待功能直到其能得到新的spread文档的句柄为止,接着使用印制板句柄,迭代程序查找焊盘对象的属性,属性被放入到一个TStringlist列表对象中,再用SpreadAPI_InsertTabDelimitedText函数把整个字符串从列表对象中传递到spread文档中,迭代程序继续运行直到没有更多的焊盘对象被从印制板文档中查找到,更多有关迭代程序信息,请参见PCB API章节和PCB API参考章节相关内容,更多的有关创建和维护文档实体的信息,请参见客户端API。 4.2 提取印制板元器件信息到电子表格
请见SDK例子\SAMPLES\NO5\API\Spread\ExportComponentInfoToSpread。
第 281 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
此代码示范了如何把当前PCB板中元件信息提取出来并输出到电子表格中。代码中使用了很多涉及到在精通篇有关代码的基础知识,如Windows临时文件夹如何获取,元件信息的提取等内容,请读者仔细研究例子代码。
{....................................................................................}
//获取Windows临时文件夹。
function GetTempDirectory: String;
var
TempDir: array[0..255] of Char;
begin
GetTempPath(255, @TempDir);
Result := StrPas(TempDir);
end;
{....................................................................................}
//把整个存放元件信息列表中的内容输出到本地文本文件。
Procedure ExportComponentInfoToTempFile(TempFileName : TString; TotalInfoList :
TStringList);
var
TempFile : TextFile;
i : Integer;
Csr : TSearchRec;
CFileAttrs : Integer;
begin
if FindFirst(GetTempDirectory + TempFileName, CFileAttrs, Csr) = 0 then
DeleteFile(GetTempDirectory + TempFileName);
//查找临时文件,如果找到则删除临时文件
AssignFile(TempFile,GetTempDirectory + TempFileName);//获得临时文件目录。
ReWrite(TempFile);//新建文。件
try
For I:=0 to TotalInfoList.Count-1 do
writeln(TempFile,TotalInfoList.Strings[I]);
finally
Closefile(TempFile);
end;
//把每一层的使用和显示信息输出到临时文件TempFile中。
end;
第 282 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 {....................................................................................}
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过程返回一个名称为Docname参数的文档,
//ADocumentEntity是包含容器的句柄。在ADocumentEntity句柄所表示的实体中查找名称为Docname的文档。
If Result <> 0 Then Break;
WaitForSingleObject(GetCurrentThread,100);
//GetCurrentThread得到当前的线程。
//WaitForSingleObject等待100毫秒。
End;
End;
{................................................................................}
//CreateASpreadDocument函数创建一工作表。
Function CreateASpreadDocument(Filename : TString) : TSPHandle;
Var
EntityHandle : TObjectHandle;
BinderHandle : TObjectHandle;
NewDocHandle : TObjectHandle;
DocumentEntity : TDocumentEntity;
DDBItem : TDDBItem;
S : TString;
Begin
Result := 0;
EntityHandle :=
第 283 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);
//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。
//当前在项层在文档的窗体句柄。
//ClientApi_FindEntityByDataHandle函数使用一个编辑器窗体句柄来返回查找返回一个实体的句
柄。
If Entityhandle = 0 Then Exit;
BinderHandle := ClientAPI_GetDocumentOwnerBinder(EntityHandle);
//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,
//一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。
NewDocHandle := ClientAPI_FindChildDocumentInBinder(BinderHandle,Filename);
//ClientApi_FindChildDocumentInBinder过程在容器中查找文档。
If NewDocHandle <> 0 Then ClientApi_DestroyEntity(NewDocHandle);
//文件如果找到,则销毁NewDocHandle句柄。
ClientAPI_GetDocumentEntityAbsoluteAddress(EntityHandle,S);
//ClientApi_GetDocumentEntityAbsoluteAddress在关联的设计数据文档内获得一个文档
//实体的绝对地址,即得到当前文档的绝对地址。
DDBItem:= TDDBItem.Create('Admin',S);//创建一个文件
DDBItem.Address.Offset.Name := Filename;//文件名称为Filename
DDBItem.Address.EditorKind := 'Spread';//文件类型为Spread
DDBItem.Address.Id := cUnassignedID;//地址ID为cUnassignedID
DDBItem.Address.Attributes := 0;
DDBItem.Write;//写。
DDBItem.Free;//释放。
NewDochandle := WaitForCommit(BinderHandle,Filename);
ClientAPI_OpenDocumentEntity(NewDocHandle,False);//打开实体,但不在窗体中。
Result := SpreadAPI_GetCurrentSpreadHandle;
//SpreadAPI_GetCurrentSpreadHandle函数返回一个当前在设计资源管理器99中打开的spread文
档的句柄。
End;
{................................................................................}
//ExtractAttributesOfAComponentObject过程把元件的参数加到列表ComponentInfoList中。
Procedure ExtractAttributesOfAComponentObject(ComponentRowNumber : Integer;ComponentHandle :
PCBTypes.TObjectHandle;ComponentInfoList : TStringList); Var
Component : TPCBComponent;
ComponentName : TPCBText; //元件名称文本对象
第 284 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
ComponentComment : TPCBText; //元件备注文本对象
NameHandle : PCBTypes.TObjectHandle;//元件名称文本对象句柄
CommentHandle : PCBTypes.TObjectHandle;//元件备注文本对象句柄
NameContent : TString;//元件名称字符串
CommentContent : TString;//元件备注字符串
Begin
Component := TPCBComponent.Create(0); //创建一个元件对象。
Component.Objecthandle := Componenthandle;
//把查找的元件对象句柄赋予元件的对象句柄属性。
Component.Querydatabase(PCBTypes.eGetstate);
//用内部服务器数据同步外部服务器数据。
NameHandle := Component.Name;//取得元件名称句柄。
ComponentName := TPCBText.Create(NameHandle);//根据元件名称句柄创建文本对象。
ComponentName.Querydatabase(PCBTypes.eGetState);
//用内部服务器数据同步外部服务器数据,即把内部元件的名称信息读取文本对象中。
NameContent := ComponentName.List;//把元件名称字符串内容放到NameContent字符串变量中。
ComponentName.Free;//释放名称文本对象
CommentHandle := Component.Comment;//取得元件备注句柄。
ComponentComment := TPCBText.Create(CommentHandle);//根据元件备注句柄创建文本对象。
ComponentComment.Querydatabase(PCBTypes.eGetState);
//用内部服务器数据同步外部服务器数据,即把内部元件的备注信息读取文本对象中。
CommentContent := ComponentComment.List;//把元件备注字符串内容放到CommentContent字符串变量中。
ComponentComment.Free;//释放备注文本对象。
//Component.Pattern为流水号。
ComponentInfoList.Add('元件: ' + IntToStr(ComponentRowNumber));//元件N
ComponentInfoList.Add('元件名称='+ NameContent);
ComponentInfoList.Add('流水号='+ Component.Pattern);
ComponentInfoList.Add('元件备注='+ CommentContent);
Component.Free;//释放元件对象。
End;
{................................................................................}
// ExportToSpread过程完成把存放元件信息的AComponentList列表中内容输出到一工作图表中, //并用Tab分隔。SpreadHandle为电子表格句柄,ARow为开始行,AComponentList为存放元件信息的
第 285 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 列表。
Procedure ExportComponentInfoToSpread(SpreadHandle : TSPHandle; ARow : Integer;
AComponentList : TStringList);
Const
cTab = #9;//换行
cEnter = #13;//回车
var
Buffer : PChar;
TempBuffer : PChar;
I : Integer;
Begin
If SpreadHandle <> 0 Then//当前有电子表。
Begin
GetMem(Buffer,1024); //申请1024字节内存。
GetMem(TempBuffer,1024); //申请1024字节内存。
StrPCopy(TempBuffer,'');//用空字符初始化内存。
StrPCopy(Buffer,''); //用空字符初始化内存。
For I := 0 to AComponentList.Count - 1 do // AComponentList为存放元件信息的列表。
Begin
StrPCopy(TempBuffer,AComponentList.Strings[i]);//把元件列表中信息放在内存中。
StrCat(Buffer,TempBuffer);//把TempBuffer中内存追加到Buffer中。
StrCat(Buffer,cTab);//把Buffer中内容加上换行符。
End;
StrCat(Buffer,cEnter);//元件列表中数据全部输出后,Buffer中追加回车符。
SpreadAPI_InsertTabDelimitedText(SpreadHandle,ARow,1,Buffer);
//把SpreadHandle指向的工作图用TAB来确定界限的文本块分隔,从ARow行,1列开始。
//ARow参数是在当前印制板中第几个元件对象,即第一个元件对象从1行开始,第N个元件对象是N行开始。
FreeMem(TempBuffer,1024);//释放内存。
FreeMem(Buffer,1024); //释放内存。
End;
End;
{................................................................................}
//RefreshDesignDatabase过程初始化Spread。
Procedure RefreshDesignDatabase(SpreadHandle : TObjectHandle);
Var
第 286 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
Binderhandle : TObjecthandle;
Entityhandle : TObjecthandle;
P : PChar;
Begin
EntityHandle :=
ClientAPI_FindEntityByDataHandle(MessageRouter_GetState_CurrentEditorWindow);
//MessageRouter_GetState_CurrentEditorWindow函数返回当前在项层的文档的窗体句柄。
//当前在项层在文档的窗体句柄。
//ClientApi_FindEntityByDataHandle 函数使用一个编辑器窗体句柄来返回查找返回一个实体的句柄。
If EntityHandle = 0 Then Exit;
BinderHandle := ClientAPI_GetDocumentOwnerBinder(EntityHandle);
//ClientApi_GetDocumentOwnerBinder函数获得在其内部存有文档的封装对象的句柄,
//一个封装对象表现为包含实体的容器,一个实体可为一个设计文档或文件来。
ClientAPI_RepopulateDocumentEntity(BinderHandle,False);
//刷新当前实体。
//Spread单元自动格式化auto formatting of Spread cells
GetMem(P,1024);//申请1024字节内存。
StrPCopy(P,'');//用空字符初始化内存。
SetState_Parameter(P,'C1','-1');
//SetState_Parameter过程插入一个参数到指定的参数文本块中。
{初始列 Initial column }
SetState_Parameter(P,'C2','0');
{ 最后的列Final column }
SetState_Parameter(P,'ColumnWidth','AUTO');//宽度为自动适应。
MessageRouter_SendCommandToModule('Spread:FormatColumn',P,1024,SpreadHandle);
//发送命令给Spread服务器的FormatColumn过程,命令参数为P中存放的参数,内存大小为
//1024,目标对象句柄为SpreadHandle。
FreeMem(P,1024);
EntityHandle := ClientAPI_FindEntityByDataHandle(SpreadAPI_GetCurrentSpreadHandle);
//SpreadAPI_GetCurrentSpreadHandle函数返回一个当前在设计资源管理器99中打开的spread文档的句柄。
End;
{................................................................................}
//主程序。
Function ExportComponentInfo : PCBTypes.TObjectHandle;
第 287 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 Var
BoardFileName : TString;//印制板DOS型路径名称。
TempFileName : TString;//输出临时文本文件名称。
SpreadHandle : TSPHandle;//Spread型文档句柄。
ComponentHandle : TObjectHandle;//元件对象句柄。
Board : TPCBBoard;//印制板对象句柄。
ComponentRowNumber : Integer;//元件统计总数。
TotalInfoList : TStringlist;//存放完整元件信息的列表。
ComponentInfoList : TStringlist;//存放元件信息的列表。
BoardUnit : TUnit;
P : PChar;
ComponentIteratorHandle : TObjectHandle;//迭代程序。
Begin
SetAllPCBProcAddresses;
//SetAllPCBProcAddresses过程初始化并且设置所有PCB编辑器调用。即取得所有AdvPcb.dll
//中输出的函数和过程的地址指针。
If PcbApi_GetCurrentBoardHandle = 0 Then Exit;
//如果当前激活的编辑器不是PCB编辑器则退出。
//PcbApi_GetCurrentBoardHandle函数返回当前在设计资源管理器中的PCB文档的句柄,
//如果印制板没有找到则返回值是空(nil)。
Board := TPCBBoard.Create(PcbApi_GetCurrentBoardHandle);//建立一个印制板对象。
Board.QueryDatabase(PCBTypes.eGetState);//用内部服务器数据同步外部服务器数据。
BoardFileName := ExtractFileName(ConvertToNormalFilePath(Board.FileName));
//ConvertToNormalFilePath函数转换一个抽象的地址到一个常规的DOS文件路径。
//ExtractFileName获取文件名称和扩展路径。
BoardFileName := ForceFileNameExtension(BoardFileName,'XLS');
//ForceFileNameExtension函数用新的扩展名称替代已存在的文件扩展名称。
BoardUnit := Board.DisplayUnit;
Board.Free;
GetMem(P, 4048);//申请内存。
SetState_Parameter(P,'Server','Spread');//设置命令参数。
SetState_Parameter(P,'Action','Start'); //设置命令参数。
MessageRouter_SendCommandToModule('Client:SetupEDAServers', P, 4048, 0);
//发送命令给Client服务器的SetupEDAServers过程,命令参数存在P中,内存大小为4048。此过
第 288 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇 程设置EDA服务器。
FreeMem(P, 4048);//释放内存。
SetupApiCalls;//设置一个Spread API调用。
SpreadHandle := CreateASpreadDocument(BoardFileName);//创建一个XLS型的spread文档。
If SpreadHandle = 0 Then Exit;
ComponentIteratorHandle := PcbApi_CreateIterator(PcbApi_GetCurrentBoardHandle,
eComponentObject,//元件对象
eProcessAll,//处理所有
eIgnoreLayer);
//建立对象迭代程序。
ComponentHandle := PcbApi_GetFirstObject(ComponentIteratorHandle);//查找第一个元件对象。
//PcbApi_GetFirstObject函数使用给定的迭代程序(iterator)句柄返回第一个发现的PCB对象句柄。
ComponentRowNumber := 0;//元件统计总数初始化为0。
TotalInfoList := TStringList.Create;//建立存放整个元件对象的列表。
While (ComponentHandle <> 0) Do//查找到有元件对象。
Begin
Inc(ComponentRowNumber);//元件对象数目统计。
ComponentInfoList := TStringList.Create;//建立存放当前元件对象的列表。
ExtractAttributesOfAComponentObject(ComponentRowNumber,ComponentHandle,
ComponentInfoList);
//调用ExtractAttributesOfAComponentObject过程来把当前元件中信息输出到列表ComponentInfoList中。
ExportComponentInfoToSpread(SpreadHandle,ComponentRowNumber,ComponentInfoList);
TotalInfoList.Add(ComponentInfoList.Text);
//ExportComponentInfoToTotalInfoList(TotalInfoList,ComponentInfoList);
//把ComponentInfoList列表中信息输出到一个XLS型的spread文档中。
ComponentInfoList.Free;//列表释放。
ComponentHandle := PcbApi_GetNextObject(ComponentIteratorHandle);//查找下一个元件对象。
End;
SpreadAPI_SetColumnName(SpreadHandle,1,'序号');//设置第一列为序号。
SpreadAPI_SetColumnName(SpreadHandle,2,'名称');//设置第二列为名称。
SpreadAPI_SetColumnName(SpreadHandle,3,'流水号');//设置第三列为流水号。
SpreadAPI_SetColumnName(SpreadHandle,4,'备注'); //设置第四列为备注。
第 289 页
Protel二次开发从入门到精通 作者:张浩、白二平 提高篇
TempFileName := ForceFileNameExtension(BoardFileName,'TXT');
//建立与印制板名称相同但扩展名为TXT的输出文本文件名称。
ExportComponentInfoToTempFile(TempFileName,TotalInfoList);
//把整个存放元件信息列表中的内容输出到本地文本文件。
TotalInfoList.Free;//释放存放整个元件信息的列表。
PcbApi_DestroyIterator(ComponentIteratorHandle);//销毁迭代程序。
RefreshDesignDatabase(SpreadHandle);//刷新spread文档,使其每一列内容和宽度相适应。
End;
{....................................................................................}
Procedure Command_ExportComponentInfoToSpread(Window : TServerWindow; Parameters : PChar);
Begin
ExportComponentInfo;
End;
第 290 页