Fêtes familliales

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Fêtes familliales

Message par Micoute »

Bonjour à tous,
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
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fêtes familliales

Message par Kwai chang caine »

Merci MICOUTE pour le partage, content de te voir de retour au clavier 8)
J'ai un dépassement de caractères de la fenêtre, je ne peux pas tout lire
W10 X64 v5.60
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fêtes familliales

Message par Micoute »

Kwai chang caine a écrit :Merci MICOUTE pour le partage, content de te voir de retour au clavier 8)
J'ai un dépassement de caractères de la fenêtre, je ne peux pas tout lire
W10 X64 v5.60
Je ne compte pas lâcher mon clavier que j'aime tant, du jour au lendemain.
Pour le programme, il est libre droits et tu peux le modifier à ta guise.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre