现在的位置: 首页 > 综合 > 正文

VB一些基本技巧

2013年10月18日 ⁄ 综合 ⁄ 共 8061字 ⁄ 字号 评论关闭
  • 如何加长 ComboBox 的下拉选单?

    2007-04-20 07:40:57

    Combo 预设的下拉长度只有 5,6 个选项,当选项很多时,要卷老半天才能找到资料,很不方便!要加长 ComboBox 的下拉选单,方法如下: 

    在声明区中放入以下声明及 Subroutine

    Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long

    Public Sub SetComboHeight(oComboBox As ComboBox, lNewHeight As Long)
    Dim oldscalemode As Integer 
    ' This procedure does not work with frames: you
    ' cannot set the ScaleMode to vbPixels, because
    ' the frame does not have a ScaleMode Property.
    ' To get round this, you could set the parent control
    ' to be the form while you run this procedure.
    If TypeOf oComboBox.Parent Is Frame Then Exit Sub
    ' Change the ScaleMode on the parent to Pixels.
    oldscalemode = oComboBox.Parent.ScaleMode
    oComboBox.Parent.ScaleMode = vbPixels
    ' Resize the combo box window.
    MoveWindow oComboBox.hwnd, oComboBox.Left, oComboBox.Top, oComboBox.Width, lNewHeight, 1
    ' Replace the old ScaleMode
    oComboBox.Parent.ScaleMode = oldscalemode
    End Sub

    在任何时候 (不一定是 Form_Load 或 Combo_DropDown),想要加长 ComboBox 的下拉选单时,只要加入以下程序即可:

    Call SetComboHeight(Combo1, 270) '设定的单位是 Pixels

  • 如何使用 ToolTip 来显示内容?

    2007-04-20 07:40:13

    ListBox 选项资料太长,虽然可以加上水平卷动轴,但卷来卷去还是有点麻烦,如果可以出现 Popup ToolTip 就更正点了!当然,您若想要二种功能一起使用,也是可以的。 

    关于这个主题,我看过很多范例都是使用 API 来做,但是以下这个方法既简单,又不必使用任何 API,帅吧!

    Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim YPos As Integer, iOldFontSize As Integer

    iOldFontSize = Me.Font.Size
    Me.Font.Size = List1.Font.Size
    YPos = Y / Me.TextHeight("Xyz") + List1.TopIndex
    Me.Font.Size = iOldFontSize

    If YPos < List1.ListCount Then
    List1.ToolTipText = List1.List(YPos)
    Else
    List1.ToolTipText = ""
    End If
    End Sub

  • 如何设定 ListBox 的水平卷动轴?

    2007-04-20 07:39:34

    VB 的 ListBox 并没有水平卷动轴的功能,如果遇到某一个资料项很长时, 使用者就无法看到这一个资料项的所有内容,要如何设定水平卷动轴给 ListBox?

    可利用 SendMessage 传送 LB_SETHORIZONTALEXTENT 讯息给 ListBox,此一讯息的作用就是要求ListBox 设定水平卷动轴, 细节如下: 

    1. API 的声明:

    '16位
    Const WM_USER = &H400
    Const LB_SETHORIZONTALEXTENT = (WM_USER + 21)
    Private Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
    '32位
    Const LB_SETHORIZONTALEXTENT = &H194
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

    2. 程序范例:

    ' List1 为 ListBox 的名称
    Call SendMessage(List1.hwnd, LB_SETHORIZONTALEXTENT, 水平卷动轴的宽度, ByVal 0&)

    特别注意:
    以上的水平卷动轴宽度的单位是 pixel(像素),或许您会认为这个宽度就是 ListBox 的宽度,但是结果却不是这样的,它真正指的是这个卷动轴要卷动的文字的宽度,所以您要预留可能放到 ListBox 内的资料最长的长度,若留得太短,可能出现以下二种情形: 

    1、 水平卷动轴的宽度设的比 ListBox 本身的宽度还短,VB会认为不需要卷动轴,而不产生卷动轴! 
    2、 水平卷动轴的宽度设的比 ListBox 内的资料宽度还短,则只能卷动一半,还是看不到完整内容! 

  • 如何利用API实现代码延时执行

    2007-04-20 07:38:49

    声明:
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    调用:
    Sleep 3000 '延时3秒执行

  • 如何让你的程序在任务列表隐藏

    2007-04-20 07:38:12

    Private Declare Function RegisterServiceProcess Lib "kernel32" (ByVal ProcessID As Long, ByVal ServiceFlags As Long) As Long
    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long

    '请你试试 Ctrl+Alt+Del 是不是你的程序隐藏了
    Private Sub Command1_Click()
    i = RegisterServiceProcess(GetCurrentProcessId, 1)
    End Sub

  • 如何计算出本月的最后一天

    2007-04-20 07:37:42

    首先为下个月的第一天生成一个顺序数值,然后再减去一天

    Private Sub Command1_Click()
    Dim dtl As Date
    dtl = DateSerial(Year(Now), Month(Now) + 1, 1) - 1
    MsgBox dtl
    End Sub

  • 如何弹出和关闭光驱托盘?

    2007-04-20 07:37:19

    Option Explicit
    Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

    Private Sub Command1_Click()
    mciExecute "set cdaudio door open" '弹出光驱
    Label2.Caption = "弹 出"
    End Sub

    Private Sub Command2_Click()
    Label2.Caption = "关 闭"
    mciExecute "set cdaudio door closed" '合上光驱
    Unload Me
    End
    End Sub

  • 如何检查软盘驱动器里是否有软盘?

    2007-04-20 07:34:56

    使用:
    Dim Flag As Boolean
    Flag = Fun_FloppyDrive("A:")
    If Flag = False Then MsgBox "A:驱没有准备好,请将磁盘插入驱动器!", vbCritical

    '-------------------------------
    '函数:检查软驱中是否有盘的存在
    '-------------------------------
    Private Function Fun_FloppyDrive(sDrive As String) As Boolean
    On Error Resume Next
    Fun_FloppyDrive = Dir(sDrive) <> ""
    End Function

  • 文字框可以设定快捷键吗?

    2007-04-19 07:33:49

    不行,要设定快捷键的先决条件,是该物件必须有 Caption 属性,但是 TextBox (文字框) 只有 Text 属性,并无 Caption 属性,所以文字框本身是不能设定快捷键的!完全没办法吗?

    但是还是有办法的!人家说山不转路转,文字框本身不能设定快捷键,一般我们在文字框的左方都会放置说明用的 Label,那我们就借用 Label 来做到这个功能,作法如下:
    1、将文字框的 TabIndex 设成说明用的 Label 物件的下一个。
    2、设定 Label 物件的快捷键,奇怪吗?Label 物件没有 Focus 好像不要快捷键!没错,我们就是要利用 Label 物件不要快捷键的特性来达到我们的要求!

    当您输入了 Label 物件的快捷键,由于 Label 物件没有 Focus 不接受快捷键,于是它立刻将 Focus 送到下一个 TabIndex 的物件,也就是 TextBox 文字框了!

  • 使 TextBox 变成只读

    2007-04-19 07:27:15

    在 Form 中放一个 TextBox,设定 Locked = True,MultiLine = True,ScrollBar = 2 - Vertical。另外再放一个 CommandButton (或其他任何可接受 Focus 的物件),此物件可由您自行作其他用途,否则设定 Command1.left = -1000 将其移到 Form 的外面。

    程式码如下:
    Private Sub Text1_GotFocus()
    '马上将 Text1 的 focus 转移到 Command1 或其他物件上
    Command1.SetFocus
    End Sub

  • 让 TextBox 由 Insert 模式变成 Overwrite 模式

    2007-04-19 07:26:35

    Windows 的 TextBox 一直都只支援 Insert Mode,而不支援 OverStrike(OverWrite) Mode,其实,只要在 Key_Press 事件中加上几行指令,就可以做到 OverStrike 功能 !!

    以下的程式码中,只设定 SelLength=1,而 SelStart 若未指定则会一直跟著滑鼠的游标所在处,设定 SelLength=1 会反白游标所在处的下一个字,但是由于您输入的字元会直接取代该反白的字元(都同时在 Key_Press 发生),所以您并不会看到字符被选定反白 (Marked),若是游标已在字串的最后面,则会直接忽略这个动作。

    以下的程式码中同时也作了以下的错误判断及预防:
    1. 当输入的是退格符,也就是 Backspace (character 8)。
    2. 当输入的是 return 键 (character 13)。
    3. 事先已作了选定动作 (Marked)。

    Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii <> 8 And KeyAscii <> 13 And Text1.SelLength = 0 Then
    Text1.SelLength = 1
    End If
    End Sub

  • 让鼠标进入 TextBox 时自动选定 TextBox 中之整串文字

    2007-04-19 07:26:05

    这个自动选定反白整串文字的动作,会使得输入的资料完全取代之前在 TextBox 中的所有字符。

    Private Sub Text1_GotFocus()
    Text1.SelStart = 0
    Text1.SelLength = Len(Text1)
    End Sub

  • 让TextBox接受某些特定字符

    2007-04-19 07:25:35

    方法有好几种, 以下列举二种:

    方法1: 可以使用 IF 或 Select Case 一个个判断, 但如果不接受的字符多时, 较麻烦!
    方法2: 将要剔除的字符统统放在一个字串中,只要一个 IF 判断即可 !! 如下:

    Private Sub Text1_KeyPress(KeyAscii As Integer)
        Dim sTemplate As String
        sTemplate = "!@#$%^&*()_+-="   '用来存放不接受的字符
        If InStr(1, sTemplate, Chr(KeyAscii)) > 0 Then
            KeyAscii = 0
        End If
    End Sub

  • 在 TextBox 中限制只能输入数字

    2007-04-19 07:24:08

    参考下列程序:
    Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii < 48 Or KeyAscii > 57 Then
    KeyAscii = 0
    End If
    End Sub
  • 如何让程序在 Windows 启动时自动执行?

    2007-04-19 07:23:39

    有以下二个方法:

    方法1: 直接将快捷方式放到启动群组中。

    方法2:
    在注册档 HKEY_LOCAL_MACHINE 中找到以下机码
    /Software/Microsoft/Windows/CurrentVersion/Run
    新增一个字串值,包括二个部份
    1. 名称部份:自己取名,可设定为 AP 名称。
    2. 资料部份:则是包含 '全路径档案名称' 及 '执行参数'

    例如:
    Value Name = Notepad
    Value Data = c:/windows/notepad.exe

  • 如何移除 Form 右上方之『X』按钮?

    2007-04-19 07:21:44

    其实 Form 右上方之三个按钮分别对应到 Form 左上方控制盒 (ControlBox) 中的几个选项 (缩到最小 / 放到最大 / 关闭),而其中的最大化 (MaxButton) 及最小化 (Minbutton) 都可以直接在 Form 的属性中设定,但是 VB 并没有提供设定『X』按钮的功能!要达到这个功能,必须借助 API:

    由于『X』按钮对应到 ControlBox 的关闭选项,所以我们只要移除系统 Menu (就是ControlBox) 的关闭选项即可!您自己可以先看看您现在使用的 Browser 左上方的系统 Menu,【关闭】选项是在第几个,不是第 6 个!是第 7 个,分隔线也算一个!分隔线才是第 6 个!

    当我们移除了关闭选项之後,会留下一条很奇怪的分隔线,所以最好连分隔线也一并移除。而 Menu 的 Index 是从 0 开始,分隔线是第 6 个,所以 Index = 5。

    修正:为了让程序码在 Windows NT 也能运作正常,将各 Integer 型态改成 Long。 89.05.04

    '抓取系统 Menu 的 hwnd
    Private Declare Function GetSystemMenu Lib "user32" Alias "GetSystemMenu" (ByVal hwnd As Long, ByVal bRevert As Long) As Long

    '移除系统 Menu 的 API
    Private Declare Function RemoveMenu Lib "user32" Alias "RemoveMenu" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    '第一个参数是系统 Menu 的 hwnd
    '第二个参数是要移除选项的 Index

  • VB清除编译时的内存垃圾

    2007-04-19 07:21:10

    语法:Set ōbjectvar = {[New] objectexpression | Nothing}

    Nothing 为选择性引数。停止 objectvar 和任何特定物件的关连。指定 objectvar 为 Nothing,会在没有其它变数引用时,释放所有与先前物件有关的系统和内存资源。

    当 objectvar 设定成 FormName 时,会将该 Form 中所有占用内存的物件所占用的内存通通释放。

    虽然有人说 VB 在 Form Unload 时会自动释放内存,但是并不是全部!!

    就像有人说, VB 程序要 Make EXE 之前最好先结束 VB, 重新载入该 Project 再 Make EXE, 结果执行档会比较小, 为什么 ? 就是少了一些在内存中的垃圾 !!

  • 如何产生渐层的 Form 背景?

    2007-04-19 07:10:43

    在 Form_Load 中加入以下程序码

    Sub Form_Load()
    Form1.AutoRedraw = True
    '使 Form 物件的自动重绘有效
    Form1.DrawStyle = 6
    '直线的样式为内实线 (6-vbInsideSolid)
    Form1.DrawMode = 13
    'copy Pen-由 ForeColor 属性指定的颜色。(13-vbCopyPen)
    Form1.DrawWidth = 2
    '输出的线宽为 2 像素 (Pixel)

    '为绘图或列印建立一自订的座标比例尺
    '图形像素为显示器或印表机解析度的最小单位
    Form1.ScaleMode = 3
    '设定物件座标的量测单位为像素 (3-VbPixels)
    Form1.ScaleHeight = (256 * 2)
    '设定垂直量测单位值为 512
    For i = 0 To 255
    Form1.Line (0, Y)-(Form1.Width, Y + 2), RGB(0, 0, i), BF
    Y = Y + 2
    Next i
    'RGB(red, green, blue)
    'B : 使一方块用一指定方块对角的座标画出
    'F : 指定此方块系以用来画方块的色彩来加以填满 (有B才可用F)
    End Sub

  • 如何让一个 Form 出现在另一个非 MDIForm 的 Form 中?

    2007-04-19 07:10:01

    假设要将 Form2 放在 Form1 中,请在宣告区中宣告:

    Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long

    在 Form2 中的 Form_Load 中加入 SetParent(Me.hWnd, Form1.hWnd) 即可。

    但有一点要注意的是,在 Unload Form1 之前一定要先 Unload Form2。

  • 如何快速设定 Form 上所有控制项的 TabIndex 顺序

    2007-04-19 07:09:00

    由于在设计 Form 上的控制项时,不一定会依照输入的顺序,在完成设计之后,我们通常会重设各控制项的 TabIndex 顺序,当 Form 上的控制项比较多时,设定起来相当麻烦,常常还会设错。

    有一个很简单又不容易出错的方法,是从画面上的右下角往左上角 (方向是先向左再往上),逐一的将控制项的 TabIndex 属性设成 0。
    1:右手用滑鼠点一下右下角的控制项,左手按 F4,将 TabIndex 设成 0。
    2:右手往左用滑鼠点一下倒数第二个控制项,左手按 F4,左手按 0。
    3:右手往左用滑鼠点一下倒数第三个控制项,左手按 F4,左手按 0。
    4:重复以上动作直到左上角第一个控制项为止。

    好了,您已经设定好整个 Form 上所有控制项的 TabIndex 顺序了!其原理就是当您设定一个控制项的 TabIndex 为 0 时,原来 TabIndex 为 0 的控制项,TabIndex 就变成了 1、而 1 的变成 2...依序 +1 改变。

     

  • 抱歉!评论已关闭.