PowerBuilder开发中控制焦点转移几法

Author: 戴金锋 Date: 2000年 第4期

  PowerBuilder(以下简称PB)是现在比较流行的客户/服务器模式应用程序开发工具,在实际应用开发过程中,如何能使操作键盘更快捷、更符合用户原来的操作习惯,实现起来并不容易,要通过PB的一些小技巧来实现,下面介绍方便用户控制焦点转移的二种方法。
  一、窗口中命令控件(COMMADN BUTTON)间焦点切换用TAB键或SHIFT TAB组合键实现,选中控件用鼠标点击,用户在输入数据过程中很不方便。用户习惯用光标键移动控件按钮,按回车键选中控件,下面介绍实现这一用户需要的方法:
  1.在窗口中定义局部外部函数(LOCAL EXTERNAL FUNCTIONS)keybd_event。
  SUBROUTINE keybd_event(INT bvk,INT bscan,INT dwflags,& INT dwextrainfo)LIBRARY“user32.dll”
  2.在窗口用户自定义事件key中写如下程序:
  GRAPHICOBJECT cb_control//定义环境变量
  CHOOSE CASE KEY
  CASE KEYRIGHTARROW!//按光标右键右移焦点
  keybd_event(9,0,0,0)
  keybd_event(9,0,2,0)
  CASE KEYDOWNARROW!//按光标下移键右移焦点
  keybd_event(9,0,0,0)
  keybd_event(9,0,20)
  CASE KEYLEFTARROW!//按光标左键左移焦点
  keybd_event(16,0,0,0)
  keybd_event(9,0,0,0)
  keybd_event(16,0,2,0)
  keybd_event(9,0,20)
  CASE KEYUPARROW!//按光标上移键左移焦点
  keybd_event(16,0,0,0)
  keybd_event(9,0,0,0)
  keybd_event(16,0,2,0)
  keybd_event(9,0,2,0)
  CASE KEYENTER!//按回车键触发焦点处控件
  cb_control=GETFOCUS()
  IF TYPEOF(cb_control)=COMMANDBUTTON!THEN
  TRIGGEREVENT(cb_control,clicked!)
  END IF
  END CHOOSE
  二、PB中数据窗口输入栏目间的切换通过按TAB键或SHIFT TAB组合键实现,用ENTER键代TAB键实现焦点向后转移,很多资料介绍了实现方法,但用户仍然需用SHIFT TAB组合键实现焦点向前转移,仍不方便,下面介绍一种用SHIFT键代替SHIFT TAB组合键,同时用ENTER键代替TAB键,并且在数据窗口末尾按ENTER键系统能自动追加数据行的方法(以下所有定义在数据窗口控件中进行)。
  1.定义局部外部函数(LOCAL EXTERNAL FUNCTIONS)keybd_event,方法如下:
  SUBROUTINE keybd_event(INT bvk,INT bscan,INT dwflags,& INT dwextrainfo)LIBRARY“user32.dll”
  2.在用户定义事件(Use Events)中选择pbm_dwnkey并命名为press_shift,选择pbm_dwnprocessenter并命名为press_enter。
  3.定义局部变量(Instance Variables)i,方法如下:
  INTEGER i=0
  4.在Itemfocuschanged用户事件中定义如下语句:
  i=0
  5.在用户定义事件press_shift中输入如下程序:
  IF KEYDOWN(KEYSHIFT!)AND i=0 THEN
  keybd_event(16,0,0,0)
  keybd_event(9,0,0,0)
  keybd_event(16,0,2,0)
  keybd_event(9,0,2,0)
  i=1
  RETURN 1//按shift键向前移焦点
  END IFT
  6.在用户自定义事件press_enter输入如下程序:
  IF THIS.GETCOLUMN()=LONG (THIS.OBJECT.DATAWINDOW.COLUMN.COUNT)THEN
  IF THIS.GETROW()=THIS.ROWCOUNT()THEN
  THIS。INSERTROW(0)//数据窗口末按ENTER键追加数据行
  THIS.SCROLLTOROW(THIS.GETROW()+1)
  THIS.SETCOLUMN(1)
  RETURN 1
  END IF
  END IF
  SEND (HANDLE(THIS),256,9,LONG(0,0))//按ENTER键向后移焦点
  RETURN 1