12、如何解决VB中的Grid控件的打印问题 ---- Grid 控件是Visual Basic最常见控件之一, 从VB3.0 到VB5.0 都有该控件。 也是VB爱好者最喜爱的工具之一。 用它可以以表格的形式 显示、浏览数据,特别是数据库应用,直接绑定即可显示浏览数据库信息。然而,美中不足的是Grid 没有编辑和打印功能,列与列的位置不能相互交换。笔者曾尝试着给Grid 增添了这些功能,使之锦上添花,功能更强大。 下面给出改进方法及源程序,读者只需按步骤写下源程序即可使你的Grid 具有打印功能。 该程序笔者在HP5/100Window95环境下用VB5.0 调试通过。 ---- 给Grid 控件增加打印方法有三种: 1 是直接打印控件的方法, 2 是通过 printer 来实现打印功能, 3 是通过调用MS-WORD 及MS-EXCEl 来 实 现 打 印。 ---- 首先,打开一个应用,在FORM1中增加DATA 控件DATA1,把DATA1的CONNECT 属性设为dBASE III,再把 DATABASENAME属性设为D:\PJXM.DBF。然后再在FORM1中增加MSFLEXGRID空间GRID1,并把GRID1的DATASOURCE 属性 设为DATA1。这样数据库PJXM.DBF 的信息就会在GRID1中显示出来。 ---- 方法一:直接打印窗体法,在FORM1中增加命令按钮(command),CAPTION属性设为直接打印,再写入下列编码: Sub command_click Form1.printform End sub ---- 这样即可通过打印窗体FORM1的方法把GRID1的数据打印出来,遗憾的是只能打印GRID1中显示的数据部分,显示不出来的 则无法打印, 而且这种打印方法很象屏幕硬拷贝把其他控件也打印出来。也不能灵活的控制字体等。 ---- 方法二:通过PRINTER实现打印。这种方法 ---- 1、加入打印命令按钮(command1)、函数(print1)即可实现打印功能,写入下面代码,读者稍加改动可写成标准的函数 或过程。 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 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方向起始位置 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 - 1‘gridrow为所要打印的行数 grid1.row = j strx = strx1 printer.Line (strx - 50, stry - 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 Then‘next 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 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.NewPage‘next 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) -(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) 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 的表格通过VB发送到MICROSOFT WORD 及 MICRO EXCEL。生成MICROSOFT WORD 和MICRO EXCEL 表格。这样就可以充分利用MICROSOFT WORD 和MICRO EXCEL的 打印、编辑功能打印出更理想的效果。下面逐一介绍。 ---- 方法三:通过生成MICROSOFT WORD表格打印 ---- 1、在declaration 中写入: Dim msword As Object ---- 2、 加入打印命令按钮(command2),CAPTION 设为"生成WORD 表格",写入下面代码, Private Sub command2_Click() screen.MousePointer = 11 Set msword = CreateObject("word.basic") Dim AppID, ReturnValue appID = Shell("d:\office97\office\WINWORD.EXE", 1) ‘ Run Microsoft Word. msword.AppActivate "Microsoft Word" ‘msword.AppActivate "Microsoft Word", 1 full 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.screenupdating 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.tabledeleterow 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 设为"生成EXCEL 表格",写入下面代码 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
|