VBGood网站全文搜索 Google

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

131、Printer 物件如何控制打印机跳页至指定的地方?
132、如何在按下 Enter 键之后,自动让 Focus 移到下一个物件?
133、如何隐藏及显示任务栏?
134、取得应用程序执行的路径
135、清除 ListBox 及 ComboBox 中重复的项目

131、Printer 物件如何控制打印机跳页至指定的地方?

在网站上有人提出这样的问题:

用 VB6 写一打印程序,打印机是点矩阵的,而纸张为公司特别定做的,所以当用 EndDoc 方法打印时,无法控制打印机跳页至指定的地方(就是可用手撕纸的那一条虚线)

VB 的 Printer 物件提供的 EndDoc 会自动根据我们设定的纸张大小,自动跳到下一页,但是当我们所使用的纸张是特殊大小时 (很多套印的表格都是特殊大小的尺寸),若要让打印机的跳页正常,并不需更改我们的程序,要更改的是我们机器上该打印机的纸张大小的设定。

1、开启【我的电脑】,开启【打印机】(或由【开始】或【控制面板】开启打印机)。
2、在该点矩阵打印机上按鼠标右键选择【内容】,出现该打印机的【内容】问话框。
3、选择【纸张】页签。
4、纸张大小选择【自订】,会出现【使用者定义大小】问话框。
5、输入纸张的宽度和长度,单位有二种 ( 0.01英寸 / 0.1公  )

用以上的方法设定好后,您就可以不用管纸张大小了,下一次它换页时就会自动跳页至指定的地方。

132、如何在按下 Enter 键之后,自动让 Focus 移到下一个物件?

如果您希望使用者在 TextBox 中按下 Enter 键之后,能够让 Focus 在各个物件之间游移,在 KeyPress 事件中您就必须判断是否有按下 Enter 键,如果有的话,您就必须取消 Enter 键,并送出一个 Tab 键。

在 VB 中,当您送出一个 Tab 键后,游标会依照 TabIndex 的顺序,在各物件之间移动。

若要照 TabIndex 顺序移动,指令为 SendKeys "{tab}"
若要照 TabIndex 反顺序移动,指令为 SendKeys "+{tab}"

其实以上的方法不只适用于 TextBox 物件,很多物件都适用这个原则,但是 CommandButton 就不行了!因为 CommandButton 根本就没有 KeyPress 事件!

以下是一段范例程序:

Sub Text1_KeyPress (KeyAscii As Integer)
If KeyAscii = 13 Then
SendKeys "{tab}"
KeyAscii = 0
End If
End Sub

133、如何隐藏及显示任务栏?

有时候,我们希望在我们的程序执行中,将任务栏隐藏,让桌面变得比较清爽,等到我们的程序执行完毕之后,再将任务栏显示出来,这时就要用到 SetWindowPos 这个 API 了!

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Const SWP_HIDEWINDOW = &H80 注释:隐藏视窗
Const SWP_SHOWWINDOW = &H40 注释:显示视窗

注释:在程序中若要隐藏任务栏

Private Sub Command1_Click()
Dim Thwnd As Long
Thwnd = FindWindow("Shell_traywnd", "")
Call SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW)
End Sub

注释:在程序中若要再显示任务栏

Private Sub Command2_Click()
Dim Thwnd As Long
Thwnd = FindWindow("Shell_traywnd", "")
Call SetWindowPos(Thwnd, 0, 0, 0, 0, 0, SWP_SHOWWINDOW)
End Sub

134、取得应用程序执行的路径

有时候执行我们的应用程序时,会用到一些和应用程序相关的文件,例如资料库、图档、文字档...等,这些文件我们通常都会放在和应用程序相同的目录或子目录中,于是在我们的应用程序中便有抓取应用程序现行目录的 求,在此我们介绍二种方法:

1、App.Path:返回值自动转为大写。
2、CurDir:返回值为大小写混合。

使用范例如下:

Private Sub Command1_Click()
Text1.text = App.Path
Text2.text = CurDir
End Sub

135、清除 ListBox 及 ComboBox 中重复的项目

当我们要将一大堆资料加入 ListBox 或 ComboBox 时,为了不让 ListBox 或 ComboBox 中的项目重复,有些人会在将新项目加入 ListBox 或 ComboBox 时,就先作项目比对,资料没有重复时,才将资料加入 ListBox 或 ComboBox 中。

但是如果我们将资料统统加入 ListBox 或 ComboBox 之后,再来执行比对动作,不但程序容易维护,而且速度会加快一点点,以下的模组就是做项目比对,以清除 ListBox 或 ComboBox 中重复的项目。

模组中需要传入二个参数,说明如下:

1、控制项名称:可传入 ListBox 或 ComboBox 的名称。
2、是否分别大小写:True 表示要分别大小写,False 则不分大小写。

Sub RemoveDups(lst As Control, comptype As Boolean)
Dim lPos As Long 注释:原始比对项目 index
Dim lCompPos As Long 注释:待比对项目 index
Dim sComp As String 注释:原始比对字串
Dim sComptype As Long 注释:0(binary) / 1(textual) 比对

lPos = 0
If comptype Then sComptype = 0 Else sComptype = 1
Do While lPos < (lst.ListCount - 1)
sComp = lst.List(lPos)
lCompPos = lPos + 1
Do While lCompPos < lst.ListCount
If StrComp(sComp, lst.List(lCompPos), sComptype) = 0 Then
lst.RemoveItem lCompPos
lCompPos = lCompPos - 1
End If
lCompPos = lCompPos + 1
Loop
lPos = lPos + 1
Loop
End Sub

注释:在程序中使用方式如下:

注释:要分别大小写
Private Sub Command1_Click()
RemoveDups List1, True
RemoveDups Combo1, True
End Sub
注释:不分别大小写
Private Sub Command2_Click()
RemoveDups List1, False
RemoveDups Combo1, False
End Sub