Conclusion et code au complet
Voila évidement il est possible d'ajouter toutes les méthodes désirées, le but de ce tutoriel n'étant que de donné les bases.
Mais voici encore une autre facette de PureBasic intéressante, j'espère que ce tutoriel vous aura été utile et vous remercie de l'avoir suivi.
MicrodevWeb
code FORM.pbi
Code : Tout sélectionner
; ************************************************
; Nom de la class : FORM
; Autheur : MicrodevWeb
; Version : 1.0
; Requis : Pb 5.60
; ************************************************
XIncludeFile "GADGET.pbi"
DeclareModule FORM
; =======================================================
;-* les méthodes public
; =======================================================
Interface _FORM
Open(FenetreMere=#PB_Ignore)
Free()
AddCallback(*Callback)
GetId()
AddGadget(x,y,w,h,titre.s,Type=#PB_GadgetType3D_String,Value.s="",flags.l=0)
Close()
EndInterface
;} ------------------------------------------------------
; =======================================================
;-* les prototypes public
; =======================================================
Declare New(x,y,w,h,titre.s,flags.l=0)
;} ------------------------------------------------------
EndDeclareModule
Module FORM
EnableExplicit
Prototype monCallback(*objet,MonEvenement.l)
; =======================================================
;-* les méthodes de gadget privées
; =======================================================
Interface _PRIVATE_GADGET Extends GADGET::_GADGET
Free()
Create()
EndInterface
;} ------------------------------------------------------
; =======================================================
;-* les membres privés
; =======================================================
Structure sPOS
x.l
y.l
w.l
h.l
EndStructure
Structure sFORM
*pFORM ; IMPORTANT ceci doit absolument être placé en premier et va contenir l'adresse des procédures
maPosition.sPOS
titre.s
flags.l
FenetreMere.l
IdForm.l
*Callback
List *myGADGET._PRIVATE_GADGET()
EndStructure
;} ------------------------------------------------------
; =======================================================
;-* les functions privées
; =======================================================
Procedure AppelCallback(*This.sFORM)
Protected maProcedure.monCallback
With *This
If \Callback
maProcedure=\Callback
maProcedure(*This,Event())
EndIf
EndWith
EndProcedure
Procedure Exit()
; IMPORTANT: je récupère l'adresse de l'objet
Protected *This.sFORM=GetWindowData(EventWindow())
With *This
CloseWindow(\IdForm)
; Si une fenêtre mère
If \FenetreMere<>#PB_Ignore
DisableWindow(\FenetreMere,#False)
SetActiveWindow(\FenetreMere)
EndIf
; REMARQUE chaque procédure callback appellera cette procédure
AppelCallback(*This)
EndWith
EndProcedure
;} ------------------------------------------------------
; =======================================================
;-* Le constructeur
; =======================================================
Procedure New(x,y,w,h,titre.s,flags.l=0)
Protected *objet.sFORM = AllocateStructure(sFORM)
With *objet
\pFORM=?PROC
\maPosition\x=x
\maPosition\y=y
\maPosition\w=w
\maPosition\h=h
\titre=titre
\flags=flags
\FenetreMere=#PB_Ignore ; Pas de fenêtre mère
ProcedureReturn *objet
EndWith
EndProcedure
;} ------------------------------------------------------
; =======================================================
;-* les méthodes publiques
; =======================================================
Procedure Open(*This.sFORM,FenetreMere=#PB_Ignore)
With *This
\FenetreMere=FenetreMere
; si aucun flags n'est renseigné je crée ceux de bases
If \flags=0
\flags=#PB_Window_SystemMenu
; je centre également la fenêtre en fonction d'une fenêtre mère ou pas
If \FenetreMere=#PB_Ignore
\flags|#PB_Window_ScreenCentered
Else
\flags|#PB_Window_WindowCentered
EndIf
EndIf
If \FenetreMere=#PB_Ignore ; pas de fenêtre mère
\IdForm=OpenWindow(#PB_Any,
\maPosition\x,
\maPosition\y,
\maPosition\w,
\maPosition\h,
\titre,
\flags)
Else
; je désactive également la fenêtre mère
DisableWindow(\FenetreMere,#True)
\IdForm=OpenWindow(#PB_Any,
\maPosition\x,
\maPosition\y,
\maPosition\w,
\maPosition\h,
\titre,
\flags,
WindowID(\FenetreMere))
EndIf
; Je crée ici tous les gadgets
ForEach \myGADGET()
\myGADGET()\Create()
Next
; important je vais sauver dans ma fenêtre l'adresse de mon objet
SetWindowData(\IdForm,*This)
; Je vais placer maintenant un callback si l'utilisateur clique sur la croix
BindEvent(#PB_Event_CloseWindow,@Exit(),\IdForm)
EndWith
EndProcedure
Procedure Free(*This.sFORM)
With *This
; je libère également tous les gadget
ForEach \myGADGET()
\myGADGET()\Free()
Next
FreeStructure(*This)
EndWith
EndProcedure
Procedure AddCallback(*This.sFORM,*Callback)
With *This
\Callback=*Callback
EndWith
EndProcedure
Procedure GetId(*This.sFORM)
With *This
If IsWindow(\IdForm)
ProcedureReturn \IdForm
EndIf
ProcedureReturn -1
EndWith
EndProcedure
Procedure AddGadget(*This.sFORM,x,y,w,h,titre.s,Type=#PB_GadgetType3D_String,Value.s="",flags.l=0)
With *This
; j'ajoute mon objet
AddElement(\myGADGET())
; j'instancie mon objet
\myGADGET()=GADGET::New(x,y,w,h,titre,Type,Value,flags)
; je retourne mon instance
ProcedureReturn \myGADGET()
EndWith
EndProcedure
Procedure Close(*This.sFORM)
With *This
CloseWindow(\IdForm)
EndWith
EndProcedure
;} ------------------------------------------------------
DataSection
PROC: ; les adresse des procédures IMPORTANT il faut respecté le même ordre que l'interface
Data.i @Open()
Data.i @Free()
Data.i @AddCallback()
Data.i @GetId()
Data.i @AddGadget()
Data.i @Close()
EndDataSection
EndModule
code GADGET.pbi
Code : Tout sélectionner
; ************************************************
; Nom de la class : GADGET
; Autheur : MicrodevWeb
; Version : 1.0
; Requis : Pb 5.60 / FORM.pbi
; ************************************************
DeclareModule GADGET
; =======================================================
;-* les méthodes public
; =======================================================
Interface _GADGET
GetTitle.s()
GetValue.s()
SetTitle(Valeur.s)
SetValue(Valeur.s)
AddCallback(*Callback)
EndInterface
;} ------------------------------------------------------
; =======================================================
;-* les prototypes public
; =======================================================
Declare New(x,y,w,h,titre.s,Type=#PB_GadgetType3D_String,Value.s="",flags.l=0)
;} ------------------------------------------------------
EndDeclareModule
Module GADGET
EnableExplicit
Prototype monCallback(*objet,MonEvenement.l)
; =======================================================
;-* les membres privés
; =======================================================
Structure sPOS
x.l
y.l
w.l
h.l
EndStructure
Structure sGADGET
*pGADGET ; IMPORTANT ceci doit absolument être placé en premier et va contenir l'adresse des procédures
titre.s
valeur.s
flags.l
TypeDeGadget.l
IdGadget.l
IdFrame.l
*Callback
maPosition.sPOS
EndStructure
;} ------------------------------------------------------
; =======================================================
;-* les functions privées
; =======================================================
Procedure MiseAJour(*This.sGADGET)
With *This
If IsGadget(\IdGadget)
Select GadgetType(\IdGadget)
Case #PB_GadgetType_String
SetGadgetText(\IdFrame,\titre)
SetGadgetText(\IdGadget,\valeur)
Case #PB_GadgetType_Button
SetGadgetText(\IdGadget,\titre)
EndSelect
EndIf
EndWith
EndProcedure
Procedure monEvenement()
Protected *This.sGADGET=GetGadgetData(EventGadget())
Protected maProcedure.monCallback
With *This
Select GadgetType(EventGadget())
Case #PB_GadgetType_String
\valeur=GetGadgetText(\IdGadget)
EndSelect
If \Callback
maProcedure=\Callback
maProcedure(*This,EventType())
EndIf
EndWith
EndProcedure
;} ------------------------------------------------------
; =======================================================
;-* Le constructeur
; =======================================================
Procedure New(x,y,w,h,titre.s,Type=#PB_GadgetType3D_String,Value.s="",flags.l=0)
Protected *objet.sGADGET = AllocateStructure(sGADGET)
With *objet
\pGADGET=?PROC
\TypeDeGadget=Type
\flags=flags
\titre=titre
\valeur=Value
\maPosition\x=x
\maPosition\y=y
\maPosition\w=w
\maPosition\h=h
ProcedureReturn *objet
EndWith
EndProcedure
;} ------------------------------------------------------
; =======================================================
;-* les méthodes publiques
; =======================================================
Procedure.s GetTitle(*This.sGADGET)
With *This
ProcedureReturn \titre
EndWith
EndProcedure
Procedure.s GetValue(*This.sGADGET)
With *This
ProcedureReturn \valeur
EndWith
EndProcedure
Procedure SetTitle(*This.sGADGET,Valeur.s)
With *This
\titre=Valeur
EndWith
EndProcedure
Procedure SetValue(*This.sGADGET,Valeur.s)
With *This
\valeur=Valeur
EndWith
EndProcedure
Procedure AddCallback(*This.sGADGET,*callback)
With *This
\Callback=*callback
EndWith
EndProcedure
;} ------------------------------------------------------
; =======================================================
;-* les méthodes privées
; =======================================================
Procedure Create(*This.sGADGET)
With *This
Select \TypeDeGadget
Case #PB_GadgetType_String
\IdFrame=TextGadget(#PB_Any,
\maPosition\x,
\maPosition\y,
\maPosition\w,
\maPosition\h/2,
\titre)
\IdGadget=StringGadget(#PB_Any,
\maPosition\x,
\maPosition\y+\maPosition\h/2,
\maPosition\w,
\maPosition\h/2,
\valeur,
\flags)
Case #PB_GadgetType_Button
\IdGadget=ButtonGadget(#PB_Any,
\maPosition\x,
\maPosition\y,
\maPosition\w,
\maPosition\h,
\titre)
EndSelect
; Je sauve l'adresse de l'objet
SetGadgetData(\IdGadget,*This)
; je place le callback
BindGadgetEvent(\IdGadget,@monEvenement())
EndWith
EndProcedure
Procedure Free(*This.sGADGET)
FreeStructure(*This)
EndProcedure
;} ------------------------------------------------------
DataSection
PROC: ; les adresse des procédures IMPORTANT il faut respecté le même ordre que l'interface
; Les méthodes PUBLIQUES
Data.i @GetTitle()
Data.i @GetValue()
Data.i @SetTitle()
Data.i @SetValue()
Data.i @AddCallback()
; les méthodes PIVEES
Data.i @Free()
Data.i @Create()
EndDataSection
EndModule
code main.pbi
Code : Tout sélectionner
EnableExplicit
XIncludeFile "FORM.pbi"
; Déclaration des l'objets
; --> Objets fenêtre
Global.FORM::_FORM maFenetreFille,maFenetreMere
; --> Objet gadget
Global.GADGET::_GADGET nom,prenom,bt_valide,bt_exit
Procedure EvenementSurFenetre(*form.FORM::_FORM,monEvenement.l)
If monEvenement=#PB_Event_CloseWindow And *form=maFenetreFille
Debug "La fenêtre fille à été fermée je libère l'objet"
*form\Free()
EndIf
If monEvenement=#PB_Event_CloseWindow And *form=maFenetreMere
Debug "La fenêtre mère à été fermée je libère l'objet et je quitte le program"
*form\Free()
End
EndIf
EndProcedure
Procedure EvenementSurGadget(*gadget.GADGET::_GADGET,monEvenement.l)
If *gadget=bt_exit
maFenetreFille\Close()
Else
If *gadget=bt_valide
Debug "Vous avez cliqué sur le bouton valider"
Else
Debug "La valeur de "+*gadget\GetTitle()+" est "+*gadget\GetValue()
EndIf
EndIf
EndProcedure
; instanciation des l'objet FORM
maFenetreMere=FORM::New(0,0,800,600,"Main",#PB_Window_SystemMenu|#PB_Window_Maximize)
maFenetreFille=FORM::New(0,0,420,160,"Teste")
; j'ajoute les callback
maFenetreMere\AddCallback(@EvenementSurFenetre())
maFenetreFille\AddCallback(@EvenementSurFenetre())
; Je crée les gadget
nom=maFenetreFille\AddGadget(10,10,400,40,"Nom")
nom\AddCallback(@EvenementSurGadget())
prenom=maFenetreFille\AddGadget(10,60,400,40,"Prénom")
prenom\AddCallback(@EvenementSurGadget())
bt_valide=maFenetreFille\AddGadget(10,110,100,30,"Valider",#PB_GadgetType_Button)
bt_valide\AddCallback(@EvenementSurGadget())
bt_exit=maFenetreFille\AddGadget(120,110,100,30,"Quitter",#PB_GadgetType_Button)
bt_exit\AddCallback(@EvenementSurGadget())
; j'ouvre la fenetre mère
maFenetreMere\Open()
; j'ouvre la fenêtre fille
maFenetreFille\Open(maFenetreMere\GetId())
Repeat
WaitWindowEvent()
ForEver