弹出窗口:messagebox()
基本写法:Messagebox('标题','内容')
完整写法: MessageBox ( '标题','内容',图标,按键,默认值)
(1)其中标题与内容为要显示的字符串,不可省略,但可以省略,即什么也不显示,例如Messagebox('','')这样也是正确的单里面的东西一样也不能少!
(2)图标可选值: Question!或None! 或Information!或 StopSign! 或 Exclamation!(默认图标)
(3)按键可选值: OK! (默认方式)或 OKCancel! 或 YesNo! 或YesNoCancel! 或RetryCancel! 或AbortRetryIgnore!
(4)默认值为可选: 1 (默认选择)或 2 或 3(即弹出消息框时的默认选择按钮)
该函数有返回值,1,2,3对选择的按键。
基本写法事例: MessageBox('此处为标题,'此处为内容')
完整写法事例:
if MessageBox('提示信息','是否删除?',&Question! ,OKCancel! , 1 ) = 1 then//选择确定
MessageBox('提示信息', '你选择了删除')
else//选择取消
MessageBox('提示信息','你选择了不删除')
end if
设置焦点:setfocus()
对象名.setfocus
sle_1.setfocus()
用format菜单下的tab order命令可以修改焦点顺序。把用户名和密码框分别设为10,20,确定按钮设为30就行了。也可以用控件的setfocus()方法设置焦点。
触发事件:triggerevent()
对象名.triggerevent()
(1)函数作用:触发指定对象的指定事件,并且立即执行该事件中的脚本。注意该函数和PostEvent的区别。PostEvent不是立即执行,TriggerEvent是立即执行触发事件的脚本。
(2)函数语法:objectname.TriggerEvent ( event{, word, long } )
z objectname:PB中任何对象或者控件,只要有可以触发的事件就可以。
z event:要触发的事件。可以是枚举类型或者String类型。PB提供的事件可以使用枚举或者String类型来表示,比如Clicked!或者‘Clicked’都可以代表Clicked事件;自定义的用户事件只能使用String来表示。需要注意的是,这里的事件应该提供了脚本。
z word:该参数不是必需的。当需要传递数据给被触发的事件时使用word和long参数。这两个参数都可以传递long类型的数据,但是参数long还可以传递string类型的数据,而该参数仅能传递long类型的。如果使用了该参数,在被触发的事件中使用Message.WordParm接收传递过去的数据。如果不使用该参数传递数据而是使用参数long进行传递,则将该参数设置为0。
z long:该参数也不是必须的,用来传递long或者string类型的数据。使用Message.LongParm接收传递的数据。当传递string类型的数据时,对象Message.LongParm中保存的是所传数据的存储地址,必须使用string(XX,’address’)来读取该地址中的string类型数据。
返回值:Integer类型。如果返回1,表示该函数执行成功;如果指定事件中没有脚本或者
函数执行错误,则返回-1。当任意参数为Null时,函数返回Null。
代码实例:
例子1,触发缺省事件:
cb_1.TriggerEvent(Clicked!)
等价于:
cb_1.TriggerEvent(“Clicked”)
例子2,触发用户自定义事件:
w_main.TriggerEvent(“ue_open”)
例子3,传递信息和接收信息:
w_main.TriggerEvent(“ue_open”,0,’test’)
在用户自定义事件ue_open中接收数据:
string ls_msg
ls_msg = String(Message.LongParm,’address’)
例子4,传递long数据:
w_main.TriggerEvent(‘ue_open’,100,0)
在用户自定义事件ue_open中接收数据:
long ll_msg
ll_msg = Message.WordParm
关闭窗口:Close()和CloseQuery()
这两个事件是比较重要的事件,尤其对于进行数据处理的窗口。在这两个事件中编写脚本可以避免用户因疏忽退出窗口而丢掉在数据窗口中的修改数据。
Close事件在触发Deconstructor之前所执行的最后一个事件,CloseQuery事件在Close事件触发之前发生。设置CloseQuery事件是为了增强可靠性。通常在CloseQuery事件中判断某些工作是否完成,并显示一个提示窗口询问用户,根据用户的确认,返回一个值来决定是否触发窗口的Close事件。返回值为1,表示取消关闭动作;返回值为0,表示继续执行Close事件。
比如,可以在CloseQuery事件中编写如下脚本,判断是否保存了数据窗口中的修改,并询问用户是否保存数据,根据用户的回答决定是否触发Close事件。在“关闭”按钮上编写脚本Close(parent),然后在CloseQuery中编写如下脚本:
Int li_flag
//如果数据窗口中没有修改,则允许执行Close,直接返回
If dw_1.ModifiedCount() <= 0 Anddw_1.DeletedCount() <= 0 Then Return 0
//如果数据窗口有修改,询问用户是否保存
li_flag = MessageBox("提示","数据已经修改,是否保存?",Question!,YesNoCancel!,1)
Choose Caseflag_i //根据用户选择执行
Case1 //用户选择要保存数据
Ifdw_1.Update() = 1 Then //如果修改数据成功
Commit; //提交
Return0 //继续执行Close事件
Else //修改数据不成功
rollback; //回退事务
li_flag= MessageBox("提示","数据错误,是否继续关闭!",&
Question!,YesNoCancel!,2) //显示错误
Ifli_flag = 1 Then
Return0 //允许关闭
Else
Return1 //不允许关闭
EndIf
EndIf
Case2 //用户选择不保存数据
Rollback; //回退事务
Return0 //允许执行Close事件
Case3 //用户选择取消
Return1 //不允许关闭
EndChoose //用户所有的选择情况处理完毕
通过上面的脚本,可以为用户提供一个很健壮的数据处理窗口。即使直接关闭该窗口,在数据窗口中所做的数据修改也不会丢失,除非用户自己想放弃。
另外,需要注意的是,在其他事件中调用或者触发(使用TriggerEvent函数、PostEvent函数或者是对象名称.Event 事件名称格式调用事件)Close事件,都只是执行该事件中的脚本,并不真正关闭窗口。也就是说,应该区别事件和事件处理脚本,这两者虽然有很多的联系但并不相同。 PB中的所有事件和事件处理脚本都是有区别的。
默认数据库链接变量:sqlca
dw_name.settransobject(sqlca)链接数据库
sqlca.sqlcode = 0 有数据\\ = 100 无数据
链接数据库
connect;一般用于程序open的时候,跟在数据库链接代码后面
打开窗口:open( )
open(windowname)
在Application中联上数据库。。
// Profile djerp1
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=djerp;UID=sa;PWD=djerp'"
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox("提示","数据库连接错误!")
Return
Elseif SQLCA.sqlcode = 0 Then
Open(w_main) //打开主操作窗口
end if
关闭应用:halt close()
halt close
halt 直接结束应用程序
halt close 会执行application对象中的Close 事件的代码,会在结束应用程序,前释放所有的实例
从ini配置文件中提取string数据
profilestring('文件名,可以包含路径','主要字节','在主要字节下的关键字','如果找不到数据则返回的数据')
断开链接
disconnect;一般用于程序close的时候
是否修改过:isrowmodified()
if dw_1.modifiedcount()+dw_1.deletedcount()>0 then
.......//数据窗口处于修改状态
end if
是否新增的:isrownew()
数据窗口中的if函数
if(true\false,'为true时返回的值','为false时返回的值',)
如:if(isrownew(),'新',if(isrowmodified(),'改','旧'))
插入空行:insertrow(0)
dw_name.insertrow(0)
通常配合插入行使用的是滚动行
dw_name.scrolltorow(dw_name.insertrow(0)) \\滚动到插入行
比如:int row
row = dw_1.insertrow(0)
//显示
dw_1.scrolltorow(row)
//使用
dw_1.object.column[row]
从数据窗口中提取数据:getitem( )
dw_name.getitem\\string\date\......(row,'数据来源控件名')
string dwcontrol.GetItemString ( long row,integer column {, DWBuffer dwbuffer, boolean originalvalue } )
String dwcontrol.GetItemString ( long row, string column {,DWBuffer dwbuffer, boolean originalvalue } )
getitem首先根据数据窗口不同的字段类型,有不同的函数。比如对于字符型使用getitemstring,对于数字,getitemnumber,对于日期gettiemdatetime。
设置数据窗口的数据:函数setItem()
(1).dw_name.setitem(row,'要设置的控件名','要设置进去的数据')
(2).函数作用:给指定的数据窗口或者Datastore中的、指定单元设置数据,通过行和列来确定哪个单元。该函数直接修改缓冲区中的数据,而不是针对显示界面进行修改,修改成功之后,数据窗口控件上会自动反映出最新的内容来。而函数SetText则针对显示界面进行修改,如果能够通过字段的校验规则,才能够进入到数据窗口对应的缓冲区中。注意这两个函数的区别。
(3).函数语法:integer dwcontrol.SetItem (long row, integer column, any value )
integer dwcontrol.SetItem ( long row, string column,any value )
dwcontrol:要设置数据的数据窗口控件、DataStore或者子数据窗口的名称。
row:要设置数据的行,为long类型。
column:要设置数据的列,可以是string类型的列名称,也可以是integer类型的列号。
lvalue:要设置的数据。类型根据数据列而定,两者的数据类型应该保持一致。
返 回 值:integer类型,1表示函数执行成功,-1表示函数执行失败。如果有任意一个参数为Null,则函数返回Null。
(4).代码实例:
例子1,下面脚本在第一行的hire_date列中设置数据:
dw_order.SetItem(1, "hire_date", 1993-06-07)
例子2,当用户在数值类型的字段中输入内容,然后又删除后要离开该单元时,数据窗口尝试着将‘’赋值给该单元,这时会导致内容不能通过校验规则而产生错误。解决的办法就是在数据窗口控件的ItemError事件中编写下面的脚本:
integer li_Null
String ls_type
ls_type = This.Describe(dwo.name + '.ColType')
ls_type = Left(Lower(Trim(ls_type)),3)
choose case ls_type
case 'dec','int','lon','num','rea','ulo'
This.SetItem(Row,integer(dwo.ID),li_Null)
end choose
return 2
基本写法:Messagebox('标题','内容')
完整写法: MessageBox ( '标题','内容',图标,按键,默认值)
(1)其中标题与内容为要显示的字符串,不可省略,但可以省略,即什么也不显示,例如Messagebox('','')这样也是正确的单里面的东西一样也不能少!
(2)图标可选值: Question!或None! 或Information!或 StopSign! 或 Exclamation!(默认图标)
(3)按键可选值: OK! (默认方式)或 OKCancel! 或 YesNo! 或YesNoCancel! 或RetryCancel! 或AbortRetryIgnore!
(4)默认值为可选: 1 (默认选择)或 2 或 3(即弹出消息框时的默认选择按钮)
该函数有返回值,1,2,3对选择的按键。
基本写法事例: MessageBox('此处为标题,'此处为内容')
完整写法事例:
if MessageBox('提示信息','是否删除?',&Question! ,OKCancel! , 1 ) = 1 then//选择确定
MessageBox('提示信息', '你选择了删除')
else//选择取消
MessageBox('提示信息','你选择了不删除')
end if
设置焦点:setfocus()
对象名.setfocus
sle_1.setfocus()
用format菜单下的tab order命令可以修改焦点顺序。把用户名和密码框分别设为10,20,确定按钮设为30就行了。也可以用控件的setfocus()方法设置焦点。
触发事件:triggerevent()
对象名.triggerevent()
(1)函数作用:触发指定对象的指定事件,并且立即执行该事件中的脚本。注意该函数和PostEvent的区别。PostEvent不是立即执行,TriggerEvent是立即执行触发事件的脚本。
(2)函数语法:objectname.TriggerEvent ( event{, word, long } )
z objectname:PB中任何对象或者控件,只要有可以触发的事件就可以。
z event:要触发的事件。可以是枚举类型或者String类型。PB提供的事件可以使用枚举或者String类型来表示,比如Clicked!或者‘Clicked’都可以代表Clicked事件;自定义的用户事件只能使用String来表示。需要注意的是,这里的事件应该提供了脚本。
z word:该参数不是必需的。当需要传递数据给被触发的事件时使用word和long参数。这两个参数都可以传递long类型的数据,但是参数long还可以传递string类型的数据,而该参数仅能传递long类型的。如果使用了该参数,在被触发的事件中使用Message.WordParm接收传递过去的数据。如果不使用该参数传递数据而是使用参数long进行传递,则将该参数设置为0。
z long:该参数也不是必须的,用来传递long或者string类型的数据。使用Message.LongParm接收传递的数据。当传递string类型的数据时,对象Message.LongParm中保存的是所传数据的存储地址,必须使用string(XX,’address’)来读取该地址中的string类型数据。
返回值:Integer类型。如果返回1,表示该函数执行成功;如果指定事件中没有脚本或者
函数执行错误,则返回-1。当任意参数为Null时,函数返回Null。
代码实例:
例子1,触发缺省事件:
cb_1.TriggerEvent(Clicked!)
等价于:
cb_1.TriggerEvent(“Clicked”)
例子2,触发用户自定义事件:
w_main.TriggerEvent(“ue_open”)
例子3,传递信息和接收信息:
w_main.TriggerEvent(“ue_open”,0,’test’)
在用户自定义事件ue_open中接收数据:
string ls_msg
ls_msg = String(Message.LongParm,’address’)
例子4,传递long数据:
w_main.TriggerEvent(‘ue_open’,100,0)
在用户自定义事件ue_open中接收数据:
long ll_msg
ll_msg = Message.WordParm
关闭窗口:Close()和CloseQuery()
这两个事件是比较重要的事件,尤其对于进行数据处理的窗口。在这两个事件中编写脚本可以避免用户因疏忽退出窗口而丢掉在数据窗口中的修改数据。
Close事件在触发Deconstructor之前所执行的最后一个事件,CloseQuery事件在Close事件触发之前发生。设置CloseQuery事件是为了增强可靠性。通常在CloseQuery事件中判断某些工作是否完成,并显示一个提示窗口询问用户,根据用户的确认,返回一个值来决定是否触发窗口的Close事件。返回值为1,表示取消关闭动作;返回值为0,表示继续执行Close事件。
比如,可以在CloseQuery事件中编写如下脚本,判断是否保存了数据窗口中的修改,并询问用户是否保存数据,根据用户的回答决定是否触发Close事件。在“关闭”按钮上编写脚本Close(parent),然后在CloseQuery中编写如下脚本:
Int li_flag
//如果数据窗口中没有修改,则允许执行Close,直接返回
If dw_1.ModifiedCount() <= 0 Anddw_1.DeletedCount() <= 0 Then Return 0
//如果数据窗口有修改,询问用户是否保存
li_flag = MessageBox("提示","数据已经修改,是否保存?",Question!,YesNoCancel!,1)
Choose Caseflag_i //根据用户选择执行
Case1 //用户选择要保存数据
Ifdw_1.Update() = 1 Then //如果修改数据成功
Commit; //提交
Return0 //继续执行Close事件
Else //修改数据不成功
rollback; //回退事务
li_flag= MessageBox("提示","数据错误,是否继续关闭!",&
Question!,YesNoCancel!,2) //显示错误
Ifli_flag = 1 Then
Return0 //允许关闭
Else
Return1 //不允许关闭
EndIf
EndIf
Case2 //用户选择不保存数据
Rollback; //回退事务
Return0 //允许执行Close事件
Case3 //用户选择取消
Return1 //不允许关闭
EndChoose //用户所有的选择情况处理完毕
通过上面的脚本,可以为用户提供一个很健壮的数据处理窗口。即使直接关闭该窗口,在数据窗口中所做的数据修改也不会丢失,除非用户自己想放弃。
另外,需要注意的是,在其他事件中调用或者触发(使用TriggerEvent函数、PostEvent函数或者是对象名称.Event 事件名称格式调用事件)Close事件,都只是执行该事件中的脚本,并不真正关闭窗口。也就是说,应该区别事件和事件处理脚本,这两者虽然有很多的联系但并不相同。 PB中的所有事件和事件处理脚本都是有区别的。
默认数据库链接变量:sqlca
dw_name.settransobject(sqlca)链接数据库
sqlca.sqlcode = 0 有数据\\ = 100 无数据
链接数据库
connect;一般用于程序open的时候,跟在数据库链接代码后面
打开窗口:open( )
open(windowname)
在Application中联上数据库。。
// Profile djerp1
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=djerp;UID=sa;PWD=djerp'"
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox("提示","数据库连接错误!")
Return
Elseif SQLCA.sqlcode = 0 Then
Open(w_main) //打开主操作窗口
end if
关闭应用:halt close()
halt close
halt 直接结束应用程序
halt close 会执行application对象中的Close 事件的代码,会在结束应用程序,前释放所有的实例
从ini配置文件中提取string数据
profilestring('文件名,可以包含路径','主要字节','在主要字节下的关键字','如果找不到数据则返回的数据')
断开链接
disconnect;一般用于程序close的时候
是否修改过:isrowmodified()
if dw_1.modifiedcount()+dw_1.deletedcount()>0 then
.......//数据窗口处于修改状态
end if
是否新增的:isrownew()
数据窗口中的if函数
if(true\false,'为true时返回的值','为false时返回的值',)
如:if(isrownew(),'新',if(isrowmodified(),'改','旧'))
插入空行:insertrow(0)
dw_name.insertrow(0)
通常配合插入行使用的是滚动行
dw_name.scrolltorow(dw_name.insertrow(0)) \\滚动到插入行
比如:int row
row = dw_1.insertrow(0)
//显示
dw_1.scrolltorow(row)
//使用
dw_1.object.column[row]
从数据窗口中提取数据:getitem( )
dw_name.getitem\\string\date\......(row,'数据来源控件名')
string dwcontrol.GetItemString ( long row,integer column {, DWBuffer dwbuffer, boolean originalvalue } )
String dwcontrol.GetItemString ( long row, string column {,DWBuffer dwbuffer, boolean originalvalue } )
getitem首先根据数据窗口不同的字段类型,有不同的函数。比如对于字符型使用getitemstring,对于数字,getitemnumber,对于日期gettiemdatetime。
设置数据窗口的数据:函数setItem()
(1).dw_name.setitem(row,'要设置的控件名','要设置进去的数据')
(2).函数作用:给指定的数据窗口或者Datastore中的、指定单元设置数据,通过行和列来确定哪个单元。该函数直接修改缓冲区中的数据,而不是针对显示界面进行修改,修改成功之后,数据窗口控件上会自动反映出最新的内容来。而函数SetText则针对显示界面进行修改,如果能够通过字段的校验规则,才能够进入到数据窗口对应的缓冲区中。注意这两个函数的区别。
(3).函数语法:integer dwcontrol.SetItem (long row, integer column, any value )
integer dwcontrol.SetItem ( long row, string column,any value )
dwcontrol:要设置数据的数据窗口控件、DataStore或者子数据窗口的名称。
row:要设置数据的行,为long类型。
column:要设置数据的列,可以是string类型的列名称,也可以是integer类型的列号。
lvalue:要设置的数据。类型根据数据列而定,两者的数据类型应该保持一致。
返 回 值:integer类型,1表示函数执行成功,-1表示函数执行失败。如果有任意一个参数为Null,则函数返回Null。
(4).代码实例:
例子1,下面脚本在第一行的hire_date列中设置数据:
dw_order.SetItem(1, "hire_date", 1993-06-07)
例子2,当用户在数值类型的字段中输入内容,然后又删除后要离开该单元时,数据窗口尝试着将‘’赋值给该单元,这时会导致内容不能通过校验规则而产生错误。解决的办法就是在数据窗口控件的ItemError事件中编写下面的脚本:
integer li_Null
String ls_type
ls_type = This.Describe(dwo.name + '.ColType')
ls_type = Left(Lower(Trim(ls_type)),3)
choose case ls_type
case 'dec','int','lon','num','rea','ulo'
This.SetItem(Row,integer(dwo.ID),li_Null)
end choose
return 2