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...)