您的位置:寻梦网首页编程乐园VB 编程乐园VB 技巧库
Visual Basic 技巧库
第 1 部分 (1-10)
(1-10) (11-20) (21-30) (31-40) (41-50) (51-60) (61-70) (71-80) (81-90) (91-100) (101-110) (111-120) (121-131)
(1) Access97的报表解决方案
(2) Combo的自动查询技术
(3) Combo的自动查询技术
(4) Office或IE4风格的ToolBar
(5) VB 中调用 Word 拼写检查
(6) VB5 未公开的函数
(7) Visual Basic 5.0的RDO
(8) 安装向导生成程序组
(9) 把文件置入到Text 或RichText 中
(10) 报表中的滚动问题

Access97的报表解决方案

利用OLE自动化解决ACESS97中文版
报表生成器直线不能往下顺延的缺陷
总参通信工程设计研究院外五室王涛

ACCESS97 是一个非常优秀的数据库软件, 它不仅能充当办公自动化的桌面数据管理工具, 也是一个开发Client/Server 产品的优秀前端开发工具. 它的特点是易学易用、工具丰富、不需写大量代码就可以在很短的时间内开发出界面优美且功能强大的系统,长期以来受到广大开发者的青睐。但笔者在使用时发现其报表生成器中有一个明显不适合我国国情的缺陷,就是当设置报表DETAIL 节上的字段长度因为横向空间不够而设为自动向下顺延(Can Grow 属性为True)时,如果字段旁有竖线(国内大部分公文报表都有竖线,而国外则很少有),则竖线不能和字段一起向下顺延。使整个报表看起来不美观。这个缺陷在ACCESS2.0 和ACCESS97 中文版上都有, 而在FoxPro2.5B/3.0/5.0 下却没有。据微软技术服务部的工作人员说是由于本地化时测试不够原因所致。为此,笔者在ACCESS 内采用了OLE 自动化!
方法,将ACCESS97 查询生成的表送交EXCEL97 进行处理(分类汇总、打印、预演),较好地解决了这个问题。由于ACCESS97 和EXCEL97 的VBA 在97 版本上几乎完全兼容,在EXCEL97 下录制的宏代码只需在ACCESS 下稍加修改就行了,所以采用此方法和用内部报表生成器设计所用的时间差不多。整个工作需要下面几步:

在EXCEL97 下设计好报表的样式,包括表头、页眉、页码等,对需要自动翻转的列,在" 单元格格式设置" 下设为" 自动换行"。

在EXCEL97 下录制好当数据送入后进行的操作宏(如分类汇总、加边框线,加空行、打印输出、预演等动作)。

在ACCESS 下用VBA 语句和DAO 对象的方法将数据送入EXCEL 表内,并将EXCEL 下宏操作变成ACCESS 下的语句。
        以下是ACCESS97 下的程序代码,实际应用程序界面是一个对话框屏幕(FORM), 上面有五个下拉框(Comb_) 和一个文字框(Text), 由用户选择相应的信息,然后用户按" 确定" 命令按钮执行程序。其中有些属性和方法在ACCESS2.0 下不能使用, 可采用相应的语句.
 Private Sub 确认_Click()
 On Error GoTo ErrorHandler
 Dim stDocName As String
 Dim k As Integer
 stDocName = "Pqry_YEAR"
        DoCmd.OpenQuery stDocName ' 从原始表内根据用户输入的信息条件运行" 生成表查询", 生成一个供打印用的表.
        ' 增加空记录处理-- 为了保证记录数少时也打印整张表.

        If Val(Me![Comb 空行]) > 0 Then ' 如果用户输入了大于0 的数值, 表示加空行

    For k = 1 To Val(Me![Comb 空行])
      CurrentDb.Execute "INSERT INTO Pqry_YEAR
     ( 项目类) VALUES (' 空行空行空行');"
    Next k
 End If
 Dim msgVar As Integer  
 ' 定义EXCEL 对象变量
 '------------------------------
 Dim xlobj As Object
 Dim xlsheetobj As Object
 Dim xlrange As Object
 '------------------------------
 ' 定义ACESS 记录集对象变量
 Dim dbs As Database, rst As Recordset
 Dim strSQL As String
 Dim recTotal, fieldTotal As Integer ' recTotal:
         表示该表内记录总数;
         fieldTotal 表示字段总数
 Dim i, j As Integer
 i = 0
 j = 0
 ' Return reference to current database.
 Set dbs = CurrentDb ' 当前数据库
 Set rst = dbs.OpenRecordset("Pqry_YEAR ") ' 选择记录集
 recTotal = rst.RecordCount ' 得出记录数
 fieldTotal = rst.Fields.Count  ' 得出字段数
 '----------------------------------
 ' 建立EXCEL 对象
 Set xlobj = CreateObject("Excel.Application.8")
 ' 打开设计好的EXCEL 表--REPORT.XLS
 xlobj.Workbooks.Open FileName:=pPathname & " REPORT.xls"
 Set xlsheetobj = xlobj.ActiveWorkbook.Worksheets("REPORT ")
  ' 指向工作表
 ' 如果是改动过的表, 不再打开
 If MsgBox(" 当前打印表格文件中已有数据,
  是否需要更新?"
  & Chr(13) & _
  " 提示: 只有对数据进行改动后, 才需要更新.", 68)
   = vbYes Then
DoCmd.Hourglass True  ' 由于时间较长,
将鼠标设为沙漏形状
   xlsheetobj.Rows("5:200").Select  ' 选定区域
xlobj.Selection.Delete Shift:=-4162  '
        注意! 原录制宏中-4162 为xlnone, 是EXCEL97 的常量, 但在ACCESS 下却不认, 只能到EXCEL 下的对象浏览器去查询对应的常数.
   ' 开始向EXCEL 传送数据
   Do Until rst.EOF
     For j = 1 To fieldTotal
         xlsheetobj.cells(5 + i, j).Value = rst.Fields(j - 1)
     Next j
     rst.MoveNext
     i = i + 1
   Loop
   rst.Close
 
  '在EXCEL中调整,具体常数参见EXCEL下的对象浏览器
xlsheetobj.Range("A4:Q" & Trim(Str(recTotal + 4))).
   Select ' 选定范围
  '以下为设置边框线录制的宏代码,已删除了相似的语句.
   xlobj.Selection.Borders(5).LineStyle = -4142
   xlobj.Selection.Borders(6).LineStyle = -4142
   With xlobj.Selection.Borders(7)
       .LineStyle = 1
       .Weight = -4138
       .ColorIndex = -4105
   End With
   
   With xlobj.Selection
   ' 确定是合计在表上还是在表尾
     If Me![Fram 位置] = 1 Then
        .Subtotal GroupBy:=2, Function:=-4157,
          TotalList:=Array(6, 9, 10, _
          11, 12, 13, 14, 15, 16), Replace:=True,
          PageBreaks:=False, _
          SummaryBelowData:=False
     Else
        .Subtotal GroupBy:=2, Function:=-4157,
         TotalList:=Array
         (6, 9, 10, _
          11, 12, 13, 14, 15, 16), Replace:=True,
          PageBreaks:=False, _
          SummaryBelowData:=True
     End If
   End With
   ' 根据用户的选择设置页眉和页尾。
   With xlsheetobj.PageSetup
       .LeftHeader = "" & Chr(10) & "" & Chr(10) & "
       " & Mid(Me![Cmbo 单位], 4)
       .CenterHeader = "&"" 宋体, 加粗""&18 " & Me!
       [Cmbo 年度] & " 年" & Mid(Me![Cmbo 类别], 4) & "XXX 表"
   End With
   xlsheetobj.Range("A1").Select
   ' 将空行内容清掉
   k = Val(Me![Comb 空行])
   If Val(Me![Comb 空行]) > 0 Then
      Dim content As String
      i = 5
      content = xlsheetobj.cells(i, 2).formulaR1C1
      Do While InStr(1, content, " 空行空行空行") = 0
          i = i + 1
          content = xlsheetobj.cells(i, 2).formulaR1C1
      Loop
      xlsheetobj.Range("B" & Trim(Str(i - k + 5)) & ":" & "Q"
      & Trim(Str(i + 5))).Select
      xlobj.Selection.ClearContents
      xlsheetobj.Range("A1").Select
   End If
   
Else  ' 不更新
   xlsheetobj.Activate
End If
xlobj.ActiveWindow.SelectedSheets.PrintPreview  ' 预演报表
' 如为打印:xlobj.ActiveWindow.SelectedSheets.PrintOut
DoCmd.Hourglass False ' 恢复鼠标形状
xlobj.Visible = True  ' 让EXCEL 可见
清除对象变量空间,节省内存
Set dbs = Nothing
Set xlobj = Nothing
xlobj.quit  ' 关闭EXCEL
Exit Sub
ErrorHandler:  ' 出错处理
 DoCmd.Hourglass False
 MsgBox "Error number " & Err.Number & ": " & Err.Description
   ' Resume with statement following occurrence of error.
   Resume Next
End Sub
        通过这个例子我们看到在OFFICE97 下利用OLE 自动化扩展应用程序的功能是多么方便和强大。用EXCEL 完成的报表的优点是格式美观, 修改方便. 缺点是第一次生成EXCEL 表格时速度较慢.
        本例是用EXCEL 对数据进行报表操作, 其实也可参照此例的方法在EXCEL 上建立图形统计、财务分析、数据透视表分析等应用程序,只要在EXCEL 下录制相应的宏,再加到ACCESS 下就行了。

  

中国计算机世界出版服务公司版权所有


Combo的自动查询技术
 

Combo的自动查询技术


--------------------------------------------------------------------------------

Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long


Public Const CB_FINDSTRING = &H14C


Private Sub Combo1_Change()

Dim iStart As Integer

Dim sString As String

Static iLeftOff As Integer


iStart = 1

iStart = Combo1.SelStart


If iLeftOff <> 0 Then

Combo1.SelStart = iLeftOff

iStart = iLeftOff

End If


sString = CStr(Left(Combo1.Text, iStart))

Combo1.ListIndex = SendMessage(Combo1.hwnd, _

B_FINDSTRING, -1, ByVal CStr(Left( _

ombo1.Text, iStart)))


If Combo1.ListIndex = -1 Then

iLeftOff = Len(sString)

combo1.Text = sString

End If


Combo1.SelStart = iStart

iLeftOff = 0

End Sub

   静态变量 iLeftOff 指定了字符长度。


--------------------------------------------------------------------------------




Combo的自动查询技术
Combo的自动查询技术
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Public Const CB_FINDSTRING = &H14C

Private Sub Combo1_Change()
Dim iStart As Integer
Dim sString As String
Static iLeftOff As Integer

iStart = 1
iStart = Combo1.SelStart

If iLeftOff <> 0 Then
Combo1.SelStart = iLeftOff
iStart = iLeftOff
End If

sString = CStr(Left(Combo1.Text, iStart))
Combo1.ListIndex = SendMessage(Combo1.hwnd, _
B_FINDSTRING, -1, ByVal CStr(Left( _
ombo1.Text, iStart)))

If Combo1.ListIndex = -1 Then
iLeftOff = Len(sString)
combo1.Text = sString
End If

Combo1.SelStart = iStart
iLeftOff = 0
End Sub

静态变量 iLeftOff 指定了字符长度。



Office或IE4风格的ToolBar
 
Office或IE4风格的ToolBar


--------------------------------------------------------------------------------

   用API 可以轻松改变 ToolBar 的风格。需要 4.70 或其以上版本的 comctl32.dll 支持。

   声明:

Private Declare Function SendMessage Lib "user32" Alias _

"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _

ByVal wParam As Integer, ByVal lParam As Any) As Long

Private Declare Function FindWindowEx Lib "user32" Alias _

"FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 _

As Long, ByVal lpsz1 As String, ByVal lpsz2 As _

String) As Long

Private Const WM_USER = &H400

Private Const TB_SETSTYLE = WM_USER + 56

Private Const TB_GETSTYLE = WM_USER + 57

Private Const TBSTYLE_FLAT = &H800

Private Const TBSTYLE_LIST = &H1000

   函数:

' tlbToolbarStyle :

'1 为 Office97 风格

'2 为 IE4 风格

Public Sub ToolbarStyle(tlb As Toolbar, _

tlbToolbarStyle As Long)

Dim lngStyle As Long

Dim lngResult As Long

Dim lngHWND As Long


' Find child window and get style bits

lngHWND = FindWindowEx(tlb.hwnd, 0&, _

"ToolbarWindow32", vbNullString)

lngStyle = SendMessage(lngHWND, _

TB_GETSTYLE, 0&, 0&)


' Use a case statement to get the effect

Select Case tlbToolbarStyle

Case 1:

' Creates an Office 97 like toolbar

lngStyle = lngStyle Or TBSTYLE_FLAT

Case 2:

' Creates an Explorer 4.0 like toolbar,

' with text to the right

' of the picture. You must provide text

' in order to get the effect.

lngStyle = lngStyle Or TBSTYLE_FLAT _

Or TBSTYLE_LIST

Case Else

lngStyle = lngStyle Or TBSTYLE_FLAT

End Select


' Use the API call to change the toolbar

lngResult = SendMessage(lngHWND, _

TB_SETSTYLE, 0, lngStyle)


' Show the effects

tlb.Refresh

End Sub


   在 Form 装入时调用:

Private Sub Form_Load()

Call ToolbarStyle(Me.Toolbar1, 2)

' …

End Sub

   关于ToolBar 风格的说明:

   Office 风格的 Toolbar 是指在鼠标移动到 ICON 后,会出现边框。如我们在 VB5 中用的一样。而comctl的ToolBar是没有该效果的。

   IE4 风格的 Toolbar 可以在ICON 下面出现文字,如同 IE4 中的Toolbar 一样。(可能是反一下……  )


--------------------------------------------------------------------------------




VB 中调用 Word 拼写检查
VB 中调用 Word 拼写检查 98-8-14
Function CheckSpell(IncorrectText as string) as string
Dim Word As Object, retText$
On Error Resume Next
' 建立对象并打开 WORD
Set Word = CreateObject("Word.Basic")

' 把需要检查的 STRING 放到 WORD
Word.AppShow
Word.FileNew
Word.Insert IncorrectText

' 运行 WORD 拼写检查
Word.ToolsSpelling
Word.EditSelectAll

' 取返回值
retText = Word.Selection$()
CheckSpell = Left$(retText, Len(retText) - 1)

'关闭文件并回到 VB 应用
Word.FileClose 2
Show

Set Word = Nothing
End Function



VB5 未公开的函数
VB5 未公开的函数
ObjPtr:返回对象实例私有域的地址。
StrPtr:返回字符串第一个字的地址。
VarPtr:返回变量的地址。

使用对象浏览器(Object Browser),你可以发现更多其他对象未公开的细节。



Visual Basic 5.0的RDO
                   浅谈Visual Basic 5.0的RDO 2.0

---- 在客户/ 服务器应用程序的前端开发工具中,Visual
Basic 以其结构简单灵活、开发周期短而被程序员广泛使
用。但是面对客户/ 服务器程序高性能数据访问和管理的
要求,VB 4.0( 或低版本) 的数据访问对象(DAO) 就显得力不从
心了。而且与VC 相比,VB 编译后生成的是伪代码(p-code),
运行时VB 须先将每一句伪代码转换成本地代码(n-code)后
才能执行,因此在代码运行速度和远程数据管理方面VB
4.0( 或低版本) 难以满足开发大型Client/Server 程序的要求。
然而这些问题都随着微软公司推出的VB 5.0 得以圆满解
决。VB 5.0 不仅增加了ActiveX 技术和Internet 等新特性,还增强
了原有专为远程关系数据库而设计的远程数据对象(RDO
1.0)的功能。笔者在工作中实践中得到以下一些体会,仅
供大家参考。

    RDO 2.0 的特性

---- VB 5.0 企业版中的RDO 2.0 是微软为ODBC API 开发的32-bit
ActiveX,可以访问任何32 位Level II ODBC 数据源。它不仅补
充完善了VB 4.0 中的RDO 1.0,并在真正意义上提供了使用对
象创建并控制远程ODBC 数据库系统部件的框架。虽然与DAO
编程模式在许多方面很类似,RDO 更着重于处理远程存储
过程及其结果集。相对于DAO 使用的Jet 引擎而言,RDO 是一个
很薄的代码层,直接建立在ODBC API 上并依赖ODBC driver 和后
台数据库引擎。在访问远程数据库引擎时,RDO 不需使用本
地的查询处理而直接访问ODBC 数据源,并提供了一系列的
对象用来满足远程数据访问的特殊要求。RDO 开销小(仅
250K),运行稳定速度快,并且利用远程数据引擎显著提
高了数据处理的能力。因此RDO 即具有ActiveX 的简单、高效、
灵活,同时也达到了ODBC 和VBSQL API 编程模式的性能等级。

    RDO 2.0 的逻辑结构

---- 微软定义了RDO 对象和集合的总体框架。在RDO 的总体框
架下,通过建立对象和集合,使用RDO 对象和集合的属性方
法来控制远程数据库的操作。

---- 在RDO 逻辑结构中rdoEngine 对象表示远程数据源,是最高
级别的对象,它包括远程数据对象层次中的所有其它对
象和集合。当程序首次引用RDO 对象时rdoEngine 对象自动被
创建。

---- rdoErrors 集合用于放置ODBC API 返回的错误代码信息。可
通过

---- rdoErrors 集合进行ODBC 的错误处理。

---- rdoEnvironment 对象是RDO 的事务作用域,它支持BeginTrans、
CommitTrans 和RollbackTrans 方法,用于开始、提交或回滚ODBC
分布式事务,同时也通过作用域的用户名及密码缓冲
rdoConnection 子对象的登陆信息。

---- rdoConnection 对象用于建立到远程数据源的连接,它仅
将参数传递给SQLDriverConnect 函数,或调用SQLDisconnect 函数关
闭连接。RDO 不能管理缓存连接。rdoConnection 对象下属
有rdoTable、rdoQuery 和rdoResultset 三个子对象。其中rdoQuery 对
象取代了1.0 版本中的rdoPreparedStatement 对象,它通过对输入
输出参数的控制和存储过程增强了管理远程数据库的能
力,灵活地处理返回的数据集。

---- 若RDO 对象模型还不能提供所需的灵活性或控制能力,
可使用底层的ODBC 句柄,直接访问数据源。RDO 提供了访
问ODBC 环境、连接及语句的句柄,rdoEnvironment, rdoConnection,
rdoQuery 和rdoResultset 对象都支持ODBC 句柄,可以使用ODBC 句柄
和ODBC API 来控制这些对象。

---- RDO 2.0 保持与1.0 版本的向下兼容,并增加了许多新特
性,如开放式批量更新、增强的本地游标支持、独立连接
和(rdoQuery)查询对象,并支持异步处理的事件驱动。

    管理游标和并发

---- 在开发ODBC 接口的客户/ 服务器程序程序时,游标库的
选用和编程中游标的编程处理直接影响到代码的性能。
RDO 2.0 支持四种游标库:ODBC 游标库、服务器端游标库、客
户端批游标库和rdUseNone 游标库。在新的客户端批游标库
中微软采用了VFP 中Rushmore 技术,不但可在客户端运行高性
能的游标操作,而且可在单次调用中提交多个查询。在使
用BatchUpdate 方法向远程数据库提交更新操作之前数据改
变仅影响客户端的本地副本。相比ODBC 游标库,选用客户
端批游标库显著增强了系统的性能,大大减小了网络通
讯量。

---- RDO 提供rdOpenForwardOnly(只能向前结果集)、rdOpenStatic
?静态可滚动的游标)、rdOpenKeyset(键集游标)和
rdOpenDynamic(动态可滚动游标)等四种游标类型。每种游
标库可选用相适应的游标类型。RDO 2.0 在管理并发时可采
用下面几种类型的锁定:rdConcurRead(只读式并发)、
OnlyrdConcurLock(保守式并发)、rdConcurRowVer(行版本并发)、
rdConcurValues(数据行值并发)和rdConcurBatch(批处理并发
),其中后三种为开放式并发类型。可编程灵活使用这些
并发类型。

    查询对象(rdoQuery)

---- rdoQuery 对象是RDO 2.0 中一个能定义多个输入输出参数
的SQL 查询,它取代了1.0 版本中rdoPreparedStatement 对象,不仅
在接口上与其保持一致,而且显著增强了远程数据库的
管理和控制功能。

---- rdoQuery 对象通过存储过程和对输入输出参数管理远
程数据库,它相当于一个已编译的SQL 语句。当调用需要提
供参数的远程存储过程时可以创建rdoQuery 对象来管理查
询参数,也可使用其rdoParameter 子对象处理过程返回的输
出参数或返回值。另外,可通过设置rdoQuery 的MaxRows 属性来
限制查询返回的数据行数,这是控制从查询返回的行数
的最简便的方法。

    RDO 2.0 的事件驱动

---- RDO 2.0 提供了事件驱动,这种模式替代了以前的轮询
编程模式。RDO 2.0 的rdoEngine、rdoEnviroment、rdoConnection
和rdoResultset 等都有异步查询事件。这些事件过程在初始
化的RDO 对象后可被触发。下举一个简单实例,具体说明RDO
的驱动事件的应用。

Option Explicit
Public WithEvents rdo_ 事件连接As rdoConnection
Public qry 事件查询查询As rdoQuery
Public rst 事件查询记录As rdoResultset

Private Sub Form_Load()
Dim Temp_Cnct As String
事件处理.Hide       ' 事件处理为窗体名
Temp_Cnct = "UID=;PWD=;DATABASE=" & db 数据库& ";SERVER=" _
& str 服务器名称& ";DRIVER={SQL SERVER};DSN='';"
'db 数据库、str 服务器名称分别为数据库名、服务器名变量
Set rdo_ 事件连接= New rdoConnection
       With rdo_ 事件连接
           .LoginTimeout = 4
           .Connect = Temp_Cnct
           .QueryTimeout = 30
           .CursorDriver = rdUseServer
           .EstablishConnection rdDriverNoPrompt, False, rdAsyncEnable
       End With
End Sub
Private Sub Form_Unload(Cancel As Integer)
   rdo_ 事件连接.Close
   Set rdo_ 事件连接= Nothing
End Sub
Private Sub 返回按扭_Click()
qry 事件查询查询.Close
   Set rst 事件查询记录= Nothing
   Set qry 事件查询查询= Nothing
End Sub
' rdoConnection 对象连接操作完成时触发Connect 事件
Private Sub rdo_ 事件连接_Connect(ByVal ErrorOccurred As Boolean)
Dim Temp_er As rdoError
If ErrorOccurred = True Then
For Each Temp_er In rdoErrors
If Temp_er.Number = 53 Then

ElseIf   …

End If
Next Temp_er
rdoErrors.Clear
Unload 事件处理
Else
事件处理.Show
End If
End Sub
Private Sub 创建查询()
Dim Temp_SQL As String
' 设sp_ 数据查询(?,?) 调用远程数据库中的一存
储过程,该过程有两个时间类型参数,
' 返回为这一段时间内的结果集
Temp_SQL = "{call sp_ 数据查询(?,?)}"
Set qry 事件查询查询= rdo_ 事件
连接.CreateQuery("qry 事件查询查询", Temp_SQL)
End Sub
Private Sub 查询按扭_Click()
查询按扭.Enabled = False
返回按扭.Enabled = False
qry 事件查询查询.rdoParameters(0) = #1997-1-1#
qry 事件查询查询.rdoParameters(1) = #1997-1-2#
Set rst 事件查询记录= qry 事件查询查询
..OpenResultset(rdOpenForwardOnly, _
& rdConcurReadOnly, rdAsyncEnable)
End Sub
' rdoConnection 和其子对象查询时间超出
QueryTimeout 属性设置值时触发QueryTimeout 事件
Private Sub rdo_ 事件连接
_QueryTimeout(ByVal Query As rdoQuery, Cancel As Boolean)
Cancel = False          ' 查询超过预定时间时不取消Query
End Sub
' 查询或重定位(MoveLast)
操作完成时触发QueryComplete 事件
Private Sub rdo_ 事件连接
_QueryComplete(ByVal Query As rdoQuery, ByVal ErrorOccured As Boolean)
   If Query.Name = "qry 事件查询查询" Then
       If ErrorOccured = True Then
           错误信息处理
       Else
           …
查询按扭.Enabled = True
       End If
End If
返回按扭.Enabled = True
End Sub
Sub 错误信息处理( )
Dim er As rdoError
For Each er In rdoErrors
If              er.Number = 229 Then    ' 无select 对象的权利!
MsgBox " 没有权利访问此表!"
ElseIf  er.Number = …

End If
Next er
rdoErrors.Clear
End Sub

---- 上例中使用了rdoConnection 对象的Connect、QueryComplete
和QueryTimeout 事件。通过这些事件可进行异步操作处理,
集中错误处理及公共例程等,充分体现了结构化编程的
特点。

---- 综上所述,RDO 2.0 作为一个优秀的ActiveX 控件,它使得
程序员只须处理RDO 简单、灵活的属性和方法,就可达到
ODBC 和VBSQL API 编程模式的性能等级。此外,VB 5.0 智能化的
编程风格也使调试代码比以前更加轻松自如,而且VB 5.0
使用了VC++ 的编译器,使用与Visual C++ 几乎相同的调试环境
来调试编译生成本地代码,优化代码运行速度,所以VB 5.0
已成为开发使用ODBC 接口的客户/ 服务器应用程序的最理
想前端开发工具之一。我们没有理由不相信Visual Basic 5.0
今后将会在Windows 应用程序编程中大放异彩!


                   中国计算机世界出版服务公司版权所有



安装向导生成程序组
安装向导生成程序组并建立多个程序项 98-7-28
1 在使用安装向导时,加入相应的文件:如Readme, 帮助文件等。
2 生成安装程序后,修改 Setup.lst 文件中的[Files],  例如要把 File1 放到程序组中, 修改 File1 的最后两项:
 File1 = .... "",""  改为 ->
   File1 = .... "程序项名称","应用全路径"
例如:
 File1 = .... "工程说明","$(AppPath)\Readme.hlp"
3 [Setup] 中的 DefProgramGroup 为组名。
注意:如果只有一个 File 要求安装,不会建立程序组。



把文件置入到Text 或RichText 中
把文件置入到Text 或RichText 中 98-6-05
dim sFile as string
'Set sFile equal to your filename
dim i as long

i = freefile()

open sFile for input as #i
txtMain.text = input$(i,LOF(i))
close #1



报表中的滚动问题
           VB图片框在报表设计中屏幕滚动的问题

          太原工业大学计算机系(030024) 李亚东
   Microsoft Visual Basic以其简单、易学及功能强大的特点正在
Windows应用开发中越来越为广大用户及程序设计人员所青睐。VB是W
indows环境下速度最快的编程工具,VB作为工作组级的软件开发工具
在国外也十分流行,而对于软件开发者来说,熟练掌握一种企业级和工
作组级的工具是非常必要的。
   在Windows应用程序开发过程中,无可避免地要经常遇到滚动问题
。特别是在制作报表的应用程序中,由于表的大小往往超出屏幕的大
小,这样就不能够利用VB所提供的各种控件直接在Form上组合出所要
求的报表。通常解决的方法为:先用控件组合出表体的一部分,然后利
用算法显示其他部分。例:可使表体对应一数组,控制控件每次只显示
数组的一部分来达到滚动的目的。此种方法并不是真正意义上的滚动
,只是在视觉效果上达到了滚动,对于开发人员来说不直观易行。
图1
图2
   VB的图片框(Picture Box)可被用来制作很多特殊效果。例如:我
们可以制作出电影字幕滚动的效果。只要利用两个Picture Box控件,
使其中的一个附属于另一个即可(如图一)。程序运行中,设定Picture
1的位置不变并把要显示的内容输出到Picture2中,不断地按照Timer
改变Picture2的位置即可实现滚动。利用此原理,当我们要制作一个
既有横滚又有纵滚的报表时,可利用6个Picture Box控件来达到此目
的。具体实现如图二所示。其中Picture1,3,5 为固定位置Picture,
而Picture2,4,6则分别附属于Picture1,3,5。将横表头内容用控件在
P icture2中画出(注:所用控件必须附属于Picture2,Picture2的大小
由表头内容长度决定,Pi cture1的大小决定了可显尺寸)。同理将纵
表头内容以及表体内容分别在Picture4,6中画出。特别表体可用"loa
d"控件数组的方法堆出,但Picture6的大小一定要调整到能全部容纳
所有"load"控件的程度(鼠标无效时可用属性调整),最后设置好横纵
滚动条的参数。程序运行时,先置Picture2,4,6的位置(Left,Top)为(
0,0),当纵滚动条被按下时,按滚动条的value值设定Picture4,6的Top
值;当横滚动条被按下时,按滚动条的value值设定Picture2,6的Left
值,可实现所需滚动。此方法在实际制作中简单易行,无需算法。滚动
条的值与位置直接对应, 直观易行。而且滚动大小任意,可实现单象
素滚动