"Reichweite" des DateGadgets

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: "Reichweite" des DateGadgets

Beitrag 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:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: "Reichweite" des DateGadgets

Beitrag 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
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag von RSBasic »

Sieht so aus. Ansonsten lass den letzten Parameter einfach weg.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: "Reichweite" des DateGadgets

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: "Reichweite" des DateGadgets

Beitrag 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?
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Antworten