Chose promise, chose dû, un exemple de programmation basé objet.
Créer un répertoire et sauvegarder ce code avec le nom : Exemple PBO.pb
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Exemple de Programmation Basé Objet -- Source principal
; Version 1.0.0
; Programmation = À compléter
; Programmé par : Guimauve
; Date : 1er mai 2005
; Mise à jour : 1er mai 2005
; Codé avec PureBasic V3.93
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
IncludeFile "Constantes.pb"
IncludeFile "ObjetINI.pb"
IncludeFile "Procédures.pb"
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Création d'un objet de paramètres par défaut pour initialiser le
; On fait une vérification de routine au départ :
; Fichier INI, Répertoire de ressources, etc.
; Et on retourne un pointeur de la zone des informations INI à utiliser
*INIUtilisateur = VerificationDepart(CreateINI_Param("Exemple PBO.ini", 400, 300, 1))
; On extrait les informations pour les utiliser
Largeur = GetINI_ParamLargeurFenetre(*INIUtilisateur)
Hauteur = GetINI_ParamHauteurFenetre(*INIUtilisateur)
ToujoursVisible = GetINI_ParamToujoursVisible(*INIUtilisateur)
; On ouvre la fenètre
If OpenWindow(#Main_Win, 0, 0, Largeur, Hauteur, #Style, "Exemple PBO") <> 0
; On créer la liste de gadget
If CreateGadgetList(WindowID(#Main_Win)) <> 0
TextGadget(#Text_LargeurFenetre, 5, 5, 100, 20, "Largeur fenètre")
TextGadget(#Text_HauteurFenetre, 5, 30, 100, 20, "Hauteur fenètre")
StringGadget(#String_LargeurFenetre, 110, 5, 100, 20, Str(Largeur))
StringGadget(#String_HauteurFenetre, 110, 30, 100, 20, Str(Hauteur))
ButtonGadget(#Btn_Quitter, Largeur - 103, Hauteur - 28, 100, 25, "Quitter")
EndIf
EndIf
; La gestion des évènements
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #PB_EventGadget
Select EventGadgetID()
Case #Btn_Quitter
; On passe les paramètres ini pour mettre à jour le fichier INI
VerificationSortie(*INIUtilisateur)
EventID = #PB_EventCloseWindow
EndSelect
Case #PB_EventMenu
Select EventMenuID()
EndSelect
EndSelect
Until EventID = #PB_EventCloseWindow
End
Celui ci sous le nom : Constantes.pb
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Exemple de Programmation Basé Objet -- Constantes, Variables
; Version 1.0.0
; Programmation = À compléter
; Programmé par : Guimauve
; Date : 1er mai 2005
; Mise à jour : 1er mai 2005
; Codé avec PureBasic V3.93
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Enumeration
#Main_Win
#Text_LargeurFenetre
#Text_HauteurFenetre
#String_LargeurFenetre
#String_HauteurFenetre
#Btn_Quitter
EndEnumeration
#Style = #PB_Window_ScreenCentered | #PB_Window_SystemMenu
Celui ci sous le nom : Objet INI
Code : Tout sélectionner
Structure INI_Param
NomFichier.s
LargeurFenetre.w
HauteurFenetre.w
ToujoursVisible.b
EndStructure
Procedures GetINI_ParamNomFichier(*p.INI_Param)
ProcedureReturn *p\NomFichier
EndProcedure
Procedurew GetINI_ParamLargeurFenetre(*p.INI_Param)
ProcedureReturn *p\LargeurFenetre
EndProcedure
Procedurew GetINI_ParamHauteurFenetre(*p.INI_Param)
ProcedureReturn *p\HauteurFenetre
EndProcedure
Procedureb GetINI_ParamToujoursVisible(*p.INI_Param)
ProcedureReturn *p\ToujoursVisible
EndProcedure
Procedure SetINI_ParamNomFichier(*p.INI_Param, NomFichier.s)
*p\NomFichier = NomFichier
ProcedureReturn *p
EndProcedure
Procedure SetINI_ParamLargeurFenetre(*p.INI_Param, LargeurFenetre.w)
*p\LargeurFenetre = LargeurFenetre
ProcedureReturn *p
EndProcedure
Procedure SetINI_ParamHauteurFenetre(*p.INI_Param, HauteurFenetre.w)
*p\HauteurFenetre = HauteurFenetre
ProcedureReturn *p
EndProcedure
Procedure SetINI_ParamToujoursVisible(*p.INI_Param, ToujoursVisible.b)
*p\ToujoursVisible = ToujoursVisible
ProcedureReturn *p
EndProcedure
Procedure UpdateINI_Param(*p.INI_Param, NomFichier.s, LargeurFenetre.w, HauteurFenetre.w, ToujoursVisible.b)
*p = SetINI_ParamNomFichier(*p, NomFichier)
*p = SetINI_ParamLargeurFenetre(*p, LargeurFenetre)
*p = SetINI_ParamHauteurFenetre(*p, HauteurFenetre)
*p = SetINI_ParamToujoursVisible(*p, ToujoursVisible)
ProcedureReturn *p
EndProcedure
Procedure TransferINI_Param(*p.INI_Param, *q.INI_Param)
*p = SetINI_ParamNomFichier(*p, GetINI_ParamNomFichier(*q))
*p = SetINI_ParamLargeurFenetre(*p, GetINI_ParamLargeurFenetre(*q))
*p = SetINI_ParamHauteurFenetre(*p, GetINI_ParamHauteurFenetre(*q))
*p = SetINI_ParamToujoursVisible(*p, GetINI_ParamToujoursVisible(*q))
FreeMemory(*q)
ProcedureReturn *p
EndProcedure
Procedure InitINI_Param()
*p.INI_Param = AllocateMemory(SizeOf(INI_Param))
ProcedureReturn *p
EndProcedure
Procedure CreateINI_Param(NomFichier.s, LargeurFenetre.w, HauteurFenetre.w, ToujoursVisible.b)
*p.INI_Param = AllocateMemory(SizeOf(INI_Param))
*p = SetINI_ParamNomFichier(*p, NomFichier)
*p = SetINI_ParamLargeurFenetre(*p, LargeurFenetre)
*p = SetINI_ParamHauteurFenetre(*p, HauteurFenetre)
*p = SetINI_ParamToujoursVisible(*p, ToujoursVisible)
ProcedureReturn *p
EndProcedure
Procedure FreeINI_Param(*q.INI_Param)
FreeMemory(*q)
EndProcedure
Et finalement celui ci sous le nom : Procédures.pb
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Exemple de Programmation Basé Objet -- Procédures
; Version 1.0.0
; Programmation = À compléter
; Programmé par : Guimauve
; Date : 1er mai 2005
; Mise à jour : 1er mai 2005
; Codé avec PureBasic V3.93
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure CreerFichierINI(*Alpha.INI_Param)
; Création du fichier INI
CreatePreferences(GetINI_ParamNomFichier(*Alpha))
; Écriture des informations
PreferenceComment("Les dimensions de la fenètre")
WritePreferenceLong("Largeur Fenètre", GetINI_ParamLargeurFenetre(*Alpha))
WritePreferenceLong("Hauteur Fenètre", GetINI_ParamHauteurFenetre(*Alpha))
PreferenceComment("Toujous Visible = 0 : La fenètre n'est toujours au dessus des autres")
PreferenceComment("Toujous Visible = 1 : La fenètre est toujours au dessus des autres")
WritePreferenceLong("Toujours Visible", GetINI_ParamToujoursVisible(*Alpha))
; On ferme le fichier INI
ClosePreferences()
EndProcedure
Procedure OuvrirFichierINI(*Alpha.INI_Param)
Nomfichier$ = GetINI_ParamNomFichier(*Alpha)
*User = InitINI_Param()
; *User est vide on lui ajoute le Nomfichier
*User = SetINI_ParamNomFichier(*User, Nomfichier$)
; On lit les valeurs depuis le fichier iNI et on écrit les valeurs dans *User
OpenPreferences(Nomfichier$)
*User = SetINI_ParamLargeurFenetre(*User, ReadPreferenceLong("Largeur Fenètre", GetINI_ParamLargeurFenetre(*Alpha)))
*User = SetINI_ParamHauteurFenetre(*User, ReadPreferenceLong("Hauteur Fenètre", GetINI_ParamHauteurFenetre(*Alpha)))
*User = SetINI_ParamToujoursVisible(*User, ReadPreferenceLong("Toujours Visible", GetINI_ParamToujoursVisible(*Alpha)))
; On ferme le fichier INI
ClosePreferences()
ProcedureReturn *User
EndProcedure
Procedure VerificationDepart(*Alpha.INI_Param)
Nomfichier$ = GetINI_ParamNomFichier(*Alpha)
If FileSize(Nomfichier$) = -1
; Le fichier n'existe pas, on creer celui par défault
CreerFichierINI(*Alpha)
; La méthode TransferINI_Param va effectuer un transfer de *Alpha
; vers une zone mémoire puis va retourner un pointeur vers la zone
; mémoire des informations. Ce transfer évite de redémarrer le programme
*Gamma = TransferINI_Param(InitINI_Param(), *Alpha)
Else
; Le fichier existe, on prend les informations depuis le fichier
; *Alpha est nécessaire à l'ouverture du fichier INI dans l'éventualité
; que ou le mot clef ou la valeur soit absente dans le fichier INI
*Gamma = OuvrirFichierINI(*Alpha)
; *Alpha est maintenant inutile, on le détruit
FreeINI_Param(*Alpha)
EndIf
ProcedureReturn *Gamma
EndProcedure
Procedure VerificationSortie(*Alpha.INI_Param)
; On Recreer le fichier INI avec les paramètres de l'utilisateur
; pour le prochain démarrage du programme.
Nomfichier$ = GetINI_ParamNomFichier(*Alpha)
Largeur.w = Val(GetGadgetText(#String_LargeurFenetre))
Hauteur.w = Val(GetGadgetText(#String_HauteurFenetre))
ToujoursVisible.b = 1
CreerFichierINI(UpdateINI_Param(*Alpha, Nomfichier$, Largeur, Hauteur, ToujoursVisible))
EndProcedure
Ici l'objet contient les paramètres INI pour le programme. L'exemple n'est pas très bon parce que les paramètres ini sont très spécifique à un seul programme.
Le concept serait le même pour les informations au sujet d'un chasseur dans un jeu par exemple. Où à la fois l'objet est utilisé par l'editeur de vaisseau et bien entendu le jeu. En incluant le même fichier dans le 2 source on est certain que la mise à jour se fait dans les 2 programmes. Et c'est le but visé surtout s'il y a beaucoup de modification à la Structure de données.
Exemple, au départ une variable de type byte semblait suffisante mais on éprouve un problème de débordement mémoire. En modifiant la Strucutre et les méthodes on corrige partout dans les 2 programmes en même temps. Si le même objet se retrouve dans 3 programmes, les corrections sont effectives dans les 3 programmes et sa continue autant de fois que l'objet est utilisé. Et c'est encore plus important si les Structures sont imbriquées les une dans les autres.
Guimauve