置粘贴板的excel函数公式大全是什么

503 Service Temporarily Unavailable
503 Service Temporarily Unavailable热门搜索:
您的位置: -&
软件教程分类查找
非常抱歉!2345软件大全没能为您提供完善服务,万分感谢能得到您的指点!
您的建议:
第二章 新建和保存文件
第三章 文档格式转换
第四章 文件安全
第五章 打印
第六章 撤销和恢复
第二章 段落调整
第三章 页面布局
第四章 插入图片
第五章 制作表格
第六章 实例运用
第二章 添加文本
第三章 添加图片和表格
第四章 添加多媒体和超链接
第五章 版面修缮
第六章 动画效果
第七章 幻灯片母版
第八章 播放幻灯片
第二章 数据输入
第三章 表格设计
第四章 数据管理
第五章 公式与函数
第六章 打印电子表格
第七章 其他功能及实例演示
精品软件课程
人气:4038474
WPS是金山公司的中文办公软件,包含文字,
人气:1428027
Excel是office的重要组成部分。多特Excel教
人气:369092
Word是由Microsoft公司出版的文字处理器应
人气:301589
Word是由Microsoft公司出版的文字处理器应
小游戏推荐
wps文字带圈文字输入方法
出处:2345软件大全
人气:11492
您可能感兴趣的问题:
核心提示:平时我们在编写文档时,对于一些标题常会使用某些符号进行着重指出,今天小编为大家介绍一下如何在wps文字中输入带圈文字。
  平时我们在编写文档时,对于一些标题常会使用某些符号进行着重指出,今天小编为大家介绍一下如何在wps文字中输入带圈文字。
  首先使用wps文字打开文档,选中你所要添加圈的文字,如下图所示:
  在“开始”菜单中找到如下图标,点击▽,选择“带圈字符”项,如下图所示:
  打开“带圈字符”对话框,选择所需要的样式后点击“确定”按钮。
  完成后就可以得到下图中的显示状态。
相关教程推荐
相关软件推荐
资源统计:无插件软件:188498个 无病毒软件:188826个 昨日已处理142个带插件、病毒的软件
本站总软件:188826个 软件总下载次数:23.057亿次
软件教程文章:104364篇 总浏览次数:3.431亿次相关文章推荐
在Windows操作系统中存在两种剪贴板机制:Windows标准剪贴板和OLE剪贴板机
标准的Windows剪贴...
剪切、复制、粘贴都是我们在操作电脑的时候经常会用到的功能。但是你知道当我们剪切或者复制的 时候,数据会保存到什么地方吗?当我们粘贴的时候,又是从什么地方将数据输出出来呢?这都源自于系统中给我们提供了一...
要使用到剪贴板的方法,搜索到有两个包可以用,pyperclip,和pywin32clipboard,pyperclip在3.5版本中不能够import,可以手动下载安装,未查到原因;pywin32cl...
在工作中遇到一些重复的excel操作,例如,检查excel中的填报情况和生成下一次的填报新模板excel。
每周重复这样操作的时间,总想着有没有可以自动化的办法可以搞定,毕竟程序员厌恶重复嘛...
http://www.limou.net/?p=593
MFC:使用剪贴板,怎么将内容复制到剪贴板
有的时候,我们的程序或许要将一些内容复制进剪贴板,以方便用户的需要。
例如,我所写的...
1. CreateFile/ReadFile/WriteFile
CreateFile函数原型:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dw...
剪贴板内置在windows中,并且使用系统的内部资源RAM,或虚拟内存来临时保存剪切和复制的信息,可以存放的信息种类是多种多样的。剪切或复制时保存在剪贴板上的信息,只有再剪贴或复制另外的信息
Win32文件操作
文件在OS中存放多是以文件索引+文件数据形式分开存放的(这里就要注意删除文件内容的时候了)。
2、windowsAPI 文件操作
①打开文件
HANDLE WI...
win32 api 文件操作!
( 10:16:34)
分类: 经济博弈
(一)ChangeClipboardChain
将剪贴的连接从一个句柄转到下一个句柄。
BOOL ChangeClipboardChain(
HWND hWndRemove, // han...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)PB编程,API函数和PB编程绝招_这是个大贴,学习用[二] - api- - ITkeyowrd
PB编程,API函数和PB编程绝招_这是个大贴,学习用[二]
推荐:最近找到了一个特别好的在线Linux C API函数,整理了下,给大家分享一下,同时也方便以后使用。 1. 字符测试函数 2. 字符串操作 3. 内存管理函数 4. 日期与时间
5.2 编 写 脚 本Powers cript画板中提供了很多辅助的功能,可以提高开发效率、减少开发人员死记硬背。尤其对于初学者,掌握这里介绍的功能可以加快学习的进度。5.2.1 粘贴语句 对于PB的初学者或使用多种语言进行开发的编程人员来说,记清楚一些语言的语法规则是件很烦人的事情。PB在Powers cript画板中提供了很强的语句粘贴功能,可以很方便地在Powers cript任意位置粘贴PB的流程控制语句,可以像小学生做填空题似的在流程控制语句中加入条件和语句即可。可以在窗口菜单Edit中的Paste Special下选择适当的命令,也可以在s cript视窗的鼠标右键弹出菜单中进行同样的选择。比如,需要在s cript视窗中粘贴Choose Case的语法格式,可以在Paste Special下选择Statement-&Choose Case,在s cript窗口的当前光标位置自动放置如下脚本:CHOOSE CASE /*expression*/CASE /*item*//*statementblock*/END CHOOSE接下来只要修改部分注释就可以了。当需要粘贴PB提供的函数时,选择Function-&Built-in,然后稍等片刻(这时的鼠标不要点任何按键,显示内建函数的时间稍长)即可在s cript视窗中当前光标位置显示一个包含系统中当前可用函数的选择框。该选择框中一般包含的函数比较多,可以使用右侧的滚动条翻页查找,也可以直接使用键盘上的PgUp或者PgDn键翻页查找,还可以直接输入需要函数的首字母来自动翻到以该字母开头的函数处。注意,这时鼠标不要在该选择框之外进行操作,否则选择框将自动关闭。找到需要的函数后,双击,选择框自动关闭,在s cript视窗当前光标位置放置该函数。除了可以粘贴PB提供的函数外,还可以粘贴用户自定义函数和扩展函数,操作方法相同。如果选择了命令后,在s cript视窗中没有显示相应的选择框,则表示没有可供粘贴的对象。需要粘贴SQL语句时,系统自动和数据库联接并进入到另外一个窗口中,在该窗口中一般进行选择数据表、字段和条件,返回这几个操作步骤,即可将SQL语句返回并粘贴到刚才的s cript视窗的当前光标位置。下面以粘贴Select SQL语句为例介绍操作过程。首先选择Paste Spaciel-&SQL-&Select,如果还没有同数据库建立联接,则此时需要联接数据库,在窗口底部信息栏中显示Connecting Database。建立联接后,显示一个选择数据表的对话框。接下来要指定哪些字段,如果从多个表中选择字段,应该指明表之间的联接条件。这里的操作和创建视图时的操作相同,可以参见上一章创建视图时的介绍。组合完毕后,点击PainterBar上最右侧的小功能图标返回到原来的画板中,并在s cript视窗中光标的当前位置插入刚刚组合的SQL语句。放弃粘贴该SQL语句,直接使用窗口右上角的关闭按钮关闭窗口。在菜单中选择其他项目可以粘贴其他内容。比如,粘贴全局变量可以选择Global,粘贴共享变量选择Shared,粘贴实例变量选择Instance,粘贴应用系统中的窗口名称选择Window,粘贴本画板中控件名称选择Object,粘贴当前事件参数使用Argument,粘贴其他文件中的文字内容可以选择From File,粘贴流程控制语句使用Statement。5.2.2 添加注释 给脚本添加注释,虽然延长了开发时间,好像是降低了开发效率,从长远来看却恰恰相反。因为一个软件的生存周期很长,只要软件在使用,就存在维护的问题,而从事维护工作的不一定就是开发人员,程序的可读性直接影响到程序的可维护性,添加详细的注释可以使程序有很好的可读性。即使开发人员自己从事软件的维护工作,随着时间的推移,一些具体的细节也会淡忘。除了维护,开发期间的调试工作也需要很好的注释,规模稍微大一点的软件项目,都要涉及到合作问题。如果程序没有很好的注释,别人总要反复询问,势必影响开发的进度。注释实际上是程序文档的一部分,从严格意义上来说,是开发人员必须要提交的。s cript的注释有两种方式,一种是从“//”开始到换行时结束的注释,这种注释方式比较简短,使用快捷。如果在整行的开头使用“//”,还可以使用快捷方式,点击图标可以在选中行的行头添加注释标记“//”,点击图标可以取消选中行的行头注释标记。这两个小图标用来添加注释和取消注释,可以对多行操作。另一种注释方式是以“/*”开始,以“*/”结束,一般在注释较长时使用。例如,下面的注释:/*---------------------------------------------------------------------------------------------------------* 函数定义:Integer FUNCTION f_set_table_select (REF adw_dataWindow)* 函数作用:将数据窗口adw_dataWindow的SQL语句设置为用户在查询条件组合* 窗口中设定的SQL语句。* 特别说明:参数adw_dataWindow的传递方式为by referrence,这点一定要注意。* 作 者: 郭宝利* 编写日期: *---------------------------------------------------------------------------------------------------*/String ls_rtn //用来保存用户在查询条件组合窗口中设置的信息String ls_Filter //用来获取用户指定查询条件OpenWithParm(w_query_tj,&gz&) //打开查询条件组合窗口Ls_rtn = Message.stringparm //格式: SQL检索条件+'^'+汉字检索条件If ls_rtn && '' Then //用户设置了查询条件Ls_filter = Left(ls_rtn,Pos(ls_rtn, '^') – 1) //获取数据窗口的过滤条件/*--------------------- 开始用用户的查询条件检索数据 -----------------*/If dw_1.RowCount()& 1 Then return //如果没有数据,则没有过滤的必要了dw_1.SetFilter(ls_filter) //设置过滤条件dw_1.Filter() //过滤数据/*-------------------------------- 检索数据完毕 -----------------------------*/ElseReturn //直接返回End If建议在自定义函数的开始、小功能模块的开始、判断的各条件分支、比较难懂的算法、变量定义时、调用其他函数或窗口处、窗口调用返回的信息格式等地方书写注释。注释要讲明要点,清晰明了。对于协作开发的大型软件项目,公共模块的注释要讲清楚作者、编写日期、调用接口、函数的返回值、使用方法,并对模块的功能做简短的描述。上面的注释是一个自定义函数中常见的注释格式。5.2.3 查找替换 使用Windows 95的人对查找和替换操作应该很熟悉了,PB在s cript画板中也提供了这种风格的查找和替换,但它提供了更多的选项。查找和替换这两个对话框在PowerBuilder中大同小异,这里只介绍替换窗口。在s cript视窗中,使用鼠标右键弹出菜单中的Replace Text、窗口菜单Edit中的Replace Tex和快捷键Ctrl+H,都可以打开如图5-2所示的对话框。该对话框中有5个选项开关可以使用。Match Case表示是否匹配大小写;Search Selection Only表示只在选中的范围内进行搜索匹配;Search Backwards表示向相反的方向查找;Wrap at Beginningor End表示当查找到文件结尾时是否继续从文件的开始搜索,直到搜索的起点结束,该选项默认是选中的;Regular Expression表示进行常规表达式搜索,该搜索是比较有技巧的搜索,例如输入“err[1234]”并选中Regular Expression可以查找出err1,err2,err3,err4。关于这种搜索方法的匹配表达式可以参阅函数match的详细解释。5.2.4 编译脚本 当关闭s cript视窗时,在s cript视窗中选择其他事件或者其他控件时,选择s cript窗口右键弹出菜单中的Compile窗口菜单Edit中的Compile或者快捷键Ctrl+L时都可以导致编译当前s cript视窗中的当前脚本。直接关闭s cript视窗,系统对脚本进行编译。编译通过,则保存脚本,没有通过则显示一个对话框询问是否放弃脚本的修改并关闭。如果确认,则关闭s cript视窗并放弃刚刚做的脚本修改,如果选择“否”,则显示编译错误信息,并且不关闭s cript视窗。如图5-3所示。其他方法进行编译脚本出错时都会停留在s cript视窗,并显示编译错误信息,其界面和图5-3相同。上面的程序中有一个错误信息。双击错误信息光标会跳到与该错误信息对应的语句位置,便于修改找错。 19:45 kevin Powers cript语言基础(1)不管哪种语言,都有自己特定的数据类型、操作符、保留字、流程控制、函数和书写规则。学习一种编程语言,最基本的要求就是要掌握这些方面,较高要求就是灵活地运用函数。单个函数的用法比较好理解,但怎么用这些函数来解决实际问题,用哪些函数的效率比较高,这不仅仅是一个算法问题,而且在很大程度上取决于对函数灵活地运用(当然,程序执行效率也有赖于界面的设计,这在后面的界面设计章节介绍)。所以,在学习Powers cript语言时,不能拘泥于一些死的规则、规定,要多实践、勤动手。很多工作上的事情都可以用Powers cript语言来解决,在学习Powers cript语言时可以尝试着用学过的内容来解决这些问题。例如,人民币的习惯表示都是大写的汉字,如何将数字转变为大写汉字表示;Powers cript语言提供了在字符串中查找指定子串的函数,如何编写通用的函数,来查找某字符串中最后一个指定的子串;和数据库打交道的应用程序一般都要涉及到排序和查询,如何编写一个通用的排序模块和查询模块等等。具体到Powers cript语言的学习,要掌握变量、表达式、语句、事件和函数,其中要灵活运用函数。5.3.1 注释 注释用于书写关于脚本的说明,提供功能上的解释或设计思路的简短描述,可以增强程序的可读性,便于日后的维护工作。有两种注释方式:= 以“//”开头,后面是注释内容,在一行内书写下。这种注释方式不能在语句中间插入注释,只能是在一行的开头或一行的后面书写注释。s cript画板中为这种注释方式提供了快捷方式,使用比较方便。= 在“/*”和“*/”符号之间的为注释内容,可以多行书写注释。这种注释方式可以在语句的中间插入注释内容,一般用于书写内容比较多的注释。例如,下面的脚本中使用了这两种注释方式:String ls_name //该变量用于保存职工姓名/*下面的程序定义光标,从数据库workers表中提取所有的职工姓名。为保证不重复提取,在name字段名前使用了关键字distinct,然后对光标逐条数据进行处理,将姓名加入到下拉列表框中,以供用户选择。*/declare name_cur /*光标名称*/ cursor forselect distinct /*该关键字可以确保不重复提取*/……5.3.2 标识符 标识符是指在脚本中使用的变量、标号、窗口、控件、菜单以及其他所有引用的对象的名称。该名称的命名应该遵循如下规则:(1)必须以字母或下划线开头。(2)最长为40个字符,不能包含空格。(3)不区分大小写,例如name,Name,NAME是相同的。(4)不能是保留字,如This,Parent。(5)可以包含数字、字母和一些特殊字符,特殊字符有短线“-”、下划线“_”、美元符号“$”、号码符号“#”和百分号“%”。在变量中可以使用短线,使标识符的表达能力更强,但同时也带来了麻烦。因为像li_in-li_out这样的表达式就有了歧义:到底是变量li_in减 li_out呢,还是一个变量名称呢?为此,PowerBuilder规定减操作符号为“ – ”,也就是说短线的两端都带有空格表示为减操作,否则是变量中的一个普通字符。因为空格不能出现在变量中,所以只在短线前面加空格表示减操作符就足够了,也就是“ –”。为了避免这样的麻烦,可以在s cript画板中配置不允许在标识符中使用短线(取消Allow dashes in identifiers选项即可)。标识符命名时,应该使标识符有一定的字面含义,有助于程序的调试和脚本可读性的提高。可以在标识符中使用大写、短线、下划线来体现标识符的意义。例如:CharacterCounter、 character_counter,character-count肯定都比charactercount的可读性更好一些。一个好的标识符命名建议是:变量作用域+变量类型+“_”+具有一定字面含义的名称使用该建议,上面的标识符character_counter改为li_CharacterCount,能反映出更多的含义:“l”代表是本地变量,是 Local的缩写,“i”代表是integer类型的变量,CharacterCount表名该变量是用来记录字符个数的计数器。按照上面的规则和建议,下面是变量的一些例子:(1) is_code(2) li_count(3) firstbuttoncaption(4) FirstButtonCaption(5) 2nd_quantity(6) first button caption(7) child’sage其中,前四个是正确的变量名称,后面三个是错误的。(1)和(2)是比较好的变量命名,能够体现变量的类型、作用域和含义;(3)的可读性不是太好,(4)的可读性稍好,但不能体现类型和作用域。5.3.3 特殊ASCII字符 字符串中可以包括一些特殊的控制字符或者字符串的界定符,例如可以在字符串中加入制表符以保证显示格式的整齐。使用方法如表5-1所示。表5-1 特殊ASCII字符名 称 符 号 名 称 符 号换行(Formfeed) ~f 新行 ~n横向制表符 ~t 垂直制表符 ~v回车 ~r 退格(Backspace) ~b单引号 ~’ 双引号 ~”波浪号~ ~~通过上表可以看出,特殊字符都是使用~符号来引用的。实际上,其他任意字符都可以使用~符号再加上数字来表示。数字的表示可以是从0到255的十进制,也可以是从0到hFF的十六进制数,还可以是从0到377的八进制数。例如:~121 //ASCII码值为121的符号,也就是“y”~h79 //ASCII码值为十六进制的79的符号,也就是“y”~o171 //ASCII码值为八进制的171的符号,也就是“y”注意,h是十六进制英文Hexadecimal的缩写,o是八进制英文单词Octal的缩写,都是小写。5.3.4 标号 标号是和GOTO语句配合使用的,是GOTO语句要跳转的地方。标号由一个标识符后面跟一个冒号(:)构成,可以在一个脚本中放入任意数目的标号,但是同一段脚本中,标号不能重复。GOTO语句跳转时也只能跳转到当前脚本中的标号处,不能跳转到其他脚本的标号处。在结构化的程序设计中不提倡使用GOTO语句,但是Powers cript还是支持它。标号可以单独占用一行,也可以和语句同在一行。例如:OtherProcess:If lb_selected Then Continue_process=True……OtherProcess: If lb_selected Then Continue_process=True……以本人的开发经验,标号都是可以避免的。 19:47 kevin Powers cript语言基础(2)5.3.5 NULL值 NULL代表不知道或者没有定义,和空值完全不同。例如,在数据库中某字段取值为NULL,代表用户还没有处理这个字段的数据,有待于处理;而如果该字段取值为空,代表这个字段的数据用户做了处理,这个字段的取值是清楚的。当变量定义后,变量没有取值,应该为NULL,但实际上不是这样。PowerBuilder为每种类型的变量都规定了默认值,当刚刚定义了某类型的变量时,该变量的取值为这种类型变量的默认值。如integer类型的默认值为0,string类型的变量的默认值为“”。大多数情况下,NULL和数据库打交道时才经常使用。当某个取值为NULL的字段取值读入到变量时,该变量被置为NULL。也可以通过函数将变量的值置为 NULL,但是不能直接把NULL赋值给变量。任何类型的变量都可以被赋值为NULL,NULL是一个非常特殊的值。函数用法是:SetNull(变量名)执行成功时返回1,否则返回-1。例如:String ls_name //此时变量ls_name的取值为“”SetNull(ls_name) //ls_name变量此时为NULL判断某变量的取值是否为NULL时,使用函数IsNull(变量名),不能使用“=”来判断。例如“if ls_name=NULL then…”是不正确的,“if IsNull(ls_name) then …”是正确的。当某布尔表达式的取值为NULL时,Powers cript处理为False。例如,下面的语句都不能执行beep(1)语句:Int li_Nbr// Set li_Nbr to NULL.SetNull(Nbr)If li_Nbr =1 Then Beep(1)If li_Nbr && 1 Then Beep(1)If Not (li_Nbr = 1) Then Beep(1)正因为NULL的特殊性,在条件语句中判断时要备加小心。例如,下面的语句就能正确执行ELSE中的信息显示:Int li_countSetNull(li_count)If li_count = 1 ThenMessageBox(&Value&, &li_count= 1&)ElseMessageBox(&Value&, &li_count= NULL&)End If但是,如果把上面的语句做语法上的等价修改,就什么显示信息也没有:Int li_countSetNull(lli_count)If li_count = 1 Then MessageBox(&Value&, &li_count= 1&)If li_count && 1 Then MessageBox(&Value&, &li_count= NULL&)当字符串的联接运算中有NULL时,取值也为NULL。例如:String ls_name,ls_tempSetNull(ls_temp)Ls_name = &张三&Ls_name = ls_name + ls_tempIf IsNull(ls_name) Then MessageBox(&提示&,&空值!&)函数MessageBox()经常用来显示一定的信息,和用户交互时经常使用。如果要显示的信息是NULL时,提示窗口不会显示。例如,下面语句执行时,没有任何的信息提示窗口:String ls_name,ls_tempSetNull(ls_temp)Ls_name = &张三&If IsNull(ls_name) Then MessageBox(&提示&,ls_name + ls_temp)5.3.6 保留字 保留字是PowerBuilder内部使用,不能用做标识符的单词。总共有99个,基本上都是些逻辑运算符、流程控制语句、事务处理语句、指代词等。为避免标识符命名时和保留字发生冲突,现将PowerBuilder的保留字罗列于表5-2。标有“*”号的保留字可以用做函数名,标有“+”号的是在PB 7.0中没有、PB 8.0新添加的保留字。表5-2 保留字Alias Dynamic Immediate Privatewrite SystemwriteAnd* Else Indirect Procedure ThenAutoinstantiate Elseif Insert Protected ThisCall End Into Protectedread Throw+Case Enumerated Intrinsic Protectedwrite Throws+Catch+ Event Is Prototypes ToChoose Execute Last Public Triggerclose Exit Library Readonly TrueCommit External Loop Ref TryConnect False Next Return TypeConstant Fetch Not Rollback UntilContinue Finally+ Of Rpcfunc Update*Create* First On Select UpdateblobCursor For Open* Selectblob UsingDeclare Forward Or Shared VariablesDelete From Parent Static WhileDescribe* Function Post* Step WithDes criptor Global Prepare Subroutine WithinDestroy Goto Prior Super _debugDisconnect Halt Private SystemDo If Privateread Systemread注意,这些保留字是不区分大小写的。例如,parent、Parent、PARENT是相同的保留字。命名标识符时,为了避免和保留字冲突,除了不使用表5-2中的保留字外,还可以有以下两种方法。= 通过颜色来区分:所有保留字在s cript画板中都是绿色显示的,保证命名时,变量不是绿色即可。= 养成良好的标识符命名习惯,例如使用匈牙利命名法、在变量中使用短线或下划线等等。5.3.7 指代词 PowerBuilder提供了4个指代词,它们是This,Parent,ParentWindow,Super,可以代替对象名称来引用对象,从而增强程序的可移植性。例如,假设在窗口w_main中,按键“退出”的Clicked事件上有语句Close(w_main),可以关闭窗口w_main,当窗口名称改变时,必须修改该语句才能正确执行;使用指代词就不同了,Close(parent)可以在窗口名称发生变化时仍然能够正确执行,并且该控件拷贝到其他窗口中不加修改仍然可以正确使用。指代词根据脚本所在对象周围环境的不同而指代不同的对象。比如,在窗口上的按键,它的Clicked事件中,脚本的Parent就是指代按键所在的窗口;可视用户对象内,按键Clicked事件中,脚本的Parent就是指代按键所在的用户对象。表5-3列出了各个指代词可以在哪些对象中使用以及所指代的对象。表5-3 指代词指 代 词 使 用 位 置 含 义Parent 窗口中的控件 父窗口可视用户对象中的控件 用户对象菜单 上一级菜单This 窗口、定制用户对象、应用对象、控件 对象或控件自身ParentWindow 菜单 运行时菜单所在的窗口Super 子对象或控件 父对象或控件子窗口或用户对象 直系祖先子窗口或用户对象中的控件 用户对象的直系祖先下面再对这些指代词做详细介绍。1.This 指代词用于引用当前对象。This指代词代表脚本所在的对象,虽然和直接使用该对象的名称作用相同,但是对象更名或者将脚本拷贝到其他对象的事件中时, This具有更好的通用性,使用This指代词可以类属地引用为其编写脚本的对象,这样,开发人员不必将脚本指向一个特定的对象名称来编写代码。例如,在按键中编写脚本时使用This,可以理解成是为按键这个类编写脚本,而不仅仅是为当前按键编写脚本。这有利于开发人员开发更通用的脚本。在对象或控件的脚本中,开发人员可以不加指代词This或本身的对象名来引用对象或者控件的属性,但是,良好的编程风格应该提倡使用指代词This,使脚本更清晰易读。例如,下面是一个按键Clicked事件下的语句,省略了指代词This仍能够完成this.x=this.x+50所完成的任务:x=x+50但是,如果上面的语句所在脚本中定义了变量x,脚本的执行就不能完成预期的功能了。PowerBuilder在变量处理时,认为x是变量而不是按键的X坐标了。当有同名的全局变量和实例变量时,PowerBuilder将会首先找到全局变量,需要引用本地变量,就必须使用指代词,因为实例变量是属于窗口或用户对象的,指代词应该指代窗口或者用户对象。所以,在窗口或用户对象中编程则使用指代词This,在窗口中的控件或用户对象中的控件上编程则指代词是 parent。例如,某窗口中有一个和全局变量test_str同名的实例变量,在该窗口中引用该实例变量的语句是this.test_str,在该窗口的控件上引用该实例变量的语句是parent.test_str,当然,全局变量可以直接使用。在函数的参数中也可以使用this,用来传递调用函数的对象。例如:wf_SetPosition(this)2.Parent 指代词Parent用于引用包含当前对象的对象。在窗口或用户对象的控件中,Parent指代窗口或者用户对象;在菜单中,Parent指代包含当前菜单项的上一级菜单。例如,在窗口的“改变标题”按键上编写如下脚本:If parent.title=&实验窗口& Thenparent.title = &hello!&Elseparent.title = &实验窗口&End If用户点击该键会看到窗口的标题在“实验窗口”和“hello!”两个之间来回切换。在窗口w_main的“退出”按键上使用close(parent)和close(w_main)语句是相同的,前面的更通用些,即使窗口的名称改变了,程序仍然能够正常运行。在定制的用户对象内,使用Parent的任何控件都是引用用户对象本身,而不是引用放置用户对象的窗口;需要访问用户对象的父对象时不能使用Parent 了,只能使用GetParent()函数。在标准用户对象中,Parent仍然指代用户对象放置的对象。例如,某可视用户对象中有一个“关闭”按键用来关闭该用户对象所在的窗口,就应该在该按键的Clicked事件上编写如下脚本:Close(GetParent(parent)) 19:48 kevin Powers cript语言基础(3)3.ParentWindow 该指代词只用于菜单中,用来指代在运行时和菜单所联系的窗口。例如,在菜单项“关闭”的Clicked事件中可以编写下面脚本,用来关闭和该菜单关联的窗口:Close(ParentWindow)当然也可以使用窗口名称。比如窗口w_main上的菜单项Clicked事件中,Close(ParentWindow)和Close(w_main)功能是相同的。当编写MDI类型的应用软件时,可能多个名称不同的窗口使用同一个菜单,使用语句Close(w_main)就不行了。除了使用ParentWindow的通用性比直接使用窗口名的通用性要强外,它们之间实际上还有其他的区别。假设窗口w_main中包含静态文本控件st_1,下面两个语句虽然在逻辑上是完全相同的,但是下面的语句就是错误的:ParentWindow.st_1.text = &测试& //该语句是错误的,编译不能通过而下面语句就是正确的:w_main.st_1.text = &测试& //能够正确运行。所以,这些语句要慢慢体会,尤其这些逻辑上相同但实际却不同的语句。写出上面的语句,无非想构造比较通用的程序。在一个对象中直接修改其他对象中的内容,这种设计是不合理的,导致了环境耦合。好的方法是在菜单项中触发父窗口的某个事件,通过窗口的事件脚本让窗口自己来修改自己的内容,这样一个菜单挂到几个窗口上都可以使用相同的脚本,只要窗口中自定义事件不同就可以了。可以如下修改:在菜单项中编写:parentWindow.TriggerEvent('ue_menupost')在窗口的ue_menupost事件中编写: st_1.text = '测试'4.Super 该指代词只有在处理继承时才使用,用来引用后代对象的祖先。使用祖先名称也可以引用,但是更为通用的是Super。例如,想调用父对象的Clicked事件处理程序时,子对象中可以这样写:CALL Super::Clicked当调用在子类中被重载的父对象的函数时,也可以使用super来指代父对象,例如,子对象重载了父对象的函数f_func(),在子对象中调用父对象的f_func()函数的语句可以这样编写:Super::f_func()5.3.8 续行和断句 通常情况下,Powers cript的一条语句书写在一行上,语句书写完毕后,按Enter键(回车键)转到下一行,开始下一条语句。有时候,为了阅读方便等原因,需要把一条语句书写在几行上,这时就需要使用续行符了。Powers cript的续行符为符号&,放在一行的末尾指示下一行是当前行的继续,例如,我们可以把语句:MessageBox(&SQL语句出错 &,&出错编号=&+String(SQLCA.SQLCode))书写在两行上:MessageBox(&SQL语句出错&,&出错编号=&+&String(SQLCA.SQLCode))注意,不能在标识符或保留字的中间续行。例如,下面的续行是错误的,原因在于将标识符分成了两行:推荐:API:(Application Programming Interface,应用程序编程接口)指的是我们用户程序编程调用的如read(),write(),malloc(),free()之类的调用的是glibc库提供的MessageBox(&SQL语句出错&,&出错编号 = &+String(SQLCA.SQLCode))在SQL语句中也不要使用续行,因为SQL语句使用“;”作为语句结束,从SQL语句开始到“;”符号之间的所有字符都认为是SQL语句,如果使用了“&”就会产生错误。在一行中写多条语句,在语句之间用分号进行分隔,例如:a = b +g = h +cnt = a + g + cnt但最好不要在一行中写多条语句,每条语句占据一行或多行既直观又清晰,何必自寻烦恼呢!5.3.9 空白 空白包括空格、Tab符、换行符和注释。除非空白被包括引号中,否则编译器忽略空白,不考虑它们所占的空间。例如:ls_FirstName + ls_LastName //加号两边空格被忽略,同时该注释也被忽略//MessageBox(&提示&,&这 里 的 空 格 没 有 被 忽 略!&)特殊情况下,短线“-”两端的空格不能被忽略,这时,短线加空格被处理成减号。 19:49 kevin19829.2 关于菜单的编程(1)关于菜单的编程涉及菜单项、工具条和小图标等的属性,函数,以及菜单项的事件等等。最经常的编程是在菜单项的Clicked事件中编写相应的脚本执行其字面表达的功能,其次是在窗口打开事件中初始化工具条的位置,或者在工具条位置改变时保存用户的配置,或者是打开Sheet时处理菜单共享,或者是在其他控件上响应点击鼠标右键时弹出菜单等等,下面分别介绍。9.2.1 为“退出”菜单项编写脚本在菜单中指代词parentwindow是指菜单挂接的窗口,比直接使用窗口的名称有更好的通用性。所以在“退出”菜单项的Clicked事件中可以这样编写脚本:Close(parentwindow)9.2.2 选中某个菜单项可以使用Checked标记来表示某个菜单项选中,可以在菜单项的Clicked事件中编写如下脚本来选中菜单项:If This.Checked Then //如果菜单为选中状态This.Checked = False //则取消选中Else //如果为非选中状态This.Checked = True //则选中该菜单项End If也可以使用函数Check和UnCheck来代替属性修改。上面的脚本可以改成:If This.Checked ThenThis.UnCheck()ElseThis.Check()End If注意: 当菜单项选中时,菜单项的左侧有一个“√”符号,并且对应的小图标为按下状态。9.2.3 隐含某个菜单项要隐含某个菜单项,可以将该菜单项的Visible属性修改为False,如果该菜单项位于菜单条的最高级别上,则可以将整个下拉菜单隐含。例如,某窗口上挂接了菜单m_main,在窗口的打开事件中将菜单中的“文件”整个下拉菜单隐含,可以在该窗口的Open事件中编写如下脚本:m_main.m_文件.Visible=False但是,将菜单项隐含并不能将其对应的在工具条中的小图标隐含,并且小图标的功能照样能够正常执行。要将小图标隐含,应该设置ToolBarItemVisible属性为False。例如,隐含菜单项“打开”对应的小图标,在窗口的打开事件中可以使用下面的语句:m_main.m_文件.m_打开.ToolBarItemVisible = False9.2.4 使某个菜单项失效将菜单项的Enabled属性置为False,即可使菜单项显示变灰而不能使用,同时对应的小图标也变灰。如果是下拉菜单则整个下拉菜单不能使用,但其下拉项目对应的小图标可以正常使用。如果是级联菜单则级联菜单不能被打开,但是级联菜单下的各个菜单项对应的小图标可以正常使用。下面是在窗口打开事件中将菜单m_main的“文件”下的m_open修改为无效的脚本:m_main.m_文件.m_open.Enabled=False9.2.5 调整工具条的位置如果工具条的ToolBarUserControl属性设置为True,则用户可以在工具条上按鼠标右键弹出菜单。使用该弹出菜单可以调整工具条的显示位置。用直接拖拉的方式也可以改变工具条的显示位置。当工具条的位置发生变化时将触发窗口的ToolBarMoved事件,在该事件中可以编写脚本来判断工具条的移动情况。当该事件触发时,PowerBuilder自动修改Message中的参数WordParm和LongParm,使用这两个属性可以判断工具条的移动情况,属性含义如下:Message.LongParm属性的含义:l 0:移动到左侧;l 1:移动到顶部;l 2:移动到右侧;l 3:移动到底侧;l 4:变为浮动显示。Message.WordParm属性的含义:l 0:FrameBar在移动;l 1:SheetBar在移动。关于工具条位置的编程一般是在窗口打开和关闭时应用。关闭时应该保存用户关于工具条的设置,以便在窗口打开时将工具条恢复到上次关闭时的状态。这些信息可以保存在应用的ini文件中,具体含义只要开发人员清楚即可,打开时按同样的含义来设置工具条的位置。例如,若按照上述message.logparm的含义在Frame关闭时保存工具条关于位置的设定,则脚本如下:Choose Case this.ToolbarAlignmentCase AlignAtBotTom!SetProfileString(&myapp&, &setup&, &Toolbarpos&, &3&)Case AlignAtLeft!SetProfileString(&myapp&, &setup&, &Toolbarpos&, &0&)Case AlignAtRight!SetProfileString(&myapp&, &setup&, &Toolbarpos&, &2&)………End Choose当然,也可以用同样的方法保存更多的设置,例如是否隐含工具条,是否显示文字,SheetBar的显示情况等等。在上述脚本中用到了函数SetProfileString,它的语法格式是:SetProfileString ( filename, section, key, value )它的含义是将value值写入文件filename的section节的key关键字中,关于ini文件的格式详细参见本书前面的介绍。同样,在Frame的打开事件中可以根据ini文件的设置来决定工具条的显示。例如,下面的脚本在打开事件中读取ini文件中的配置来决定工具条的显示位置:String ls_posls_pos = ProfileString(&myapp&,&setup&,&Toolbarpos&, &1&)Choose Case ls_posCase &0&This. ToolbarAlignment = AlignAtTop!Case &1&……End Choose 19:52 kevin 关于菜单的编程(2)9.2.6 修改工具条上鼠标右键弹出菜单中的内容应用对象的属性ToolBarUserControl控制着用户是否可以在工具条上使用右键弹出菜单,该属性缺省是True。右键弹出菜单可以控制工具条的很多属性,但是美中不足的是该菜单项都是英文,可以使用应用对象的属性ToolBarPopMenuText来改变该弹出菜单的文字内容。弹出菜单的内容如图9-3所示。弹出菜单中包括三部分,最上面的两项来自应用对象的ToolBarFrameTitle属性和ToolBarSheetTitle属性,中间和最下面两部分的文字内容可以使用应用对象的属性ToolBarPopMenuText来修改成其他的文字。可以在Frame的打开事件中编写如下脚本:GetApplication().ToolBarPopMenuText = &左侧,顶部,右侧,底部,浮动,文字,提示信息&文字以逗号分隔,如果多了则被自动忽略。只能修改该弹出菜单中的文字,但不能修改对应各项的功能。其中函数GetApplication可以获取当前应用的句柄(handle)。也可以在Frame的打开事件中使用下面的语句来限制用户不准使用工具条上的弹出菜单:GetApplication ().ToolBarUserControl = False9.2.7 动态设置MicroHelp使用函数SetMicroHelp可以动态改变菜单项的MicroHelp内容。该函数的语法是:windowname.SetMicroHelp ( string )其中windowname是菜单所挂接的窗口名称,string是要设置的MicroHelp内容。函数正确执行返回1,否则返回-1,如果有参数为 Null则返回Null。一般在菜单项的Selected事件中使用该函数,下面是一段将MicroHelp修改为“测试修改SetMicroHelp函数”,脚本如下:parentwindow.SetMicroHelp(&测试修改SetMicroHelp函数&)如果在定制Frame窗口的控件中修改MicroHelp,还得在相关事件中取消MicroHelp。一般在控件的GetFocus事件中显示 MicroHelp提供关于该控件的解释信息,在LoseFocus事件中将MicroHelp修改为“Ready”,脚本如下:在控件的GetFocus事件中:Parent.SetMicroHelp(&该控件的帮助信息&)在控件的LoseFocus事件中:Parent.SetMicroHelp(&Ready&)一个保存MicroHelp的好方法是使用控件的Tag属性,在窗口画板中给每个要显示MicroHelp的控件的Tag属性都指定适当的内容,然后在需要改变MicroHelp的脚本中将Tag属性作为函数SetMicroHelp的参数即可。9.2.8 使用右键弹出菜单弹出式菜单通常在用户点击鼠标右键时显示,而一般可视控件都具有事件RbutTonDown,可以在该事件下使用函数PopMenu来显示弹出式菜单。该函数的语法是:menuname.PopMenu ( xlocation, ylocation )其中menuname是要弹出的菜单的名称,可以是某个下拉菜单中的某个下拉项目或者某个级联菜单。 xlocation和ylocation是菜单显示的位置,该坐标的取值是相对于窗口而言的。通常使用函数PoInterX和PoInterY来获取该坐标,以便在鼠标点击的位置弹出菜单。这两个函数的语法格式相同,PoInterX的格式是:objectname.PoInterX ( )其中objectname是控件名称,X是鼠标点击位置和objectname左边框的距离,缺省为脚本所在控件。在和函数PopMenu搭配使用时应该获取相对于窗口而言的坐标位置。虽然每个控件的RbutTonDown事件中都有xpos和ypos参数可用,但这都是相对于控件而言的,下面的脚本都不会使弹出菜单在鼠标点击位置显示(除非该控件的起始坐标为(0,0)):m_main.m_文件.PopMenu(xpos,ypos)或者:m_main.m_文件.PopMenu(PoInterX(),PoInterY())上面两种语句的执行效果是完全相同的。正确的编程应该是在控件的RbutTonDown事件中编写如下脚本:m_main.m_文件.PopMenu(Parent.PoInterX(),Parent.PoInterY())在窗口的RbutTonDown事件中使用上述两种方式的哪一种都完全可以。9.2.9 改变窗口中的菜单函数ChangeMenu可以动态改变窗口的菜单。它的语法格式是:windowname.ChangeMenu ( menuname {, position } )其中,windowname是要改变菜单的窗口的名称;menuname是要挂接到窗口上的菜单的名称;position是可选参数,仅用于MDI Frame窗口中,用来指示给当前的窗口列表中追加的菜单标题的位置。缺省值为1,这时所有打开的Sheet出现在第一个菜单标题的下拉式菜单的底部。例如,下面的语句改变窗口w_employee的菜单为m_emp1:w_employee.ChangeMenu(m_emp1)9.2.10 设计一个通用工具条配置窗口只要使用菜单一般就提供工具条,就涉及工具条的设置问题。可以将这个普遍性的问题用通用的方法解决。设计一个通用的工具条设置窗口,界面如图9-4所示。在需要进行工具条设置的窗口菜单项Clicked事件中使用带参数方式打开该窗口,语句如下:OpenWithParm(w_setToolbar,parentwindow)其中窗口名称为w_setToolbar,在它的打开事件中根据当前工具条的情况初始化该窗口中控件的属性。打开事件的脚本如下:iw_window = message.powerobjectparm/* 根据当前工具条的位置设置单选按钮 */Choose Case iw_window.ToolbarAlignmentCase AlignAtBotTom!rb_botTom.Checked = TrueCase AlignAtLeft!rb_left.Checked = TrueCase AlignAtRight!rb_right.Checked = TrueCase AlignAtTop!rb_Top.Checked = TrueCase Floating!rb_floating.Checked = TrueEnd Choose/* 根据工具条的是否可视来设置按键cb_visible上的文字 */If iw_window.ToolbarVisible Thencb_visible.Text = &隐藏&Elsecb_visible.Text = &显示&End If/* 根据工具条是否显示文字来设置“显示文字”复选框的状态 */cbx_showtext.Checked = GetApplication ( ).ToolbarText/* 根据工具条是否显示提示信息来设置“显示提示信息”复选框的状态 */cbx_showtips.Checked = GetApplication ( ).ToolbarTips在单选按钮“左侧”的Clicked事件中编写如下脚本:iw_window.ToolbarAlignment = AlignAtLeft!对其他单选按钮也做类似的编程,来设置工具条的显示位置。在“显示文字”复选框的Clicked事件中编写如下脚本:GetApplication ( ).ToolbarText = this.Checked因为ToolbarText是应用对象的属性,所以上面的语句中用到了函数GetApplication。该属性的取值为Boolean型,和复选框的Checked属性类型相同。在“显示提示信息”复选框中也做类似的编程:GetApplication ( ).ToolbarTips = this.Checked在按键“隐藏”的Clicked事件中如下编写脚本:If This.Text = &隐藏& Theniw_window.ToolbarVisible = FalseThis.Text = &显示&Elseiw_window.ToolbarVisible = TrueThis.Text = &隐藏&End If通过以上10个方面的编程,介绍了很多关于菜单项、工具条的属性、函数以及菜单的引用方法和技巧。 20:32 kevin1982第9章 菜单和MDI9.3 什么是MDI应用MDI是Multiple Document Interface的缩写,在这样的应用系统中,可以同时打开多个窗口,每个窗口都被作为一个Document处理。同时打开多个窗口,用户可以很方便地在其间切换,以便获取关于当前工作更多的参考信息,更符合现实世界中的工作情况。试想在用户处理工资数据时,很有可能同时还要翻阅人事数据、出勤数据、甚至还有本月工资调整的红头文件,这都是进行工资处理必不可少的参考信息,如果不让翻阅这些数据,用户的工作该是多么别扭。MDI就是这样的应用,用户可以同时打开多个窗口,随意在窗口之间切换,工作流程完全由用户掌握,这样的应用系统界面更加友好。最典型的例子就是Excel。用户在窗口之间的任意切换可以通过菜单进行,每个MDI都肯定有一个菜单,它是MDI应用不可缺少的对象。所以,本章将菜单和MDI应用放在一起介绍,除了介绍它们的设计方法,还介绍它们的编程技巧。图9-5是一个MDI应用的外观。由六部分构成,其中工具条中的每个小图标代表某个菜单项的功能,是菜单项的快捷方式;状态条提供相应的帮助、提示信息,可以是关于菜单项的,也可以是关于工具条的,还可以是有关Sheet等其他所有可以出现在MDI应用中的对象的提示信息;Sheet是MDI应用中的重要的对象,可以是任何非MDI类型的窗口,是执行用户工作的;客户区是用户的工作区间,所有Sheet都显示在该区域;MDI框架是包含客户区在内的窗口框架,也叫做Frame。在这六部分中,Frame和菜单中都需要编写脚本,脚本中可能用到这六部分各自的属性、特有的函数,在后面都将详细介绍。9.3.1 菜单条和工具条菜单是MDI应用中必不可少的,不仅Frame必须有一个菜单,就连在客户区打开的各个Sheet也应该有菜单,如果没有就会自动继承前面Sheet的菜单。有两种通常的方式来为MDI的Sheet表提供菜单:在框架和每个Sheet之间共享一个菜单,或者分别为每个Sheet提供一个单独的菜单,当然也可以这两种方式混合使用。当打开多个有菜单的Sheet时,只有当前Sheet的菜单显示在Frame顶部,其他Sheet的工具条可以显示,而它们的菜单不显示。菜单提供各个Sheet间切换的功能,以及在Sheet中能够完成的绝大部分功能。每个菜单可以有自己对应的工具条,也可以没有,还可以对应多行工具条,这些都是在菜单画板中设计的,在后面设计菜单时加以介绍。工具条是一个对界面有非常强的装饰效果的对象,并且使用户的操作也会很方便。但如果没有相应的提示、帮助信息,用户很难记住众多小图标各自的功能,开发人员在设计时应该考虑到用户的这点难处。首先小图标的图片应该有一定的含义,有很多的PowerBuilder开发人员仅仅随便使用一个 PowerBuilder自带的小图标就了事,显然是对这个问题没有重视,而这一点对用户是否愿意熟悉工具条的功能有非常大的影响,以至于很多 PowerBuilder应用软件中工具条仅仅是一个装饰,而不是一个快捷的工具。奉劝开发人员不要把工具条在用户心目中改成装饰条。其次,工具条中每个小图标都可以显示一定的文字内容,简短的描述文字对用户有很大的提示作用,没有哪个用户不愿意使他的工作效率更高,这些文字内容将会使用户很乐意去熟悉工具条。可以通过属性ToolBarText来设置。但小图标上的空间毕竟有限,不能显示更多的文字,如果能够再显示更为详细的信息,这是哪个用户都不会反对的事情。我经常看见用户在拿到新的应用软件时,将鼠标停留在工具条上然后在屏幕上到处寻找是否有更多的信息出现,可见用户有这方面的强烈要求和使用经验,而开发人员千万不能成为消灭用户要求的杀手。在小图标上面停留片刻后的提示信息称为ToolBarTips,可以在设计菜单时指定,该提示信息一般也比较简短。更长的提示信息可以在MDI窗口底部状态条中显示,该信息称为MicroHelp,既可以在设计菜单时指定,也可以在脚本中使用函数 SetMicroHelp来动态设定。所有这些提示信息、属性的设定都将在菜单设计中详细介绍。9.3.2 客户区客户区是MDI窗口中用户的工作区间,Sheet都是在该区域显示的,它们的显示范围不会超过该区域。如果在MDI框架中放置了控件,这样的MDI窗口称为定制Frame,否则就称为标准Frame。客户区实际上是一个非常特殊的控件,该控件叫做mdi_1,只有当运行时才可用。当使用定制Frame时 mdi_1控件不能正确显示在可视区域,这时打开Sheet也不会正常显示,应该在Frame的Resize事件中编写脚本,对mdi_1重新进行定位。假设在Frame的上部放置了命令按键cb_1,在命令按键的下面和状态条之间显示mdi_1。脚本如下:UInt li_x,li_y,li_width,li_heightli_x = WorkSpaceX() //获取工作区的起始坐标xli_y = cb_1.y + cb_1.Height //获取命令按键cb_1下部的坐标li_width = WorkSpaceWidth() //获取工作区宽度//获取命令按键和状态条之间的高度li_height = WorkSpaceHeight() - li_y - mdi_1.MicroHelpHeightmdi_1.Move(li_x,li_y) //将mdi_1移动到指定坐标位置mdi_1.Resize(li_width,li_height) //按指定的宽、高改变mdi_1的大小上述脚本中的函数WorkSpaceX、WorkSpaceWidth、WorkSpaceHeight和另外的函数WorkSpaceY用来获取关于工作区域的参数,使用方法都比较简单,只要注意这些函数都不包括工具条所占用的区域。通过上述脚本,mdi_1控件就可以正确显示在Frame的可视范围内,再打开Sheet也不会出现什么异常了。当使用标准Frame时,系统会自动维护客户区的位置和大小。 20:33 kevin1982 第9章 菜单和MDI9.4 菜单和MDI(1)菜单是MDI应用中非常重要的控件,用来执行动作、导航Sheet。所以,熟练开发MDI应用系统必须要掌握菜单和MDI的关系,这包括两个方面,一个是 菜单和Frame的关系,一个是菜单和Sheet的关系。在MDI应用系统中,Frame窗口必须包含一个菜单,该菜单可以有工具条也可以没有。在Frame菜单中可以编写打开Sheet的脚本。Sheet并非特殊类型的窗口,只是在Frame中打开就称为了Sheet,实际上就是非MDI类型的窗口。虽然Sheet就是普通的窗口,但不能使用Open函数打开,要使用OpenSheet或者OpenSheetWithParm函数来打开。Sheet可以有菜单也可以没有菜单。当打开带有菜单的Sheet时, Sheet的菜单自动取代Frame的菜单;当打开没有菜单的Sheet时,该Sheet自动使用Frame的菜单(当然,可能是Frame本身自带的菜单,也有可能是其他Sheet的菜单)。这时就出现了问题,当打开带菜单的Sheet时,Sheet的菜单覆盖了Frame的菜单,Frame菜单中的功能如何执行?好的解决方法就是使用工具条。Sheet的菜单替换了Frame的菜单后,Frame的工具条始终可以显示,使用工具条照样可以正常执行 Frame菜单的功能。所以,在创建Frame的菜单时,好的习惯就是要同时创建菜单的工具条。但是,使用这种解决方法时,工具条中小图标功能的易记易用性就非常重要了,开发人员应该尽可能提供更多关于小图标的信息,如MicroHelp,Tips和 ToolBarItemText等,这些在“设计菜单”一节中已经详细介绍过了。另外一种解决方法可能有一定的适用情况,就是让所有的Sheet都共享 Frame的菜单,当所有的Sheet都进行同一类型或相似类型的操作时,比如像微软的Word似的,Sheet都进行文件编辑的情况下,这种方法就比较实用,菜单的维护就比较简单。在清楚了菜单和Frame及Sheet之间的关系后,还应该掌握一些常用的编程方法和技巧。在Frame菜单中打开Sheet、在Sheet之间导航,获取当前Sheet和安排Sheet的布局等都是最基本的操作,根据用户的操作情况维护菜单项是否可用,获取工具条的信息及保存工具条的设置等都是常用的技巧,遍历菜单中的各个菜单项在某些特殊情况下也能用到。下面对这些情况下的编程一一加以介绍。9.4.1 打开Sheet有两个函数可以用来打开Sheet,其中OpenSheet函数不给Sheet传递参数,而函数OpenSheetWithParm可以在打开Sheet的同时传递参数。OpenSheet的语法格式是:OpenSheet(Sheetrefvar{,windowtype},mdIframe{,position{,arrangeopen}})其中,Sheetrefvar是要打开的Sheet的名称(注意,不能是MDI类型的窗口);mdIframe是Frame的名称,表示要在这个 Frame的客户区打开名称为sheetrefvar的Sheet;这两个参数指明了在哪个Frame中打开哪个Sheet,都是必须的。变量 windowtype为String类型,用来表示要打开的窗口的名称,如果指明该参数,则sheetrefvar的类型必须是能够接受window类型的赋值,这时的函数表示要打开windowtype名称的窗口,并将其实例保存在变量sheetrefvar中,可以使用该变量引用这个Sheet。 position是一个Integer类型的参数,表示在菜单条中的位置,新打开的Sheet名称作为一个菜单项添加在该位置的下拉菜单中。菜单条最左面的项目位置为1,依次增加,当该参数大于菜单条中的项目数时则将Sheet名称添加到右侧倒数第二个菜单的下面。如果打开的Sheet数目超过9个,多余的则以级联菜单的形式显示在该菜单的more windows下。参数arrangeopen是指打开Sheet后在客户区中的布局方式,是ArrangeOpen枚举类型的值,有3个可以使用的取值。l Cascaded!:将打开的Sheet层叠起来,使所有的标题栏都可见。这是缺省方式。l Layered!:将打开的Sheet完全地覆盖在客户区,后打开的覆盖前面的Sheet。l Original!:用窗口的原始尺寸打开,打开后并以Cascaded!方式安排布局。下面是打开Sheet的实例。比如,在名称为MDI_my的Frame中打开窗口名称为w_edit的窗口,并将窗口w_edit的标题添加到Frame菜单的第三个下拉菜单中,打开后做Cascaded!方式的布局,可以使用下面的语句:OpenSheet(w_edit,MDI_my,3,Cascaded!)下面的例子是打开名称为w_edit的窗口的实例,并将该实例保存在window类型的变量wedit中,其他情况和上面的例子相同。语句如下:window weditOpenSheet(wedit, &w_edit&,MDI_my,3,Cascaded!)最简单的情况,在名称为MDI_my的Frame中以缺省布局方式打开名称为w_edit的窗口,语句如下:OpenSheet(w_edit,MDI_my)该语句执行后,自动将窗口w_edit的标题添加到Frame菜单右侧倒数第二个下拉菜单中。和OpenSheet函数类似,OpenSheetWithParm函数中的很多参数含义完全相同。其语法格式如下:OpenSheetWithParm(Sheetrefvar,parameter{,windowtype},mdIframe{,position{,arrangeopen}})其中parameter是要传递的参数,可以是String,Numeric或者PowerObject类型。该函数的用法及参数含义和OpenSheet完全相同,不再赘述。9.4.2 获取当前Sheet使用函数GetActiveSheet可以获取当前的Sheet,该函数的语法如下:mdIframewindow.GetActiveSheet ( )其中mdIframewindow是当前Frame的名称。该函数返回window类型数值,是当前活动的Sheet。执行过程中发生错误则返回无效数据,如果mdIframewindow为Null则返回Null。该函数经常和IsValid配合使用,来检查函数返回的窗口是否有效。下面是在一个菜单项的Clicked事件中的脚本:If IsValid(ParentWindow.GetActiveSheet()) Then //如果当前有活动窗口MessageBox(&提示&,ParentWindow.GetActiveSheet().title) //则显示活动窗口标题Else //如果没有Beep(2) //则响铃两声MessageBox(&提示&,&没有活动Sheet!&) //并且显示提示信息End If在上面的脚本中用到了函数IsValid ,可以用它来判断指定对象是否有效,该函数语法为:IsValid( objectname )其中objectname是要进行是否有效判断的对象。该函数返回为Boolean类型的值。9.4.3 安排Sheet的布局使用函数ArrangeSheets可以安排当前打开的和最小化的Sheet的布局,该函数的语法是:mdIframe.ArrangeSheets ( arrangetype )其中,mdIframe为Frame的名称,arrangetype是arrangetypes枚举类型的数值,可以取为:l Cascade!:将打开的Sheet层叠起来,使所有的标题栏都可见。l Layer!:将打开的Sheet完全地覆盖在客户区。l Tile!:将打开的Sheet以平铺的方式从左到右排列。l TileHorizontal!:将打开的Sheet并排放置。l Icons!:仅将最小化的Sheet沿Frame的底部放置。该函数正确执行则返回1,否则返回-1,如果有参数为Null则返回Null。在Frame的菜单项“平铺工作表”中可以编写下面的脚本:ParentWindow.ArrangeSheets(Tile!)
推荐:用到的串口通信编程方法有:使用通信控件、在高级语言中嵌入汇编以及使用API函数。在这几种方法中,使用API函数编写的串口通信程序最为高效、灵活。串口通
5.2 编 写 脚 本
Powers cript画板中提供了很多辅助的功能,可以提高开发效率、减少开发人员死记硬背。尤其对于初学者,掌握这里介绍的功能可以加快学习的进度。
5.2.1 粘贴语句 对于PB
相关阅读排行
相关内容推荐
请激活账号
为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。
您的注册邮箱:
如果您没有收到激活邮件,请注意检查垃圾箱。

我要回帖

更多关于 excel最常用的八个函数 的文章

 

随机推荐