| VB问题全功略(13) [查找本页请按Ctrl+F] |
| 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 |
|
[木瓜软件工作室] 整理 |