[TUTO] Programmation modulaire

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation modulaire

Message par microdevweb »

Aller plus loin

Dans cette exemple nous gérer un fichier clients

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : Allez plus loin, gestion de client
; File Name : AllezPlusLoin.pb
;************************************************************************************************************************
DeclareModule myMacro
    Macro EntreCote(TXT)
        Chr(34)+TXT+Chr(34)
    EndMacro
EndDeclareModule
Module myMacro
    
EndModule
DeclareModule db
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    Global DbName.s,user.s,psw.s
    ;}
    ;-* PUBLIC DECLARATION
    Declare Create()
    Declare Query(query.s)
    Declare Update(query.s)
    ;}
EndDeclareModule
Module db
    EnableExplicit
    UseSQLiteDatabase()
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global myDb
    ;}
    ;-* LOCAL DECLARATION
    Declare FileCreate()
    Declare OpenDb()
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure FileCreate()
        ; Le fichier existe pas besoin de le créer
        If FileSize(DbName)<>-1:ProcedureReturn :EndIf
        ; Création du fichier
        If CreateFile(0,DbName)=0
            MessageRequester("Erreur création fichier","Le fichier "+DbName+" n'a pas peu être créé")
            End
        EndIf
        CloseFile(0)
    EndProcedure
    Procedure OpenDb()
        FileCreate()
        myDb=OpenDatabase(#PB_Any,DbName,user,psw)
        If myDb=0
            MessageRequester("Erreur base de données","impossible d'ouvrir la base de donnée")
            End
        EndIf
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure Create()
        Protected query.s
        query="CREATE TABLE IF NOT EXISTS client ("
        query+"id INTEGER PRIMARY KEY,"
        query+"name TEXT,"
        query+"localite TEXT,"
        query+"adresse TEXT)"
        If Not  Update(query)
            End
        EndIf
    EndProcedure
    Procedure Query(query.s)
        OpenDb()
        If DatabaseQuery(myDb,query)=0
            MessageRequester("Erreur base de donnée",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn 0
        EndIf
        ProcedureReturn myDb
    EndProcedure
    Procedure Update(query.s)
        OpenDb()
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur base de donnée",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    ;}
EndModule
DeclareModule ClientFIC
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    Enumeration 
        #NEW
        #EDIT
    EndEnumeration
    ;}
    ;-* PUBLIC DECLARATION
    Declare SetMode(mode=ClientFIC::#NEW)
    Declare Open(MotherWindow)
    Declare SetRefreshCallback(*callback)
    Declare SetCurrentID(Id)
    ;}
EndDeclareModule
Module ClientFIC
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global Form,myMotherWindow,myMode=#NEW
    Global TxtNom,StrNom,TxtLocalite,StrLocalite,TxtAdresse,StrAdresse
    Global btSubmit,btChancel,*refreshCallback=-1,CurrentID
    ;}
    ;-* LOCAL DECLARATION
    
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure Exit()
        DisableWindow(myMotherWindow,#False)
        CloseWindow(Form)
        SetActiveWindow(myMotherWindow)
    EndProcedure
    Procedure AddClient()
        Protected query.s
        query="INSERT INTO client ("
        query+"name,"
        query+"localite,"
        query+"adresse) VALUES ("
        query+myMacro::EntreCote(GetGadgetText(StrNom))+","
        query+myMacro::EntreCote(GetGadgetText(StrLocalite))+","
        query+myMacro::EntreCote(GetGadgetText(StrAdresse))
        query+")"
        If db::Update(query)
            If *refreshCallback<>-1
                CallFunctionFast(*refreshCallback)
            EndIf
            Exit()
        EndIf
    EndProcedure
    Procedure SaveClient()
        Protected query.s
        query="UPDATE client SET "
        query+"name="+myMacro::EntreCote(GetGadgetText(StrNom))+","
        query+"localite="+myMacro::EntreCote(GetGadgetText(StrLocalite))+","
        query+"adresse="+myMacro::EntreCote(GetGadgetText(StrAdresse))
        query+" WHERE id="+Str(CurrentID)
        If db::Update(query)
            CallFunctionFast(*refreshCallback)
            Exit()
        EndIf
    EndProcedure
    Procedure EventMyGadget()
        Select EventGadget()
            Case btSubmit
                Select myMode
                    Case #NEW
                        AddClient()
                    Case #EDIT
                        SaveClient()
                EndSelect
            Case btChancel
                Exit()
        EndSelect
    EndProcedure
    Procedure FillGadget()
        Protected  query.s,db
        query="SELECT name,localite,adresse FROM client WHERE id="+Str(CurrentID)
        db=db::Query(query)
        If db>0
            If FirstDatabaseRow(db)
                SetGadgetText(StrNom,GetDatabaseString(db,0))
                SetGadgetText(StrLocalite,GetDatabaseString(db,1))
                SetGadgetText(StrAdresse,GetDatabaseString(db,2))
            EndIf
        EndIf
        CloseDatabase(db)
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure SetRefreshCallback(*callback)
        *refreshCallback=*callback
    EndProcedure 
    Procedure SetMode(mode=ClientFIC::#NEW)
        myMode=mode
    EndProcedure
    Procedure SetCurrentID(Id)
        CurrentID=Id
    EndProcedure
    Procedure Open(MotherWindow)
        myMotherWindow=MotherWindow
        DisableWindow(myMotherWindow,#True)
        Protected Flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
        Protected WF=400,HF=260
        Protected Marg=10,X=Marg,Y=Marg
        Protected WG=WF-(Marg*2),HG=30
        Protected WBT=(WF/2)-(Marg*2)
        Protected title.s
        Select myMode
            Case #NEW
                title="Nouveau client"
            Case #EDIT
                title="Edition d'un client"
        EndSelect
        Form=OpenWindow(#PB_Any,0,0,WF,HF,title,Flag,WindowID(myMotherWindow))
        TxtNom=TextGadget(#PB_Any,X,Y,WG,HG,"Nom")
        Y+HG
        StrNom=StringGadget(#PB_Any,X,Y,WG,HG,"")
        Y+HG+Marg
        TxtLocalite=TextGadget(#PB_Any,X,Y,WG,HG,"Localité")
        Y+HG
        StrLocalite=StringGadget(#PB_Any,X,Y,WG,HG,"")
        Y+HG+Marg
        TxtAdresse=TextGadget(#PB_Any,X,Y,WG,HG,"Adresse")
        Y+HG
        StrAdresse=StringGadget(#PB_Any,X,Y,WG,HG,"")
        Y+HG+Marg
        btSubmit=ButtonGadget(#PB_Any,X,Y,WBT,HG,"Valider")
        X+WBT+Marg
        btChancel=ButtonGadget(#PB_Any,X,Y,WBT,HG,"Annuler")
        ; Mise en place des callback
        BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
        BindEvent(#PB_Event_Gadget,@EventMyGadget(),Form)
        SetActiveGadget(StrNom)
        If myMode=#EDIT
            FillGadget()
        EndIf
    EndProcedure
    ;}
EndModule
DeclareModule ClientTAB
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    
    ;}
    ;-* PUBLIC DECLARATION
    Declare RefreshList()
    Declare Open()
    ;}
EndDeclareModule
Module ClientTAB
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global Form,LstCLient,BtNew,BtEdit,BtDelete,BtExit
    ;}
    ;-* LOCAL DECLARATION
    
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure Exit()
        End
    EndProcedure
    Procedure DeleteClient()
        Protected query.s
        If MessageRequester("Liste des clients","Etes-vous sure de vouloir supprimer cet enregistrment?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_No
            ProcedureReturn 
        EndIf
        query="DELETE FROM client WHERE id="+Str(GetGadgetItemData(LstCLient,GetGadgetState(LstCLient)))
        If db::Update(query)
            RefreshList()
        EndIf
    EndProcedure
    Procedure EventButton()
        ClientFIC::SetRefreshCallback(@RefreshList())
        Select EventGadget()
            Case BtNew
                ClientFIC::SetMode(ClientFIC::#NEW)
                ClientFIC::Open(Form)
            Case BtEdit
                If GetGadgetState(LstCLient)=-1
                    MessageRequester("Liste des clients","Aucun client n'est sélectionné")
                    ProcedureReturn 
                EndIf
                ClientFIC::SetMode(ClientFIC::#EDIT)
                ClientFIC::SetCurrentID(GetGadgetItemData(LstCLient,GetGadgetState(LstCLient)))
                ClientFIC::Open(Form)
            Case BtExit
                Exit()
            Case BtDelete
                If GetGadgetState(LstCLient)=-1
                    MessageRequester("Liste des clients","Aucun client n'est sélectionné")
                    ProcedureReturn 
                EndIf
                DeleteClient()
        EndSelect
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure RefreshList()
        Protected query.s,db,N
        query="SELECT id,name,localite FROM client ORDER BY name"
        db=db::Query(query)
        If db>0
            ClearGadgetItems(LstCLient)
            While NextDatabaseRow(db)
                AddGadgetItem(LstCLient,-1,GetDatabaseString(db,1)+Chr(10)+GetDatabaseString(db,2))
                SetGadgetItemData(LstCLient,N,GetDatabaseLong(db,0))
                N+1
            Wend
            CloseDatabase(db)
        EndIf
    EndProcedure
    Procedure Open()
        Protected Flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
        ; Taille de la fenêtre
        Protected WF=400,HF=600
        ; Marge/taille boutons / taille liste
        Protected WBT=100,HBT=30,Marg=10,HL=HF-(Marg*2),WL=WF-(Marg*3)-WBT
        ; Position X /Y
        Protected X=Marg,Y=Marg
        Form=OpenWindow(#PB_Any,0,0,WF,HF,"Liste des clients",Flag)
        LstCLient=ListIconGadget(#PB_Any,X,Y,WL,HL,"Nom",WL*0.5,#PB_ListIcon_FullRowSelect)
        AddGadgetColumn(LstCLient,1,"Localité",(WL*0.5)-5)
        ; Position des boutons
        X+WL+Marg
        BtNew=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Nouveau")
        Y+HBT+Marg
        BtEdit=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Editer")
        Y+HBT+Marg
        BtDelete=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Supprimer")
        Y+HBT+Marg
        BtExit=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Quitter")
        ; Mise en place des callback
        BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
        BindEvent(#PB_Event_Gadget,@EventButton(),Form)
        ; Affiche les éléments
        RefreshList()
    EndProcedure
    ;}
EndModule
; Lancement du logiciel
; initialisation de la base de données
db::DbName="client.sqlite"
db::user=""
db::psw=""
db::Create()
ClientTAB::Open()

Repeat:WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
4 Z 3 R T Y 9
Messages : 3
Inscription : mer. 27/avr./2016 11:24

Re: [TUTO] Programmation modulaire

Message par 4 Z 3 R T Y 9 »

merci bck
Cagou.77
Messages : 2
Inscription : mar. 19/avr./2016 4:47

Re: [TUTO] Programmation modulaire

Message par Cagou.77 »

Bonjour, très bon TUTO
petit rajout dans la procédure EventButton()

Code : Tout sélectionner

          Case LstCLient
                Select EventType()
                  Case #PB_EventType_LeftDoubleClick
                       ClientFIC::SetMode(ClientFIC::#EDIT)
                       ClientFIC::SetCurrentID(GetGadgetItemData(LstCLient,GetGadgetState(LstCLient)))
                       ClientFIC::Open(Form)
                EndSelect
digital
Messages : 25
Inscription : mar. 02/févr./2016 0:34

Re: [TUTO] Programmation modulaire

Message par digital »

Excellent tutorial!

J'approuve le coté utile de la prog modulaire, surtout quand on bosse sur un gros projet.
C'est vraiment moins fouilli aussi.
Répondre