|
Unabhängig davon, ob der ListIndex einer ComboBox oder einer ListBox durch Auswahl des Anwenders oder per Code erfolgt - es wird immer das Click-Ereignis ausgelöst, wenn sich der ListIndex geändert hat. Somit kann es unter Umständen wünschenswert sein, das Click-Ereignis zu unterdrücken, vor allem, wenn der ListIndex per Code voreingestellt werden soll, während nur die Auswahl durch den Anwender ein Click-Ereignis auslösen soll.
Mittels der Nachricht CB_SETCURSEL bzw. LB_SETCURSEL, die Sie über die API-Funktion SendMessage an eine ComboBox bzw. an eine ListBox senden, können Sie den ListIndex setzen, ohne dass ein Click-Ereignis ausgelöst wird:
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 Const CB_SETCURSEL = &H14E
Private Const LB_SETCURSEL = &H186
' ...
SendMessage Combo1.hwnd, CB_SETCURSEL, NeuerListIndex, 0&
' oder
SendMessage List1.hwnd, LB_SETCURSEL, NeuerListIndex, 0&
Wird bei einer Standard-ComboBox (Style = 0 - Dropdown-Kombinationsfeld) versucht, einen ungültigen ListIndex zu setzen, wird das Eingabefeld der ComboBox geleert und ihr ListIndex wird auf -1 (= keine Auswahl) gesetzt. Bei den anderen ComboBox-Stilen als auch bei einer ListBox wird ein Fehlversuch einfach ignoriert.
Falls Sie auf einen Fehlversuch auf eigene Weise reagieren möchten, müssen Sie die Gültigkeit des gewünschten ListIndex-Wertes selbst prüfen. Die beiden nachfolgenden Prozeduren ComboSetListIndex und ListSetListIndex können diese Prüfung vornehmen. Im optionalen Parameter ErrMode legen Sie fest, ob die Prüfung erfolgen soll, und wie reagiert werden soll. Voreingestellt ist cscsNoCheck - es erfolgt keine Prüfung. Geben Sie cscsRaiseErr an, wird der Laufzeitfehler 5 ausgelöst - sie können in einer Fehlerbehandlung entscheiden, was geschehen soll. Bei der Angabe cscsClearSel wird der ListIndex auf -1 gesetzt (was bei einer ComboBox zugleich die Leerung des Edit- bzw. Anzeigefeldes bewirkt).
Public Enum cblbSetCurSelErrMode
cscsNoCheck
cscsRaiseErr
cscsClearSel
End Enum
Public Sub ComboSetListIndex(ComboBox As ComboBox, _
ByVal ListIndex As Long, _
Optional ByVal ErrMode As cblbSetCurSelErrMode)
Const CB_SETCURSEL = &H14E
With ComboBox
Select Case ErrMode
Case cscsNoCheck
Case cscsRaiseErr, cscsClearSel
Select Case ListIndex
Case -1 To .ListCount - 1
Case Else
Select Case ErrMode
Case cscsRaiseErr
Err.Raise 5
Case cscsClearSel
.ListIndex = -1
End Select
End Select
Case Else
Err.Raise 5
End Select
SendMessage .hwnd, CB_SETCURSEL, ListIndex, 0&
End With
End Sub
Public Sub ListSetListIndex(ListBox As ListBox, _
ByVal ListIndex As Long, _
Optional ByVal ErrMode As cblbSetCurSelErrMode)
Const LB_SETCURSEL = &H186
With ListBox
Select Case ErrMode
Case cscsNoCheck
Case cscsRaiseErr, cscsClearSel
Select Case ListIndex
Case -1 To .ListCount - 1
Case Else
Select Case ErrMode
Case cscsRaiseErr
Err.Raise 5
Case cscsClearSel
.ListIndex = -1
End Select
End Select
Case Else
Err.Raise 5
End Select
SendMessage .hwnd, LB_SETCURSEL, ListIndex, 0&
End With
End Sub
|