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 |