窗口的open 事件或者【浏览】和【查询】按钮的click 事件
dw_1.settransobject(sqlca)//指定事务对象
dw_1.retrieve()//检索数据
【添加】按钮的click 事件
dw_1.insertrow(0)
dw_1.setfocus()
dw_1.scrolltorow(dw_1.rowcount())
if dw_1.updata()=1 then
messagebox("提示保存成功!")
cb_1.enabled=true
cb_3.enabled=false
esle
messagebox("提示保存失败,请核实!")
end if
dw_1.setcolumn(1)//将第一列设置为当前列
cb_1.enabled=false
cb_3.enabled=true//cb_3 为保存控件
【保存】按钮的click 事件
if dw_1.update()=1 then
messagebox("提示保存成功!")
cb_1.enabled=true
cb_3.enabled=false
else
messagebox("提示保存失败,请核实!")
end if
【删除】按钮的click 事件
if dw_1.deleterow(0) then//其中0 表示删除当前行
if dw_1.update()=1 then
messagebox("提示删除成功!")
else
messagebox("提示删除失败!")
end if
else
messagebox("提示删除失败")
end if
【退出】按钮click 事件
close(parent)
【上一条】按钮的click 事件
dw_1.scrollpriorrow()
dw_1.selectrow(0,false)//0 表示选取或者取消所有行,dw_1.selectrow(1,true)//第一行高亮显
示
dw_1.selectrow(dw_1.getrow(),true)
【下一条】按钮的click 事件
dw_1.scrollnextrow()
dw_1.selctrow(0,false)
dw_1.selectrow(dw_1.getrow(),true)
【升序】按钮的click 事件 本例按商品编号升序排列
dw_1.setransobject(sqlca)
dw_1.setsort("商品编号 A")//setsort 函数用来定义数据窗口如何排序,sort()函数则实际对数
据窗口进行排序。A 表示升序,D 表示降序。
dw_1.sort()
dw_1.retrieve()
下拉数据窗口的selectionchanged 事件,用于动态绑定数据窗口
string sjckdx
sjckdx=trim(ddlb_1.text)
if sjckdx="商品信息表" then
dw_1.dataobject="spxxb_data"//在程序运行时动态绑定数据窗口对象spxxb_data
elseif sjckdx="供应商信息表" then
dw_1.dataobject="gysxxb_data"//在程序运行时绑定数据窗口对象gysxxb_data
end if
控制数据窗口中数据列的显示颜色关键技术
打开数据窗口对象画板,选择数据窗口对象中要为其设置显示颜色的字段列,然后再属性页
中选择【font 】选项卡background Color 后的expression 中填入代码,例如: if( 数
量>4,rgb(240,0,0),if(数量>3,rgb(0,240,0),rgb(50,50,250)))
使用下列数据窗口选择商品名称实现快速输入
在属性页中选择【edit】,在【style type】下拉列表框中选择【dropdowndw】
在数据录入时对行进行计算
数据窗口控件的rbuttondown 事件,实现行数据的自动计算其代码如下:
decimal jj,je
long sl,i,rowcnt
rowcnt=dw_1.rowcount()//获取数据窗口中的记录总数
if rowcnt>0 then
dw_1.scrolltorow(1)
for i=1 to rowcnt
jj=dw_1.getitemnumber(i,5)//从数据窗口中取值
sl=dw_1.getitemnumber(i,6)
je=dec(mid(string(jj*sl),1,pos(string(jj*sl),".",1) 2))
dw_1.setitem(i,7,je)//为数据窗口赋值
next
end if
为数据窗口建立一个用户自定义事件us_dw,event id 选择pbm_dwnprocessenter 其代码如下,
实现行数据的自动计算
decimal jj,je
long sl,i,rowcnt
rowcnt=dw_1.rowcount()
send(handle(this),256,9,long(0,0))
if dw_1.getcolumn()=7 then
if rowcn>0 then
dw_1.scrolltorow(1)
for i=1 to rowcnt
jj=dw_1.getitemnumber(i,5)
sl=dw_1.getitemnumber(i,6)
je=dec(mid(string(jj*sl),1,pos(string(jj*sl),".",1) 2))
dw_1.setitem(i,7,je)
next
dw_1.scrolltorow(rowcnt)
end if
end if
密码触发相关程序
用户名的单行编辑框进行代码的编写。在该单行编辑框中用户按下enter 键下来验证用户名。
如果存在,输入焦点自动切换到密码输入框中;否则提示用户输入错误,要求重新输入用户
名。
keydown 中添加如下的代码:
string is_username
integer li_isexist
if key=keyenter! then//当按下的按键是enter 键时处理
is_username=trim(this.text)
select count(*) into:li_isexist from password where
username=:is_username;
if li_isexist<=0 then//用户不存在的话
messagebox("错误该用户不存在")
this.selecttext(1,len(this.text))
return
end if
sle_password.setfocus()//切换焦点到密码输入窗口
end if
用户登录模块登录按钮的代码如下所示:
string is_password,is_userpass
is_password=trim(sle_password.text)
if trim(sle_username.text)='' then
messagebox("错误请输入用户名")
return
end if
select password into:is_userpass from password where
username=:sle_username.text;
if is_password=is_userpass then
open(w_changpass)
close(parent)
else
messagebox("错误密码不存在")
sle_password.selecttext(1,len(sle_password.text))
return
end if
在主窗口的closequery 事件编写脚本。如果数据窗口的数据被修改和删除过以后还没保存,
则需要提示用户先进性保存然后再对出窗口。
if dw_1.modifiedcount() dw_1.deletedcount()>0 then
if messagebox("提示数据已经被修改,是否保存以后再退出?",question!,yesno!)=1 then
return -1//返回-1 可以不关闭当前窗口
end if
end if
if trim(ddlb_1.text)=trim(ddlb_2.text) then
if trim(ddlb_1.text)='' then
dw_2.dataobject="d_result_search_arrive"
dw_2.settransobject(sqlca)
dw_2.retrieve(ddlb_2.text)
return
end if
if trim(ddlb_2.text)='' then
dw_2.dataobject="d_result_search"
dw_2.settransobject(sqlca)
dw_2.retrieve(ddlb_1.text)
return
end if
datastore ldt_1
ldt_1=create datastore
ldt_1.dataobject="d_result_rearch_between"
ldt_1.settransobject(sqlca)
ldt_1.retrieve(ddlb_1.text,ddlb_1.text)
long ll_row,ll_total,ll_order_start,ll_order_end,ll_id,ll_currow
string is_startstation,is_endstation,is_trainno
ll_total=ldt_1.rowcount()
if ll_total<=0 then
messagebox("抱歉当前没有所需要查询的数据")
destroy(ldt_1)
return
end if
dw_2.dataobject='d_result_search'
for ll_row=1 to ll_total
ll_id=ldt_1.getitemnumber(ll_row,'id')
select "traindetail"."order" into :ll_order_start from traindetail where id=:ll_id and
station=:ddlb_1.text;
select "traindetail"."order" into :ll_order_end from traindetail where id=:ll_id and
station=:ddlb_2.text;
select startstation into :is_endstation from trainbase where id=:ll_id;
select endstation into :is_endstation from trainbase where id=:ll_id;
select trainno into:is_trainno from trainbase where id=:ll_id;
if ll_order_start dw_2.setitem(ll_currow,'trainbase_id',ll_id) dw_2.setitem(ll_currow,'trainbase_startstation',is_startstation) dw_2.setitem(ll_currow,'trainbase_endstation',is_endstation) dw_2.setitem(ll_currow,'trainbase_trainno',is_trainno) end if end for 部分菜单的代码 w_main.arrangesheets(tile!)//窗口水平 w_main.arrangesheets(tilehorizontal!)//窗口垂直 w_main.arrangesheets(layers!)//窗口平铺 w_main.arrangesheets(cascade!)//窗口层叠 opensheet(sheet,parentwindow)//打开 opensheet()在mdi 框架窗口中打开mdi 子窗口,并在 指定才当中创建选择该子窗口的菜单项。例子 //opensheet(child,mid_user,2,original!) 动态窗口下拉列表源代码 string sty,exp,err choose case ddlb_1.text case"自由格式" sty="form" case"网格格式" sty="grid" case"列表格式" sty="tabular" case"标签格式" sty="label" end choose //对label 显示风格做处理 If sty="label" then exp="style(type=" sty ")datawindow(units=2" & "timer_interval=0 color=16777215 processing=2" & "label.name='laser address 0.50*1.755627'" & "label.width=750 label.height=200 label.row=5" & "label.rows.spacing=100 label.columns=4" & "label.columns.spacing=313 label.topdown=no" & "label.sheet=yes label.shape=roundrectangle" & "label.ellipse_height=80 label.ellipse_width=83)" else exp="style(type=" sty ")datawindow(units=2 color=16777215)" end if //利用函数生成数据窗口的源代码 exp=syntaxfromsql(sqlca,dw_1.getsqlselect(),exp,err) //syntaxfromsql()函数根据sqlselect 语句生成数据窗口对象的源代码,通常用于创建动态数 据窗口 //创建数据窗口 dw_1.create(exp,err) //dw_1.creat()可以用来动态创建数据窗口对象。使用指定的源代码创建数据窗口对象,并用 新的数据窗口对象取代数据窗口原有的数据窗口。 //显示数据 dw_1.settransobject(sqlca) dw_1.retrieve() 闪动的文字代码timer 事件 if mod(second(now()),2)=1 then st_1.visible=false else st_1.visible=true end if 移动的字体timer 事件 if mod(second(now()),2)=0 then st_1.move(st_1.x 50,st_1.y)//沿水平方向移动 end if PB 通用右键菜单制作(2007-08-23 14:13:44)转载 分类: 关于计算机 ---- 对象被右键单击就弹出一个功能菜单是Windows 应用程序一项不可缺少的功能。在 PowerBuilder 应用开发中,可在需弹出右键菜单对象的rbuttondown 事件中调用该菜单的 Popmenu( )方法实现这一功能。但多数情况下,应用中有多处要用到不同的弹出式菜单,如 一一用这种方法就需要做大量的工作。能不能做一个通用的菜单,可以用任何对象的 rbuttondown 事件激发弹出,并在弹出前动态改变弹出菜单项的内容,当点击菜单项时又可 执行被右击对象的相应用户事件? 一、 创建弹出菜单m_popup 创建一个菜单m_popup, 定义菜单条m_main , 其下有十五个菜单项, 分别命名为 m_item1,m_item2,„„m_item15,各项的显示文本(text)分别为item1,item2,„ „item15; 为m_popup 菜单定义一个Powerobject 类型的Instance 变量:Anyobject 脚本为: Powerobject Anyobject 给m_item1,m_item2,„ „m_item15 各菜单项的Clicked 事件下分别输入脚本: Anyobject.triggerevent("ue_item1") //m_item1 的clicked 事件 Anyobject.triggerevent("ue_item2") … … Anyobject.triggerevent("ue_item15") ---- 4、 定义几个菜单函数: ---- 1) setmenuitem(string itemstring),返回值为Null。 ---- 参数Itemstring 是由多个子串组成的。各个子串间用“|”间隔,每个子串为一个菜单项 的显示文本(text)。 ---- 该函数功能是把itemstring 分解为多个子串,并把子串赋给相应菜单项的text。脚本如 下: int itempos,itemorder=1,i string currentitem if len(itemstring)=0 then return itempos=pos(itemstring,"|") DO WHILE itempos<>0 // itempos 为间隔符"|"的位置 currentitem=left(itemstring,itempos -1) //取出子串 itemstring=mid(itemstring, itempos+1) this.item[itemorder].text=currentitem itempos=pos(itemstring,"|") itemorder++ LOOP this.m_main.item[itemorder].text=itemstring for i=1 to itemorder this.item[i].visible=true this.item[i].enabled=true next for i=itemorder+1 to 15 this.item[i].visible=false next 2)setitemdisable(integer itemorder) 返回值Null。 该函数把第itemorder 菜单项置灰(disable)。 脚本如下: if itemorder<1 or itemorder>15 then return this.m_main.item[itemorder].enabled=false 3)popupmenu(integer x, integer y) 返回值Null。 该函数弹出菜单条。 脚本如下: this.popmenu(x,y) 二、 rbuttondown 事件激发弹出菜单m_popup ---- 至此,我们就可以在窗口中任意对象如DataWindow、 Picture、 SingleLineEdit、 ListBox、 PictureListBox 、 DropDownPictureListBox 、 MultiLineEdit 、 ListView 、 TreeView 等的 rbuttondown 事件中写脚本调用m_popup 的函数来实现右键单击弹出一个菜单。下面以数 据窗口dw_1 为例,在其rbuttondown 事件下写入脚本,使得右击dw_1 可弹出菜单:刷新 /插入/删除/修改。步骤如下: 1、事先给窗口定义一个m_popup 型instance 变量om_1: m_popup om_1 2、dw_1 的rbuttondown 事件脚本: if not isvalid(om_1) then om_1= CREATE m_popup end if //把菜单的anyobject 指向被右击的对象(dw_1) om_1.anyobject=this om_1.setmenuitem("刷新|插入|删除|修改") //可在此调用om_1.setitemdisable(itemorder)函数disable 某菜单项。 om_1.popupmenu(this.x+this.pointerx(),this.y+this.pointery()) 3、 给dw_1 定义用户事件ue_item1、ue_item2、ue_item3 及 ue_item4。事件ue_item1 脚 本: dw_1.retrieve() 事件ue_item2 脚本: long newrow newrow=dw_1.insertrow(0) dw_1.scrolltorow(newrow) 事件ue_item3 脚本: dw_1.deleterow(0) 事件ue_item4 脚本: dw_1.update() ---- 这样,只要用户单击dw_1 弹出的右键菜单,就可完成对dw_1 的插入、删除、修改等 功能。 三、 推广为全程函数 ---- 如果应用中有许多地方要用此功能,我们可以把dw_1 的rbuttondown 事件脚本改造成 一个全程函数。 ---- 1、将变量om_1 定义为global 变量: ---- m_popup om_1 ---- 2、定义一个全程函数 ---- pupmenu(powerobject sender,string itemstring,integer x,integer y) 返回值Null。其中参数 sender 为被右击的对象,itemstring 为弹出菜单的菜单项字符串,x、y 为菜单弹出的坐标位 置。 脚本如下: if not isvalid(om_1) then om_1= CREATE m_popup end if om_1.anyobject=sender om_1.setmenuitem(itemstring) sender.triggerevent("ue_beforepop") //激活sender 用户事件。 om_1.popupmenu(x,y) 这样,上述dw_1 的rbuttondown 事件脚本就可改写为: string items="刷新|插入|删除|修改" popmenu(this, items ,this.x+this.pointerx(), this.y+this.pointery()) 注意:在MDI 应用中,popmenu()函数需要改为: popmenu(this, items ,w_frame.pointerx(),w_frame.pointery()) 其中w_frame 为MDI 主窗口名。 ---- 在函数popmenu 中,又激活了被右击对象的ue_beforepop 用户事件。如有必要,你可以 给被右击对象定义一个ue_beforepop 事件,在该事件中可调用om_1.setitemdisable()函数来 屏蔽某个菜单项。 ---- 最后,别忘了在应用的close 事件里加上下列语句,及时释放系统内存。 ---- if isvalid(om_1) then destroy om_1 ---- 以上代码在Windows98 和Powerbuilder6.5 平台上开发,并在多个大型系统中应用,效 果很好。__