ComboboxGadget zur Laufzeit Editierbar machen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Cläusel
Beiträge: 25
Registriert: 14.08.2010 21:26
Computerausstattung: PB5.73 Win10 64bit
Wohnort: Oberland

ComboboxGadget zur Laufzeit Editierbar machen

Beitrag von Cläusel »

Hallo Zusammen

Kann ich ein ComboboxGadget zur Laufzeit Editierbar machen?
(#PB_Combobox_Editable)
Habs Probiert mit:
FreeGadget() und dann das ComboboxGadget mit dem #PB_Combobox_Editable Flag
neu zu erstellen aber dann stimmt der TAB-Index nicht mehr :o(

Beste Grüße
Cläusel
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: ComboboxGadget zur Laufzeit Editierbar machen

Beitrag von RSBasic »

Du könntest zwei ComboBoxGadgets erstellen, einmal mit und einmal ohne Edit-Flag und zeigst die jeweilige ComboBox an.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Shardik
Beiträge: 752
Registriert: 25.01.2005 12:19

Re: ComboboxGadget zur Laufzeit Editierbar machen

Beitrag von Shardik »

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
Antworten