260 likes | 518 Views
第 11 章 自定义函数和结构. 11.1 创建自定义全局函数 11.2 创建自定义对象函数 11.3 外部函数 11.4 结构. 图 11-1 定义全局函数. 11.1.1 创建自定义全局函数. 在开发环境的主窗口中,选择工具栏的 New 图标或选择主菜单 File 的子菜单 New ,将出现标题为“ New ” 的窗口。. 点击该图标, 将显示 / 隐含 函数属性定义. 图 11-2 定义全局函数的属性. 11.1.1 创建自定义全局函数.
E N D
第11章自定义函数和结构 11.1 创建自定义全局函数 11.2 创建自定义对象函数 11.3 外部函数 11.4 结构
图11-1 定义全局函数 11.1.1创建自定义全局函数 在开发环境的主窗口中,选择工具栏的New图标或选择主菜单File的子菜单New,将出现标题为“New”的窗口。
点击该图标, 将显示/隐含 函数属性定义 图11-2定义全局函数的属性 11.1.1创建自定义全局函数 Object页的Function,双击Function项或点击OK按钮,进入全局函数的定义。 在图中,Function Name项中输入函数名、Return Type下拉框中选择函数返回值的类型、Argument Name中输入函数参数名、Argument Type下拉框中选择函数参数类型、PassBy下拉框中选择参数传递方式。
图11-3 增加、插入、删除参数 11.1.1创建自定义全局函数 参数传递方式有三种: • Value:值传递---将实际参数的值传递给函数参数 • Reference:地址传递---把实际参数的地址传递给函数,此时,如果函数修改了形式参数的值,那么实际参数的值也就被修改了。 • Readonly:地址传递---把实际参数的地址传递给函数,不过不允许修改参数的值。 要增加或删除参数,可在图11-2中右击,出现弹出式菜单。Add Parameter增加参数,Insert Parameter插入参数,Delete Parameter删除参数
点击该图标,将显示/隐含函数属性定义 图11-4 编辑函数代码 11.1.1创建自定义全局函数 函数名及参数定义好后,在定义函数的下面窗口内编辑代码。或选择主窗口View菜单的Script子菜单,打开函数代码编辑窗口。函数返回值的类型、参数名、个数及类型可以随时更改。若函数有返回值,必须立即输入代码,即必须写一条return语句,否则产生错误。 定义好的全局函数和标准函数一样使用。
1.选择目标 2.选择pbl源文件 3.在ObjectType中选择Functions或All Objects 4.选择要打 开的函数 图11-5 打开自定义全局函数 11.1.2修改自定义全局函数 在开发环境的主窗口中,选择工具栏的Open图标或选择主菜单File的子菜单Open,将出现标题为“Open”的窗口,在ObjectType下拉框中选择Functions,在Object中选择要打开的函数, 双击或点击OK按钮,进入全局函数的定义,如前图11-4所示。可以更改函数返回值的类型、参数名、个数及类型和函数代码。
图11-6 删除自定义全局函数 11.1.3删除自定义全局函数 打开Library库管理器,打开要删除的自定义全局函数所在的PBL,选择要删除的自定义全局函数,右击,出现弹出式菜单,选择Delete将删除所选的自定义全局函数。
2.选择New Function 1.选择Functions 图11-7 定义对象函数 11.2.1 创建自定义对象函数 可以为Application Object对象、窗口对象、用户对象创建自定义函数,这种函数称为对象函数。 先打开要定义函数的对象,再打开Script代码编辑窗口,先选择Functions,再选择New Function,将出现函数定义窗口。
点击该图标,将显示/隐含函数属性定义 图11-8定义对象函数的属性 11.2.1 创建自定义对象函数 Access缺省值为“public” 。 访问属性Access有三个选择: lpublic:在整个程序中都可访问。 lprivate:只能在当前对象的程序中使用,不能在该对象的后代的程序中使用。 lprotected:只能在当前对象的程序以及该对象的后代的程序中使用。 对象函数的命名规则一般与对象有关,如应用对象Application Object的函数一般以“af_”作前缀,窗口对象Window的函数一般以“wf_”作前缀,菜单对象menu的函数一般以“mf_”作前缀,用户自定义对象的函数一般以“uf_”作前缀。这些规则清楚地表明了函数所在对象的类型,便于程序的维护。
点击该图标,将显示/隐含函数属性定义 图11-9编辑函数代码 11.2.1 创建自定义对象函数 在定义函数的下面窗口内编辑代码。若函数有返回值,立即输入代码,即必须写一条return语句,否则产生错误。 对象函数的返回值的类型、参数名、个数及类型能随时更改,系统会给出一个提示信息,以确认是否更改。 在其它对象的程序中调用时,应在函数名前加上函数所在的对象名如w_pipe.wf_error(num),当然w_pipe必须已被打开。
1.选择Functions 2.选择要修改的函数 点击该图标,将显示/隐含函数属性定义,可以更改返回值类型及参数等 3.输入或修改代码 图11-10 修改对象函数 11.2.2 修改自定义对象函数 打开自定义函数所在的对象,打开Script代码编辑窗口,选择Functions,再选择要修改的函数。对象函数的返回值的类型、参数名、个数及类型都能随时更改。系统会给出一个提示信息,以确认是否更改。可以输入或更改函数代码。
图11-11 列出全部函数 11.2.3 删除自定义对象函数 要删除自定义对象函数,首先打开自定义函数所在的对象,然后选择主菜单View的子菜单Function List。
图11-12 列出所有对象函数 图11-13删除对象函数 11.2.3 删除自定义对象函数 选择Function List后将列出该对象的全部函数,如图11-12,右击要删除的函数,出现一个弹出式菜单,图11-13,选择Delete将删除所选的对象函数。 注意:一旦选择Delete将立刻删除所选的对象函数,系统对删除操作不作提醒。 在图11-13中,选择弹出式菜单中的Script,或双击所选的函数,将打开Script代码编辑窗口,以便查看与修改所选的对象函数,包括函数返回值的类型、参数名、参数个数、参数类型及函数代码等。
2.选择Global External Functions或Local External Functions 1.选择Declare 3.输入函数定义 图11-14定义外部函数 11.3.1外部函数的定义 使用外部函数之前,必须先对其进行说明。根据作用范围分为两种类型:全局外部函数Global External Functions和局部外部函数Local External Functions。全局外部函数可在应用程序的任何地方使用;局部外部函数只能在所定义的对象中使用。 打开要定义外部函数的对象,再打开Script代码编辑窗口,选择Declare,再选择Global External Functions或Local External Functions,最后输入函数定义。
11.3.1外部函数的定义 定义外部函数时使用两种关键词:有返回值用Function,无返回值用Subroutine。 用Function的格式: [access] FUNCTION return_type function_name([REF][type1 arg1,。。。,typen argn]) LIBRARY lib_name 用Subroutine的格式: [access] SUBROUTINE sub_name([REF][type1 arg1,。。。,typen argn]) LIBRARY lib_name 其中: laccess:访问级别。是可选项,只用于局部外部函数Local External Functions, lreturn_type:返回值类型。必须是一个合法的PowerBuilder数据类型。 lfunction_name和sub_name:外部程序的函数名或子程序名储存在DLL库中。 lREF:参数通过地址传递。 ltypei:参数的数据类型。 largi:参数名 llib_name:包含外部函数或子程序的DLL/EXE文件名。
11.3.2外部函数的调用 全局外部函数的使用类似于全局函数,局部外部函数的使用类似于对象函数。在其它对象的代码中使用局部外部函数时需加上函数定义所在的对象名。 但在实际应用中会发现,调用外部函数经常不成功,原因可能是以下几种情况: (1) 32位环境调用16位DLL (2) 数据类型不一致。外部函数一般是用C/C++写的,有许多PowerBuilder所没有的数据类型。 (3)指针。PowerBuilder没有指针数据类型。 (4)函数名大小写错误。在PowerBuilder中不区分大小,但使用外部函数时却要区分大小写。 (5)外部函数所在的库文件DLL或EXE文件找不到。可能不在当前路径下。
图11-15Windows口令管理窗口 图11-16 调用外部函数示例 11.3.3外部函数使用实例 在Windows的控制面板中的有一个口令管理程序,用来设置和修改Windows和其它系统口令,如图11-15。如何调用这个口令管理程序呢? 步骤如下: (1)创建一个setpassword.pbl,其应用对象名为password,再创建一个窗口w_pw,窗口上放一个“设置口令”的命令按钮cb_setpw,如图11-16所示。
图11-17 定义外部函数 11.3.3外部函数使用实例 (2)编写代码 l在应用对象password的open事件中编写代码: open(w_pw) l在窗口w_pw中定义外部函数。先打开w_pw的Script代码编辑窗口,再选择Declare,然后选择Local External Functions。
11.3.3外部函数使用实例 输入下面的代码: // 定义外部函数,即声明外部函数的语法格式与来源 Function Long ShellExecuteA(Long hwindow, String lpOperation, String lpFile, String lpParameters, String lpDirectory, Long nShowCmd) Library 'shell32.dll' Function Long GetDesktopWindow() Library 'user32.dll' l在“设置口令”的命令按钮cb_setpw的clicked事件中输入以下代码: //在PowerBuilder中调用Windows控制面板中的口令管理程序 String cpl_name String ls_null SetNull(ls_null) cpl_name = "Password.cpl" ShellExecuteA(GetDesktopWindow(), ls_null, 'rundll32.exe', "shell32.dll,Control_RunDLL " + cpl_name + ",", ls_null, 0) //调用外部函数
图11-18 定义全局结构 11.4.1 定义全局结构 在开发环境的主窗口中,选择工具栏的New图标或选择主菜单File的子菜单New,将出现标题为“New”的窗口。
图11-19 全局结构定义画板 图11-20 增加、删除结构元素 11.4.1 定义全局结构 选择Object页的Structure项,双击Structure项或点击OK,进入全局结构的定义,如图11-19。 在图11-19全局结构定义画板中,输入元素名,并选择元素的数据类型。右击将出现弹出式菜单,如图11-20,选择Insert Row将插入元素,选择Delete Row将删除元素。
图11-21 保存结构 11.4.1 定义全局结构 定义好结构的元素后,选择保存,输入结构名。结构名一般以“s_”作前缀。
图11-22 定义对象层结构 图11-23 结构定义画板 11.4.2 定义对象层结构 为Application Object对象、窗口对象、菜单对象、用户对象等创建结构称为对象层结构。对象层结构一般只能在该对象内使用,当该对象正在打开时,其它对象的程序可以使用该结构。 打开要定义结构的对象,选择主菜单Insert的子菜单Structure,如图11-22,出现结构定义窗口,如图11-23。输入结构名、元素名及类型。按右键出现弹出式菜单,选择Insert Row将插入元素,选择Delete Row将删除元素。对象层的结构与所在的对象一起保存,不能单独保存。
11.4.3 使用结构 要使用某结构,应该先声明一个该结构类型的实例变量,然后再引用该结构的变量。 例如,设s_student是定义的一个全局结构,则在程序中使用该结构类型的代码例子为: s_student s1,s2 //定义两个s_student型的实例变量s1和s2 s1.no=“320108800123204” //给结构s1的元素no赋值 s1.name=sle.text //给结构s1的元素name赋值 s1.math=96 //给结构s1的元素math赋值 s2=s1 //将结构s1各元素的值赋给结构s2的对应元素, //只有同一类型的结构才能这样整体赋值。 对象层的结构其引用方法与全局结构基本一样,但在其它对象的代码中引用时,需指明结构所在的对象(象引用对象函数那样)。 例如,s_stru是在窗口w_main中定义的结构,在窗口中定义一个实例变量s3: s_stru s3 //在窗口的Declare中定义Instance Variable 要在另一窗口w_sub中引用s3,格式为: sle_1.text=w_main.s3.id sle_2.text=w_main.s3.name
图11-24 删除全局结构 11.4.4 删除结构 • 删除全局结构 打开Library库管理器,打开要删除的全局结构所在的PBL,选择要删除的全局结构,右击,出现弹出式菜单,选择Delete将删除所选的全局结构。
图11-26 删除对象层结构 图11-25 View菜单 11.4.4 删除结构 2. 删除对象层结构 打开结构所在的对象,选择主菜单View的子菜单Structure List,如图11-25。 选择Structure List后将列出该对象的全部结构,右击要删除的结构,出现一个弹出式菜单,如图11-26,选择Delete将删除所选的结构。