PowerBuilder问与答
?牐犖侍庖弧⑷绾卧赑B中实现精确的时间控制(如使用延时控制)?timer函数只能使用一次,idle函数只能是在没有任何键盘和鼠标动作的时候才生效,还有其他函数可以用吗?
?牐牬穑河肁PI函数Sleep()可以解决,此函数用于通知操作系统忽略当前进程指定时间数,参数为时间(千分之一秒)。
?牐犐骱?
?牐燬UBROUTINE Sleep(uint cMilliSeconds) LIBRARY “KERNEL32.dll”
?牐牭饔茫?
?牐燬leep(2000)//延时2秒
?牐燩B8中新增了对应的函数:Sleep (seconds)。
?牐犖侍舛B中怎样实现在循环时通过点击按钮终止循环? 就像在VB的循环中用DoEvent实现的一样。
?牐牬穑赫獾比灰肶ield()函数了。如:
?牐爄nteger n
?牐?//sb_interrupt 是共享变量
?牐爏b_interrupt=false
?牐爁or n=1 to 3000
?牐爕ield()?煟?
?牐爄f sb_interrupt then
?牐?//sb_interrupt的值在“取消”按钮的Clicked事件中修改为true
?牐燤essageBox(“我不干了”,“你真坏!”)??
?牐爏b_interrupt=false
?牐爀xit
?牐爀lse
?牐?//其它处理,在单行编辑器中显示当前n值
?牐爏le_1.text = string(n)??
?牐?//....
?牐爀nd if
?牐爊ext
?牐犖侍馊⑷绾喂乇沾蚩腄OS窗口? 如在PB中调用run(*.bat)函数,该函数运行完毕后有一个打开的DOS窗口,怎样在程序中关闭?
?牐牬穑憾ㄒ錋PI:
?牐燜unction ulong FindWindowA(String lpClassName, String lpWindowName) Library “user32.dll”
?牐燜unction ulong CloseWindow(ulong hwnd ) Library “user32.dll”
?牐牻疟荆?
?牐爈ong ll_Handler
?牐爏tring ls_Class
?牐爏tring ls_title
?牐燬etNull?煟╨s_Class)??
?牐爈s_title = “ms-dos 方式” //DOS窗口标题,根据具体情况改
?牐爈l_Handler = FindWindowA(ls_Class, ls_title) ??
?牐營f ll_Handler <> 0 Then
?牐燬end?煟╨l_Handler, 16,0,0)??
?牐燛nd If
?牐犎缬肅loseWindow(ll_Handler) 替换Send(ll_Handler,16,0,0) 一句则是将指定标题窗口最小化。
?牐犚陨戏椒ㄍ视糜谄渌嘈痛翱凇R郧坝型盐使肁PI函数DestroyWindow,DestroyWindow只适用于关闭PB本身的窗口(对象),不适用于外部窗口,如在一个button的clicked事件中加上:DestroyWindow(handle(parent))则关闭button所在窗口。DestroyWindow的声明格式是:
?牐燜UNCTION ulong DestroyWindow(ulong hwnd) LIBRARY “user32.dll”
?牐犖侍馑摹⑹荽翱诘亩啾砀挛侍猓何业氖荽翱谑菰蠢醋粤礁霰恚毙薷母檬荽翱谑菹钍保跹龅搅礁鰐able都能更新?
?牐牬穑菏荽翱谑菰蠢醋粤礁龌蛄礁鲆陨系谋恚嗟庇诙喔霰砹咏?立的一个视图,对于这种数据窗口,PB默认是不能修改的。当然我们可以通过设置它的Update 属性,数据窗口的Update Properties用来设置数据窗口是否可Update、可Update的表、可Update列等,但不能同时设置两个表可更新;所以当修改它的数据项时,不能简单地用dw_1.update()来更新table,我们可以在程序中设置数据窗口可更新的一个表A(及其可更新列),其他表为不可更新,更新完表A后,再设置另一表B为可更新,表A设置为不可更新,依次类推。
?牐犚訮owerBuilder7自带的EAS Demo DB V3数据库为例:
?牐?1、新建一个数据窗口d_grid_dep_emp,它的Select语句为
?牐燬ELECT department.dept_id,
?牐燿epartment.dept_name,
?牐爀mployee.emp_id,
?牐爀mployee.emp_fname,
?牐爀mployee.emp_lname,
?牐燜ROM department,employee
?牐燱HERE employee.dept_id = department.dept_id
?牐?2、设置数据窗口d_grid_dep_emp的属性,将列的taborder改为非0值;并点击菜单Rows→Update Properties,设置此数据窗口Allow Updates,Table to Update设为department,Updateable Columns设为department.dept_id,department.dept_name。
?牐?3、在窗口中更新数据窗口按钮的clicked事件编写脚本:
?牐爈ong ll_rtn
?牐?// 修改Department表(Department表在第2步已设置为可更新)??
?牐爈l_rtn = dw_1.update(true, false)??
?牐營f ll_rtn = 1 then
?牐?//关闭对Department表的修改
?牐燿w_1.Modify(“department_dept_name.Update = 'No'”)??
?牐燿w_1.Modify(“department_dept_id.Update = 'No'”)??
?牐燿w_1.Modify(“department_dept_id.Key = 'No'”)??
?牐?//设置Employee表成为新的可修改表
?牐燿w_1.Modify(“DataWindow.Table.UpdateTable = 'employee'”)??
?牐燿w_1.Modify(“employee_emp_id.Update = 'Yes'”)??
?牐燿w_1.Modify(“employee_emp_fname.Update = 'Yes'”)??
?牐燿w_1.Modify(“employee_emp_lname.Update = 'Yes'”)??
?牐燿w_1.Modify(“employee_emp_id.Key = 'Yes'”)??
?牐?//修改Employee表
?牐爈l_rtn = dw_1.Update()?煟?
?牐營F ll_rtn = 1 THEN
?牐燙OMMIT USING SQLCA;??
?牐燿w_1.retrieve()?煟?
?牐爉essagebox('提示信息','更新成功!')??
?牐燛LSE
?牐燫OLLBACK USING SQLCA;??
?牐燤essageBox('提示信息','更新成功!')??
?牐燛ND IF
?牐?//重置修改标志
?牐燿w_1.Modify(“department_dept_name.Update = 'Yes'”)??
?牐燿w_1.Modify(“department_dept_id.Update = 'Yes'”)??
?牐燿w_1.Modify(“department_dept_id.Key = 'Yes'”)??
?牐燿w_1.Modify(“DataWindow.Table.UpdateTable = 'department'”)
?牐燿w_1.Modify(“employee_emp_id.Update = 'No'”)??
?牐燿w_1.Modify(“employee_emp_fname.Update = 'No'”)??
?牐燿w_1.Modify(“employee_emp_lname.Update = 'No'”)??
?牐燿w_1.Modify(“employee_emp_id.Key = 'No'”)??
?牐燛LSE
?牐燫OLLBACK USING SQLCA;??
?牐燤essageBox('提示信息','更新成功!')??
?牐燛ND IF
?牐犖颐腔箍梢越陨瞎δ茏鞒梢桓龊诒匾氖焙虻饔眉纯伞?
?牐犖侍馕濉⑷绾卧诜荘B窗口中实现键盘按键和鼠标点击动作的检测?有很多屏幕捕捉软件都可以在非本软件窗口中实现热键响应事件。
?牐牬穑菏紫鹊饔肁PI函数RegisterHotKey为窗口注册热键。当热键按下后,Windows发送wm_hotkey消息给窗口,这时我们可以在PB窗口的other事件中处理。
?牐牰ㄒ宕翱谑道淞浚?
?牐爈ong atomid
?牐燾onstant integer MOD_ALT= 1//ALT键
?牐燾onstant integer MOD_CONTROL= 2//CTRL键
?牐燾onstant integer MOD_SHIFT= 4//SHIFT键
?牐牰ㄒ錋PI函数:
?牐燜UNCTION Integer GlobalAddAtom(ref string lpString) LIBRARY “kernel32.dll” ALIAS FOR “GlobalAddAtomA”
?牐燜UNCTION ulong RegisterHotKey(ulong hwnd,ulong id,ulong fsModifiers,ulong vk) LIBRARY “user32.dll”
?牐犜诖翱诘膐pen事件编写脚本:
?牐?//注册热键
?牐爈ong ll_RC
?牐爏tring ls_atomid
?牐爈s_atomid = 'myatomid'
?牐燼tomid = GlobalAddAtom(ls_atomid)??
?牐?//得到惟一的ID,保证不和其他应用程序发生冲突
?牐爈l_RC = RegisterHotKey(Handle(this),atomid,MOD_CONTROL, 70)??
?牐?//注册的热键为Ctrl+F ,70为'F'
?牐?//如果组合键,可用MOD_CONTROL + MOD_ALT等
?牐爄f ll_RC = 0 then messagebox(“Error!”,“热键注册错误”)??
?牐?//热键注册冲突
?牐犜诖翱诘膐ther事件编写脚本:
?牐?//处理系统热键
?牐營F wparam = atomid THEN
?牐?//处理
?牐爉essagebox('hello','你好!')??
?牐燛ND IF