Seite 3 von 3
Re: "Reichweite" des DateGadgets
Verfasst: 19.12.2015 00:04
von Kurzer
Damit geht es... fast.

Allerdings nur bis ich die Doppelte-Datumsunterdrückung wieder rausnehme.
Offenbar feuert das DateGadget regulär auch zweimal das Change Event. Einmal, wenn man im aufgeklappten Monatskalender ein Datum gewählt hat und einmal, wenn das zugehörige DateGadget mit dem soeben ausgewählten Datum aktualisiert wird. Okay, dann scheint das normales Verhalten zu sein.
Ich denke, ich habe nun alle Infos die ich brauche. Danke.

Re: "Reichweite" des DateGadgets
Verfasst: 19.12.2015 00:57
von Kurzer
Nee doch nicht...
Kann es sein, dass BindEvent nicht mit Userdefinierten Events umgehen kann? Oder liegt es an was anderem, dass ich hier beim rumklicken auf den Gadgets nicht den String "Geht!" zu lesen bekomme?
Die beiden anderen Debugausgaben kommen direkt aus dem Callback.
Code: Alles auswählen
EnableExplicit
#PB_EventType_Calendar_Change = #PB_Event_FirstCustomValue + #PB_EventType_Change
Procedure.l Callback(iWindowHandle.i, iMessage.i, wParam.i, lParam.l)
Protected *NMHDR.NMHDR
If iMessage = #WM_NOTIFY
*NMHDR = lParam
If GadgetType(*NMHDR\idFrom) = #PB_GadgetType_Calendar And *NMHDR\code = #MCN_FIRST + 1 ; = #MCN_SELCHANGE
PostEvent(#PB_Event_Gadget, GetParent_(*NMHDR\hwndFrom), *NMHDR\idFrom, #PB_EventType_Calendar_Change)
Debug "Calendar"
ElseIf GadgetType(*NMHDR\idFrom) = #PB_GadgetType_Date And *NMHDR\code = #DTN_DATETIMECHANGE
PostEvent(#PB_Event_Gadget, GetParent_(*NMHDR\hwndFrom), *NMHDR\idFrom, #PB_EventType_Calendar_Change)
Debug "Date"
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure GetDate()
Debug "Geht!"
EndProcedure
If OpenWindow(0, 2300, 200, 480, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
DateGadget(0, 250, 10, 120, 20, "%dd %mm %yyyy", Date())
CalendarGadget(1, 10, 10, 230, 180)
ButtonGadget(5, 250, 40, 120, 25, "GetDates")
EditorGadget(6, 250, 80, 220, 110, #PB_Editor_ReadOnly)
SetWindowCallback(@Callback())
BindGadgetEvent(0, @GetDate(), #PB_EventType_Calendar_Change)
BindGadgetEvent(1, @GetDate(), #PB_EventType_Calendar_Change)
BindGadgetEvent(5, @GetDate(), #PB_EventType_LeftClick)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
SetWindowCallback(0)
EndIf
Re: "Reichweite" des DateGadgets
Verfasst: 19.12.2015 01:11
von RSBasic
Sieht so aus. Ansonsten lass den letzten Parameter einfach weg.
Re: "Reichweite" des DateGadgets
Verfasst: 19.12.2015 18:08
von edel
Kann es sehr wohl, euer Code nur ist falsch. PostEvent erwartet kein Windowshandle sondern eine PBID. Also statt GetParent_() sollte dort GetDlgCtrlID_(iWindowHandle) oder GetWindowlongPtr_ mit #gwlp_id stehen.
Re: "Reichweite" des DateGadgets
Verfasst: 19.12.2015 18:20
von RSBasic
Du hast recht, edel.
Ich habe den Code von Kurzer nicht genauestens überprüft und habe es 1:1 übernommen.
Hier die angepasste Version:
Code: Alles auswählen
EnableExplicit
#PB_EventType_Calendar_Change = #PB_Event_FirstCustomValue + #PB_EventType_Change
Procedure.l Callback(iWindowHandle.i, iMessage.i, wParam.i, lParam.l)
Protected *NMHDR.NMHDR
If iMessage = #WM_NOTIFY
*NMHDR = lParam
If GadgetType(*NMHDR\idFrom) = #PB_GadgetType_Calendar And *NMHDR\code = #MCN_FIRST + 1 ; = #MCN_SELCHANGE
PostEvent(#PB_Event_Gadget, GetProp_(GetParent_(*NMHDR\hwndFrom), "PB_WINDOWID")-1, GetProp_(*NMHDR\hwndFrom, "PB_ID"), #PB_EventType_Calendar_Change)
Debug "Calendar"
ElseIf GadgetType(*NMHDR\idFrom) = #PB_GadgetType_Date And *NMHDR\code = #DTN_DATETIMECHANGE
PostEvent(#PB_Event_Gadget, GetProp_(GetParent_(*NMHDR\hwndFrom), "PB_WINDOWID")-1, GetProp_(*NMHDR\hwndFrom, "PB_ID"), #PB_EventType_Calendar_Change)
Debug "Date"
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure GetDate()
Debug "Geht!"
EndProcedure
If OpenWindow(5, 2300, 200, 480, 200, "Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
DateGadget(0, 250, 10, 120, 20, "%dd %mm %yyyy", Date())
CalendarGadget(1, 10, 10, 230, 180)
ButtonGadget(5, 250, 40, 120, 25, "GetDates")
EditorGadget(6, 250, 80, 220, 110, #PB_Editor_ReadOnly)
SetWindowCallback(@Callback())
BindGadgetEvent(0, @GetDate(), #PB_EventType_Calendar_Change)
BindGadgetEvent(1, @GetDate(), #PB_EventType_Calendar_Change)
BindGadgetEvent(5, @GetDate(), #PB_EventType_LeftClick)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
SetWindowCallback(0)
EndIf
@Kurzer
Deinen Bug-Thread kannst du also schließen.
Re: "Reichweite" des DateGadgets
Verfasst: 19.12.2015 18:32
von Kurzer
Leute ihr seid super!

Vielen Dank.
Der Bugreport im englischen Forum wird sogleich geschlossen bzw. aufgeklärt - evtl. möchte das Beispiel ja noch jemand nutzen?