Visual Basic 技巧库
第 7 部分 (61-70)
开始屏幕保护 使用 API 开始屏幕保护 98-8-22 声明: Private Declare
Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByVal hWnd As Long,
ByVal wMsg _ As Long, ByVal wParam As Long, ByVal lParam As Long) _ As
Long Const WM_SYSCOMMAND = &H112& Const SC_SCREENSAVE =
&HF140& 代码: Dim result As Long result = SendMessage(Form1.hWnd,
WM_SYSCOMMAND, SC_SCREENSAVE, 0&)
开始上次关机时关闭的应用 自动开始上次关机时关闭的应用 98-8-03 两点关键: 1 检测是
Windows 关闭引起的 QueryUnload 事件。 2 改写
Software\Microsoft\Windows\CurrentVersion\RunOnce
声明: Declare Function RegCloseKey Lib "advapi32.dll" Alias
"RegCloseKey" (ByVal hKey As Long) As Long Declare Function RegCreateKey Lib
"advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As
String, phkResult As Long) As Long Declare Function RegSetValueEx Lib
"advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As
String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal
cbData As Long) As Long ' Note that if you declare the lpData parameter as
String, you must pass it By Value.
在主 Form 中增加:
Public Const REG_SZ = 1 Public Const HKEY_CURRENT_USER =
&H80000001
Private Sub Form_QueryUnload (Cancel as Integer, UnloadMode as
Integer) Dim hKey As Long Dim strRunCmd As String If UnloadMode =
vbAppWindows Then strRunCmd = App.Path & "\" & App.EXEName
& ".EXE" Call RegCreateKey(HKEY_CURRENT_USER,
"Software\Microsoft\Windows\CurrentVersion\RunOnce", hKey) Call
RegSetValueEx(hKey, "MyApp", 0&, REG_SZ, ByVal strRunCmd,
Len(strRunCmd)+1) Call RegCloseKey(hKey) Endif End Sub
快速建立目录 快速建立目录 98-8-22 声明: Private Type
SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As
Long bInheritHandle As Long End Type Private Declare Function
CreateDirectory Lib "kernel32" _ Alias "CreateDirectoryA" (ByVal lpPathName
As String, _ lpSecurityAttributes As SECURITY_ATTRIBUTES) As Long
函数: 'Call CreateNewDirectory("c:\test\directory\vb\tips\") Public Sub
CreateNewDirectory(NewDirectory As String) Dim sDirTest As String Dim
SecAttrib As SECURITY_ATTRIBUTES Dim bSuccess As Boolean Dim sPath As
String Dim iCounter As Integer Dim sTempDir As String iFlag =
0 sPath = NewDirectory If Right(sPath, Len(sPath)) <> "\"
Then sPath = sPath & "\" End If iCounter = 1 Do Until
InStr(iCounter, sPath, "\") = 0 iCounter = InStr(iCounter, sPath,
"\") sTempDir = Left(sPath, iCounter) sDirTest = Dir(sTempDir) iCounter
= iCounter + 1 'create directory SecAttrib.lpSecurityDescriptor =
&O0 SecAttrib.bInheritHandle = False SecAttrib.nLength =
Len(SecAttrib) bSuccess = CreateDirectory(sTempDir, SecAttrib) Loop End
Sub
理解与掌握ACCESS 用xBase
用户的眼光理解与掌握ACCESS
中国矿业大学工商管理学院(221008)----王建军
---- 摘要:本文从xBase 用户的角度对比分析 了ACCESS 与xBase 的差异并进一步阐述了ACCESS
中的 数据库对象及编程方法。
---- 关键词:ACCESS----Foxpro----数据库
---- 微软公司有两个流行的桌面数据库开发工 具,一个是其自行研制开发的基于WINDOWS
环境 的ACCESS,另一个是其兼并FOX 公司而得到的Foxpro 。通常将dBASE、foxBase、Foxpro 等统称为xBase
在我国 拥有大量的用户,随着微软公司的ACCESS 在国际 桌面数据库市场上的迅速崛起及中文OFFICE
在我 国的深入普及,越来越多的用户开始使用MS ACCESS(中文OFFICE97 的组件之一),很多xBase
用户 也开始转向或使用微软公司的ACCESS。由于ACCESS 的文件组织、数据类型、编程语言、编程方法等 与xBase
有较大的差异,致使不少xBase 用户在学 习ACCESS 时感到困惑,有些用户甚至仅仅是因为 从ACCESS 中找不到与xBase
相对应的命令而对ACCESS 大加抨击,从而放弃ACCESS 的学习。与xBase 相比, ACCESS 有很多先进特性,xBase
用户一旦你掌 握ACCESS 的基本概念与编程方法、改变“xBase 的思 维方式”,就能利用已有的xBase
知识能够很快地 掌握ACCESS。本文从多方面对xBase 和ACCESS 进行对比 分析,通过对比使传统的xBASE
用户更好地理解与 掌握ACCESS。
---- 壹、ACCESS 与xBase 的主要差异:
---- 从大的方面说,ACCESS 的使用与编程方法 同Visual Foxpro3.0 及Visual Foxpro5.0
的使用与编程方 法非常相似,熟悉Visual Foxpro3.0
及以上版本的用 户会非常容易地学会ACCESS。没有使用过Visual Foxpro 的传统xBase 用户在开始学习ACCESS
或Visual Foxpro 时,需要从思想上做较大的转变,这是由 于ACCESS 及Visual Foxpro
都是采用基于事件处理和面 向对象的程序设计方法。下文中所谈到的xBase 指 的是Visual Foxpro 以下的版本。
---- 文件组织不同:用xBase
建立的系统通常包含 很多不同类型的文件,每一个表、程序、报表、 查询、索引、菜单等内容都是文件的方式存放在 磁盘上,可以通过项目文件对其他类型的文件 进行组织与管理;ACCESS
对数据库的组织同大型 后台数据库系统(如SQL
SERVER)的数据库组织非 常相似,不同数据或程序元素称为对象,所有的 对象都存储在一个物理文件中,而这个物理文 件被称为数据库。
---- 编程语言不同:在传统的xBase 中,表、记录等 数据操纵或是界面的设计采用的是xBase
命令进 行编程,高版本的Foxpro 中引入了部分SQL 语句(如 SQL-SELECT)主要用来完成数据的查询;ACCESS
中对 表、记录等数据操作主要通过SQL 实现,程序及事 件代码的编写采用Visual Basic for
Application(低版 本的ACCESS 用access basic 编程),简单的程序设计用 宏。Visual Basic
是更为通用的编程语言,MS Office 的 组件都可以用Visual Basic 进行编程。
---- 编程方法不同:xBase 中采用面向过程的程序 设计方法,即使是一个用户输入界面的设计也 需要较长的一段xBase
程序;ACCESS
中采用面向对象 的程序设计方法,数据处理功能的完成通过改 变对象的属性或执行对象方法实现,程序段通 常构成事件过程、对象方法、函数,ACCESS
中较少 会出现连续的长程序。此外,ACCESS
中具有字段 级、记录级、表级数据引用完整性数据约束功 能,事务处理功能和完备的安全机制。
---- 贰、ACCESS 中的数据库对象
---- ACCESS
的数据库窗口中包含六类不同的数据 库对象,它们分别是表(Table)、查询(Query)、窗体 (Form)、报表(Report)、宏(Macro)
和模块(Module)。ACCESS 的数据库如同一个容器一样包含了全部的数据 库对象,与Foxpro 的项目文件不同ACCESS
将这些对 象存储在一个文件中。创建数据库对象只需单 击数据库窗口中的‘新建’按钮,修改已有对象 选择对象然后单击‘设计’按钮。
---- ACCESS 中的表:ACCESS 中的表等同于xBase 中的DBF 文件或Visual Foxpro
中的数据库表。ACCESS 的表 与xBase 的DBF 文件比有如下新特点:
字段名可多达64
位字符 可以设置字段的输入掩码、缺省值、值范 围。相当与xBase
中使用@匞ET 语句中的PICTURE、 DEFAULT、RANGE
等子句的作用。 可以设置字段与字段间的关系(通过设置表 的属性)
---- 在ACCESS
中,不需要用专门的命令或操作来建 立和维护索引文件,按某字段建立索引只需在 该字段的索引属性中选择特定的索引类型即 可,索引的建立维护和使用都是通过ACCESS
系统 来完成的,在xBase 中诸如:Index on、set index to 等操 作不必有用户关心。
---- 根据需要可在ACCESS 的数据库中创建多个表, 表与表之间能够建立所谓的参照完整性关系, 如同在xBase 中用set
relation 、set skip 命令创建的多 对一和一对多关系一样,ACCESS
只需图形界面操 作就可完成一对多和多对一关系的建立并且通 过连锁删除与连锁更新来确保相关表中记录之 间关系的有效性,并且不能意外地删除或更改 相关数据。
---- 使用ACCESS 表与使用xBase 的DBF 文件的一个重要 差别是所谓“打开”的概念不同,xBase 中用USE
命 令打开DBF 文件实质是在内存建立数据缓冲区提 供数据通道,若想查看DBF 文件中的数据需要再 使用BROWSE 或其他命令,ACCESS
中打开一个表相当 于xBase 中USE + BEOWSE 命令。对表中的数据进行处理 而不显示表中的记录,在ACCESS
中通常有两中做 法,一种是用SQL 语句更新或改变数据,无须先打 开表后执行SQL 语句;另一种是用VBA
编程通过数 据访问对象(DAO)来操纵表,通过DAO 操纵表时, 要打开所谓的记录集(Recordset),xBase 中的USE
命 令与VBA(Visual BASIC for Application)中的Openrecordset 方法的作用象类似。
---- 查询(Query):ACCESS 中的查询本质上就是SQL
的 数据操纵语句,利用查询可以通过不同的方法 来查看、更改以及分析数据,相当于Foxpro 中的SQL SELECT 语句及Foxpro
的查询。在ACCESS 中,对表、记 录、字段的多数操作都可通过查询来完成,例 如:在xBase 中使用很多的REPLACE ... WITH
... 命令 在ACCESS 中应当用一个动作查询来完成(SQL UPDATE )。在ACCESS
中建立和使用查询基本上等同于在 后台数据库(如:ORACLE、SQL SERVER)中使用SQL 命 令,Microsoft Jet
数据库引擎的SQL 符合ANSI SQL,ACCESS 的SQL 实现了几乎所有的ANSI SQL 功能,有些SQL 命令 在ANSI SQL
中所没有的。
---- ACCESS 中选择查询比Foxpro 中的SQL SELECT 命令使 用起来更为方便灵活,在ACCESS
中,选择查询在使 用等同于表,可以在表与查询间建立关系,查询 也可象表一样作为窗体和报表的记录来源,利 用查询还能再建查询。
---- 窗体(Form):窗体是利用ACCESS 开发出系统的 主要交互界面,在有些书刊上又把窗体叫做表 单,窗体相当于xBase
中利用@匰AY匞ET 命令编写用于 实现所谓全屏幕编辑功能的程序,窗体又近似 于Foxpro 中的屏幕文件(.SCX)。在ACCESS
中建立人机 交互界面如同在Foxpro 中建立屏幕文件需要创建 窗体对象。
---- 报表(Report):ACCESS 的报表对象最接近xBase 中 的报表文件(FRX、FRM)。在xBase
中建立报表文件之 后需要用REPORT FORM ... 命令预览或打印报表, ACCESS
中报表对象建立之后可直接在数据库窗口 中单击‘打开’按钮预览报表或是在宏或模块中 用OPENREPORT 命令打印或预览报表。
----
宏(Macro):宏是指一个或多个操作的集合, 其中每个操作实现特定的功能,例如打开某个 窗体或打印某个报表。宏可以使某些普通的任 务自动完成。例如,可设置某个宏,在用户单击 某个命令按钮时运行该宏,以打印某个报表。在 xBase
中没有特定的文件类型与ACCESS 的宏相对 应,在ACCESS97 及以下的版本中,利用宏来创建用 户自定义菜单。
---- 模块(module):ACCESS 的模块相当于xBase
中的程 序文件和过程文件。每一个模块中可以包含一 个或多个子程序、函数或属性,子程序相当于 xBase
中的过程(Procedure)。
---- 壹、ACCESS 中用户界面设计
---- 在信息系统的开发中,用户界面的设计占有 较大的工作量。ACCESS 中的用户界面设计比xBase
中 的用户界面设计大大简化,早期的xBase 版本中用 户界面的设计需要确定屏幕上显示文字的坐标 位置然后用户@ 卻ay単et
命令书写程序;Foxpro
中, 用户界面的设计有了较大的改进,设计用户界 面时,先建立屏幕文件(.SCX),然后用生成器生 成用户界面的程序文件(.SPR)。ACCESS
中建立用户 界面即建立数据库窗体对象(Form),Form 的建立 与设计和多数基于WINDOWS
的开发工具(如:Visual BASIC)的界面设计一致,与xBase 的用户界面设计 有较大的差异,xBase
用户应从以下几个方面理解 和把握ACCESS 的窗体设计:
---- 1. 理解窗体与程序
---- Foxpro
中,建立用户交互界面需先建立屏幕 文件,屏幕文件中又包含若干代码片段(Code Snippet),利用生成器根据屏幕文件生成扩展名 为SPR
的程序文件,代码片段被包含在程序文件 之中,执行程序文件即出现交互式用户界面。 ACCESS
中,窗体相当于屏幕文件,窗体有三种不 同的视图(VIEW)--
设计视图、窗体视图和数据表 视图。设计视图模式用于设计或修改窗体,窗体 设计好之后就可以以窗体视图或数据表视图打 开窗体即为用户操作使用的交互界面。ACCESS
中 不需要将窗体生成程序代码,窗体建好之后直 接打开窗体或切换到窗体视图即可。Foxpro
中另 人头疼的事情之一是调试屏幕时反复修改屏 幕、生成程序代码、执行程序观看运行效果,对 屏幕文件的任何微小改动都必须通过生成程 序、执行程序才能看到结果,ACCESS
中无须生成过 程,只需在设计视图与窗体视图间切换即可知 道窗体修改后的效果。
---- 窗体模块与事件过程:在Foxpro 中,@匞ET 、READ 、ACTIVATE
等命令中都可带有许多子句,如:最为 常用的VALID
子句,子句通常跟一个用户自定义函 数,在用屏幕生成器建立屏幕文件时,子句后的 自定义函数的内容可直接输入,这些子句用到 的自定义函数程序段被称为代码片段(Code Snippet)。ACCESS
中,与Foxpro 中代码片段相对应的 程序段是事件过程(Event
Procedure),所谓事件过 程是指一种自动执行的过程,用来对用户或程 序代码启动的事件或系统触发的事件作出响 应。例如:在Foxpro
中若想在某一字段的值输入或 修改之后执行某一段程序,则需要通过输入代 码片段建立VALID 子句及VALID
子句所需要的自定义 函数;在ACCESS 中,某控件(CONTROL)的值在输入或 修改之后欲执行某段程序需在该控件的After Update
事件属性的事件过程中输入程序内容即 可,当控件的值发生变化之后发生After Update
事 件系统就自动执行该事件对应的事件过程。 ACCESS
中每一个窗体都有与该窗体相关联的窗体 模块,窗体模块中存放了所有该窗体的事件过 程和该窗体的公用子程序和函数,窗体保存时 该窗体模块自动保存。
---- 2. 理解记录来源(Record Source)
---- 在Foxpro
中,创建屏幕文件之前应先打开相关 的表,建立表与表之间的关系,屏幕文件建立之 后在保存时系统会询问是否保存环境(Environment ),若保存环境则系统保存了打开的表,生成程 序代码中包含有打开和关闭表的命令。ACCESS
中 窗体的“数据环境”被称为记录来源(Record Source ),记录源可以是表、查询或SQL 的SELECT 语句。 ACCESS
的记录来源比Foxpro 的“数据环境”提供了 更大的灵活性,当ACCESS 窗体的记录来源是相互 ?关联”的若干表时,ACCESS
中通过建立查询或是 使用SQL SELECT 语句作为记录来源,而查询与SELECT 语句指定了相关的表及表间关系。
---- 建立Foxpro 的屏幕文件需先打开相关表并保 存“数据环境”才能在生成程序时包含有打开表 的代码行,ACCESS
窗体的记录来源只是在窗体的 记录来源属性中给出表、查询名字或SQL SELECT
语 句,记录来源并不生成程序代码。窗体在打开时 自动处理表、查询及SELECT
语句的数据,并没有什 么命令或语句来处理表、查询的打开问题。
---- 3. 理解控件、属性及事件过程
---- Foxpro
屏幕生成器界面中添加的文本框 (TextBox)、列表框(ListBox)等项目在生成程序后 对应内存变量或字段变量,屏幕生成器中对文 本框等项目的许多设置形成了生成代码的@
..GET 语句的许多子句如:ENABLE 、DISABLE 、FONT、STYLE 、DEFAULT、MESSAGE、RANGE 、COLOR
等,屏幕生成器中输 入的代码片段(Code Snippet)形成了程序中的自定 义函数或过程和@単et 语句的VALID、WHEN
等子句。 ACCESS 中,相当Foxpro 于屏幕生成器中文本框等项 目的称之为控件(CONTROL)。Foxpro 中@単et
语句的子 句在ACCESS 中是通过控件的属性来实现的,例如: Foxpro 中的@ .... Get text disable
语句,在ACCESS 中是 将text 控件的enabled 属性值设置为False( 否);Foxpro 中SHOW GET TEXT
ENABLE 在ACCESS 中用赋值语 句Me!text.enabled=true 改变text 控件的属性。Foxpro
中 的代码片段在ACCESS 中是通过事件过程实现的, 例如:Foxpro 中@匞et text valid check()
语句中包含 有Valid 子句和check() 自定义函数,实现同样的功 能在ACCESS 中在text 控件的Before Update(
或After Update) 属性值选择‘[ 事件过程]’并输入相应的程序代 码。常见的Foxpro @匞ET 语句的子句与ACCESS
的控件 属性对应关系如下:
Foxpro 子句 ACCESS 控件属性 FUNCTION Format 、Input Mask
属性 PICTURE Format 、Input Mask 属性 FONT Font color name size weight
italic underline 等属性 STYLE Font italic underline 等属性 DEFAULT Default
Value ENABLED|DISABLE Enabled RANGE Validation Rule、Validation
Text SIZE Left 、top、height、width VILID Before Update、After
Update WHEN On enter 、On Got focus
---- 1. 在窗体中“移动记录指针”
---- 通过foxpro
屏幕生成器创建的用户界面中常 常包含用于移动记录的按钮,通过单击按钮改 变屏幕或窗口中当前记录,foxpro
中实现该功能 的方法一般是在按钮变量的valid 子句的函数中 增加指针移动语句如:skip、goto 、locate
等。XBase 用户初次使用ACCESS 窗体时欲实现同等功能但往 往不知如何下手,ACCESS
中实现窗体中记录导航 可以通过以下三种方法:
在窗体的左下角增加记录导航控制按钮 (navigation
button) 使用Goto Record 宏或Find Record
宏 使用数据访问对象(DAO)改变当前窗体的记 录
---- 若只是在窗体中前后移动记录,不需要编写 程序,在窗体的设计视图将窗体的navigation
button 值设置为true,则在窗体时就会出现导航按钮, 用户通过单击导航按钮前移、后移记录。若想将 记录移到特定的记录则必须通过用宏或VB
编程 实现,例如:单击窗体中的CMD 按钮下移三个记录 则在CMD 按钮的on click 事件过程中输入如下VB 语 句:
---- DoCmd.GoToRecord ,,,3
---- 下面的示例在当前窗体中使用记录集 及FindFirst 方法将记录定位到“姓名”字段值为 ?张三”的记录:
Dim rst As Recordset Dim
strSearchName As String Set rst =
Me.RecordsetClone strSearchName = "
张三" rst.FindFirst " 姓名= " &
strSearchName If
rst.NoMatch
Then MsgBox
"
没找到" Else Me.Bookmark
=
rst.Bookmark End
If rst.Close
---- 程序中Me.RecordsetClone
是由窗体的RecordSource 属性指定的基础查询或基表的一个副本,Bookmark 是记录集的书签,用来唯一标识窗体基表、基 础查询或SQL
语句中的特定记录。例子中FindFirst 方法先在窗体记录来源的记录集副本中定位记 录,然后再将窗体的记录的位置移动到相同的 位置。
---- 壹、xBase 中的常用命令在ACCESS 中如何实现
---- 许多xBase 用户初次使用ACCESS 时常常在ACCESS 中 查找与xBase
命令相当的语句、功能或实现方法, 下表给出了常用的xBase 命令所对应的ACCESS 宏命 令及VB 语句或实现方法:
XBase 命令 ACCESS 宏命令 ACCESS VBA 语句 ACCESS 操作 USE <
表>
OpenRecordset
方法 通常不需要,处理表记录时用 BROWSE/EDIT OpenTable Docmd.opentable 在数据库窗口直接打开表 INDEX
ON
指定表字段的索引属性 SORT ON
通过工具栏的按钮或菜单上命令 REPLACE
使用SQL 语句 SUM AVER 等
Dsum() 等函数 使用SQL 语句 GOTO GotoRecord Move
方法 使用记录导航按钮 SKIP GotoRecord Move 方法 使用记录导航按钮 LOCATE
FindFirst 方法 通过工具条或菜单命令查找与过滤操作 TOTAL
使用SQL 语句
壹、ACCESS 中的数据类型
---- xBase 用户在初次使用ACCESS 时对ACCESS 表的字 段类型特别是数值型字段类型不适应。正是由 于对ACCESS
的数据类型缺乏足够的了解,使得很 多用户在开发过程中出现了一些问题。ACCESS 与xBase 表的字段类型及其对应关系见下表:
ACCESS 中表的字段类型 xBase 中库的字段类型 字符型(Text) 字符型(Character) 数值型(
短整型、长整型、单精度、双精度) 数值型(Numeric) 货币型(Currency) 数值型(Numeric) 备注型(Memo) 备注型(Memo) 日期时间型(date/Time) 日期型(Date) 逻辑型(Yes/No) 逻辑型(Logical) OLE
对象型(OLE Object) 通用型(General)
---- XBase 用户初次使用ACCESS 时常遇到的问题之 一是ACCESS 表中的数值型字段类型问题,在xBase 的DBF
文件中定义数值型字段需给出字段类型、 宽度和小数位数,在记录的数值型字段存放数 据时,xBase
只保存规定的小数位数并自动处理四 舍五入问题,ACCESS 中表的数值型字段同xBase
的数 值型字段不同,在表中的字段存放数值型数据 需将字段设置为短整型、长整型、单精度、双精 度或货币型中的一种,在数值字段保存数据时 不能保存固定长度的小数位数,也不能自动处 理小数的四舍五入问题。尽管字段属性中有 DecimalPlaces
和Format,但这两个属性只是确定数据 的显示方式而不是保留特定的小数位数,用户 必须在保存数值数据时自行处理保留的小数位 数及四舍五入问题。
---- XBase 用户使用ACCESS 表时常遇到另一个问题 是字段的NULL 值问题,xBase
中,若字段没输入值, 则字符型字段为空格串、数值型字段为零值; ACCESS 中,若字段没输入值则字段的值为NULL(空 值),NULL
是ACCESS 中的特殊常量表示没值,NULL 不 能赋予非Variant 变量。通过DAO 访问记录的字段 时,使用NZ()函数将NULL
转换为字符型空串或数 值型零值。
中国计算机世界出版服务公司版权所有
利用集合过滤重复的值 Dim i As
Long Dim RawData As String Dim
DataValues As New Collection
On Error Resume Next ' 忽略 error
457 - Duplicate key For i = LBound(arr) To
UBound(arr) RawData =
arr(i) DataValues.Add RawData,
RawData Next On Error GoTo 0
' 放到 ListBox 中
lstSortedData.Clear For Each
DataValue In
DataValues lstSortedData.AddItem
DataValue Next
列出 SQL Server
数据库中所有的存储过程 列出 SQL Server 数据库中所有的存储过程 Dim cn As
rdoConnection Dim ps As rdoPreparedStatement Dim rs As rdoResultset Dim
strConnect As String Dim strSQL As String '利用 DSNless 连接到 pubs
数据库 '改变参数以适合你自己的 SQL Server strConnect = "Driver={SQL Server};
Server=myserver; " & "Database=pubs; Uid=sa; Pwd=" Set cn =
rdoEnvironments(0).OpenConnection(dsName:="", Prompt:=rdDriverNoPrompt,
ReadOnly:=False, Connect:=strConnect)
strSQL = "Select so.name,sc.name,st.name,sc.length " & "FROM
syscolumns sc,master..systypes st,sysobjects so " & "WHERE sc.id in (select
id from sysobjects where type ='P')" & " AND so.type ='P' " & "AND sc.id
= so.id " & "AND sc.type = st.type " & "AND sc.type <> 39"
Set ps = cn.CreatePreparedStatement("MyPs", strSQL)
Set rs = ps.OpenResultset(rdOpenStatic)
list1.AddItem "SP Name,Param Name,Data Type,Length" While Not
rs.EOF list1.AddItem rs(0) & " , " & rs(1) & " , " & rs(2)
& " , " & rs(3) rs.MoveNext Wend rs.Close Set rs =
Nothing cn.Close Set cn = Nothing
目录所占的字节数 目录所占的字节数 该函数返回目录使用的字节数:
Function DirUsedBytes(ByVal dirName As String) As Long Dim FileName As
String Dim FileSize As Currency If Right$(dirName, 1) <> "\"
Then dirName = dirName & "\" Endif FileSize =
0 FileName = Dir$(dirName & "*.*") Do While FileName <>
"" FileSize = FileSize +
_ FileLen(dirName &
FileName) FileName = Dir$ Loop DirUsedBytes =
FileSize 使用: MsgBox DirUsedBytes("C:\Windows")
判断驱动器类型 using GetDriveType to detect,
below is the example for detecting CD-ROM, others I
am not try, you may look up the detail of the funtion, you
can fix it.
'Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As
Long 'Private Declare Function GetLogicalDriveStrings Lib
"kernel32" Alias "GetLogicalDriveStringsA" (ByVal
nBufferLength As Long, ByVal lpBuffer As String) As
Long 'Private Const DRIVE_REMOVABLE =
2 'Private Const DRIVE_FIXED =
3 'Private Const DRIVE_REMOTE =
4 'Private Const DRIVE_CDROM =
5 'Private Const DRIVE_RAMDISK = 6
'Place the following code in under a command button
or in a menu, etc...
Dim r&, allDrives$, JustOneDrive$, pos%,
DriveType& Dim CDfound As
Integer allDrives$ = Space$(64) r&
= GetLogicalDriveStrings(Len(allDrives$),
allDrives$) allDrives$ = Left$(allDrives$,
r&) Do pos% = InStr(allDrives$,
Chr$(0)) If pos%
Then JustOneDrive$ =
Left$(allDrives$, pos%) allDrives$
= Mid$(allDrives$, pos% + 1,
Len(allDrives$)) DriveType& =
GetDriveType(JustOneDrive$) If
DriveType& = DRIVE_CDROM
Then CDfound% =
True Exit
Do End If End
If Loop Until allDrives$ = "" Or DriveType& =
DRIVE_CDROM If CDfound%
Then label1 = "The CD-ROM drive on
your system is drive "
& UCase$(JustOneDrive$) Else:
label1 = "No CD-ROM drives were detected on your
system." End If
判断是否已经建立 Dial Up
连接 判断是否已经建立 Dial Up 连接 98-8-21 通过读取注册表,
可以知道该信息。 声明: Public Const ERROR_SUCCESS = 0& Public Const APINULL =
0&Public Const HKEY_LOCAL_MACHINE = &H80000002 Public ReturnCode
As Long Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long)
As Long Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA"
(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA"
(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long,
lpType As Long, lpData As Any, lpcbData As Long) As Long 函数:
Public Function ActiveConnection() As Boolean Dim hKey As Long Dim
lpSubKey As String Dim phkResult As Long Dim lpValueName As String Dim
lpReserved As Long Dim lpType As Long Dim lpData As Long Dim lpcbData
As Long ActiveConnection = False lpSubKey =
"System\CurrentControlSet\Services\RemoteAccess" ReturnCode =
RegOpenKey(HKEY_LOCAL_MACHINE, lpSubKey, _ phkResult)
If ReturnCode = ERROR_SUCCESS Then hKey = phkResult lpValueName =
"Remote Connection" lpReserved = APINULL lpType = APINULL lpData =
APINULL lpcbData = APINULL ReturnCode = RegQueryValueEx(hKey, lpValueName,
_ lpReserved, lpType, ByVal lpData, lpcbData) lpcbData =
Len(lpData) ReturnCode = RegQueryValueEx(hKey, lpValueName, _ lpReserved,
lpType, lpData, lpcbData)
If ReturnCode = ERROR_SUCCESS Then If lpData = 0
Then ActiveConnection = False Else ActiveConnection = True End
If End If
RegCloseKey (hKey) End If
End Function
判断是否在 VB5
环境下运行 判断是否在 VB5 环境下运行 98-7-30 声明: Private Declare Function
GetModuleFileName Lib "kernel32" Alias _ "GetModuleFileNameA" (ByVal hModule As
Long, ByVal lpFileName As _ String, ByVal nSize As Long) As Long 函数: '
True 表示在 VB5 环境下运行 Function IsRunUnderVB5() As Boolean Dim S
As String, Length Length = 256 S = String(Length, 0)
Call GetModuleFileName(0, S, Length) S = Left(S, InStr(S,
Chr(0)) - 1) IsRunUnderVB5 = UCase(Right(S, 7)) = "VB5.EXE" End
Function
|