📄 datawin.txt
字号:
意的关闭或开启控件的重画功能。如果一个控件或窗口被别的 A 挡住了,然后
A 此时有移开了或关闭了。那么 Window 将会通知这个控件或者窗口要求他们重
画一遍自己,这就是重画的意思。
当 DataWindow 检索大量数据时 SetRedraw 函数就大有用途了。DataWindo
w 每检索出一条数据便会重画一边 DataWindow 。因此如果有大量的数据需要检
索的话,那么 DataWindow 将会频繁闪烁。同时也消耗了大量的 CPU 资源。因此
,我们可以在检索数据之前调用 SetRedraw (
False ) 关闭重画功能,在数据检索完后在开启重画功能,即 SetRedraw ( Tru
e )。这样便消去了闪烁现象,最关键是大大地提高了检索速度。
SetTrans vs SetTransObject
函数 SetTrans 与 SetTransObject 都是为 DataWindow 指定事务对象。但
是这两个函数又有很大的区别。使用 SetTrans 函数 DataWindow 每次访问数据
是都单独建立一次连接。也就是说 DataWindow 每次访问数据库都要经过连接数
据库、断开连接的过程。使用 SetTransObject
函数 DataWindow 的每次对数据库的访问都使用该函数设置的事务对象。一般情
况下,都使用 SetTransObject 。
使用 ID 字段的好处
有人会觉得并不是所有场合都需要使用 ID 字段。的确如此,但是使用 ID
字段却有许多好处。
记录你的应用程序所发生的所有错误
记录应用程序发生的错误是非常重要也是非常有意义的事情。本篇文章将为
大家介绍一种在 PB 中记录应用程序错误的方法。
应用程序错误分为两大类。一种是与实际情况不符的错误,例如软件中出现
了年龄大于两百岁的人。一种是物理错误,例如非法操作等。这两种错误对于用
PB 开发出的软件经常都会发生。不管是那种错误我们都需要记录一些相同的信
息。错误发生的描述,错误发生所在的
Window、menu 或 Object ,错误发生所在的事件函数,PB 返回的错误号等。
具体做法:
为应用程序对象定义事件 ue_logerror
Event Name: ue_logerror
Event ID: 空
Arguments : Error aerr_error
脚本如下:
string ls_message
Integer li_fhandle
ls_message = &
+ 'Error Number ' + string(aerr_error.number) &
+'.~r~nError text = ' + aerr_error.text &
+'.~r~nWindow/Menu/Object = ' + aerr_error.windowmenu &
+'.~r~nError Object/Control = ' + aerr_error.object &
+'.~r~nScript = ' + aerr_error.objectevent &
+'.~r~nLine in Script = ' + string(aerr_error.line) + "."
li_fhandle = FileOpen ( "Error.log", LineMode! , write! , LockReadWrit
e! , Append! )
ls_message = String ( CrtDate ) + " " + String ( CrtTime ) + " " + ls_
message
FileWrite ( FileHandle, ls_message )
FileClose ( FileHandle )
对于应用程序的物理错误处理采用方法:
在应用程序的 SystemError 事件中编写代码
This.Event ue_logerror ( Error )
Halt
对于应用程序出现与实际不符的错误则在脚本中:
If ll_rc <= 0 Then
// 将错误记录到日志文件中
error lerr_error
lerr_error = Create error
lerr_error.text = "无法初始化安全服务"
lerr_error.is_pblname = ""
lerr_error.windowmenu = ""
lerr_error.object = "rs_n_cst_appmanager"
lerr_error.objectevent = "constructor"
lerr_error.line = 84
lerr_error.number = ll_rc
myapp.Event ue_logError ( lerr_error )
Destroy lerr_error
return
End If
How to determine if you are connected
如果在使用 DataWindow 之前,SQLCA 并未连接到数据库。那么程序将会出
现错误。所以有时有必要判断一下 SQLCA 是否已经连接到数据库。
使用函数 dbhandle 。函数 dbhandle 将返回数据库服务器分配的 handle
。如果 handle 为 0 表示 sqlca 未连接到数据库。
PB 6.5 的 Timing Object
PB 5 中只有 Window 才有 Timer 事件。利用 Timer 事件可以实现一些定时
执行的功能。 pb 6 现在还提供 Timing 标准不可视对象。利用该对象不仅可以
在窗体中实现定时功能,还可以在用户自定义对象中实现定时功能。
制作一个用户自定义对象 ue_timer 继承 Timing 对象
在 ue_timer 中定义属性
PowerObject ipo_object
String is_event
在 Timer 事件中
ipo_object.TriggerEvent ( is_event )
至此通用 ue_timer 事件已经完成,下面是使用该对象的方法
在 n_cst_object 对象中定义实例变量
ue_timer i_timer
在 n_cst_object 的构造事件中
i_timer = create ue_timer
i_timer.Interval = 1000 // 一秒钟执行一次
i_timer.ipo_object = this
i_timer.is_event_or_function = "ue_myevent"
在 n_cst_object 的析构事件中
destroy i_timer
在 ue_myevent 中编写相应的代码
向窗口传递参数的几种方法
向窗口传递参数有好几种方法。最简单的方法当然是利用全局变量。其实这
更本不算是一种方法。传递参数的方法主要有两种。
1. 利用 Message 全局变量,也是比较常用的方法。
OpenWithParm ( w_main, 1 )
OpenWithParm 函数将会自动的将 1 放入 Message 对象的 Number 属性中。
然后再 w_main 窗口的 Open 事件中访问 Message 的 Number 属性就可以获得由
OpenWithParm 函数传来的参数。OpenWithParm 函数可以传递的参数不仅仅是
整型,还可以是 String、Double 甚至是
PowerObject 类型。如果传递的是 String 类型,那么参数就会被放入 StringP
arm 属性中。如果是 Double 类型,那么参数就会被放入 DoubleParm 中。同样
,如果参数是 PowerObject 类型,参数就会被放到 PowerObjectParm
中。这种方法是最常用的方法,也是最简洁的方法。但是这种方法只能传递一个
参数。对于需要传递多个参数的话那就的采用方法 2 。
2. 利用结构向窗口传递参数
由于 Message 对象的 PowerObjectParm 参数可以储存任何的 PB 对象。利
用这个特点,我们将所有需要传递个窗口的参数都封装到一个结构中(类也可以
)。在使用 OpenWithParm 函数将结构作为参数传给窗口。具体的源代码如下:
定义结构:
global type s_a from structure
string a
string b
end type
传递参数:
s_a ls_parm
ls_parm.a = 'ha'
ls_parm.b = 'hb'
OpenWithParm ( w_main, ls_parm )
w_main 的 open 事件:
s_a ls_rec
ls_rec = Message.PowerObjectParm
至此,ls_rec 中就收到了有 OpenWithParm 函数传递来的多个参数。
处理表单打开时位置自动向右下方移动问题
PB 的 MDI 父窗口有一个非常令人讨厌的问题。每次你打开一个表单,
表单的位置总是向右下方移动一点距离,而不管 MDI 中是否只有一个表单。
下面的代码将为您解决这个问题。首先必须定义一个父类窗口 w_sheet ,
所有的表单都必须继承该 w_sheet 。
在 w_sheet 中定义共享变量:
/* 用于记录已打开表单的数目 */
integer si_count
/* 用于记录表单所在的位置 */
integer si_win[]
定义如下的实例变量:
int ii_count /* 当前表单号 */
窗体的 Open 事件:
integer li_i
/* 增加已打开的表单数 */
si_count++
/* 确定当前该 sheet 所在的位置 */
FOR li_i = 1 TO UpperBound(si_win)
IF si_win[li_i] = 0 THEN
ii_count = li_i
EXIT
END IF
NEXT
IF ii_Count = 0 THEN ii_Count = si_Count
/* 将新位置保存到数组中 */
si_win[ii_count] = 1
/* 将窗口移动到新位置 */
This.Move((ii_count - 1) * 75,(ii_count - 1) * 75)
窗体的 Close 事件中:
/* 释放该窗口在 si_win 中的位置 */
si_win[ii_count] = 0
/* 减少已打开的窗口数 */
si_count --
Post 与 Trigger 的使用
PB 的函数与事件有两个种调用方式。一种同步方式、一种异步方式。
同步方式的调用就是等待函数或事件执行完后再执行下一步的代码。异步
方式就是不等待函数执行完毕就执行下一步的代码。一般情况的调用都是
同步方式的。使用关键字 Post 表示采用异步调用。关键字 Trigger
表示同步调用,一般同步调用不用使用任何关键字。
Post 方法是一种非常有用的方法。最典型的用法是用在数据库连接的
时候。PB 初学者一般都在 Application 对象或者窗体的 Open
事件中连接数据。这种做法是最常规的做法。一般大家在开发程序的时候很
少出现连接不上数据库的问题或者找不到服务器的时候。因此,这种做法并
没有带来什么不变。而往往软件发放的用户手中后,用户的环境总是不确定
的。出现找不到服务器、网络线路问题等等都是很平常的事
如数据库的连接仍然在 Application 的 Open 事件或者 Window 窗口的
Open 事件中,当数据库连接不上时会出现“死机”的假象。使用 Post
方法可以很好的解决这种问题。方法如下:
1 为窗口定义自定义事件
Event Name:PostOpen
EVent ID:空
2 在窗体的 Open 事件中
Post Event PostOpen ()
3 在 PostOpen 事件中编写关于数据库的连接代码。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -