|
|
|
VB问题全功略(13) |
[上一页](13)[下一页] |
61、若画面上
ListBox 中可显示的项目数量为 5 条,而 ListBox 中的资料总数已超过 5 条,如何让新加入 ListBox 的项目能够马上显示在
ListBox 的最后一条〈画面上显示最后 5 条,含新加入之资料〉? 62、如何事先选定
ListBox 或 ComboBox 的某一个 Item? 63、模拟 IE 的
地址栏:智慧型下拉式 Combo 64、如何让 ListBox
同一列显示二栏以上的栏位? 65、如何控制二栏以上
ListBox 之各栏位宽度?
61、若画面上 ListBox 中可显示的项目数量为
5 条,而 ListBox 中的资料总数已超过 5 条,如何让新加入 ListBox 的项目能够马上显示在 ListBox
的最后一条〈画面上显示最后 5 条,含新加入之资料〉?
使用 TopIndex 配合
ListCount 属性即可,而且不会更改原来的选取状态。
List1.AddItem "xxx" 'xxx
指新加入之资料 List1.TopIndex = List1.ListCount - n 'n=5 就是画面上 ListBox
可看到的条数
62、如何事先选定 ListBox 或 ComboBox 的某一个
Item?
有二个方法:
方法1: 使用 For Loop 一一比对,再设定
ListIndex 即可,只是项目多时比方法2慢。例如: Dim i As Integer For i = 0 To
List1.ListCount - 1 If List1.List(i) = "搜寻的字串" Then List1.ListIndex
= i Exit For End If Next
方法2: '16位版本: Declare Function
SendMessage Lib "User" (ByVal hWnd As Integer, ByVal wMsg As Integer,
ByVal wParam As Integer, lParam As Any) As Long Const WM_USER =
&H400 Const LB_SELECTSTRING = (WM_USER + 13) Const
CB_SELECTSTRING = (WM_USER + 13) '32 位版本: ( Integer 改成 Long
) Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As
Long Const WM_USER = &H400 Const LB_SELECTSTRING =
&H18C Const CB_SELECTSTRING = &H14D
Sub
SelectListItem(lst As Control, Idx As String) Dim i As Long If
TypeOf lst Is ComboBox Then i = SendMessage(lst.hwnd, CB_SELECTSTRING,
-1, ByVal Idx) Else i = SendMessage(lst.hwnd, LB_SELECTSTRING, -1,
ByVal Idx) End If End Sub 在必要的时候,例如 Form_Load,只要 call
SelectListItem(ControlName, StringToFind) 即可,不管是 ListBox 或
Combobox,本范例都适用。
63、模拟 IE 的
地址栏:智慧型下拉式 Combo
不知您是否有注意到?您在 IE
的地址栏直接输入地址的时候,如果您输入的地址前面几位和下拉式 Combo 中现存的地址相同时,IE 便会自动带出该地址资料放在 Combo 的
Text 框中,而且这串字有一个特性,在滑鼠游标之前的字是未选定反白的,而在滑鼠游标之后的字则是已经选定反白的,它的目的有二个: 1.
如果您要输入的整串字和它带出的字完全一样,就可以不用再输入,可以节省时间。 2.
如果您要输入的整串字和它带出的字不一样,您还是可以继续输入,继续输入的字串会自动取代后面那串已经选定反白的字串。
以下的范例,只处理英文字,若要处理其他情形如数字,请自行略加更改,请先在
Form1 中放一个 Combo,然后将以下程式直接 Copy 进去即可:
Dim strCombo As
String Const WM_SETREDRAW = &HB Const KEY_A = 65 Const KEY_Z
= 90
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
Private Sub combo1_KeyUp(KeyCode As
Integer, Shift As Integer) Dim x% Dim strTemp$ Dim
nRet&
If KeyCode >= KEY_A And KeyCode <= KEY_Z
Then 'only look at letters A-Z strTemp = Combo1.Text If
Len(strTemp) = 1 Then strCombo = strTemp nRet& =
SendMessage(Combo1.hwnd, WM_SETREDRAW, False, 0&) For x = 0 To
(Combo1.ListCount - 1) If UCase((strTemp & Mid$(Combo1.List(x),
Len(strTemp) + 1))) = UCase(Combo1.List(x)) Then Combo1.ListIndex =
x Combo1.Text = Combo1.List(x) Combo1.SelStart =
Len(strTemp) Combo1.SelLength = Len(Combo1.Text) -
(Len(strTemp)) strCombo = strCombo & Mid$(strTemp, Len(strCombo) +
1) Exit For Else If InStr(UCase(strTemp), UCase(strCombo))
Then strCombo = strCombo & Mid$(strTemp, Len(strCombo) +
1) Combo1.Text = strCombo Combo1.SelStart =
Len(Combo1.Text) Else strCombo = strTemp End If End
If Next nRet& = SendMessage(Combo1.hwnd, WM_SETREDRAW, True,
0&) End If End Sub
Private Sub
Form_Load() Combo1.AddItem "AAAAAAAA" Combo1.AddItem
"ABBBBBBB" Combo1.AddItem "ABCCCCCC" Combo1.AddItem
"ABCDDDDD" Combo1.AddItem "ABCDEEEE" Combo1.AddItem
"ABCDEFFF" Combo1.AddItem "ABCDEFGG" Combo1.AddItem
"ABCDEFGH" End Sub
64、如何让 ListBox
同一列显示二栏以上的栏位?
要让 ListBox
显示二栏以上,有很多方法:
有人用二个字串中间加上空白来
AddItem,但是这样有一个很大的缺点,就是第二栏常常无法对齐!有人说可以加上 Format
来强迫留白,以便对齐,但是这些方法都比较麻烦,没有效率!
有一个很简单,又保证不用伤脑筋就可以对 的方法,就是使用
vbTab!作法如下:
lstMyListBox.AddItem "0001" & vbTab & "王一"
& vbTab & "广州市" lstMyListBox.AddItem "0002" & vbTab &
"丁二" & vbTab & "上海市" lstMyListBox.AddItem "0003" & vbTab
& "张三" & vbTab & "北京市" lstMyListBox.AddItem "0004" &
vbTab & "李四" & vbTab & "重庆市"
65、如何控制二栏以上 ListBox 之各栏位宽度?
使用
vbTab 来设定 ListBox 的多栏显示,效果不错,但是若以 vbTab 来做,每栏长度是固定的,只有
8,我的资料有些字串很长,有些很短,如果可以逐栏设定宽度,那就太完美了!但是单用 VB 的基本函数,是做不到的!不过我们可以 Call
API:
假设要放到 ListBox 的资料有四个栏位,如下: 1、员工编号 (长度为6) 2、员工姓名
(长度为6) 3、员工住址 (长度为38) 4、员工性别 [长为4]
Const LB_SETTABSTOPS =
&H192 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
Sub SetListTabStops(iListHandle As
Long) ' 设定四个栏位, 长度各为 6,6,38,4 ' iListHandle = the window handle of
the list box Dim iNumColumns As Long Dim iListTabs(3) As Long Dim
Ret As Long iNumColumns = 4 iListTabs(0) = 24 ' 24/4 = 6
(第1-第6字节) iListTabs(1) = 48 ' 48/4 = 12 (第7-第12字节) iListTabs(2) =
200 ' 200/4 = 50 (第13-第50字节) iListTabs(3) = 216 ' 216/4 = 54
(第51-第54字节) Ret = SendMessage(iListHandle, LB_SETTABSTOPS,
_ iNumColumns, iListTabs(0)) End Sub
Private Sub
Form_Load() Call SetListTabStops(List1.hwnd) List1.AddItem "0001"
& vbTab & "王一" & vbTab & "广州市市体育东路二段120巷176号" & vbTab
& "男" List1.AddItem "0002" & vbTab & "丁二" & vbTab &
"北京市中关村路100号" & vbTab & "男" List1.AddItem "0003" & vbTab
& "张三" & vbTab & "上海市中山路150巷26号" & vbTab &
"女" List1.AddItem "0004" & vbTab & "李四" & vbTab &
"重庆市福州路99号" & vbTab & "男" End
Sub |
|