软件教程>>程序设计>>pb程序设计>>PB问题解答

PB问题解答

 

一、pbr使用的时机? 
1、如果你将resource动态的指定给object或control property,就必须使用pbr 

2、如果使用pbr会降低exe档发行时所需要的档案数目 
3、要让许多的应用程式使用共同的library 

二、如何将bmp,ico,datawindow资源整合到pbd中? 
使用pbr(资源索引档)将其资源整合进入pbd档案中pbr的语法如下: 
XXXX.PBL 
XXXX.BMP 
XXXX.ICO 
如果你的script是如此p_roller.picturename="c:\rollwe.bmp" 
则需将该叙述加入pbr中 
c:\rollwe.bmp 

三、如何将datawindow资料更新在多个table上? 
设定及修改datawindow的update table和update column资料 

四、错误讯息超过script行号? 
可能忘加入end if 或end choose 

五、中文字型发生错误? 
修改PBTY050.DLL的拼字错误,或到http://www.eur.com.tw下载修正程式 

六、中英文输入法切换? 
function boolean ImmSimulateHotKey (UnsignedLong hWnd, 
UnsingedLong dwHotKeyID) library "IMM32.dll" 
function unsignedlong GetKeyboardLayout (unsignedlongwLayout)library " 
user32.dll" 
function boolean ImmIsIME(unsignedLong hklKeyboardLayout)library "IMM3 
2.DLL" 

英文输入法切换 
constant int IME_THotKey_IME_NonIME_Toggle=112 
uint hklCurrent 
unsignedlong hnd 

hklCurrent=GetKeyboardLayout(0) 
if ImmIsIME(hklCurrent) then 
hnd=Handle(parent) 
ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle) 
end if 

中文输入法切换 
constant int IME_THotKey_IME_NonIME_Toggle=112 
uint hklCurrent 
unsignedlong hnd 

hklCurrent=GetKeyboardLayout(0) 
if not ImmIsIME(hklCurrent) then 
hnd=Handle(parent) 
ImmSimulateHotKey(hnd,IME_THotKey_IME_NonIME_Toggle) 
end if 

七、当datawindow的column在存档後,如果想设计禁止操作者再到该column输入 
,因该如何设计? 
在该datawindow的column上按右键进入properties在expressions 
的protect设成 If(isrownew(),0,1)即可 

八、在使用inherit windows时,有的window的object不需要执行祖先event 
中的程式那怎麽办? 
在window的object的event中,在design下拉视窗中,有四个script设定其中第三 
项3.override ancestor script 即可关闭祖先的程式,只执行目前的程式 

九、object的properties中的有一个设定visible 打勾,我因设计需要将打勾取 
消使object 看不见,但现在想使其恢复,该如何作?该object己经看不见了 
object 在取消visible後,如要恢复请下拉edit的control list将object 的pro 
perties拉出设回 

十、PowerBuilder 由版本5.0提升至5.0.03後,在使用SQL CENTRAL 工具时,若 
希望查看Stored Procedure,按右键,选OPEN,会出现"这个程式执行的作业无效 
,即将关闭"。 
PowerBuilder 5.0.03中之程式bug,请将Scview.exe程式档回覆。 

十一、在程式中如何控制让使用者在输入资料时,能够自动产生连续性的号码? 

在定义TABLE栏位时,其default值(最後一栏)设定中有一autoincrement选项,即 
会自动产生连续的号码。 

十二、如何在视窗之间传递叁数? 
PowerBuilder提供了三个函数可以达到此功能: 
1.OpenWithParm() 
2.OpenSheetWithParm() 
3.CloseWithReturn() 
当在程式中呼叫了这些函数时,从视窗所传过来的叁数会放在message物件中。 

可从message的属性中取得所要的叁数。 

十三、有何不同? 
:是任何Window 都可以使用 
:适用於单一Window 
:适用於单一Object 

十四、如何读取不同Database的Data? 
1.点取PowerBar的Pipline(Painter Bar的Pipline) 
2.选择New 
3.在Quick Select下选取Source Connection和Descination Connection 
4.选取Tables和Columns 

十五、何谓汇入(Import)汇出(Export)?如何汇入及汇出? 
1.汇入(Import)汇出(Export): 
Import用於使Power Builder能读取其他软体的资料,Export则正好相反 
2.如何汇入及汇出: 
从Rows功能表中选择Import,出现Select import file视窗;指定要汇入的资料所 
在的档案名称,再选择Ok! 

十六、三者的差异? 
:存放使用者可以看到的资料列 
:存放在资料视窗中滤掉的资料列 
:存放被使用者透过程式码删除的资料列 
如果我们为该资料视窗定义了Filter,则被过滤掉的资料被转存放在Filter Buf 
fer中,使用者不能再对这些资料进行修改,当资料被重新存入资料库其馀的资料 
保持不变,在刚开始时,先滤除不合格的资料外,其馀的资料都被存放到Primar 
y Buffer中,使用者透过资料视窗控制件提供的一些Function可以对Primary Bu 
ffer中的资料进行动作,如果某列资料被删掉了,它就从Primary Buffer 移至D 
elete Buffer,使用者就不能在资料视窗中看到它,当呼叫Update function时重 
新把资料写入资料库时,Primary Buffer中的资料被写回硬碟,而Delete Buffe 
r中的资料即被加上删除标记之後放回资料库或者直接被删除。 

十七、何谓Transaction Object? 
当Application开始执行时,它会Create一个Global Transaction(SQLCA),当应 
用程式结困时它会自动Destroy,一个Transaction Object中包括了:DBMS,Data 
Base name,login ID,Password,SQLcode,logpass,servername.....,程式 
和资料库连接之前,必须先将Transaction object 初使化,如果application使 
用同一个DBMS,而且资料库使用同一Database name,则可使用同一个Transacti 
on object,若在application中使用到两个不同的资料库,则需要另一个Transa 
ction object来存取第二个资料库了。 

十八、把dbfile转到另一台pc时,却发生资料库无法连结的情况该如何解决? 
先寻找dblog.exe这个档案位於何处,再到dos模式中切换到该路径,如:cd\sqla 
ny50\win32, 
执行dblog-t\path\logfilename \path\dbfilename。 

十九、由於我现在要制作的报表show出来的资料长度很短,我希望在同页面上可 
以多栏的方式显示结果,pb的报表功能可以提供此方法吗? 
在Data Window或Report中Edit\Properties\Print Specification中设定即可最 
下方有Newspaper Columns,即是设定显示的栏位数及栏位宽度。 

二十、如何在Grid型态的Data Window及Report中加上标题而不出现格线? 
在Header区域,先加上一个「text object」,在其Properties中,到Position\ 
Layer选「Forground」,再到Font\Background,指定为白色(或其它颜色,非Tr 
ansparent即可),此text object即成为可移动及可调整大小的,只要把拉开到足 
以填满整个Header的区域即可。 

PB问题解答之二

1。问 题 : 如 何 把 阿 拉 伯 数 字 转 换 为 中 文 大 写?(发 票 打印 
中 需 要) 
  技 巧 1: 脚 本 如 下: 
      int i,lendec,lenint 
      string numstr,a,b,c,d,bbak 
      numstr=string(aje,"#0.00") 
      lenint=len(mid(numstr,1,pos(numstr,'.') - 1)) 
      if right(numstr,2)='00' then 
        lendec=0 
      else 
        lendec=2 
      end if 
      string dxint[13],dxdec[2],sz[13] 
      string dxstr="万仟佰拾亿仟佰拾万仟佰拾元" 
      string szstr="零壹贰叁肆伍陆柒捌玖" 
      for i=1 to 13 
        dxint[i]=mid(dxstr,26 - i*2+1,2) 
        if i<11 then 
         sz[i]=mid(szstr,i*2 - 1,2) 
        else 
         sz[i]=" " 
        end if 
      next 
      dxdec[1]="角" 
      dxdec[2]="分" 
      dxstr=" " 
      for i = 1 to lenint 
      a = mid(mid(numstr,1,lenint),i,1) 
      b = sz[integer(a)+1] 
      c = dxint[lenint - i +1] 
      if dxstr<>" " then 
        d = mid(dxstr,len(dxstr) - 1 ,2) 
      else 
        d = " " 
      end if 
      if b="零" and (d="零" or b=bbak or c="元" or c="万" or c=" 
亿") then b="" 
        if a="0" and c<>"元" and c<>"万" and c<>"亿" then c="" 

         if (c="元" or c="万" or c="亿") and d="零" and a="0" 
then 
           dxstr=mid(dxstr,1,len(dxstr) - 2) 
           d = mid(dxstr,len(dxstr) - 1,2) 
            if (c="元" and d="万" or c="万"and d="亿") the 
n 
             c="" 
            end if 
           dxstr=dxstr + b + c 
           bbak = b 
          next 
       for i=1 to lendec 
        a = mid (mid(numstr,lenint+2,lendec),i,1) 
       if a="0" and dxdec[i]="分" then 
        b="" 
       else 
        b=sz[integer(a) + 1] 
       end if 
       if a<>"0" then 
        dxstr=dxstr+b+dxdec[i] 
       else 
        dxstr=dxstr+b 
       end if 
       next 
       if lendec=0 then dxstr=dxstr+"整" 
       return dxstr 

2。问 题 : 请 问 如 何 在 DataWindow 中 作 一 个 累 加 ( 累 计 量 ) 的 
栏 位 , 格 式 如 下 : 
      项目 数量 累计量 
      ==== ==== ====== 
       1  10   10 
       2  20   30 
       3  30   60 

  cumulativeSum( column for all )  

3。问 题 : 如 何 以 Enter 键 来 达 到 切 换 物 件 的 focus... ? 

技 巧 1: 有 许 多 方 法 , 以 下 是 PowerBuilder 中 较 常 用 的 一 种方 
法 
   在 PowerBuilder 中 已 定 义 许 多 事 件 所 对 应 的 Message ID, 而 
在 其 所 提 供 的 元 件 , 大 部 分 有 对 应 key down 事 件 , 其 ID 值 
不 一 定 相 同 , 例 如 在 datawindow -> pbm_dwnkey,single line edit - 
> pbm_keydown, 其 他 参 考 使 用 手 册 ... 因 此 先 对 使 用 的 元件 
新 增 key 的 使 用 者 事 件 , 当 user 在 元 件 上 按 任 何 按 键 时 , 
将 会 触 发 此 key down 事 件 ( 有 例 外 , 讲 解 太 过 复 杂 ,...) 
      你 将 可 获 得 所 传 的 参 数 key: 按 键 码 ,keyflags 复合 
键 码 , 当 所 按 的 是 Enter 时 , 你 就 把 focus 转 移 到 下 一 元件 
, 或 下 一 栏 位 , 或 ....... 
   
   我 想 我 贴 上 一 个 datawindow 的 例 子 , 这 样 也 可 供 其 他网 
友 参 考 . 
   step1. 先 选 择 要 处 理 的 datawindow control, 然 後 选 择 menu 
的 declare 的 user events, 此 时 会 显 示 一 个 使 用 者 事 件 box 
   step2. 於 event name 设 定 使 用 者 事 件 名 称 例 如 :ue_checkke 
y, 然 後 在 event ID 填 入 pbm_dwnkey( 或 从 Paste event 选 择 ), 然後 
按 OK 
   step3. 此 时 你 可 在 datawindow controls 的 script 中 select eve 
nt 里 发 现 多 了 一 个 使 用 者 事 件 
   ue_checkkey, 并 且 此 事 件 会 传 递 2 个 参 数 keycode key,unsig 
nedlong keyflags 
   step4. 在 script 中 可 如 此 写 : 
   choose case key 
   case KeyTab! // 按 Tab 
   //write your code 
   case KeyEnter! // 按 Enter 
   //write your code 
   case KeyEscape! // 按 Esc 
   //write your code 
   . 
   . 
   . 
   end choose 
   备 注 :1.keycode 是 Enumerate data type 可 在 on line help 或 bro 
wers 中 获 得 其 属 性 
      2. 你 可 以 设 定 return value:0 或 1。 

  技 巧 2: 如 果 是 在 DataWindow 上 , 可 参 考 以 下 的 方 式 : 
       在 DataWindow 宣 告 一 user event: 
       1. 如 ue_enter, 将 Event ID 参 考 至 pbm_dwnprocessenter 

       2. 在 ue_enter 加 入 以 下 的 程 式 码 
         send(handle(this),256,9,long(0,0)) 
         return 1     

4。问 题 : 简 介 一 下 PowerBuilder 如 何 与 CommPort 连 接。 
   
  技 巧 1: Step1. 使 用 可 以 控 制 CommPort 的 OCX, 例 如 Microsoft 
Communications Control 或 pdqComm。 
       Step2.Initiate the OCX。 
       //Script如下,ole_1为OCX Name 
        ole_1.object.CommPort = 2 
        ole_1.object.Settings = "9600,N,8,1" 
        ole_1.object.PortOpen = true 
        ole_1.object.InputLen = 0 
       Step3.Get Data or Put Data。 
       //Get Data 
        ole_1.object.input() 
       //Put Data 
        ole_1.object.output = 'ATDT4125678'+char(13) 
   
  技 巧 2: 1.呼 叫 电 话 拨 号 程 序,RUN(c:\windows\dialer.exe) 
       2.VB 或 VC++ 的 Microsoft Communications Control 搭 配 m 
oden 的 AT Command 
       3.windows API 的tapiRequestMakeCall(...) 
       4.windows API 的 TAPI  

5。问 题 : 我 欲 在 MDI 视 窗 内 加 入 其 他 CONTROLs, 但 其 sheets 视 
窗 却 无 法 显 现 , 请 问 可 有 方 式 解 决 ? 

  技 巧 1: 你 必 须 把 MDI Window 的 Client Area 打 开 (Resize)。 Cli 
ent Area 可 视 为 一 种 Control, PB 将 它 的 名 字 内 定 为 MDI_1。 

   //Example//m1, m2, r1, r2 are all integer.//move the client area 
to begin at (m1, m2).mdi_1.Move(WorkspaceX()+m1, WorkspaceY()+m2) 
   //Resize the client area based on the value (r1, r2) you gived.md 
i_1.Resize(r1, r2) 
   要 注 意 的 是 Client Area 打 开 後, 区 域 内 的 Control 会 被盖 
掉。 
  技 巧 2: 可 以 再 开 一 个 child window, 在 开 启 MDI window 以後, 
以 MDI window 为 parent, 开 启 放 有 任 何 object 的 child window 即 
可。 
  技 巧 3:I think you may invisible your object that you want to show 
on your mdi frame. I hope it will helpful. 

6。问题: 有 时 你 想 使 数 据 窗 口 中 的 某 列 的 标 题 title 覆盖 
好 几 列, 在 tabular 类 型 的 数 据 窗 口 非 常 容 易 实 现, 我 不 
细 说 了, 在 grid 类 型 的 数 据 中 该 如 何 实 现 呢? 

   技巧: 选 中 某 列 的 标 题 title,点 右 键 , 选 properties\po 
sition\layer,选 中 foreground。这时 你 可 以 改 变 标 题 的 大 小。同 
时 你 要 禁 止 用 户 在 运 行 程 序 时 移 动 列 的 权 利, 在 脚 本中 
写 上:dw_1.Modify("DataWindow.Grid.ColumnMove=No") 

7。问题:  当 你 建 立 一 个 grid style 的 数 据 窗 口 时,powerbuild 
er是 不 允 许 你 移 动 数 据 列 的, 那 我 们 需 要 移 动 数 据 列时 
就 必 须 重 建 数 据 窗 口 吗? 

   技巧: 在 数 据 窗 口 的 预 览 状 态 下 移 动 数 据 列 即 可。 

8。问题: 如 何 使 数 据 窗 口 中 的 看 上 去 象MultiLineEdit control 
? 

   技巧: 在 数 据 窗 口 的 画 笔 中 选 择 某 一 单 元, 点 击 右键 
, 选 择Edit Styles 中 的 Edit...,然 后 使 H Scroll and V Scroll Bar 
  无 效,仅仅 输 入 一 个 上 限 数 字 即 可。 

9。问题: 在 数 据 窗 口 中 如 果 你 如 何 隐 藏 某 计 算 单 元 ? 

   技巧: 你 可 以 在 它 的properties\expression\visible set: IF( 1 
=2,1,0) ,这 样 就 可 以 了。