专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »VB教程 » vb程序设计:VB程序设计1000问( 3) »正文

vb程序设计:VB程序设计1000问( 3)

来源: 发布时间:星期四, 2009年1月15日 浏览:150次 评论:0
  11、如何让用户自行输入方程式并计算其结果?

  假设我们要让使用者在“方程式”栏位中自由输入方程式然后利用方程式进行计算则引用ScriptControlControl控件可以很方便地做到

  ( ScriptControl Control控件附属于VB 6.0如果安装后没有看到此Control控件可在光盘 \Common\Tools\VB\Script 目录底下找此Control控件 其.文件名为Msscript.ocx) 假设放在窗体上ScriptControlControl控件名称为ScriptControl1则在“计算”按钮Click事件中编写如下代码:

  Dim Statement As String Statement = "X=" + Text1.Text + vbCrLf + _ "Y=" + Text2.Text + vbCrLf + _ "MsgBox ""计算结果="" & Y " ScriptControl1.ExecuteStatement( Statement )

  12、如何解决VB中GridControl控件打印问题

  ---- Grid Control控件是Visual Basic最常见Control控件的 从VB3.0 到VB5.0 都有该Control控件 也是VB爱好者最喜爱工具的用它可以以表格形式 显示、浏览数据特别是数据库应用直接绑定即可显示浏览数据库信息然而美中不足是Grid 没有编辑和打印功能列和列位置不能相互交换笔者曾尝试着给Grid 增添了这些功能使的锦上添花功能更强大下面给出改进思路方法及源读者只需按步骤写下源即可使你Grid 具有打印功能笔者在HP5/100Window95环境下用VB5.0 调试通过

  ---- 给Grid Control控件增加打印思路方法有 3种:1 是直接打印Control控件思路方法2 是通过 prer 来实现打印功能3 是通过MS-WORD 及MS-EXCEl 来 实 现 打 印

  ---- 首先打开个应用在FORM1中增加DATA Control控件DATA1,把DATA1CONNECT 属性设为dBASE III再把DATABASENAME属性设为D:\PJXM.DBF然后再在FORM1中增加MSFLEXGRID空间GRID1并把GRID1DATASOURCE 属性设为DATA1这样数据库PJXM.DBF 信息就会在GRID1中显示出来

  ---- 思路方法:直接打印窗体法在FORM1中增加命令按钮(command)CAPTION属性设为直接打印再写入下列编码:

  Sub command_click
Form1.prform
End sub


  ---- 这样即可通过打印窗体FORM1思路方法把GRID1数据打印出来遗憾是只能打印GRID1中显示数据部分显示不出来则无法打印 而且这种打印思路方法很象屏幕硬拷贝把其他Control控件也打印出来也不能灵活控制字体等

  ---- 思路方法 2:通过PRINTER实现打印这种思路方法

  ---- 1、加入打印命令按钮(command1)、(pr1)即可实现打印功能写入下面代码读者稍加改动可写成标准或过程

  Function prnt1 (x As Integer, y As Integer,
font As Single, txt As String)
prer.CurrentX = x
prer.CurrentY = y
prer.FontBold = False
prer.FontSize = font
prer.Pr txt
End Function
Sub command1_click
Dim fnt As Single
Dim pp as eger
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'定义字体大小
prer.fontname = "宋体"'定义字体
dd = prnt1(4000, 700, 18, ss$)'打印标题
prer.Line (strx - 50, stry - 30)
-(strx + kan - 10, stry - 30)
For j = 0 To gridrow - 1'gridrow为所要打印行数
grid1.row = j
strx = strx1
prer.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
prer.Line (strx - 50, stry + linw)
-(strx + kan - 10, stry + linw)
stry = stry1
'line col
For n = 0 To 8
prer.Line (strx - 30, stry - 30)
-(strx - 30, stry + (page1 + 2) * linw)
strx = strx + a(n)
Next
prer.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$)'打印页角码
prer.NewPage'next page
dd = prnt1(4000, 700, 18, ss$) '打印标题
strx = strx1
stry = stry1
prer.Line (strx - 50, stry - 30)-
(strx + kan - 10, stry - 30)' pr first row
Else
stry = stry + linw
End If
Next
st = stry
If p < page1 Then '在最后页剩余划空行
For o = p To page1 + 1
strx = strx1
prer.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
prer.Line (strx - 30, stry - 30)-
(strx - 30, stry + (page1 + 2) * linw)
strx = strx + a(n)
Next
prer.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$)'打印页角码
prer.EndDoc'打印结束
Endsub


  ---- 这种思路方法通过灵活编程可以方便地调整字体、字型、线形、页面、纸张大小等可打印出比较满意效果如果你计算机上装有MICROSOFT WORD 和MICRO EXCEL最精彩使用方法还是把GRID 表格通过VB发送到MICROSOFT WORD 及MICRO EXCEL生成MICROSOFT WORD 和MICRO EXCEL 表格这样就可以充分利用MICROSOFT WORD 和MICRO EXCEL打印、编辑功能打印出更理想效果下面逐介绍

  ---- 思路方法 3:通过生成MICROSOFT WORD表格打印

  ---- 1、在declaration 中写入: Dim msword As Object

  ---- 2、 加入打印命令按钮(command2)CAPTION 设为"生成WORD 表格"写入下面代码

  Private Sub command2_Click
screen.MousePoer = 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.MousePoer = 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.filedefault
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


  ---- 思路方法 4:通过发送到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


  13、如何在VB中实现绘图区大十字光标

  有时我们需要用VB快速开发个试验数据绘图处理将绘图Control控件内鼠标光标改变成和AutoCAD软件Software中使用大十字光标形式将可以比普通箭头光标达到更好效果那么我们如何实现这样大十字光标呢?

  ---- 首先我们明确下要达到效果假若我们在个PictureControl控件中绘图那么鼠标移动到这个Control控件上时鼠标光标立即改变为大十字形状光标中横线从Control控件左边界到右边界竖线从Control控件上边界到下边界即大十字光标将绘图Control控件分割为 4个象限当鼠标移动到Control控件外时光标则又恢复成原来形式

  ---- 要实现这样光标得我们自己通过画线方式实现如鼠标在绘图Control控件内先在鼠标当前位置画上光标横线和竖线;当鼠标位置移动先擦除原先光标横线和竖线然后再在新位置画光标横线和竖线那么我们就要响应绘图Control控件MouseMove事件当然绘图Control控件内无论有什么内容我们擦除光标线和重画光标线时都不能破坏原先内容因此我们要将绘图Control控件DrawMode设置为vbXorPen(异或方式)绘制光标横线和竖线时用异或方式将横线和竖线象素点颜色设为光标颜色和原先象素点色彩异或值再用异或方式在同样位置绘制遍竖线和横线横线和竖线上象素点再次和光标颜色进行异或操作就擦除了光标横线和竖线且又恢复了绘图Control控件内原先内容

  ---- 我们还得保证鼠标移动到绘图Control控件内时普通鼠标光标消失只有绘制大十字光标出现因此还应该设置绘图Control控件MousePoer属性为vbCuntom即用户自定义绘图Control控件MousePoer属性设置为vbCustom后其MouseIcon属性中应装入相应用户自定义图形我们希望绘图Control控件内只有我们绘制光标而没有其它光标故应该装入个空(透明)光标图形可以任找个光标文件通过任意个资源编辑器对其进行编辑用透明方式填充整个光标图形保存成我们所需NoIcon.cur即可

  ---- 通过以上关键设置和操作我们就可以实现大十字光标了利用异或方式进行绘图我们还可以实现般绘图软件Software中常有“橡皮筋”效果即用鼠标定义个点后动态拖动鼠标来定义另外个点动态拖动鼠标过程中所要绘图形也动态相应变化

  ---- 以下我们通过个举例来完整实现绘图Control控件中大十字光标还演示如何实现用“橡皮筋”效果来画矩形:

  ---- 在VB中新建个标准EXE工程在Form1中加入个PictureControl控件其Name设为PicDraw可以装入个图象文件PicDraw大小和其中图象大小基本上覆盖大部分Form1即可实现代码如下所示在VB5.0中运行通过

  Option Explicit
Private Old_X As Single
Private Old_Y As Single
Private isMouseDown As Boolean
Private Box_X0 As Single
Private Box_Y0 As Single
Private Box_X1 As Single
Private Box_Y1 As Single
Private PenColor As Long
Private CrossColor As Long
Private Sub Form_Load
CrossColor = QBColor(8)
PenColor = QBColor(15)
picDraw.DrawMode = vbXorPen
picDraw.MouseIcon = LoadPicture
(App.Path & "\no.cur")
picDraw.MousePoer = vbCustom
isMouseDown = False
Box_X0 = Box_X1 = Box_Y0 = Box_Y1 = 0
End Sub
Private Sub picDraw_MouseDown
(Button As Integer,
Sht As Integer, X As Single, Y As Single)
If isMouseDown = True Then
'先前已经用鼠标定义了个点
Box_X1 = X
Box_Y1 = Y
isMouseDown = False
picDraw.DrawMode = vbCopyPen
picDraw.Line (Box_X0, Box_Y0)-
(Box_X1, Box_Y1),
PenColor, B
picDraw.DrawMode = vbXorPen
'画个光标
picDraw.Line (0, Y)-(picDraw.ScaleWidth, Y),
CrossColor
picDraw.Line (X, 0)-(X, picDraw.ScaleHeight),
CrossColor
Old_X = X
Old_Y = Y
Else
'定义了个矩形个顶点则擦除光标
picDraw.Line (0, Y)-(picDraw.ScaleWidth, Y),
CrossColor
picDraw.Line (X, 0)-(X, picDraw.ScaleHeight),
CrossColor
Box_X0 = X
Box_Y0 = Y
isMouseDown = True
End If
End Sub
Private Sub picDraw_MouseMove(Button As Integer,
Sht As Integer, X As Single, Y As Single)
If isMouseDown = True Then
'拖动鼠标来定义矩形另外个顶点
此时擦除前个矩形绘制新矩形
picDraw.Line (Box_X0, Box_Y0)-(Old_X, Old_Y),
PenColor, B
picDraw.Line (Box_X0, Box_Y0)-(X, Y), PenColor, B
Else
'消除旧光标线
picDraw.Line (0, Old_Y)-(picDraw.ScaleWidth, Old_Y),
CrossColor
picDraw.Line (Old_X, 0)-(Old_X, picDraw.ScaleHeight),
CrossColor
'画新光标线
picDraw.Line (0, Y)-(picDraw.ScaleWidth, Y),
CrossColor
picDraw.Line (X, 0)-(X, picDraw.ScaleHeight),
CrossColor
End If
Old_X = X
Old_Y = Y
End Sub


  14、如何充分扩充VB功能

  Visual Basic是目前开发WINDOWS应用软件Software最有效工具的它综合运用了BAIC语言和新可视化设计工具不仅功能强大而且简单易学其次VB具有事件驱动编程机制它充分利用WINDOWS图形环境特点能让开发人员快速地构造强大应用

  那么在开发VB应用软件Software时如何充分地扩充VB功能呢?这就要求在区别层次上要很好地利用VB最具威力和特色部分:

  ●在动态链接库

  ●在Control控件层使用VBX●在应用层执行其他应用

  、在功能态链接库(DLL)

  WINDOWS操作系统实际上是由许多功能强大动态链接库(DLL)组合而成VB考虑到有些工作超过自身语言所及能力范围所以提供了直接操作系统中这些DLL子能力例如:在正常情况下窗口控制菜单提供了 7种功能:还原、移动、大小、最小化、最大化、关闭和切换而在实际应用中我们希望窗口按设计时大小显示不允许用户随意改变窗口大小也不允许切换到其他窗口这就要求在设计时必须删除控制菜单中除“移动”和“关闭”选项以外所有控制菜单项要完成这任务我们首先可把窗体MaxButton属性和MinButton属性设置为False不允许窗体最小化和最大化窗体也就不能还原然后再把窗体BorderSstyle属性设置为1-Fixed Single或3-Fixed Double不允许窗体改变大小但VB本身却无法删除“切换”选项和两条分隔线幸运通过WINDOWS DLL就很容易做到

  通常要使用WINDOWS DLL首先必须介绍说明要使用DLL子我们可在两个地方介绍说明所使用DLL子即在全局模块中介绍说明或者在窗体层介绍说明部分中介绍说明其格式是:

  Declare Sub子名Lib“库名”[Alias“别名”][([参数])]

  Declare Function子名Lib“库名”[Aliass“别名”][([参数])][AS数据类型]

  第种格式表示过程没有返回值第 2种格式表示过程返回个值该值可用于表达式中库名如果用是WINDOWS操作环境(在目录下)中如“USER.EXE”“KERNEL.EXE”或者“GDI.EXE”等就用此名作为库名如果用是其他来源DLL则用包括路径文件名称(如:“C:\WINDOWS\BRUSH.DLL”)别名(Alias)是允许另外使用别名称来称呼子尤其是当外来子名和VB保留字相同时它就显得特别有用参数指要被传递到子参数值数据类型指返回值数据类型它可能是IntegerLongSingleDoubleCurrency或String下面就是所要使用DLL子介绍说明:

  Declare Function GetMenu% Lib"User"(ByValhWnd%ByValbRevert%)

  Declare \function \RemoveMenu% Lib"User"(ByValhMenu%ByValnPosition%ByValwFlags%)

  当介绍说明完DLL子执行DLL子思路方法就象在VB中执行通用过程()下面我们编写个名为Remove-Items-From-过程来完成上面例子中提到功能过程中了上述介绍说明过两个DLL子:

  Sub remove-Items-From-Sysmenu(A-Form As Form)
'获取窗体系统菜单句炳
HSysMenu=GetMenu(A-Form.hWnd0)
'删除除“移动”和“关闭”外所有菜单项 删除时必须从最后个菜单项开始
R=RemoveMenu(HSysMenu8MF-BYPOSITION) '删除切换
R=RemoveMenu(HSysMenu7MF-BYPOSITION) '删除第条分隔线
R=RemoveMenu(HSysMenu5MF-BYPOSITION) '删除第 2条分隔线
End Sub


  有了这个过程在任窗体Form-Load事件中加入下面行代码就可以删除该窗体除“移动”和“关闭”选项以外所有控制菜单项:

  Remove-Items-From-Sysmenu Me

   2、在Control控件层使用VBX

  VB功能强大第 2个部分是VBX使用即其开放及无限扩增特性虽然VB工具箱(ToolBox)已经尽量将设计应用软件Software所需工具包括在内但是为了不断扩充VB功能VB提供了套开发工具(Custom Control Development Kit)供第 3方开发者来设计所需要Control控件当设计完Control控件文件后(其文件扩展名为“.VBX”)可以从菜单“file”项下选“Add File...”命令结果画面上出现个"Add File"对话框双击所需VBX文件名即可将该VBX加入到VB中这些Control控件装入VB后VB会将这些外来Control控件加到原有工具箱中和其他Control控件起合并使用正是有了这技术VB才能够不断发展使用VB编程也更为方便、迅速和有效这是VB区别于其他开发环境主要特色的自从VB推出以来第 3方软件Software公司设计了大量新Control控件下面是开发WINDOWS应用时几个非常有用VBX:

  ● 3维Control控件Threed.vbx

  它提供了包括命令按钮、复选框、单选钮 、框架、下推按钮和面板在内 6种 3维Control控件使用这些Control控件可使窗体更具有立体感

  ●图形Control控件Graph.vbx

  向图形Control控件发送数据后图形Control控件可绘制 2维或 3维饼图、直方图、趋势图并且可以打印或拷贝到剪贴板上

  ●通讯Control控件Mscomm.vbx

  它提供了串行通讯能力可用于串行端口的间传送和接收数据

  ●数据网格Control控件Truegrid.vbx

  它既可以作为数据显示表格也可把个数据库和个网格联系起来它是制作数据库浏览器或数据显示理想工具

   2、在应用层执行其他应用

  在编制复杂大型软件Software时我们经常会需要有些功能相对独立和完善专用如编辑而这些通常是通用和流行并经实战检验如果由开发者重新编制这些不仅大大增加了工作量以及调试过程而且功能上很难比得上这些通用显然如果我们能直接这些是最为理想令人欣喜VB提供了个可用来其他应用Shell使VB某些功能可直接由其他应用来完成从而大大地减少了编程任务

  格式是Shell(命令串[窗口类型])

  其中命令串是欲执行应用可执行文件扩展名只限于“.COM”“.EXE”“.BAT”“.PIF”缺省扩展名为.EXE文件窗口类型是整数值它对应于执行时显示窗口风格是可选 共有下列5种选择:

窗口类型 值
正常窗口 具有指针 2
最小窗口 具有指针(缺省) 3
最大窗口 具有指针 48
正常窗口 不具指针 67
最小窗口 不具指针

  当Shell成功地个应用返回个任务标识(Task ID)该ID表示正在执行标识

  [例]

  X=Shell("C:\WINDOWS\NOTEPAD.EXE",1)

  该语句WINDOWS附件中记事本NOTEPAD.EXE作为编辑来使用并返回1个ID值到X

  15、成组更新Control控件属性

  Sub EnableAll(Enabled As Boolean, ParamArray objs As Variant)
Dim obj As Variant
For Each obj In objs
obj.Enabled = Enabled
Next obj
End Sub
应用:
EnableAll True, Text1, Text2, Command1, Command2


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: