PowerBuilder编程俱乐部

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

  大家好!PowerBuilder编程俱乐部又与大家见面了,最近俱乐部的论坛中你问我答,非常热闹,有一大批PB爱好者及高手活跃在论坛上。我们也热切期待你的加盟,各位可到俱乐部主页http://kjx.126.com或http://pb70.yeah.net的BBS讨论区去提交或解答问题。
  问:PB6.5所带的数据库Sybase SQL Anywhere 5.0 小巧方便,但不知如何在Sybase SQL Anywhere 服务器增加用户和设置数据库的操作权限?
  答:不知以下的介绍对你是否有用:
  SQL Anywhere数据库的默认用户名和口令是DBA和SQL,要对数据库安全负责的话,就应当更改口令或用户名,不然大家得到你的数据库后都能打开它。
  启动Sybase Central,″connect″数据库后,在数据库项目列表中,有一项″users & groups″,打开它,有以下功能:
  add user:添加用户及口令,指定级别(可选DBA)。
  add group:添加用户组。
  dba。
    对已有的用户,进行修改,打开后有四个标签页:
  1.General:修改用户口令
  2.Authorities:设置用户级别,其中DBA为系统管理员;Resource为可以创建数据库级别。
  3.Membership:指定用户组。
  4.Permissions:设定对每个表的操作级别。
  dbo和public:添加或删除组中的用户。
  Sybase Central是一个数据库管理中心,功能十分强大,可以实现诸如创建数据库、压缩、备份、改变库结构(这个功能相当实用,例如你在PB的table画板下,不能改变字段类型、长度只能扩大不能缩小,在Sybase Central下你想做什么都可以)等等许多数据库操作。(此题由yiyi提供答案)
  问:我的程序在PB下可正常运行,单步调试也没出错。但是编译成.EXE 文件后运行时连不上数据库(SQL Anywhere的本地库),不知哪里出了问题,有没有可能是我的PB安装得不完全?缺少一些DLL文件?
  答:经过编译生成的PowerBuilder应用程序需要如下运行环境:
  ①PowerBuilder 运行时动态连接库( Runtime Library ),在PowerBuilder 6.0中需要如下DLL:
  PBVM60.DLL (PowerBuilder 虚拟机)(必需)
  PBDWE60.DLL (DataWindow 引擎) (可选) 
  PBRTC60.DLL (Rich Text Control)(可选) 
  PBTRA60.DLL (DLL used for tracing db calls)(可选)
  ②与所需连接的数据库的直连接口(Native Driver) 或 ODBC接口(ODBC Driver):
  PBSYC60.DLL (连接Sybase 的直连接口) 
  PBO7360.DLL (连接Oracle7.3的直连接口)
  ③所需连接的数据库的Client端(如Sybase的Open Client,Oracle 的SQL Net) 
  以上是Sybase公司的建议。 
  我的经验是,编译好的程序必须有pbdwe60.dll和pbvm60.dll才行。如果使用了数据管道、超文本控件,还要加pbrtc60.dll。另外,如果使用ODBC连接数据库则还需pbodb60.dll,如果使用专用接口,则必须对应数据库的DLL,如Oracle7.3用PBO7360.DLL,Sybase用PBSYC60.DLL。这些文件必须在你的PB应用程序可搜索的路径内(如Window\System、应用程序目录下等),PB可执行文件才能正常运行。(此题由yiyi回答)
  问:怎样检测数据窗口中数据是否被修改,以避免用户不小心关闭窗口而导致数据窗口中大量修改数据未保存而丢失?
  答:在窗口的closequery事件加入如下代码即可:
  if dw_1.deletedcount() + dw_1.modifiedcount() > 0 then
  integer li_ret
  li_ret = messagebox(″注意″,″数据已经被修改,是否存盘?″,Question!,YesNoCancel!)
  choose case li_ret
  case 1
  if dw_1.update() = 1 then 
  commit;
  return 0
  else
  rollback;
  messagebox(″出错″,″存盘时出错!请检查数据的正确性。″)
  return 1
  end if
  case 2
  return 0
  case 3
  return 1
  end choose
  end if
  (此题由ferryman回答)
  问:各位大侠,怎么在数据窗口中用箭头键实现“Shift+Tab”按键的功能?我想在PB中获得一个像Foxpro那样的编辑环境,即按左箭头键光标便移动到当前列的左边一列,按右箭头键光标便移动到右边一列?
  答:方法一(推荐):
  声明函数:
  subroutine keybd_event(uint bVk,uint bScan,long dwFlags,long dwExtraInfo ) library ′user32.dll′
  定义用户事件ue_keydown:pbm_dwnkey。
  在事件中编程:
  integer VK_TAB = 09
  integer VK_SHIFT = 16
  if key = KeyLeftArrow! then
      keybd_event(VK_SHIFT,0,0,0) //按下shift
      keybd_event(VK_TAB,0,0,0) //按下tab 
      keybd_event(VK_TAB,0,2,0) //释放tab 
      keybd_event(VK_SHIFT,0,2,0) //释放shift 
      return 1
  end if
  if key = KeyRightArrow! then
      keybd_event(VK_TAB,0,0,0) //按下tab 
      keybd_event(VK_TAB,0,2,0) //释放tab 
      return 1
  end if
  (此题由ferryman回答)
  方法二(比较原始,但也能实现):
  声明函数:
  function boolean GetKeyboardState (ref char kbarray[256]) library ″user32.dll″
  function boolean SetKeyboardState (ref char kbarray[256]) library ″user32.dll″
  脚本:用户事件ue_keydown:pbm_dwnkey
  char lc_kb[256] 
  if key = KeyLeftArrow! then
      GetKeyboardState (lc_kb) 
      lc_kb[17] = Char (128) 
      SetKeyboardState (lc_kb) 
      Send (Handle (this), 256, 9, 0) 
      GetKeyboardState (lc_kb) 
      lc_kb[17] = Char (0) 
      SetKeyboardState (lc_kb) 
  end if
  问:动态切换数据窗口对象编译后运行为何出错?如在数据窗口dw_1中用 dw_1.dataobject=″dw_sj″来改变对象,在PB7环境下运行一切OK。但当创建工程和应用程序后,运行该应用程序(.EXE文件)时,数据窗口dw_1的数据对象dw_sj不能出现。
  答:当程序中用到了动态加入的对象,如BMP资源文件、数据窗口对象(dw_1.dataobject=″dw_sj″,这里″dw_sj″即为动态加入),PB编译时是扫描不到的,有两种方法解决:
  1.将此对象写入到资源文件中:
  用记事本创建资源文件dw_object.pbr
  写入:c:\myprogram.pbl(dw_sj)
  编译时将此文件选入Resource File Name处。
  2.将应用编译成PBD、DLL文件。
  问:请问PB编译后的程序可否带参数运行,就像DOS中的dir命令:dir/w的形式,如果可以,PB中怎样接收呢?
  答:PB中带参数运行应用程序一般都是用在Application 的 Open 事件里访问 CommandLine参数的办法,根据参数CommandLine 的不同做不同的操作。如程序myapp,运行:myapp hello。hello就是命令行参数。