Eigentlich ist es in
Windows nicht möglich, bei einem ComboBoxGadget zur Laufzeit umzuschalten zwischen änderbar und schreibgeschützt. Im englischen Forum hat netmaestro jedoch bereits
demonstriert, dass dies mit Einschränkungen doch möglich ist. Und Rashad hat im englischen Forum bereits
gezeigt, wie man in einer ComboBox vorgenommene Änderungen dann auch in der Ausklappliste sichtbar macht. Ich habe diese beiden Ansätze einmal im folgenden Beispiel zusammengefasst.
Die Einschränkung besteht darin, dass mit einem änderbaren ComboBoxGadget gearbeitet wird und bei Umschalten auf "Schreibgeschützt" lediglich eine Änderung verhindert wird, der Strich-Cursor aber trotzdem angezeigt wird. Um anzudeuten, dass eine Änderung zur Zeit nicht möglich ist, wird daher der Cursor als "Verboten"-Icon angezeigt, sobald er sich über einer "schreibgeschützten" ComboBox befindet.
Das folgende Beispiel funktioniert wegen der Verwendung von betriebssystemspezifischen API-Funktionen nur unter
Windows!
Code: Alles auswählen
EnableExplicit
Enumeration
#ComboBox
#CheckBoxEditEnabled
#CheckBoxEditDisabled
#Frame
EndEnumeration
Define CurrentItem.I
Define DefaultCallback.I
Define EditBox.I
Define i.I
Define SelectedItem.I
Procedure EditBoxCallback(WindowHandle.I, Msg.I, WParam.I, LParam.I)
Shared DefaultCallback.I
Select Msg
Case #EM_SETSEL, #WM_KEYDOWN, #WM_CHAR
If GetGadgetState(#CheckBoxEditDisabled)
ProcedureReturn 0
EndIf
Case #WM_SETCURSOR
If GetGadgetState(#CheckBoxEditDisabled)
SetCursor_(LoadCursor_(0, #IDC_NO))
ProcedureReturn #True
EndIf
EndSelect
ProcedureReturn CallWindowProc_(DefaultCallback, WindowHandle, Msg, WParam, LParam)
EndProcedure
OpenWindow(0, 100, 100, 200, 140, "ComboBox")
ComboBoxGadget(#ComboBox, 10, 10, WindowWidth(0) - 20, 21, #PB_ComboBox_Editable)
FrameGadget(#Frame, 10, 60, WindowWidth(0) - 20, 60, "Status der ComboBox")
OptionGadget(#CheckBoxEditDisabled, 25, GadgetY(#Frame) + 15, 100, 20, "Schreibgeschützt")
OptionGadget(#CheckBoxEditEnabled, 25, GadgetY(#Frame) + 35, 150, 20, "Kann abgeändert werden")
For i = 1 To 5
AddGadgetItem(#ComboBox, -1, "Eintrag " + Str(i))
Next
SetGadgetState(#ComboBox, 0)
SetGadgetState(#CheckBoxEditEnabled, #True)
EditBox = GetWindow_(GadgetID(#ComboBox), #GW_CHILD)
DefaultCallback = SetWindowLongPtr_(EditBox, #GWL_WNDPROC, @EditBoxCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #WM_CHAR
If EventwParam() = #CR
SetGadgetItemText(#ComboBox, SelectedItem, GetGadgetText(#ComboBox))
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #ComboBox
CurrentItem = GetGadgetState(#ComboBox)
If CurrentItem <> -1
SelectedItem = CurrentItem
EndIf
EndSelect
EndSelect
ForEver