Page 1 sur 1

problème avec #PB_Any

Publié : ven. 12/déc./2025 17:42
par Francois
Bonjour,

Ci-dessous le code source d’un petit programme me permettant de tester le CallBack. (PureBasic 6.21 (Windows - x64) sous Windows 10 22H2)
J’ai généré avec le concepteur de fenêtre une fenêtre avec une ListIconGadget. Pour des raisons de débogage, j’ai copié le code généré par le concepteur de fenêtre directement dans le source.

Je comprends de votre documentation (qui est très bien faite) que pour un Gadget comme ListIconGadget, si l’on utilise « #PB_Any » alors la valeur de retour est le numéro d'identification du gadget, généré automatiquement.
Sur la ligne 12 :

Code : Tout sélectionner

ListIcon_Test = ListIconGadget(#PB_Any, 10, 50, 570, 260, "Column 1", 100)
il y a bien « #PB_Any ».
Malheureusement le debug indique que Le ListIconGadget n’utilise pas la valeur de la variable « ListIcon_Test »
Window_Test = 1851162091264
ListIcon_Test = 1851162091488
hdr\idFrom = 0 / wParam = 0
hdr\idFrom = 31186912 / wParam = 31186912
hdr\idFrom = 31186912 / wParam = 31186912
hdr\idFrom = 31186912 / wParam = 31186912
hdr\idFrom = 31186912 / wParam = 31186912

hdr\idFrom = 0 / wParam = 0
Si je transforme cette même ligne 12 en forçant le numéro d’identification du gadget :

Code : Tout sélectionner

ListIcon_Test = ListIconGadget(25, 10, 50, 570, 260, "Column 1", 100)
Le debug indique que le ListIconGadget utilise bien la valeur « 25 »
Window_Test = 2428747833088
ListIcon_Test = 209974
hdr\idFrom = 0 / wParam = 0
hdr\idFrom = 25 / wParam = 25
hdr\idFrom = 25 / wParam = 25
hdr\idFrom = 25 / wParam = 25
hdr\idFrom = 25 / wParam = 25

hdr\idFrom = 0 / wParam = 0
Mais peut-être, ai-je loupé quelque chose ?
Merci par avance pour votre retour.
Cordialement,

---> Début source

Code : Tout sélectionner

Declare.l WinCallback(hWnd, uMsg, wParam, lParam)
;XIncludeFile "Window_Test.pbf"

; *** DEBUT copie depuis le concepteur de fenêtre ***
Global Window_Test

Global ListIcon_Test


Procedure OpenWindow_Test(x = 0, y = 0, width = 600, height = 400)
  Window_Test = OpenWindow(#PB_Any, x, y, width, height, "Petit test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIcon_Test = ListIconGadget(#PB_Any, 10, 50, 570, 260, "Column 1", 100)
EndProcedure

Procedure Window_Test_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

; *** FIN copie depuis le concepteur de fenêtre ***

OpenWindow_Test()
SetWindowCallback(@WinCallback()) ;, Window_Principal, #PB_Window_NoChildEvents)

Debug "Window_Test = " + Str(Window_Test)
Debug "ListIcon_Test = " + Str(ListIcon_Test)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      MessageRequester("test", "Sorti par la fenêtre !")
      End
      
  EndSelect
  
ForEver

End

Procedure.l WinCallback(hWnd, uMsg, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  
  Select uMsg
    Case #WM_NOTIFY
      *hdr.NMHDR = lParam
      Debug "hdr\idFrom = " + Str(*hdr\idFrom) + " / wParam = " + Str(wParam)
  EndSelect
  
  ProcedureReturn Result
EndProcedure
<--- Fin source

Re: problème avec #PB_Any

Publié : ven. 12/déc./2025 17:54
par Fred
Le probleme c'est que les champs dans NMHDR sont les DWORD (32-bit), or l'ID PB est 64-bit (c'est un pointeur). Pour corriger ca, il faut utiliser soit GetWindowLongPtr_() avec #GWL_ID, soit GetProp_() avec "PB_ID":

Code : Tout sélectionner

Declare.l WinCallback(hWnd, uMsg, wParam, lParam)
;XIncludeFile "Window_Test.pbf"

; *** DEBUT copie depuis le concepteur de fenêtre ***
Global Window_Test

Global ListIcon_Test


Procedure OpenWindow_Test(x = 0, y = 0, width = 600, height = 400)
  Window_Test = OpenWindow(#PB_Any, x, y, width, height, "Petit test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ListIcon_Test = ListIconGadget(#PB_Any, 10, 50, 570, 260, "Column 1", 100)
EndProcedure

Procedure Window_Test_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False

    Case #PB_Event_Menu
      Select EventMenu()
      EndSelect

    Case #PB_Event_Gadget
      Select EventGadget()
      EndSelect
  EndSelect
  ProcedureReturn #True
EndProcedure

; *** FIN copie depuis le concepteur de fenêtre ***

OpenWindow_Test()
SetWindowCallback(@WinCallback()) ;, Window_Principal, #PB_Window_NoChildEvents)

Debug "Window_Test = " + Str(Window_Test)
Debug "ListIcon_Test = " + Str(ListIcon_Test)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      MessageRequester("test", "Sorti par la fenêtre !")
      End
      
  EndSelect
  
ForEver

End

Procedure.l WinCallback(hWnd, uMsg, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  
  Select uMsg
    Case #WM_NOTIFY
      *hdr.NMHDR = lParam
      Debug "hdr\idFrom = " + Str(*hdr\idFrom) + " / wParam = " + Str(wParam)
      Debug "id = " + GetWindowLongPtr_(*hdr\hwndFrom, #GWL_ID)
      Debug "id = " + GetProp_(*hdr\hwndFrom, "PB_ID")
  EndSelect
  
  ProcedureReturn Result
EndProcedure

Re: problème avec #PB_Any

Publié : ven. 12/déc./2025 18:39
par Francois
Merci beaucoup pour votre réactivité, cela fonctionne parfaitement.