VERSION 5.00
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   5835
   ClientLeft      =   60
   ClientTop       =   450
   ClientWidth     =   4635
   LinkTopic       =   "Form1"
   ScaleHeight     =   5835
   ScaleWidth      =   4635
   StartUpPosition =   3  'Windows Default
   Begin VB.ListBox lstRev 
      Height          =   2790
      Left            =   1920
      TabIndex        =   3
      Top             =   600
      Visible         =   0   'False
      Width           =   1335
   End
   Begin VB.TextBox Text1 
      Height          =   375
      Left            =   1920
      TabIndex        =   2
      Top             =   120
      Width           =   2535
   End
   Begin VB.ListBox lstFull 
      Height          =   5325
      Left            =   120
      Sorted          =   -1  'True
      TabIndex        =   1
      Top             =   120
      Width           =   1695
   End
   Begin VB.ListBox lstPart 
      Height          =   5325
      Left            =   120
      Sorted          =   -1  'True
      TabIndex        =   0
      Top             =   120
      Width           =   1695
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
    ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Any) As Long
    
Private Const LB_FINDSTRING = &H18F

Private lIndex(25) As Long

Private Sub GenerateList()
    Dim N As Long, I As Long, lChar As Long, sText As String
    For N = 0 To 10000
        For I = 0 To Int(5 * Rnd) + 4
            sText = sText & Chr$(Int(26 * Rnd) + 65)
        Next I
        lstFull.AddItem StrConv(sText, vbProperCase)
        sText = vbNullString
    Next N
    lChar = 90
    For N = lstFull.ListCount - 1 To 0 Step -1
        If Asc(lstFull.List(N)) < lChar Then
            lIndex(lChar - 65) = (N + 1) Mod lstFull.ListCount
            lChar = Asc(lstFull.List(N))
        End If
        lstRev.AddItem lstFull.List(N)
    Next N
End Sub

Private Sub Form_Load()
    GenerateList
End Sub

Private Sub Text1_Change()
    Dim lAsc As Long, lStart As Long, lEnd As Long
    Dim sText As String
    
    If Trim$(Text1.Text) = vbNullString Then lstFull.ZOrder: Exit Sub
    
    sText = UCase$(Trim$(Text1.Text))
    
    lAsc = Asc(sText)
    lStart = lIndex(lAsc - 65)
    
    lstPart.Clear
    If (lStart = 0) And Not (lAsc = 65) Then
        lstPart.AddItem "No Matches"
    Else
        For lAsc = lAsc + 1 To 90
            If lIndex(lAsc - 65) > 0 Then lEnd = lIndex(lAsc - 65) - 1: Exit For
        Next
        If lAsc > 90 Then lEnd = lstFull.ListCount - 1
        
        lStart = SendMessage(lstFull.hwnd, LB_FINDSTRING, lStart - 1, ByVal sText)
        If lStart > -1 Then
              For lAsc = lStart To lstRev.ListCount - SendMessage(lstRev.hwnd, LB_FINDSTRING, lstRev.ListCount - lEnd - 2, ByVal sText) - 1
                lstPart.AddItem lstFull.List(lAsc)
            Next lAsc
        Else
            lstPart.AddItem "No Matches"
        End If
    End If
    lstPart.ZOrder
End Sub
