VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB问题全功略(48)
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11531, 日期:2002-02-02
VB问题全功略(48)

236、ZOrder 的迷思?
237、如何判断资料库中某一个 Table 是否存在 (二)?(DAO)
238、如何将长文件名转成短文件名格式 (MS-DOS 8.3)(二)?
239、如何移动文件到回收站
240、如何比较两个文件

236、ZOrder 的迷思?

ZOrder 拆开以后就是 Z 及 Order,其意义说明如下:
Z:这里是指三度空间中的 Z 座标轴 (注一),而不是指英文字母的第 26 个字母。
Order:排列顺序。
所以 ZOrder 就是指在 Z 座标轴上的排列顺序!

ZOrder 语法如下:

object.ZOrder position

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

object 选择性引数。物件运算式,用来指定「适用于」清单中的物件。
如果省略 object,则假设具有驻点的 Form 物件为 object。
Position 选择性引数。整数,用以指示 object 相对于同一 object 其它执行个体的位置。
如果 position 为 0 或省略,则 object 放置在 z- 顺序前面 (上方)。
如果 position 为 1,则 object 放置在 z- 顺序后面 (下方)。

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

在设计阶段选取快显功能表中的「移至顶层」或「移至底层」功能表指令,可以设定物件的 z- 顺序。

ZOrder 用在不同的地方,有二种不同的意义:
1、用于 MDIForm 中的 Child Form 时,指的是每一个 Child Form 的上下位置关系。
2、用于每一个 Form 中的所有控制项时,指的是每一个控制项间的上下位置关系。 (注二)

注一:一般我们的二度平面座标轴是指 X 座标轴 (东西向)及 Y 座标轴 (南北向),
   二个轴构成一个平面,再加上垂直的 Z 座标轴,就构成了三度立体空间了!
   所以 ZOrder 指的就是物件在垂直的 Z 座标轴上的上下位置关系。

注二:虽然 ZOrder 指的是物件在垂直的 Z 座标轴上的上下位置关系。
   但是很多人搞不清楚,为什么他已经设定了 ZOrder 了,为什么在某些控制项中是无效的?

   原因是对单一 Form 或 单一 Container 而言,在垂直的 Z 座标轴上又分成三个层次:
   最下一层:显示图形方法结果的绘图空间。
   中间一层:用来显示图形物件(例如 Image) 和 Label 控制项。
   上面一层:显示所有非图形控制项,例如 CommandButton、CheckBox 或 ListBox。
   而 ZOrder 只对单一层次内的控制项有效而已!

   例如:您如果设定 Label 及 Image 的 ZOrder 是有效的,因为它们都在中间一层!
      您如果设定 Label 及 CommandButton 的 ZOrder 是无效的,因为它们在不同层!

   最重要的是:不管 ZOrder 如何设定,
         在上面一层的物件永远会在中间一层的物件的上方!
         在中间一层的物件永远会在最下一层的物件的上方!

237、如何判断资料库中某一个 Table 是否存在 (二)?(DAO)

在 问题: 如何判断资料库中某一个 Table 是否存在?(ADO) 中,我们提到了使用 ADO 的方法来判断资料库中的某一个 Table 是否存在,但是它只适用于 VB6,顶多只到 VB5 (注一),然而,DAO 却可适用于 VB6 - VB3 中所有的版本!

虽然是使用 DAO,但是我们仍然是使用错误尝试法来解决今天的问题,我们仍然以 Access 为例,资料库使用 VB 内附的 Biblio.mdb,要注意的地方有二个:

1、记得要设定【专案】【设定引用项目】【Microsoft DAO x.x Object Library】。
2、除了 Table 之外,今天我们也检查 Access 的 Query !

请将以下的程序码复制到表单中,表单中不需要任何控制项:

Const NameNotInCollection = 3265
Dim DB As Database

Private Function ExistsTableQuery(TName As String) As Boolean
Dim Test As String
On Error Resume Next

注释: 检查这个名称是否出现在 Tables collection 中:
Test = DB.TableDefs(TName).Name
If Err <> NameNotInCollection Then
ExistsTableQuery = True
注释: 重设 Err 预设值为 0
Err = 0
注释: 检查这个名称是否出现在 Queries collection 中:
Test = DB.QueryDefs(TName$).Name
If Err <> NameNotInCollection Then
ExistsTableQuery = True
End If
End If
End Function

Private Sub Form_Load()
Set DB = DBEngine.Workspaces(0).Opendatabase("Biblio.mdb")
Debug.Print "BadTable "; IIf(ExistsTableQuery("BadTableName"), "", "不"); "存在."
Debug.Print "Authors "; IIf(ExistsTableQuery("Authors"), "", "不"); "存在."
End Sub
注一

VB5.0 并不包含 ADO 的技术,然而您还是可以在 VB5.0 中使用 ADO。您可以有下列两种方式,取得ADO:

(1) 安装 NT Option Pack 的 IIS 4.0。
(2) 从网路上下载 ADO2.0, 网址为 http://www.microsoft.com/data。


238、如何将长文件名转成短文件名格式 (MS-DOS 8.3)(二)?

在【问题: 如何将长文件名转成短文件名格式 (MS-DOS 8.3)】中我们曾经提过这个问题,不过当时我们是使用 GetShortPathName 这个 API 函数,而在【问题185: 如何将短文件名格式转成长文件名?】这个相反的主题中我们并没有使用 API!有网友问我,长文件名转成短文件名可以不必使用 API 吗?我先告诉各位,答案是:当然可以!

在很多情形下,您会需要知道某一个长文件名文件的 8.3 格式短文件名,幸运的是,在一般的情形下,您只要回到 MSDOS 模式,您就可以看到这些长文件名文件的 8.3 格式短文件名!例如:在 MSDOS 之模式下,Program Files 这个目录便变成了 Progra~1。

而如果您知道,您不必使用 GetShortPathName 这个 API 函数,就可以取得这些长文件名文件的 8.3 格式短文件名,您一定会更高兴!因为现在 VB 有提供一个 Scripting Runtime library,您只要使用其中 File 及 Folder 物件的 ShortPath 属性,就可以取得长文件名目录或长文件名文件的 8.3 格式短文件名!

不过在开始之前,一定要记得在【专案】的【引用项目】中,加入【Microsoft Scripting Runtime】!

程序码大致如下:

Private Sub Form_Load()
Dim fso As FileSystemObject
Dim fsoFile As File

Set fso = New FileSystemObject
Set fsoFile = fso.GetFile("C:\MyReallyLongName.txt")
MsgBox fsoFile.ShortPath

Set fsoFile = Nothing
Set fso = Nothing
End Sub
注释:结果就是 C:\MYREAL~1.TXT
239、如何移动文件到回收站

声明:
Public Type SHFILEOPSTRUCT
hwnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAnyOperationsAborted As Long
hNameMappings As Long
lpszProgressTitle As Long
End Type

Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40
代码:
Dim SHop As SHFILEOPSTRUCT
Dim strFile as string

With SHop
.wFunc = FO_DELETE
.pFrom = strFile + Chr(0)
.fFlags = FOF_ALLOWUNDO
End With

SHFileOperation SHop

240、如何比较两个文件

Function CompFile(F1 as string, F2 as string) as boolean
Dim issame as boolean
Open F1 For Binary As #1
Open F2 For Binary As #2

issame = True
If LOF(1) <> LOF(2) Then
issame = False
Else
whole& = LOF(1) \ 10000 注释:number of whole 10,000 byte chunks
part& = LOF(1) Mod 10000 注释:remaining bytes at end of file
buffer1$ = String$(10000, 0)
buffer2$ = String$(10000, 0)
start& = 1
For x& = 1 To whole& 注释:this for-next loop will get 10,000
Get #1, start&, buffer1$ 注释:byte chunks at a time.
Get #2, start&, buffer2$
If buffer1$ <> buffer2$ Then
issame = False
Exit For
End If
start& = start& + 10000
Next
buffer1$ = String$(part&, 0)
buffer2$ = String$(part&, 0)
Get #1, start&, buffer1$ 注释:get the remaining bytes at the end
Get #2, start&, buffer2$ 注释:get the remaining bytes at the end
If buffer1$ <> buffer2$ Then
issame = False
End If
Close
CompFile = issame
End Function