Seite 1 von 1

Das aktuelle Item eines Comboboxgadgets heruasfinden?

Verfasst: 27.01.2005 14:45
von Dostej
Ich habe folgendes Problem und keine Lösung...


Ich möchte, je nachdem welches Gadgets "aktiv" ist, soll der Eintrag, über dem sich die maus gerade befindet, zurückgegeben werden. Events gehen, aber die werden nicht dem gadget zugeordnet (ich vermute es sind maus-move-events)

Code: Alles auswählen

  If OpenWindow(0,0,0,270,140,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ComboBoxGadget") And CreateGadgetList(WindowID(0)) 
    ComboBoxGadget(0,10,10,250,100) 
    For a=1 To 5 : AddGadgetItem(0,-1,"ComboBox 0 item "+Str(a)) : Next 
    ComboBoxGadget(1,10,40,250,100) 
    For a=1 To 5 : AddGadgetItem(1,-1,"ComboBox 1 item "+Str(a)) : Next 
    Repeat
      Event = WaitWindowEvent()
      Debug "event"
      If Event = #PB_EventGadget ; Gadgets
        GadgetID = EventGadgetID()
        If GadgetID = 0
          
          Debug "stete 0: " + Str(GetGadgetState(1))
        EndIf
        If GadgetID = 1
          
          Debug "stete 1: " + Str(GetGadgetState(1))
        EndIf
      EndIf
    Until WaitWindowEvent()=#PB_Event_CloseWindow 
  EndIf 
  

Hat jemand ne Lösungsidee?

Und dann dazu noch ein Frage:
Gibt es eine Möglichkeit, herauszufinden, welches gadget gerade aktiv ist
sozusagen das Gegen-kommando zu ActivateGadget(#Gadget), so in der Form: GetAktivGadget()

Verfasst: 27.01.2005 15:08
von Leo

Code: Alles auswählen

  If OpenWindow(0,0,0,270,140,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ComboBoxGadget") And CreateGadgetList(WindowID(0)) 
    ComboBoxGadget(0,10,10,250,100) 
    For a=1 To 5 : AddGadgetItem(0,-1,"ComboBox 0 item "+Str(a)) : Next 
    ComboBoxGadget(1,10,40,250,100) 
    For a=1 To 5 : AddGadgetItem(1,-1,"ComboBox 1 item "+Str(a)) : Next 
    Repeat 
      Event = WaitWindowEvent() 
      If Event = #PB_EventGadget ; Gadgets 
        GadgetID = EventGadgetID() 
        Select GadgetID 
          Case 0  
            Debug "state 0: " + Str(GetGadgetState(0)+1)  ;!!!!!!! Hier hattest du bei GetGadgetState 1 angegeben :D
          Case 1 
            Debug "state 1: " + Str(GetGadgetState(1)+1) 
        EndSelect
      EndIf 
    Until Event = #WM_Quit ;!!!!!!!!! Doppeltes WaitWindowEvent kann nicht gut gehen ^^
  EndIf

Verfasst: 27.01.2005 15:13
von Dostej
Danke für den Tipp, aber der Code tut immer noch nicht was er soll. Wenn ich die Maus über der Itemliste bewege, wird nciht das aktuelle item angezeigt im debugger.

Verfasst: 27.01.2005 15:43
von Leo

Code: Alles auswählen

 If OpenWindow(0,0,0,270,140,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ComboBoxGadget") And CreateGadgetList(WindowID(0)) 
  ComboBoxGadget(0,10,10,250,100) 
  For a=1 To 5 : AddGadgetItem(0,-1,"ComboBox 0 item "+Str(a)) : Next 
  ComboBoxGadget(1,10,40,250,100) 
  For a=1 To 5 : AddGadgetItem(1,-1,"ComboBox 1 item "+Str(a)) : Next 
  Repeat 
    Event = WindowEvent() 
    Delay(10)
    Debug "state 1: " + Str(GetGadgetState(1)+1) 
    Debug "state 0: " + Str(GetGadgetState(0)+1)
  Until Event = #WM_Quit 
EndIf

Verfasst: 27.01.2005 15:55
von Dostej
Danke. So gehts.

Geht scheinbar nur so, das man die events dauernd abfragt. Es gibt praktisch keien Möglichkeit, das dauzgehörige Gadget direkt zu erkennen?

Verfasst: 27.01.2005 15:57
von ChaOsKid
hi Dostej,
ich hab leo's code mal etwas umgebaut :)

Code: Alles auswählen

If OpenWindow(0,0,0,270,140,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ComboBoxGadget") And CreateGadgetList(WindowID(0))
  ComboBoxGadget(0,10,10,250,100)
  For a=1 To 5 : AddGadgetItem(0,-1,"ComboBox 0 item "+Str(a)) : Next
  ComboBoxGadget(1,10,40,250,100)
  For a=1 To 5 : AddGadgetItem(1,-1,"ComboBox 1 item "+Str(a)) : Next
  oldState0 = GetGadgetState(0)
  oldState1 = GetGadgetState(1)
  Repeat
    event = WaitWindowEvent()
    State = GetGadgetState(0)
    If State <> oldState0
      Debug "state 0: " + Str(State+1)
      oldState0 = State
    EndIf
    State = GetGadgetState(1)
    If State <> oldState1
      Debug "state 1: " + Str(State+1)
      oldState1 = State
    EndIf
  Until event = #PB_Event_CloseWindow
EndIf 
mfG
Tobi

Verfasst: 27.01.2005 15:58
von Leo
Dostej hat geschrieben:Danke. So gehts.

Geht scheinbar nur so, das man die events dauernd abfragt. Es gibt praktisch keien Möglichkeit, das dauzgehörige Gadget direkt zu erkennen?
Entweder so wie ChaosCid es gepostet hat, oder mit nem Callback O_O

Verfasst: 27.01.2005 16:08
von Dostej
@Chaoskid - Vielen Dank - so hab ich mir das vorgestellt - bin aber selbst nicht draufgekommen. Manchmal bin ich ziemlich vernagelt.

@Leo
Nicht das ichs verwenden würde (dazu blick ich bei den Callbacks nichs durch) - aber interessieren würde es mich schon - eigentlich nur zum Verständnis. Wenn Du nen Code hast oder posten würdest, der das etwas erklärt, fände ich das klasse. (oder gar n tutorial zu callback...)

Immerhin gibt es ausser einem Danekschön auch nohc ne erwähnung in den Credits.

Verfasst: 27.01.2005 17:16
von Leo

Code: Alles auswählen

;
;Mini-WindowCallback ^^
;Von Leonard Dahlmann
;

;##########################################################################################
;Diese Funktion wird von Windows bei jedem Ereignis aufgerufen, und zwar mit den Parametern
;hwnd (auf welchem fenster war das event?), 
;msg (was ist passiert?), 
;wparam (weiter informationen, was passiert ist),
;lparam (das gleiche wie wparam)
Procedure WindowCallback(hwnd,msg,wparam,lparam)
  Result = #PB_ProcessPureBasicEvents  
  Shared Old.l
  ;Jetz verarbeiten wir die Informationen
  Select msg
    Case #WM_CLOSE
      ;Der Benutzer hat auf das Kreuz gedrückt ;)
      End 
    Case #WM_SIZE
      ;Die Fenstergröße wurde verändert
      Debug "Window Resize"
      ;Hier könnte man z.B. die Größe von Gadgets
      ;anpassen
    Case #WM_MOVE
      ;Das Fenster wurde bewegt
      Debug "Window Move"
      ;Was man hier machen könnte weiß ich nich ^^
    Default
      ;Status des Gadgets debuggen
      State = GetGadgetState(0)
      If State <> -1 And Old <> State 
        Debug "ComboBox: "+Str(State)
        Old = State 
      EndIf
  EndSelect
  ProcedureReturn Result
EndProcedure

;###########################################################################################
;Fenster öffnen
hwnd = OpenWindow(0,0,0,400,300,#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget,"Callback ^^")
CreateGadgetList(hwnd)
ComboBoxGadget(0,10,10,200,100)
For I = 0 To 10 : AddGadgetItem(0,-1,"Position: "+Str(I)) : Next 

;Da Windows ja wissen muss, an welche Procedur die Nachrichten geschickt werden, 
;müssen wir folgendes machen:
SetWindowCallback(@WindowCallback());Pointer auf die Callback Funktion

;###########################################################################################
;Das Callback braucht man eigentlich nur für spezielle Sachen, wie Button-Colorisieren, 
;deswegen erledigt man sachen wie fenster schließen eigentlich immer in der Haupt-Schleife,
;doch weil es hier um callbacks geht, fangen wir alle events im callback ab.

;Wir müssen eine Endlosschleife machen, weil wir das Programm "am leben erhalten" wollen.
;Die ganzen Events werden jetzt vom Callback verarbeitet. (WaitWindowEvent() sendet das akt-
;uelle Event automatisch an das oben definierte WindowCallback)

While WaitWindowEvent():Wend 

;Ansonsten würde man ganz normal schreiben
;##
;Repeat
; Event=WaitWindowEvent()
; Select Event
; ...
;Until Quit
;##
;Und nur spezielle Sachen vom Callback verarbeiten lassen.


;Was hab ich heute gelernt?
;1.Schlechten Code-Stil
;2.Schlechtes Wörter-Tr-
;ennen
;3.Wie man Callbacks am sc-
;hlechtesten einsetzt O__O
Eigentlich braucht man hier kein Callback, doch es ist immer gut, zu wissen was das ist ^^

Sind bestimmt noch Fehler im Code drin...

Verfasst: 27.01.2005 18:13
von Dostej
Vielen Dank - das finde ich wirklich nett
Ich denke ich hab das grundsätzlich verstanden. (ob ichs selbst hinbringen würde, keine Ahnung - vermutlich nur mit viel probieren)
;Was hab ich heute gelernt?
;1.Schlechten Code-Stil
;2.Schlechtes Wörter-Tr-
;ennen
;3.Wie man Callbacks am sc-
;hlechtesten einsetzt O__O
Ich habe heute gelernt:
1. Manchmal sehe ich naheliegende Lösungen nicht
2. Den grundsätzlichen Einsatz von Callbacks (bisher waren das Angstgegner und auch Gegenstand von bewunderung für die die damit umgehen konnten...)