toujours sur ma lancée et toujours sur le même principe, aujourd'hui je vous propose de trouver la date des fêtes familiales importantes, c'est à dire celle de nos aïeux et de nos parents. J'ai du ajouter la date de Pâques, parce la fête des mères est toujours reportée au dimanche suivant, quand la Pentecôte tombe le dernier dimanche de mai.
Pour l'utilisation, c'est très simple, j'ai repris mon combo pour afficher les années qui va de l'année en cours jusqu'à 2037, d'ici cette date, on aura sûrement trouvé un moyen de calculer plus loin.
Code : Tout sélectionner
;Fetes familliales
;Auteur : Micoute
;Date : 4 juin 2017
;Version PB : 5.60 x86 et x64, devrait fonctionner avec toutes les versions
;OS utilisé : Windows 10 64 bits
Enumeration Fenetres
#Fenetre_principale
EndEnumeration
Enumeration Gadgets
#Txt_Annee
#Cmb_Annee
#Btn_Valider
#Cvs
EndEnumeration
Enumeration Polices
#Police
EndEnumeration
Declare Programme_Principal()
Declare Valider()
Declare$ Fete_des_grand_meres(Annee = -1)
Declare$ Fete_des_meres(Annee = -1)
Declare$ Fete_des_peres(Annee = -1)
Declare$ Fete_des_grand_peres(Annee= -1)
Declare.i TrouverPremierDimanche(Annee, Mois)
Declare.i TrouverDeuxiemeDimanche(Annee, Mois)
Declare.i TrouverTroisiemeDimanche(Annee, Mois)
Declare.i TrouverQuatriemeDimanche(Annee, Mois)
Declare.i TrouverDernierDimanche(Annee, Mois)
Declare.b JoursDansMois(Annee=-1, Mois=-1)
Declare Paques(Annee = -1)
Declare Quitter()
Global n, evenement
Programme_Principal()
Procedure Programme_Principal()
OpenWindow(#Fenetre_principale, 0, 0, 220, 70, "Choisissez une année", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(#Txt_Annee, 20, 20, 40, 22, "Année")
ComboBoxGadget(#Cmb_Annee, 70, 20, 50, 22)
For n = Year(Date()) To 2037
AddGadgetItem(#Cmb_Annee, -1, Str(n))
Next n
SetGadgetState(#Cmb_Annee, 0)
ButtonGadget(#Btn_Valider, 130, 20, 80, 22, "Valider")
;Déclancheurs
BindEvent(#PB_Event_CloseWindow, @Quitter())
BindGadgetEvent(#Btn_Valider, @Valider())
Repeat : WaitWindowEvent() : ForEver
EndProcedure
Procedure Valider()
Protected X = 10, Y = 0, L = 570, H = 180, AnneeRet = Val(GetGadgetText(#Cmb_Annee))
If AnneeRet = 0
AnneeRet = Year(Date())
EndIf
LoadFont(#Police, "FontAwesome", 30)
HideGadget(#Txt_Annee, 1)
HideGadget(#Cmb_Annee, 1)
HideGadget(#Btn_Valider, 1)
ResizeWindow(#Fenetre_principale, 545, 295, L, H)
SetWindowTitle(#Fenetre_principale, "Vous avez sélectionné l'année " + AnneeRet)
CanvasGadget(#Cvs, 0, 0, L, H)
StartDrawing(CanvasOutput(#Cvs))
DrawingFont(FontID(#Police))
texte$ = "Fêtes des grand-mères : le "
texte$ + Fete_des_grand_meres(AnneeRet)
X = (L - TextWidth(texte$)) / 2
DrawText(X, Y, texte$, $B40000, $FFFFFF)
Y + TextHeight(" ")
texte$ = "Fêtes des mères : le "
texte$ + Fete_des_meres(AnneeRet)
X = (L - TextWidth(texte$)) / 2
DrawText(X, Y, texte$, $B40000, $FFFFFF)
Y + TextHeight(" ")
texte$ = "Fêtes des pères : le "
texte$ + Fete_des_peres(AnneeRet)
X = (L - TextWidth(texte$)) / 2
DrawText(X, Y, texte$, $B40000, $FFFFFF)
Y + TextHeight(" ")
texte$ = "Fêtes des grand-pères : le "
texte$ + Fete_des_grand_peres(AnneeRet)
X = (L - TextWidth(texte$)) / 2
DrawText(X, Y, texte$, $B40000, $FFFFFF)
Y + TextHeight(" ")
StopDrawing()
EndProcedure
Procedure$ Fete_des_grand_meres(Annee = -1)
Protected Mois = 3, Resultat$=FormatDate("%dd/%mm/%yyyy", TrouverPremierDimanche(Annee, Mois))
ProcedureReturn Resultat$
EndProcedure
Procedure$ Fete_des_meres(Annee = -1)
Protected Mois = 5, Resultat$=FormatDate("%dd/%mm/%yyyy", TrouverDernierDimanche(Annee, Mois))
If Resultat$ = FormatDate("%dd/%mm/%yyyy", AddDate(Paques(Annee), #PB_Date_Day, 49))
Mois = 6
Resultat$ = FormatDate("%dd/%mm/%yyyy", TrouverPremierDimanche(Annee, Mois))
EndIf
ProcedureReturn Resultat$
EndProcedure
Procedure$ Fete_des_peres(Annee = -1)
Protected Mois = 6, Resultat$=FormatDate("%dd/%mm/%yyyy", TrouverTroisiemeDimanche(Annee, Mois))
ProcedureReturn Resultat$
EndProcedure
Procedure$ Fete_des_grand_peres(Annee= -1)
Protected Mois = 10, Resultat$=FormatDate("%dd/%mm/%yyyy", TrouverPremierDimanche(Annee, Mois))
ProcedureReturn Resultat$
EndProcedure
Procedure.i TrouverPremierDimanche(Annee, Mois)
Protected Jour=1
Protected DatePremierDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
;Cherche le premier dimanche
While DayOfWeek(DatePremierDimanche)<>0
Jour + 1
DatePremierDimanche= Date(Annee, Mois, Jour, 0, 0, 0)
Wend
ProcedureReturn DatePremierDimanche
EndProcedure
Procedure.i TrouverDeuxiemeDimanche(Annee, Mois)
Protected Jour=8
Protected DateDeuxiemeDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
;Cherche le deuxième dimanche
While DayOfWeek(DateDeuxiemeDimanche)<>0
Jour + 1
DateDeuxiemeDimanche= Date(Annee, Mois, Jour, 0, 0, 0)
Wend
ProcedureReturn DateDeuxiemeDimanche
EndProcedure
Procedure.i TrouverTroisiemeDimanche(Annee, Mois)
Protected Jour=15
Protected DateTroisiemeDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
;Cherche le Troisième dimanche
While DayOfWeek(DateTroisiemeDimanche)<>0
Jour + 1
DateTroisiemeDimanche= Date(Annee, Mois, Jour, 0, 0, 0)
Wend
ProcedureReturn DateTroisiemeDimanche
EndProcedure
Procedure.i TrouverQuatriemeDimanche(Annee, Mois)
Protected Jour=22
Protected DateQuatriemeDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
;Cherche le Quatrième dimanche
While DayOfWeek(DateQuatriemeDimanche)<>0
Jour + 1
DateQuatriemeDimanche= Date(Annee, Mois, Jour, 0, 0, 0)
Wend
ProcedureReturn DateQuatriemeDimanche
EndProcedure
Procedure.i TrouverDernierDimanche(Annee, Mois)
Protected Jour=25 ;JoursDansMois(Mois)
Protected DateDernierDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
;Cherche le dernier dimanche
While DayOfWeek(DateDernierDimanche)<>0
Jour + 1
DateDernierDimanche= Date(Annee, Mois, Jour, 0, 0, 0)
Wend
;Debug DateDernierDimanche
;If DateDernierDimanche <> -1
ProcedureReturn DateDernierDimanche
;EndIf
EndProcedure
Macro Bissextile(Annee)
Bool(((Not Year(Annee) % 4) And Year(Annee) % 100) Or (Not Year(Annee) % 400))
EndMacro
Procedure.b JoursDansMois(Annee=-1, Mois=-1)
; Retourne le nombre de jours dans le mois donné (28 .. 31)
; Si l'année est absente, l'année en cours est utilisée
; Si l'année est présente mais le mois est absent, février est utilisé
; Si l'année et le mois sont tous deux absents, le mois courant de l'année en cours est utilisé
Protected Jours
If Annee = -1
Annee = Year(Date())
If Mois = -1
Mois = Month(Date())
EndIf
Else
If Mois<=0: Mois = 2: EndIf
EndIf
If Mois=2
If Bissextile(Annee)
Jours = 29
Else
Jours = 28
EndIf
Else
jours = 31-$A55>>Mois&1
EndIf
NbjoursMois = Jours
ProcedureReturn NbjoursMois
EndProcedure
Procedure Paques_(Annee) ; interne
Protected a, b, c, d, e, f, g, h, i, k, l, m, Resultat
a = Mod(Annee, 19)
b = Annee / 100
c = Mod(Annee, 100)
d = b / 4
e = Mod(b, 4)
f = (b + 8) / 25
g = (b - f + 1) / 3
h = Mod((19 * a + b - d - g + 15), 30)
i = c / 4
k = Mod(c, 4)
l = Mod((32 + 2 * e + 2 * i - h - k), 7)
m = (a + 11 * h + 22 * l) / 451
Resultat = 22 + h + l - 7 * m
ProcedureReturn Resultat
EndProcedure
Procedure Paques(Annee = -1)
Protected Jour, Mois = 3
If Annee = -1
Annee = Year(Date())
EndIf
Jour = Paques_(Annee)
If Jour
If Jour > 31
Jour - 31
Mois + 1
EndIf
ProcedureReturn Date(Annee, Mois, Jour, 0, 0, 0)
EndIf
EndProcedure
Procedure Quitter()
End
EndProcedure