PowerBuilder编程俱乐部

Author: 柯建勋 Date: 2000年 第3期

  大家新年好!非常感谢各位在版主出差期间对PowerBuilder编程俱乐部一如既往的支持。建议各位到俱乐部主页http://kjx.126.com或http://pb70.yeah.net的BBS讨论区去提交问题,在那会有很多热心的PB爱好者替你排忧解难,更欢迎你去讨论区解答问题,因为我们俱乐部的宗旨就是互相学习、共同进步!
  2000年已经到来,PowerBuilder编程俱乐部也在大家的关心下逐步发展壮大,在这里版主衷心地祝福各位新年快乐、学习进步!
  一、问:下拉列表控件(DropDownListBox)中,当选中某一项后,我怎样才能返回当前选中项的索引号?(相当于VB中ComboBox的Index属性)
  答:PowerBuilder中下拉列表控件没有Index属性,不能直接引用,得用其它方法实现。现给出两种方法:
  1.设一long型实例变量il_index,在下拉列表的SelectionChanged事件中加入:
  il_index = index
  以后引用il_index即可。
  2.假设下拉列表名为ddlb_1,则索引号:
  li_index = ddlb_1.FindItem(ddlb_1.Text,1)
  二、我用的数据库是 Sybase SQL Anywhere 5.0,数据库文件在本机能用,拷贝到别的机器却连接不上,是否还需其它配置?
  答:假设数据库文件为hello.db,将hello.db与hello.log拷贝过去,再配置ODBC数据源。如果还连不上数据库,则须重新连接事务注册文件hello.log,方法如下:
  1.进入MS_DOS模式。
  2.进入Sybase SQL Anywhere5.0\win32目录,如:C:> cd C:\Program Files\Sybase\SQL Anywhere 5.0\Win32
  3.运行命令(假设数据库文件拷贝到D盘根目录下):
  dblog -t d:\hello.log d:\hello.db
  三、问: 我在安装好PB6.5之后,连接示例Powersoft Demo DB V6数据库,打开DATABASE画板,出现Select Table对话框,选择Cancel。打开FILE菜单中只有:Close、Connect、Configure ODBC、PowerPanel、Print Setup、Exit等菜单项,却没有像书中所讲的Create Database选项,请问这是为什么?
  答:这个问题的关键所在是在PowerBuilder所能找到的路径中,必须有dbtl50t.dll这个文件,PB才会出现建数据库的选项。这个文件包含在完整的SQL Anywhere之中,PB安装时只安装SQL Anywhere最基本的引擎部分,不安装这个文件。
  解决方法:在PB光盘上有完整的SQL Anywhere 5.0,安装它即可。或者你也可以从其他机上将dbtl50t.dll拷贝到C:\Windows\System或\SQL Anywhere 5.0\Win32中。
  (本题由网易PB版主ilike提供解答)
  四、数据窗口中某列的编辑风格设为下拉数据窗口(DropDownDataWindow),用GetItemNumber()函数只能得到实际值。有什么办法能得到此列的显示值?
  答:数据窗口中有一个内部函数LookupDisplay()可实现此功能,若列名为“currency”,取第1行的显示值的方法如下:
  dw_1.Describe ( “Evaluate(′LookupDisplay(currency)′,1)” )
  这种方法同样适用于编辑风格为下拉列表框(DropDownListBox)、单选钮(RadioButtons)等的列。
  五、在数据窗口录入数据时,有的域要输英文,有的域要输中文,每次要手工切换,很麻烦,能不能在程序中自动控制切换中英文输入法?
  答:可以用API函数实现:
  声明API函数:
  function boolean ImmSimulateHotKey (ULong hWnd,ULong dwHotKeyID) library “IMM32.dll” 
  function ulong GetKeyboardLayout(ulong dwLayout) LIBRARY “user32.dll”
  function boolean ImmIsIME(uLong hklKeyboardLayout) library “IMM32.DLL” 
  定义变量:
  constant int IME_THotKey_IME_NonIME_Toggle=112
  ulong hklCurrent
  ulong hnd
  切换到英文输入法:
  hklCurrent=GetKeyboardLayout(0)
  if ImmIsIME(hklCurrent) then
  hnd=Handle(parent)
  ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle) 
  end if
  切换到中文输入法:
  hklCurrent=GetKeyboardLayout(0)
  if not ImmIsIME(hklCurrent) then
  hnd=Handle(parent)
  ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle)
  end if
  可根据需要,触发两段不同的脚本以达到动态切换中英文输入法的目的。
  六、问:在数据窗口对象画板中可以设定列的编辑风格为下拉数据窗口(DropDownDataWindow),请问在程序中可以动态实现这项功能吗?
  答:可以的,假设所设定列为部门号“department_id”,相关连的子数据窗口为“d_dddw_dep”,显示列为部门名称“dept_name”,数据列为部门号“dept_id”,实现方法如下:
  dw_1.Modify(“department_id.DDDW.Name=d_dddw_dep ”)
  dw_1.Modify(“department_id.DDDW.DisplayColumn=′dept_name′ ”)
  dw_1.Modify(“department_id.DDDW.DataColumn=′dept_id′ ”)
  或:
  dw_1.object.department_id. DDDW.name = “d_dddw_dep”
  dw_1.object.department_id.DDDW.DisplayColumn = “dept_name” dw_1.object.department_id.DDDW.DataColumn = “dept_id”
  注:PowerBuilder有一个小工具DWSyntax(程序名为:dwsyn60.exe),提供了获得及修改数据窗口、列等的各项属性值的语法,对编程非常有帮助。上述脚本在DWSyntax中都能找到。