Je voudrais raccourcir mon programme en supprimant les actions du genre :
car s'il y a un grand nombre d'interrupteurs, ça devient vite un listing style roman.Case Interrupteur1
If GetGadgetState(Interrupteur1)
SetGadgetText(Texte1, "Ouvert")
Else
SetGadgetText(Texte1, "Fermé")
EndIf
Case Interrupteur2
If GetGadgetState(Interrupteur2)
SetGadgetText(Texte2, "Ouvert")
Else
SetGadgetText(Texte2, "Fermé")
EndIf
J'avais pensé à mettre dans ma structure MonGadget l'information Texte.s et selon l'état du gadget on change la valeur de Texte, soit "Ouvert" ou "Fermé", mais je tourne en rond sans trouver la solution, donc voici mon code d'origine:
Code : Tout sélectionner
;Interrupteurs
Structure PB_Interrupteur
Type.l
Taille.l
Rappel.i
Liberation.i
ObtenirEtat.i
DefinirEtat.i
EndStructure
ImportC ""
PB_Event_AddWithData(a,b,c,d,e,f)
EndImport
; Faites vos propres constantes
Enumeration
#CHANGER_ETAT = #WM_USER
#OBTENIR_ETAT
#DEFINIR_ETAT
EndEnumeration
Structure Rect2
Gauche.l
Haut.l
Droite.l
Bas.l
EndStructure
Structure MonGadget
IdGadget.i
AncProc.i
Etat.i
Couleur.i
EndStructure
Global.s Texte
Procedure Interrupteur__ObtenirEtat(*IdGadget.integer)
ProcedureReturn SendMessage_(*IdGadget\i, #OBTENIR_ETAT, 0, 0)
EndProcedure
Procedure Interrupteur__DefinirEtat(*IdGadget.integer, Etat)
SendMessage_(*IdGadget\i, #DEFINIR_ETAT, 0, Etat)
EndProcedure
Procedure MonGadgetProc(hWnd, Msg, wParam, lParam)
Protected *mg.MonGadget = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
Protected x , y, hdc, rect.Rect2
Protected Proc
proc = *mg\AncProc
If Msg = #WM_PAINT
hdc = StartDrawing(CanvasOutput(*mg\IdGadget))
If *mg\Etat = 0
*mg\Couleur = $7779E9
Else
*mg\Couleur = $9CE3AA
EndIf
Box(0, 0, GadgetWidth(*mg\IdGadget), GadgetHeight(*mg\IdGadget), *mg\Couleur)
Rect\Droite = GadgetWidth(*mg\IdGadget)
Rect\Bas = GadgetHeight(*mg\IdGadget)
DrawEdge_(hdc, Rect, #BDR_SUNKENINNER, #BF_RECT)
If *mg\Etat = 0
Rect\Droite = GadgetWidth(*mg\IdGadget) / 2
Else
Rect\Gauche = GadgetWidth(*mg\IdGadget) / 2
Rect\Droite = GadgetWidth(*mg\IdGadget) / 2 + Rect\Gauche
EndIf
Rect\Gauche + 1
Rect\Haut = 1
Rect\Bas - 1
DrawFrameControl_(hdc, Rect, #DFC_BUTTON, #DFCS_BUTTONPUSH)
StopDrawing()
EndIf
If Msg = #OBTENIR_ETAT
ProcedureReturn *mg\Etat
EndIf
If Msg = #DEFINIR_ETAT
*mg\Etat = lparam
SendMessage_(hWnd, #WM_PAINT, 0, 0)
EndIf
If Msg = #WM_LBUTTONUP
*mg\Etat ! 1
PB_Event_AddWithData($332C, *mg\IdGadget, 0, #PB_EventType_Change, 0, 0)
SendMessage_(hWnd, #WM_PAINT, 0, 0)
EndIf
If Msg = #WM_DESTROY
SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, proc)
FreeMemory(*mg)
EndIf
ProcedureReturn CallWindowProc_(Proc, hWnd, Msg, wParam, lParam)
EndProcedure
Procedure MonGadget(id, x, y, largeur, hauteur)
Protected gadget
Protected *mg.MonGadget
Protected *Interrupteur.PB_Interrupteur
*mg = AllocateMemory(SizeOf(MonGadget))
gadget = CanvasGadget(id, x, y, largeur, hauteur, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
If id = #PB_Any
*mg\IdGadget = gadget
Else
*mg\IdGadget = id
EndIf
;Stocker des données dans le gadget
SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_USERDATA, *mg)
;Rappel
*mg\AncProc = SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_WNDPROC, @MonGadgetProc())
;Ensemble de ObtenirEtat et DefinirEtat
*Interrupteur = PeekI(IsGadget(*mg\IdGadget) + SizeOf(Integer))
*Interrupteur\ObtenirEtat = @Interrupteur__ObtenirEtat()
*Interrupteur\DefinirEtat = @Interrupteur__DefinirEtat()
ProcedureReturn gadget
EndProcedure
;TEST
Procedure Principale()
Protected window
Protected gadget
Protected event
Fenetre = OpenWindow(#PB_Any, 0, 0, 320, 260, "Interrupteurs", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
Interrupteur1 = MonGadget(#PB_Any, 10, 10, 70, 40)
Interrupteur2 = MonGadget(#PB_Any, 10, GadgetY(Interrupteur1)+GadgetHeight(Interrupteur1)+10, 70, 40)
Interrupteur3 = MonGadget(#PB_Any, 10, GadgetY(Interrupteur2)+GadgetHeight(Interrupteur2)+10, 70, 40)
Interrupteur4 = MonGadget(#PB_Any, 10, GadgetY(Interrupteur3)+GadgetHeight(Interrupteur3)+10, 70, 40)
Interrupteur5 = MonGadget(#PB_Any, 10, GadgetY(Interrupteur4)+GadgetHeight(Interrupteur4)+10, 70, 40)
Interrupteur6 = MonGadget(#PB_Any, GadgetX(Interrupteur1)+150, GadgetY(Interrupteur1), 70, 40)
Interrupteur7 = MonGadget(#PB_Any, GadgetX(Interrupteur2)+150, GadgetY(Interrupteur6)+GadgetHeight(Interrupteur6)+10, 70, 40)
Interrupteur8 = MonGadget(#PB_Any, GadgetX(Interrupteur3)+150, GadgetY(Interrupteur7)+GadgetHeight(Interrupteur7)+10, 70, 40)
Interrupteur9 = MonGadget(#PB_Any, GadgetX(Interrupteur4)+150, GadgetY(Interrupteur8)+GadgetHeight(Interrupteur8)+10, 70, 40)
Interrupteur10 = MonGadget(#PB_Any, GadgetX(Interrupteur5)+150, GadgetY(Interrupteur9)+GadgetHeight(Interrupteur9)+10, 70, 40)
Texte1 = TextGadget(#PB_Any, GadgetWidth(Interrupteur1)+20, GadgetHeight(Interrupteur1)/4+GadgetY(Interrupteur1), 30, 20, "Fermé")
Texte2 = TextGadget(#PB_Any, GadgetWidth(Interrupteur2)+20, GadgetHeight(Interrupteur1)/4+GadgetY(Interrupteur2), 30, 20, "Ouvert")
Texte3 = TextGadget(#PB_Any, GadgetWidth(Interrupteur3)+20, GadgetHeight(Interrupteur2)/4+GadgetY(Interrupteur3), 30, 20, "Ouvert")
Texte4 = TextGadget(#PB_Any, GadgetWidth(Interrupteur4)+20, GadgetHeight(Interrupteur3)/4+GadgetY(Interrupteur4), 30, 20, "Fermé")
Texte5 = TextGadget(#PB_Any, GadgetWidth(Interrupteur5)+20, GadgetHeight(Interrupteur4)/4+GadgetY(Interrupteur5), 30, 20, "Fermé")
Texte6 = TextGadget(#PB_Any, GadgetX(Interrupteur6) +GadgetWidth(Interrupteur6) +20, GadgetY(Interrupteur6) +GadgetHeight(Interrupteur6) /4, 30, 20, "Ouvert")
Texte7 = TextGadget(#PB_Any, GadgetX(Interrupteur7) +GadgetWidth(Interrupteur7) +20, GadgetY(Interrupteur7) +GadgetHeight(Interrupteur7) /4, 30, 20, "Fermé")
Texte8 = TextGadget(#PB_Any, GadgetX(Interrupteur8) +GadgetWidth(Interrupteur8) +20, GadgetY(Interrupteur8) +GadgetHeight(Interrupteur8) /4, 30, 20, "Fermé")
Texte9 = TextGadget(#PB_Any, GadgetX(Interrupteur9) +GadgetWidth(Interrupteur9) +20, GadgetY(Interrupteur9) +GadgetHeight(Interrupteur6) /4, 30, 20, "Ouvert")
Texte10 = TextGadget(#PB_Any, GadgetX(Interrupteur10)+GadgetWidth(Interrupteur10)+20, GadgetY(Interrupteur10)+GadgetHeight(Interrupteur10)/4, 30, 20, "Ouvert")
SetGadgetState(Interrupteur2, 1)
SetGadgetState(Interrupteur3, 1)
SetGadgetState(Interrupteur6, 1)
SetGadgetState(Interrupteur9, 1)
SetGadgetState(Interrupteur10, 1)
Repeat
event = WaitWindowEvent()
If event = #PB_Event_CloseWindow
Break
EndIf
If event = #PB_Event_Gadget
If EventType() = #PB_EventType_Change
Select EventGadget()
Case Interrupteur1
If GetGadgetState(Interrupteur1)
SetGadgetText(Texte1, "Ouvert")
Else
SetGadgetText(Texte1, "Fermé")
EndIf
Case Interrupteur2
If GetGadgetState(Interrupteur2)
SetGadgetText(Texte2, "Ouvert")
Else
SetGadgetText(Texte2, "Fermé")
EndIf
Case Interrupteur3
If GetGadgetState(Interrupteur3)
SetGadgetText(Texte3, "Ouvert")
Else
SetGadgetText(Texte3, "Fermé")
EndIf
Case Interrupteur4
If GetGadgetState(Interrupteur4)
SetGadgetText(Texte4, "Ouvert")
Else
SetGadgetText(Texte4, "Fermé")
EndIf
Case Interrupteur5
If GetGadgetState(Interrupteur5)
SetGadgetText(Texte5, "Ouvert")
Else
SetGadgetText(Texte5, "Fermé")
EndIf
Case Interrupteur6
If GetGadgetState(Interrupteur6)
SetGadgetText(Texte6, "Ouvert")
Else
SetGadgetText(Texte6, "Fermé")
EndIf
Case Interrupteur7
If GetGadgetState(Interrupteur7)
SetGadgetText(Texte7, "Ouvert")
Else
SetGadgetText(Texte7, "Fermé")
EndIf
Case Interrupteur8
If GetGadgetState(Interrupteur8)
SetGadgetText(Texte8, "Ouvert")
Else
SetGadgetText(Texte8, "Fermé")
EndIf
Case Interrupteur9
If GetGadgetState(Interrupteur9)
SetGadgetText(Texte9, "Ouvert")
Else
SetGadgetText(Texte9, "Fermé")
EndIf
Case Interrupteur10
If GetGadgetState(Interrupteur10)
SetGadgetText(Texte10, "Ouvert")
Else
SetGadgetText(Texte10, "Fermé")
EndIf
EndSelect
EndIf
EndIf
ForEver
EndProcedure
End Principale()
Code : Tout sélectionner
;Interupteurs
Structure PB_Interrupteur
Type.l
Taille.l
Rappel.i
Liberation.i
ObtenirEtat.i
DefinirEtat.i
EndStructure
ImportC ""
PB_Event_AddWithData(a,b,c,d,e,f)
EndImport
; Faites vos propres constantes
Enumeration
#CHANGER_ETAT = #WM_USER
#OBTENIR_ETAT
#DEFINIR_ETAT
EndEnumeration
Structure Rect2
Gauche.l
Haut.l
Droite.l
Bas.l
EndStructure
Structure MonGadget
IdGadget.i
AncProc.i
Etat.i
Couleur.i
EndStructure
Procedure Interrupteur__ObtenirEtat(*IdGadget.integer)
ProcedureReturn SendMessage_(*IdGadget\i, #OBTENIR_ETAT, 0, 0)
EndProcedure
Procedure Interrupteur__DefinirEtat(*IdGadget.integer, Etat)
SendMessage_(*IdGadget\i, #DEFINIR_ETAT, 0, Etat)
EndProcedure
Procedure MonGadgetProc(hWnd, Msg, wParam, lParam)
Protected *mg.MonGadget = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
Protected x , y, hdc, rect.Rect2
Protected Proc
proc = *mg\AncProc
If Msg = #WM_PAINT
hdc = StartDrawing(CanvasOutput(*mg\IdGadget))
If *mg\Etat = 0
*mg\Couleur = $7779E9
Else
*mg\Couleur = $9CE3AA
EndIf
Box(0, 0, GadgetWidth(*mg\IdGadget), GadgetHeight(*mg\IdGadget), *mg\Couleur)
Rect\Droite = GadgetWidth(*mg\IdGadget)
Rect\Bas = GadgetHeight(*mg\IdGadget)
DrawEdge_(hdc, Rect, #BDR_SUNKENINNER, #BF_RECT)
If *mg\Etat = 0
Rect\Droite = GadgetWidth(*mg\IdGadget) / 2
Else
Rect\Gauche = GadgetWidth(*mg\IdGadget) / 2
Rect\Droite = GadgetWidth(*mg\IdGadget) / 2 + Rect\Gauche
EndIf
Rect\Gauche + 1
Rect\Haut = 1
Rect\Bas - 1
DrawFrameControl_(hdc, Rect, #DFC_BUTTON, #DFCS_BUTTONPUSH)
StopDrawing()
EndIf
If Msg = #OBTENIR_ETAT
ProcedureReturn *mg\Etat
EndIf
If Msg = #DEFINIR_ETAT
*mg\Etat = lparam
SendMessage_(hWnd, #WM_PAINT, 0, 0)
EndIf
If Msg = #WM_LBUTTONUP
*mg\Etat ! 1
PB_Event_AddWithData($332C, *mg\IdGadget, 0, #PB_EventType_Change, 0, 0)
SendMessage_(hWnd, #WM_PAINT, 0, 0)
EndIf
If Msg = #WM_DESTROY
SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, proc)
FreeMemory(*mg)
EndIf
ProcedureReturn CallWindowProc_(Proc, hWnd, Msg, wParam, lParam)
EndProcedure
Procedure MonGadget(id, x, y, largeur, hauteur)
Protected gadget
Protected *mg.MonGadget
Protected *Interrupteur.PB_Interrupteur
*mg = AllocateMemory(SizeOf(MonGadget))
gadget = CanvasGadget(id, x, y, largeur, hauteur, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
If id = #PB_Any
*mg\IdGadget = gadget
Else
*mg\IdGadget = id
EndIf
;Stocker des données dans le gadget
SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_USERDATA, *mg)
;Rappel
*mg\AncProc = SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_WNDPROC, @MonGadgetProc())
;Ensemble de ObtenirEtat et DefinirEtat
*Interrupteur = PeekI(IsGadget(*mg\IdGadget) + SizeOf(Integer))
*Interrupteur\ObtenirEtat = @Interrupteur__ObtenirEtat()
*Interrupteur\DefinirEtat = @Interrupteur__DefinirEtat()
ProcedureReturn gadget
EndProcedure
;***TEST***
#NBRE_INTER = 10
Enumeration Gadgets
#inter0
#inter1
#inter2
#inter3
#inter4
#inter5
#inter6
#inter7
#inter8
#inter9
#Texte0
#Texte1
#Texte2
#Texte3
#Texte4
#Texte5
#Texte6
#Texte7
#Texte8
#Texte9
EndEnumeration
Macro MonInter(NumInter, X ,Y)
MonGadget(NumInter, X, Y, largeurInter, HauteurInter)
EndMacro
Procedure Principale()
Protected Fenetre
Protected gadget
Protected event
Fenetre = OpenWindow(#PB_Any, 0, 0, 320, 260, "#inters", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
LargeurInter = 70
HauteurInter = 40
MonInter(#inter0, 10, 10)
MonInter(#inter1, 10, GadgetY(#inter0) + GadgetHeight(#inter0) + 10)
MonInter(#inter2, 10, GadgetY(#inter1) + GadgetHeight(#inter1) + 10)
MonInter(#inter3, 10, GadgetY(#inter2) + GadgetHeight(#inter2) + 10)
MonInter(#inter4, 10, GadgetY(#inter3) + GadgetHeight(#inter3) + 10)
MonInter(#inter5, GadgetX(#inter0) + 150, GadgetY(#inter0))
MonInter(#inter6, GadgetX(#inter1) + 150, GadgetY(#inter5) + GadgetHeight(#inter5) + 10)
MonInter(#inter7, GadgetX(#inter2) + 150, GadgetY(#inter6) + GadgetHeight(#inter6) + 10)
MonInter(#inter8, GadgetX(#inter3) + 150, GadgetY(#inter7) + GadgetHeight(#inter7) + 10)
MonInter(#inter9, GadgetX(#inter4) + 150, GadgetY(#inter8) + GadgetHeight(#inter8) + 10)
TextGadget(#Texte0, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter0), 30, 20, "Fermé")
TextGadget(#Texte1, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter1), 30, 20, "Ouvert")
TextGadget(#Texte2, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter2), 30, 20, "Ouvert")
TextGadget(#Texte3, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter3), 30, 20, "Fermé")
TextGadget(#Texte4, LargeurInter + 20, HauteurInter / 4 + GadgetY(#inter4), 30, 20, "Fermé")
TextGadget(#Texte5, GadgetX(#inter5) + LargeurInter + 20, GadgetY(#inter5) + HauteurInter /4, 30, 20,
"Ouvert")
TextGadget(#Texte6, GadgetX(#inter6) + LargeurInter + 20, GadgetY(#inter6) + HauteurInter /4, 30, 20,
"Fermé")
TextGadget(#Texte7, GadgetX(#inter7) + LargeurInter + 20, GadgetY(#inter7) + HauteurInter /4, 30, 20,
"Fermé")
TextGadget(#Texte8, GadgetX(#inter8) + LargeurInter + 20, GadgetY(#inter8) + HauteurInter /4, 30, 20,
"Ouvert")
TextGadget(#Texte9, GadgetX(#inter9) + LargeurInter + 20, GadgetY(#inter9) + HauteurInter /4, 30, 20,
"Ouvert")
SetGadgetState(#inter1, 1)
SetGadgetState(#inter2, 1)
SetGadgetState(#inter5, 1)
SetGadgetState(#inter8, 1)
SetGadgetState(#inter9, 1)
Repeat
event = WaitWindowEvent()
If event = #PB_Event_CloseWindow
Break
EndIf
If event = #PB_Event_Gadget
If EventType() = #PB_EventType_Change
Select EventGadget()
Case #inter0 To #NBRE_INTER
If GetGadgetState(EventGadget())
SetGadgetText(EventGadget() + 10, "Ouvert")
Else
SetGadgetText(EventGadget() + 10, "Fermé")
EndIf
EndSelect
EndIf
EndIf
ForEver
EndProcedure
End Principale()