PB中一个类Word打印对话框的实现在线教程

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 22:38:47

---- 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" //默认打印份数为1rb_pagearrangeall.checked = true //默认范围为全部页sle_pagearrange.enabled = false //页面范围编辑框无效ddlb_printwhat.SelectItem( 1 ) //默认为“所选页面”//打印方向integer li_templi_temp = integer( idw_toprint.object.datawindow.print.orientation ) //取出设计时的方向if li_temp = 1 then //横向 rb_landscape.checked = true //选中 p_landscape.visible = true //图片显示 p_portrait.visible = falseelseif li_temp = 2 then //纵向 rb_portrait.checked = true p_portrait.visible = true p_landscape.visible = falseend 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_printersetupPrintSetup( ) //设置打印机parent.event ue_initcontrols( )
在无线按钮rb_portrait的clicked事件中编写如下脚本://纵向p_landscape.visible = falsep_portrait.visible = true //显示纵向图片框在无线按钮rb_landscape的clicked事件中编写如下脚本://横向p_portrait.visible = falsep_landscape.visible = true
在命令按钮cb_cancel的clicked事件中编写如下脚本// cb_cancel执行程序CloseWithReturn( parent, 2 ) //如果选择取消,返回2在命令按钮cb_ok的clicked事件中编写如下脚本// cb_ok执行程序string str_tempinteger li_templong ll_row
//打印什么li_temp = ddlb_printwhat.FindItem( ddlb_printwhat.text, 0 ) - 1idw_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.divview = "Yes"//设成预览模式 str_temp = idw_toprint.Describe( "evaluate( 'Page( )', " + String( ll_row ) +" ) " ) //计算页码 idw_toprint.object.datawindow.print.divview = "No"elseif rb_pagearrange.checked then //输入范围 str_temp = sle_pagearrange.textend ifidw_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 = 0if rb_landscape.checked then li_temp = 1elseif rb_portrait.checked then li_temp = 2end ifidw_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 的 相 应 成 员 中。 如 果 要 传 递 多 个 参 数,可 以 把 要 他 们 定 义 为 一 个 结 构 来 传 递。


Tags:

作者:佚名
分享到: 微信 更多