PB窗口使用技巧解析
- 格式:docx
- 大小:18.53 KB
- 文档页数:8
[PB]-窗口使用技巧
**在打开和关闭窗口时进行数据传递
OpenWithParm(windowvar,parmeter{,parent})
其中windowvar是要打开的窗口名称,可以是window画板中定义的窗口,也可以是脚本中定义的窗口变量;parameter是要传递的参数,只能是String,Numeric或者PowerObject类型,该参数根据类型保存在Message的成员变量中传递个要打开的窗口;parent是一个已经打开的窗口名称,该窗口要成为windowvar窗口的父窗口。函数执行成功返回1,否则返回-1,如果有参数为null则返回null。
对象Message是一个结构类型的全局变量,并有很多的成员变量。在传递参数时三个成员变量用来读取传递的数据,它们是:
Message.DoubleParm:用来传递Numeric类型的数据。
Message.PowerObjectParm:用来传递PowerObject对象类型的数据,象数据窗口、按键、列表框和拥护自定义的结构等都可以使用该变量进行传递。
Message.StringParm:用来传递String类型的数据。
当使用函数OpenWithParm打开窗口后,应该在进行其他操作之前首先读取传递过来的参数,以免其他操作修改Message中的成员变量。
CloseWithReturn(windowname,Returnvalue)
其中,windowname是要关闭的窗口的名称,一般是脚本所在的窗口的名称;Returnvalue是要返回的数值,和上述函数OpenWithParm的完全相同。函数正确执行返回1,否则返回-1,当有参数为null时则返回null。
*只要是response类型的窗口,使用该函数就能有效地传递参数;该窗口不一定非得是用OpenWithParm打开的。在打开该response的窗口中可以读取传递过来的参数。
总之,使用CloseWithReturn函数时一定要注意,只有被关闭的窗口是response类型才能有效地获取返回参数。
另外需要说明一点是,某些情况下需要直接修改Message成员变量的取值才能正确返回值。比如,在一个数据窗口中,经常需要在窗口的CloseQuery事件中判断数据是否已经修改:如果修改,则直接保存,这时返回是否保存过数据的相应标记。在CloseQuery事件中使用函数CloseWithReturn不能正确返回值,只好直接修改Message成员变量的取值了。
**使用窗口名加界定符再加变量的形式可以应用其他窗口中的变量或者函数。例如,要想在窗口w_parm中引用窗口w_data中的实例变量is_title,可以使用w_data.is_title来引用。引用变量既可以使用其他的取值,也可以给它赋值,只要变量的定义允许这些操作。
**打开多个相同的窗口
打开多个相同窗口,是否可以多次使用open语句来解决这个问题呢?不行,该语句只能激活已经打开的窗口,而不会重新打开一个窗口。只能通过创建实例来解决这个问题。
如:在按钮的clicked事件中,多次点击该按钮就会打开多哥完全相同的实例窗口。
w_edit lw_edit
open(lw_edit)
如果希望一次打开多个实例窗口,可以使用数组:
w_edit lw_edit[3]
int li_i
for li_i = 1 to 3
open(lw_edit[li_i])
next
*在同一事件中(如,点击一次按钮)对一个窗口实例变量重复执行open语句也只能打开一个实例
如,下面的脚本只能打开一个实例窗口
w_edit lw_edit
int li_i
for li_i = 1 to 3
open(lw_edit)
next
还可以使用如下的语句打开实例窗口
window lw_edit[3]
string ls_win = "w_main"
int li_i
for li_i = 1 to 3
open(lw_edit[li_i],ls_win)
next
打开一个实例时,可以直接使用实例变量的名字引用实例窗口
w_edit lw_edit
open(lw_edit)
lw_edit.title = "测试"
**窗口的属性
tag
属性tag可以应用于所有的控件、用户对象与菜单,用来保存和控件相关的文本。
control[]
使用该属性可以引用窗口中的控件,它是一个包含窗口中所有控件的数组,可以按只读方式引用其中的控件。配合函数TypeOf可以判断控件的类型,根据类型编写相应的脚本。
实现对窗口中各个控件复位操作:
Int li_index,li_total
DataWindow ldw_temp DropDownListbox lddlb_temp
RadioButton lrb_temp
li_total = Upperbound(Parent.Control[])
For li_index = 1 To li_total
Choose Case Parent.Control[li_index].TypeOf()
Case DataWindow!
ldw_temp = Parent.Control[li_index]
ldw_temp.Reset()
Case DropDownListBox!
lddlb_temp = Parent.Control[li_index]
lddlb_temp.SelectItem(0)
Case RadioButTon!
lrb_temp = Parent.Control[li_index]
lrb_temp.Checked = False
Case Else
…
End Choose
Next
MenuId
该属性是一个指针,并指向和窗口相关联的菜单。在MDI应用程序中,多个工作表都能通过该指针引用其他菜单的实例,程序员可以编写出更为通用的脚本。
WindowState
该属性是一个枚举型属性,可以取值为Maximized!,Minimized!和Normal!。通过该属性可以判断当前窗口的状态,也可以使用脚本直接修改该属性来改变窗口的状态。
**窗口最小化时设置动态图标
当应用程序最小化时,程序的图标如果是动画的,肯定更能吸引用户的注意,视觉效果会更好。方法是通过动态修改程序的图标来实现。
当程序最小化时打开timer(在deactive中加入timer(1)语句),并在timer事件中编写如下程序:
If This.Icon = "appico.ico" Then
This.Icon = "reverse.ico"
Else
This.Icon = "appico.ico"
End If
程序激活时关闭Timer事件(在Active事件中加入timer(0)语句)。
需要注意,要将上面用到的两个ico文件放到当前应用程序的目录中。
**放置闪烁文字
以闪烁文字显示重要信息可以吸引用户的注意力,避免这些重要信息被忽略。通过周期性修改visible属性,可以实现闪烁效果。
在窗口中,假设放置一个静态文本st_1,在窗口的Open事件中定义Timer事件的间隔:
Timer(1)
然后,在窗口的Timer事件中定期修改静态文本的visible属性:
If Mod(Second(Now()),2) = 1 Then
st_1.visible = False
Else
st_1.Visible = True
End If
这样就可以实现闪烁效果。当然也可以在适当的时候使用timer(1),并在适当的时候关闭Timer事件。
**函数PostEvent和TriggerEvent都可以触发其他的事件,但是两者是有区别的。PostEvent触发的事件不是马上执行,而TriggerEvent触发的事件马上执行。PostEvent向消息队列中发送消息,等当前脚本执行完毕再触发消息队列中等待状态事件的脚本;而TriggerEvent函数可以中断当前执行的脚本,转向被触发事件,等执行完被触发事件的脚本后再返回当前脚本继续执行所以,当需要马上执行被触发的事件时使用函数TriggerEvent;当执行完当前脚本后需要触发某个事件时使用函数PostEvent。但是,当在脚本最后触发其他事件时不论使用哪个函数,效果都相同。
**移动不带标题栏的窗口
在开发应用程序中,可能要用到不带标题栏的窗口,而带有标题栏的窗口可以通过拖动标题栏来移动窗口,如何移动没有标题栏窗口呢?这需要编写代码来解决。
在要拖动窗口的MouseDown事件中编写脚本,给窗口发送消息WM_SYSCOMMAND,并将Wordparm设置成SC_MOVE+1,这两个常数的取值分别为274和61 457。脚本如下:
Send(handle(this),274,61458,0)
这将通知窗口在鼠标移动时跟随它一起移动。
**闪烁窗口标题栏
可以使用API函数FlashWindow来实现闪烁窗口标题栏的功能,使用该功能可以在重要窗口或者特殊情况下吸引用户的注意力。首先声明Locat External
Function,语句如下:
Function boolean FlashWindow (Uint handle, boolean flash) Library
"user.exe"
然后在适当的时候(比如,用户点击了某个按键后)使用下面语句设置Timer事件的间隔:
Timer(1)
然后在窗口的Timer事件中编写如下脚本:
FlashWindow(Handle(This),True)
在适当的时候使用timer(0)语句关闭Timer事件。