Die Locked-Eigenschaft kennen Sie sicher von der TextBox her. Ist diese Eigenschaft auf True gesetzt, kann der Inhalt der TextBox nicht mehr durch Eingaben vom Anwender geändert oder von ihm gelöscht werden. Lediglich markieren und Kopieren ist möglich.
Da die ComboBox auch über eine Locked-Eigenschaft verfügt, wäre zu erwarten, dass diese Sperrmöglichkeit beim Eingabefeld einer ComboBox (Style = 0) genau so funktioniert. Im Prinzip ist das auch so. Nur hat die Sperre einen kleinen Haken. Die Visual Basic-Hilfe formuliert die Beschreibung zur Locked-Eigenschaft ein wenig anders als zur TextBox und sagt, dass die Daten nicht mehr geändert werden können. Der subtile Unterschied ist, dass dies wortwörtlich zu nehmen ist. Denn auch die Auswahl aus der nach wie vor aufklappbaren Liste ist nicht mehr möglich.
Da das Eingabefeld einer ComboBox jedoch nichts anderes als eine TextBox ist (ein Windows-Edit-Control), können Sie dieses separat über die Nachricht EM_SETREADONLY und die API-Funktion SendMessage sperren. Allerdings brauchen Sie dazu das Fenster-Handle dieser Combo-TextBox, das nicht mit dem aus der hWnd-Eigenschaft der ComboBox auslesbaren Fenster-Handle übereinstimmt. Sie können es aber mittels der API-Funktion FindWindowEx problemlos erhalten.
Die einfache Hilfsprozedur ComboLockEdit findet das Fenster-Handle der TextBox und setzt die Nachricht EM_SETREADONLY an die Combo-TextBox ab. Sie übergeben ihr im ersten Parameter die betreffende ComboBox, und im zweiten, optionalen Parameter legen Sie fest, ob die Eingabe gesperrt (True = Voreinstellung) oder freigegeben (False) werden soll.
Private Declare Function FindWindowEx Lib "user32" _
Alias "FindWindowExA" (ByVal hWndParent As Long, _
ByVal hWndChildAfter As Long, ByVal lpszClass As String, _
ByVal lpszWindow As String) As Long
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 EM_SETREADONLY = &HCF
Public Sub ComboLockEdit(Combo As ComboBox, _
Optional ByVal ReadOnly As Boolean = True)
Dim nWndEdit As Long
nWndEdit = FindWindowEx(Combo.hwnd, 0, "Edit", "")
SendMessage nWndEdit, EM_SETREADONLY, ReadOnly, ByVal 0&
End Sub
Wenn Sie eine ComboBox so sperren, erhalten Sie zudem eine leicht modifizierte Version einer ComboBox mit der Style-Einstellung 2. Denn bei dieser kann der Inhalt des Eingabefeldes nicht beliebig markiert und dann kopiert werden (und auch das dazu praktische Kontext-Menü fehlt).
Sie können auch beide Effekte kombinieren, den der Locked-Eigenschaft und den der Sperre des Eingabefeldes. Sie können nämlich auch Locked auf True setzen und somit die Auswahl aus der Liste sperren, aber zusätzlich über die Nachricht an die Combo-TextBox nur diese wieder zur Eingabe freigeben.
Die Kombination der beiden Einstell-Möglichkeiten nimmt die folgende Prozedur ComboLock vor. Sie übergeben dieser wieder die betreffende ComboBox und dazu eine Konstante aus de Enumeration ComboLockStateConstants.
Public Enum ComboLockStateConstants
clUnlocked
clLockEdit
clLockList
clLockBoth
End Enum
Public Sub ComboLock(Combo As ComboBox, _
Optional ByVal LockState As ComboLockStateConstants)
Dim nWndEdit As Long
Select Case LockState
Case clUnlocked
With Combo
.Locked = False
nWndEdit = FindWindowEx(.hwnd, 0, "Edit", "")
End With
SendMessage nWndEdit, EM_SETREADONLY, False, ByVal 0&
Case clLockEdit
With Combo
.Locked = False
nWndEdit = FindWindowEx(.hwnd, 0, "Edit", "")
End With
SendMessage nWndEdit, EM_SETREADONLY, True, ByVal 0&
Case clLockList
With Combo
.Locked = True
nWndEdit = FindWindowEx(.hwnd, 0, "Edit", "")
End With
SendMessage nWndEdit, EM_SETREADONLY, False, ByVal 0&
Case clLockBoth
With Combo
.Locked = True
nWndEdit = FindWindowEx(.hwnd, 0, "Edit", "")
End With
SendMessage nWndEdit, EM_SETREADONLY, True, ByVal 0&
Case Else
Err.Raise 380
End Select
End Sub
|