万卷书>>电脑书籍>>程序设计>>pb程序设计>>PowerBuilder使用技巧集

WANJUANSHU.COM

PB中一个类Word打印对话框的实现

许 昌 市 电 力 设 计 研 究 所
高 灵 超



 

---- Powerbuilder 数 据 窗口 可 用 于 生 成 各 种 复 杂 的 报 表, 但 如 何 让 用 户 在 使 用时 控 制 打 印 份 数、 打 印 范 围 等 信 息 呢 ?


 

---- 我 们 在 开 发 我局MIS 系 统 时, 经 过 对 我 局 报 表 打 印 需 求 的 分 析, 提 出了 如 下 的 功 能 要 求:


 

---- 1. 必 须 能 够 控制 象 打 印 份 数、 打 印( 页 码) 范 围 等 信 息, 这 是 基 本的 要 求。


 

---- 2. 我 们 系 统 中装 有 多 台 打 印 机, 必 须 能 让 用 户 根 据 自 己 需 要 选 择 使用 哪 台 打 印 机, 必 要 时 能 对 所 选 打 印 机 进 行 配 置。


 

---- 3. 在 设 计 时,对 每 一 个 报 表 需 要 什 么 样 的 纸 张, 要 多 大 的 边 距 合适, 都 已 确 定, 所 以 使 用 时 不 需 要 页 面 的 设 置。 但 由于 不 同 的 报 表 使 用 不 同 的 纸 张, 必 须 在 使 用 时 给 出 提示, 以 便 用 有 机 会 换 上 合 适 的 纸 张( 或 换 用 合 适 的 打印 机)。


 

---- 根 据 以 上 要求, 我 们 设 计 了 如 下 图 所 示 的 对 话 框。 下 面 把 设 计 过程 以 及 用 到 的 技 术 介 绍 一 下。


 

---- 首 先 使 用 窗 口画 板 画 出 窗 口, 名 字 为w_printdlg, 窗 口 类 型 为respons。“ 打 印机” 组 框 中 的“ 名 称” 文 本 控 制 的 名 字 为st_printname,“ 设置” 按 钮 的 名 字 为cb_printsetup。“ 页 面 范 围” 组 框 中 的 无线 按 钮 组 名 字 分 别 为rb_pagearrangeall,、rb_pagearrangecurrent、rb_pagearrange,单 行 编 辑 框 名 字 为sle_pagearrange, 其enable 属 性 为false。“ 副本” 组 框 中 的 编 辑 域 名 字 为em_copies。“ 打 印” 旁 边 的 下拉 列 表 框 名 字 为ddlb_printwhat, 列 表 有 三 项, 分 别 为 所 选页 面、 偶 数 页、 奇 数 页。“ 纸 张” 组 框 中 的 下 拉 列 表 框名 字 为ddlb_paper, 列 表 内 容 为Poerbuiler 定 义 的43 种 纸 张 类型, 分 别 用0-42 的 数 字 来 表 示。“ 纵 向” 无 线 按 钮 的 名字 为rb_portrait,“ 横 向” 无 线 按 钮 的 名 字 为rb_landscape。 表 示纵 向 和 横 向 的 图 片 框 分 别 为p_portrait 和p_landscape。 命 令 按钮“ 确 定” 和“ 取 消” 的 名 字 分 别 为cb_ok 和cb_cancel。


 

---- 以 上 工 作 完 成之 后, 就 要 着 手 编 写 程 序。


 

---- 首 先 为 窗 口 定义 实 例 变 量idw_toprint, 类 型 为datawindow, 用 于 保 存 要 打 印 的数 据 窗 口。 再 定 义 一 个 窗 口 事 件ue_initcontrols( 也 可 以 定义 为 窗 口 函 数), 其 程 序 内 容 如 下:


 


// event ue_initcontrols( )
//设置窗口中各控件的初始值
st_printername.text = idw_toprint.object.
datawindow.printer //当前打印机名字
em_copies.text = "1"  //默认打印份数为1
rb_pagearrangeall.checked = true  //默认范围为全部页
sle_pagearrange.enabled = false	  //页面范围编辑框无效
ddlb_printwhat.SelectItem( 1 )  //默认为“所选页面”
//打印方向
integer li_temp
li_temp = integer( idw_toprint.object.
datawindow.print.orientation ) //取出设计时的方向
if li_temp = 1 then  //横向
	  rb_landscape.checked = true  //选中
	  p_landscape.visible = true	  //图片显示
	  p_portrait.visible = false
elseif li_temp = 2 then  //纵向
	  rb_portrait.checked = true
	  p_portrait.visible = true
	  p_landscape.visible = false
end if


//纸张类型 li_temp = integer( idw_toprint.object. datawindow.print.Paper.Size ) //设计时的纸张类型 ddlb_paper.SelectItem( li_temp + 1 ) //列表框中选中

然后,在窗口的open事件中编写如下脚本: // open event //要使用OpenWithParm( )打开,参数中包含要打印的数据窗口。

idw_toprint = message.powerobjectparm //从参数中取出要打印的数据窗口

this.event ue_initcontrols( ) //初始化窗口各控件

在无线按钮rb_pagearrangall的clicked事件中编写脚本如下: sle_pagearrange.enabled = false 在无线按钮rb_pagearrangcurrent的clicked事件中编写脚本如下: sle_pagearrange.enabled = false 在无线按钮rb_pagearrang的clicked事件中编写脚本如下: sle_pagearrange.enabled = true //当此无线按钮选中时才可用

在命令按钮cb_printersetup中编写如下脚本: // cb_printersetup PrintSetup( ) //设置打印机 parent.event ue_initcontrols( )

在无线按钮rb_portrait的clicked事件中编写如下脚本: //纵向 p_landscape.visible = false p_portrait.visible = true //显示纵向图片框 在无线按钮rb_landscape的clicked事件中编写如下脚本: //横向 p_portrait.visible = false p_landscape.visible = true

在命令按钮cb_cancel的clicked事件中编写如下脚本 // cb_cancel执行程序 CloseWithReturn( parent, 2 ) //如果选择取消,返回2 在命令按钮cb_ok的clicked事件中编写如下脚本 // cb_ok执行程序 string str_temp integer li_temp long ll_row

//打印什么 li_temp = ddlb_printwhat.FindItem ( ddlb_printwhat.text, 0 ) - 1 idw_toprint.object.datawindow. print.page.rangeinclude = li_temp

//打印范围 if rb_pagearrangeall.checked then //全部页 str_temp = "" elseif rb_pagearrangecurrent.checked then //当前页 ll_row = idw_toprint.GetRow( ) idw_toprint.object.datawindow.print.preview = "Yes" //设成预览模式 str_temp = idw_toprint.Describe( "evaluate ( 'Page( )', " + String( ll_row ) +" ) " ) //计算页码 idw_toprint.object.datawindow.print.preview = "No" elseif rb_pagearrange.checked then //输入范围 str_temp = sle_pagearrange.text end if idw_toprint.object.datawindow.print.page.range = str_temp

//副本份数 if len( em_copies.text ) > 0 then idw_toprint.object.datawindow.print.copies = Integer( em_copies.text ) end if

//纸的方向 li_temp = 0 if rb_landscape.checked then li_temp = 1 elseif rb_portrait.checked then li_temp = 2 end if idw_toprint.object.datawindow.print.orientation = li_temp

//纸的尺寸 li_temp = ddlb_paper.FindItem( ddlb_paper.Text, 0 ) //第li_temp项 idw_toprint.object.datawindow.print.paper.size = li_temp

closewithreturn( parent,1 )


 

---- 几 点 说 明:


 

---- 1. 原 点 访 问 语法: 程 序 中 多 次 用 到 了 象datawindowcontrol.object.datawindow.print.attribute 语 法, 用 语 控 制 数 据 窗 口 的 打 印 属 性。 原 点 访 问 语 法用 语 代 替 原 来 的Discribe 和Modify 函 数, 更 符 合 面 向 对 象 的语 言 习 惯。 关 于print 属 性 的 详 细 信 息, 请 参 见Powerbuilder 帮助。


 

---- 2. 当 前 打 印 页的 计 算: 先 用GetRow 得 到 当 前 行 数, 再 用Describe 和Evaluate 函数 来 计 算 数 据 窗 口 表 达 式, 得 出 当 前 页 号。 注 意 在 计算 只 前, 先 把 要 打 印 的 数 据 窗 口 置 成 预 览 模 式, 否 则计 算 出 来 的 是 显 示 页 号, 和 打 印 页 号 不 一 致。


 

---- 3. 窗 口 内 外 信息 的 传 递: 虽 然 你 可 以 用 全 局 变 量 传 递 信 息, 但 那 决不 是 一 个 好 的 注 意。 使 用OpenWithParm 函 数 打 开 窗 口 可 以 向窗 口 传 递 一 个 参 数, 使 用CloseWithReturn 函 数 关 闭 窗 口 可 以返 回 一 个 参 数, 根 据 参 数 的 类 型, 其 结 果 被 放 在 系 统全 局 变 量message 的 相 应 成 员 中。 如 果 要 传 递 多 个 参 数,可 以 把 要 他 们 定 义 为 一 个 结 构 来 传 递。

 
上一页 WanJuanShu.COM 下一页
WANJUANSHU.COM 万卷书