1、如 何 解 决 VB 中 的 Grid 控 件 的 打 印 问 题- Grid 控 件 是 Visual Basic 最 常 见 控 件 之 一, 从 VB3.0 到 VB5.0 都 有 该 控 件。 也 是 VB 爱 好 者 最 喜 爱 的 工 具 之 一。 用 它 可 以 以 表 格 的 形 式 显 示、 浏 览 数 据, 特 别 是 数 据 库 应 用, 直 接 绑 定 即 可 显 示 浏 览 数 据 库 信 息。 然 而, 美 中 不 足 的 是 Grid 没 有 编 辑 和 打 印 功 能, 列 与 列 的 位 置 不 能 相 互 交 换。 笔 者 曾 尝 试 着 给 Grid 增
2、添 了 这 些 功 能, 使 之 锦 上 添 花, 功 能 更 强 大。 下 面 给 出 改 进 方 法 及 源 程 序, 读 者 只 需 按 步 骤 写 下 源 程 序 即 可 使 你 的 Grid 具 有 打 印 功 能。 该 程 序 笔 者 在 HP5/100 Window 95 环 境 下 用 VB5.0 调 试 通 过。 - 给 Grid 控 件 增 加 打 印 方 法 有 三 种:1 是 直 接 打 印 控 件 的 方 法,2 是 过 printer 来 实 现 打 印 功 能,3 是 通 过 调 用 MS-WORD 及 MS-EXCEl 来 实 现 打 印。 - 首 先, 打 开
3、 一 个 应 用, 在 FORM1 中 增 加 DATA 控 件 DATA1, 把 DATA1 的 CONNECT 属 性 设 为 dBASE III, 再 把 DATABASENAME 属 性 设 为 D: PJXM.DBF。 然 后 再 在 FORM1 中 增 加 MSFLEXGRID 空 间 GRID1, 并 把 GRID1 的 DATASOURCE 属 性 设 为 DATA1。 这 样 数 据 库 PJXM.DBF 的 信 息 就 会 在 GRID1 中 显 示 出 来。 - 方 法 一: 直 接 打 印 窗 体 法, 在 FORM1 中 增 加 命 令 按 钮( command),C
4、APTION 属 性 设 为 直 接 打 印, 再 写 入 下 列 编 码: Sub command_click Form1.printform End sub - 这 样 即 可 通 过 打 印 窗 体 FORM1 的 方 法 把 GRID1 的 数 据 打 印 出 来, 遗 憾 的 是 只 能 打 印 GRID1 中 显 示 的 数 据 部 分, 显 示 不 出 来 的 则 无 法 打 印, 而 且 这 种 打 印 方 法 很 象 屏 幕 硬 拷 贝 把 其 他 控 件 也 打 印 出 来。 也 不 能 灵 活 的 控 制 字 体 等。 - 方 法 二: 通 过 PRINTER 实 现 打
5、 印。 这 种 方 法 - 1、 加 入 打 印 命 令 按 钮(command1)、 函 数(prnt1) 即 可 实 现 打 印 功 能, 写 入 下 面 代 码, 读 者 稍 加 改 动 可 写 成 标 准 的 函 数 或 过 程。 Function prnt1 (x As Integer, y As Integer, font As Single, txt As String) printer.CurrentX = x printer.CurrentY = y printer.FontBold = False printer.FontSize = font printer.Print
6、txt End Function Sub command1_click Dim fnt As Single Dim pp as integer Pp=0设置开始页码 0 Dim stry,strx,strx1,stry1,linw,page1,p As Integer Static a(8) As Integer定义打印的列数 ss$ = “内部结算存入款对帐单“定义表头 kan = 0 For i = 0 To 8 a(i) = 1500定义每列宽 kan = kan + a(i)计算表格总宽度 Next page1 = 50定义每页行数 strx = 200 strx1 = 200定义 X
7、 方向起始位置 stry = 1400 stry1 = 1400定义 Y 方向起始位置 linw = 240定义行宽 fnt = 8定义字体大小 printer.fontname = “宋体“定义字体 dd = prnt1(4000, 700, 18, ss$)打印标题 printer.Line (strx - 50, stry - 30) -(strx + kan - 10, stry - 30) For j = 0 To gridrow - 1gridrow 为所要打印的行数 grid1.row = j strx = strx1 printer.Line (strx - 50, stry
8、- 30) -(strx + kan - 10, stry - 30) p = p + 1 For i = 0 To 8 grid1.col = i dd = prnt1(strx, stry, fnt, grid1.text) strx = strx + a(i) Next If p page1 Thennext page p = 0 strx = strx1 line last line printer.Line (strx - 50, stry + linw) -(strx + kan - 10, stry + linw) stry = stry1 line col For n = 0
9、To 8 printer.Line (strx - 30, stry - 30) -(strx - 30, stry + (page1 + 2) * linw) strx = strx + a(n) Next printer.Line (strx - 30, stry - 30) -(strx - 30, stry + (page1 + 2) * linw) pp=pp+1 foot$=“第 “+cstr(pp)+“页“ dd = prnt1(strx - 30-1000, stry + (page1 + 2) * linw+100, 10, foot$)打印页角码 printer.NewPa
10、genext page dd = prnt1(4000, 700, 18, ss$) 打印标题 strx = strx1 stry = stry1 printer.Line (strx - 50, stry - 30)- (strx + kan - 10, stry - 30) print first row Else stry = stry + linw End If Next st = stry If p page1 Then 在最后页剩余划空行 For o = p To page1 + 1 strx = strx1 printer.Line (strx - 50, stry - 30)
11、-(strx + kan - 10, stry - 30) stry = stry + linw Next End If stry = stry1 strx = strx1 stry = stry1 line col For n = 0 To 8 printer.Line (strx - 30, stry - 30)- (strx - 30, stry + (page1 + 2) * linw) strx = strx + a(n) Next printer.Line (strx - 30, stry - 30)- (strx - 30, stry + (page1 + 2) * linw)
12、pp=pp+1 foot$=“第 “+cstr(pp)+“页“ dd = prnt1(strx - 30-1000, stry + (page1 + 2) * linw+100, 10, foot$)打印页角码 printer.EndDoc打印结束 Endsub - 这 种 方 法 通 过 灵 活 的 编 程 可 以 方 便 地 调 整 字 体、 字 型、 线 形、 页 面、 纸 张 大 小 等。 可 打 印 出 比 较 满 意 的 效 果。 如 果 你 的 计 算 机 上 装 有 MICROSOFT WORD 和 MICRO EXCEL, 最 精 彩 的 用 法 还 是 把 GRID 的 表
13、 格 通 过 VB 发 送 到 MICROSOFT WORD 及 MICRO EXCEL。 生 成 MICROSOFT WORD 和 MICRO EXCEL 表 格。 这 样 就 可 以 充 分 利 用 MICROSOFT WORD 和 MICRO EXCEL 的 打 印、 编 辑 功 能 打 印 出 更 理 想 的 效 果。 下 面 逐 一 介 绍。 - 方 法 三: 通 过 生 成 MICROSOFT WORD 表 格 打 印 - 1、 在 declaration 中 写 入: Dim msword As Object - 2、 加 入 打 印 命 令 按 钮(command2),CAPT
14、ION 设 为“ 生 成 WORD 表 格“, 写 入 下 面 代 码, Private Sub command2_Click() screen.MousePointer = 11 Set msword = CreateObject(“word.basic“) Dim AppID, ReturnValue appID = Shell(“d:office97officeWINWORD.EXE“, 1) Run Microsoft Word. msword.AppActivate “Microsoft Word“ msword.AppActivate “Microsoft Word“, 1 ful
15、l Screen.MousePointer = 0 End Sub - 2、 写 入 以 下 过 程 full() Sub full() Dim i As Integer, j As Integer, col As Integer, row As Integer Dim cellcontent As String Me.Hide cols = 4表格的列数 row = gridrow打印表的行数 msword.filenewdefault msword.MsgBox “正在建立 MS_WORD 报表, 请稍候.“, “, -1 msword.leftpara msword.screenupda
16、ting 0 msword.tableinserttable , col, row, , , 16, 167 msword.startofdocument for j=0 to gridrow 表格的行数 grid1.row=j For i = 1 To cols Gri1d.col=i If IsNull(grid1.text) Then cellcontent$ = “ Else cellcontent$ = grid1.text End If msword.Insert cellcontent$ msword.nextcell Next i Next j msword.tabledele
17、terow msword.startofdocument msword.tableselectrow msword.tableheadings 1 msword.centerpara msword.startdocument msword.screenrefresh msword.screenupdating 1 msword.MsgBox “ 结束“, “, -1 Me.Show End Sub - 方 法 四: 通 过 发 送 到 MICROSOFT EXCEL 实 现 表 格 打 印 - 1、 加 入 打 印 命 令 按 钮(command3),CAPTION 设 为“ 生 成 EXCE
18、L 表 格“, 写 入 下 面 代 码 Private Sub command3_Click() Dim i As Integer Dim j As Integer Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject(“Excel.Application“) xlApp.Visible = True Set xlBook = xlApp.Workbooks.Add On Error Resume Next Set xlBook = xlApp.Workbooks.Add Open(“d:text2.xls“) Set xlSheet = xlBook.Worksheets(1) xlSheet.Cells(6, 1) = “i“ For i = 0 To gridrow grid1.Row = i For j = 0 To 6 Grid1.Col = j If IsNull(Grid1.Text) = False Then xlSheet.Cells(i + 5, j + 1) = Grid1.Text End If Next j Next i Exit Sub