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. :allright:

Re: "Reichweite" des DateGadgets

Verfasst: 19.12.2015 00:57
von Kurzer
Nee doch nicht... :cry:

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! :allright: Vielen Dank.
Der Bugreport im englischen Forum wird sogleich geschlossen bzw. aufgeklärt - evtl. möchte das Beispiel ja noch jemand nutzen?