Gestion d'événements périodiques
Publié : mar. 14/janv./2025 8:51
Bonjour à tous
aujourd'hui, je vous offre cette petite application qui permet de programmer des événements périodiques qui être peuvent annuels, mensuels, hebdomadaires, spécifiques ou personnels, par exemple tous les 20 de chaque mois.
aujourd'hui, je vous offre cette petite application qui permet de programmer des événements périodiques qui être peuvent annuels, mensuels, hebdomadaires, spécifiques ou personnels, par exemple tous les 20 de chaque mois.
Code : Tout sélectionner
Enumeration Fichiers
#Fichier_Json
EndEnumeration
Enumeration Fenetres
#Fenetre_Principale
EndEnumeration
Enumeration Gadgets
#Cvs_principal
#Txt_Alarmes
#Txt_Nom
#Txt_Date
#Txt_Periode
#Txt_Frequence
#Txt_JourSpecifique
#Txt_MoisSpecifique
#Txt_JoursPerso
#Str_Nom
#Str_Date
#Str_Frequence
#Str_JourSpecifique
#Str_MoisSpecifique
#Str_JoursPerso
#Cmb_Periode
#Chk_AlarmeActive
#Btn_Ajouter
#Btn_Modifier
#Btn_Supprimer
#Btn_Quitter
#Lst_EvenementPeriodique
EndEnumeration
Enumeration Polices
#Police
EndEnumeration
; Déclaration des structures et des variables nécessaires
Structure EvenementPeriodique
nom.s
dateRdv.s
periode.s
frequence.i
jourSpecifique.i
moisSpecifique.i
JoursPerso.i
alarmeActive.i
EndStructure
Global.s Rep$ = GetPathPart(ProgramFilename()) : SetCurrentDirectory(Rep$)
Global NewList Lst_Evenements.evenementPeriodique()
Global Timer = 0
Global baseDeDonnees$ = GetCurrentDirectory() + "événements périodiques.json"
Global fichierDeConfiguration$ = GetCurrentDirectory() + "config.ini"
Global alarmes$ = "" ; Variable pour stocker les messages d'alarme
Global X.i = -1, Y.i = -1, Largeur.i = 490, Hauteur.i = 530
; Chargement des polices
LoadFont(#Police , "Arial Nova", 12, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))
Declare AjouterEvenementPeriodique(nom$, dateEvenement$, periode$, frequence, jourSpecifique, moisSpecifique, joursPerso, alarmeActive)
Declare VerifierExistenceEvenementPeriodique(nom$, dateEvenement$)
Declare VerifierAlarmes()
Declare ReactiverAlarmes()
Declare ChargerEvenements(baseDeDonnees$)
Declare AfficherListeEvenements()
Declare SauvegarderEvenements(baseDeDonnees$)
Declare ChargerListeListeEvenements()
Declare AjouterEvenement()
Declare ModifierEvenement(index)
Declare SupprimerEvenement(index)
Declare GestionEvenements()
Declare SauvegarderPositionEtTaille()
Declare ChargerPositionEtTaille()
Declare Programme_principal()
Declare FenetreFermer()
Declare Quitter()
; Modification de la fonction d'ajout d'événements pour inclure un indicateur d'alarme active
Procedure AjouterEvenementPeriodique(nom$, dateEvenement$, periode$, frequence, jourSpecifique, moisSpecifique, joursPerso, alarmeActive)
AddElement(Lst_Evenements())
Lst_Evenements()\nom = nom$
Lst_Evenements()\dateRdv = dateEvenement$
Lst_Evenements()\periode = periode$
Lst_Evenements()\frequence = frequence
Lst_Evenements()\jourSpecifique = jourSpecifique
Lst_Evenements()\moisSpecifique = moisSpecifique
Lst_Evenements()\JoursPerso = joursPerso
Lst_Evenements()\alarmeActive = alarmeActive
EndProcedure
Procedure VerifierExistenceEvenementPeriodique(nom$, dateEvenement$)
ForEach Lst_Evenements()
If Lst_Evenements()\nom = nom$ And Lst_Evenements()\dateRdv = dateEvenement$
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
; Fonction pour vérifier et déclencher les alarmes
Procedure VerifierAlarmes()
alarmes$ = "" ; Nettoyer la variable avant d'ajouter de nouvelles alarmes
DateActuelle = Date()
jourActuel = Day(DateActuelle)
moisActuel = Month(DateActuelle)
anneeActuelle = Year(DateActuelle)
jourSemaineActuel = DayOfWeek(DateActuelle)
ForEach Lst_Evenements()
DateRdv = ParseDate("%dd/%mm/%yyyy", Lst_Evenements()\dateRdv)
joursEcoules = (DateActuelle - DateRdv) / 86400
Select Lst_Evenements()\periode
Case "annuel"
If Day(DateRdv) = jourActuel And Month(DateRdv) = moisActuel And Lst_Evenements()\alarmeActive = 1
alarmes$ + "Événement: " + Lst_Evenements()\nom + " (annuel)" + #LF$ ; Ajouter le message d'alarme
Lst_Evenements()\alarmeActive = 0 ; Désactiver l'alarme après déclenchement
EndIf
Case "mensuel"
If Day(DateRdv) = jourActuel And Lst_Evenements()\alarmeActive = 1
alarmes$ + "Événement: " + Lst_Evenements()\nom + " (mensuel)" + #LF$ ; Ajouter le message d'alarme
Lst_Evenements()\alarmeActive = 0 ; Désactiver l'alarme après déclenchement
EndIf
Case "hebdomadaire"
If DayOfWeek(DateRdv) = jourSemaineActuel And Lst_Evenements()\alarmeActive = 1
alarmes$ + "Événement: " + Lst_Evenements()\nom + " (hebdomadaire)" + #LF$ ; Ajouter le message d'alarme
Lst_Evenements()\alarmeActive = 0 ; Désactiver l'alarme après déclenchement
EndIf
Case "specifique"
If Day(DateActuelle) = Lst_Evenements()\jourSpecifique And Month(DateActuelle) = Lst_Evenements()\moisSpecifique
If Lst_Evenements()\alarmeActive = 1
alarmes$ + "Événement: " + Lst_Evenements()\nom + " (spécifique)" + #LF$ ; Ajouter le message d'alarme
Lst_Evenements()\alarmeActive = 0 ; Désactiver l'alarme après déclenchement
EndIf
EndIf
Case "perso"
; Vérifier que joursPerso n'est pas zéro avant de faire l'opération modulo
If Lst_Evenements()\joursPerso > 0 And joursEcoules % Lst_Evenements()\joursPerso = 0 And Lst_Evenements()\alarmeActive = 1
alarmes$ + "Événement: " + Lst_Evenements()\nom + " (tous les " + Str(Lst_Evenements()\joursPerso) + " jours)" + #LF$
; Ajouter le message d'alarme
Lst_Evenements()\alarmeActive = 0 ; Désactiver l'alarme après déclenchement
EndIf
EndSelect
Next
; Mettre à jour le TextGadget avec les messages d'alarme
SetGadgetText(#Txt_Alarmes, alarmes$)
EndProcedure
; Fonction pour réactiver les alarmes périodiques
Procedure ReactiverAlarmes()
ForEach Lst_Evenements()
If Lst_Evenements()\periode = "annuel" Or Lst_Evenements()\periode = "mensuel" Or Lst_Evenements()\periode = "hebdomadaire" Or Lst_Evenements()\periode = "specifique" Or Lst_Evenements()\periode = "perso"
Lst_Evenements()\alarmeActive = 1
EndIf
Next
EndProcedure
Procedure ChargerEvenements(baseDeDonnees$)
If ReadFile(#Fichier_Json, baseDeDonnees$)
CloseFile(#Fichier_Json)
LoadJSON(#Fichier_Json, baseDeDonnees$, #PB_JSON_NoCase)
ExtractJSONList(JSONValue(#Fichier_Json), Lst_Evenements())
Debug "Chargement du fichier JSON réussi"
Else
Debug "Erreur lors de la lecture du fichier JSON"
EndIf
EndProcedure
Procedure SauvegarderEvenements(baseDeDonnees$)
CreateJSON(#Fichier_Json)
InsertJSONList(JSONValue(0), Lst_Evenements())
If SaveJSON(#Fichier_Json, baseDeDonnees$, #PB_JSON_PrettyPrint)
Debug "Fichier JSON sauvegardé avec succès"
Else
Debug "Erreur lors de la sauvegarde du fichier JSON"
EndIf
FreeJSON(#Fichier_Json)
EndProcedure
Procedure ChargerListeListeEvenements()
ClearGadgetItems(#Lst_EvenementPeriodique)
ForEach Lst_Evenements()
AddGadgetItem(#Lst_EvenementPeriodique, -1, Lst_Evenements()\nom + " - " + Lst_Evenements()\dateRdv)
Next
EndProcedure
Procedure AjouterEvenement()
nom$ = GetGadgetText(#Str_Nom)
dateEvenement$ = GetGadgetText(#Str_Date)
periode$ = GetGadgetText(#Cmb_Periode)
frequence = Val(GetGadgetText(#Str_Frequence))
jourSpecifique = Val(GetGadgetText(#Str_JourSpecifique))
moisSpecifique = Val(GetGadgetText(#Str_MoisSpecifique))
joursPerso = Val(GetGadgetText(#Str_JoursPerso))
alarmeActive = GetGadgetState(#Chk_AlarmeActive)
If Not VerifierExistenceEvenementPeriodique(nom$, dateEvenement$)
AjouterEvenementPeriodique(nom$, dateEvenement$, periode$, frequence, jourSpecifique, moisSpecifique, joursPerso, alarmeActive)
SauvegarderEvenements(baseDeDonnees$)
ChargerListeListeEvenements()
Else
MessageRequester("Information", "L'événement existe déjà.")
EndIf
EndProcedure
Procedure ModifierEvenement(index)
If index >= 0 And index < ListSize(Lst_Evenements())
SelectElement(Lst_Evenements(), index)
Lst_Evenements()\nom = GetGadgetText(#Str_Nom)
Lst_Evenements()\dateRdv = GetGadgetText(#Str_Date)
Lst_Evenements()\periode = GetGadgetText(#Cmb_Periode)
Lst_Evenements()\frequence = Val(GetGadgetText(#Str_Frequence))
Lst_Evenements()\jourSpecifique = Val(GetGadgetText(#Str_JourSpecifique))
Lst_Evenements()\moisSpecifique = Val(GetGadgetText(#Str_MoisSpecifique))
Lst_Evenements()\JoursPerso = Val(GetGadgetText(#Str_JoursPerso))
Lst_Evenements()\alarmeActive = GetGadgetState(#Chk_AlarmeActive)
SauvegarderEvenements(baseDeDonnees$)
ChargerListeListeEvenements()
EndIf
EndProcedure
Procedure SupprimerEvenement(index)
If index >= 0 And index < ListSize(Lst_Evenements())
If MessageRequester("Confirmation", "Êtes-vous sûr de vouloir supprimer ce rendez-vous ? Cette action est irréversible.", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
SelectElement(Lst_Evenements(), index)
DeleteElement(Lst_Evenements())
SauvegarderEvenements(baseDeDonnees$)
ChargerListeListeEvenements()
EndIf
EndIf
EndProcedure
Procedure GestionEvenements()
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Ajouter
AjouterEvenement()
Case #Btn_Modifier
index = GetGadgetState(#Lst_EvenementPeriodique)
ModifierEvenement(index)
Case #Btn_Supprimer
index = GetGadgetState(#Lst_EvenementPeriodique)
SupprimerEvenement(index)
Case #Btn_Quitter
CloseWindow(#fenetre_principale)
End
Case #Cvs_principal
Select EventType()
Case #PB_EventType_LeftButtonDown
Btn_SourisPresse = 1:DecalageX = DesktopMouseX() - WindowX(#Fenetre_principale):DecalageY = DesktopMouseY() - WindowY(#Fenetre_principale)
Case #PB_EventType_MouseMove
If Btn_SourisPresse:ResizeWindow(#Fenetre_principale, DesktopMouseX() - DecalageX, DesktopMouseY() - DecalageY, #PB_Ignore, #PB_Ignore):EndIf
Case #PB_EventType_LeftButtonUp
Btn_SourisPresse = 0
EndSelect
Case #Lst_EvenementPeriodique
index = GetGadgetState(#Lst_EvenementPeriodique)
If index >= 0 And index < ListSize(Lst_Evenements())
SelectElement(Lst_Evenements(), index)
SetGadgetText(#Str_Nom, Lst_Evenements()\nom)
SetGadgetText(#Str_Date, Lst_Evenements()\dateRdv)
SetGadgetText(#Cmb_Periode, Lst_Evenements()\periode)
SetGadgetText(#Str_Frequence, Str(Lst_Evenements()\frequence))
SetGadgetText(#Str_JourSpecifique, Str(Lst_Evenements()\jourSpecifique))
SetGadgetText(#Str_MoisSpecifique, Str(Lst_Evenements()\moisSpecifique))
SetGadgetText(#Str_JoursPerso, Str(Lst_Evenements()\JoursPerso))
SetGadgetState(#Chk_AlarmeActive, Lst_Evenements()\alarmeActive)
EndIf
EndSelect
Case #PB_Event_CloseWindow
If EventWindow() = #fenetre_principale
Break
EndIf
EndSelect
ForEver
EndProcedure
Procedure SauvegarderPositionEtTaille()
If CreateFile(0, fichierDeConfiguration$)
WriteStringN(0, "X=" + Str(X))
WriteStringN(0, "Y=" + Str(Y))
WriteStringN(0, "Largeur=" + Str(Largeur))
WriteStringN(0, "Hauteur=" + Str(Hauteur))
CloseFile(0)
Else
MessageRequester("Erreur", "Impossible de créer le fichier de configuration.")
EndIf
EndProcedure
Procedure ChargerPositionEtTaille()
If FileSize(fichierDeConfiguration$) > 0
If ReadFile(0, fichierDeConfiguration$)
While Eof(0) = 0
ligne$ = ReadString(0)
If FindString(ligne$, "X=", 1) > 0
X = Val(RemoveString(ligne$, "X="))
ElseIf FindString(ligne$, "Y=", 1) > 0
Y = Val(RemoveString(ligne$, "Y="))
ElseIf FindString(ligne$, "Largeur=", 1) > 0
Largeur = Val(RemoveString(ligne$, "Largeur="))
ElseIf FindString(ligne$, "Hauteur=", 1) > 0
Hauteur = Val(RemoveString(ligne$, "Hauteur="))
EndIf
Wend
CloseFile(0)
Else
MessageRequester("Erreur", "Impossible de lire le fichier de configuration.")
EndIf
Else
; Valeurs par défaut si le fichier n'existe pas
X = -1
Y = -1
Largeur = 490
Hauteur = 530
EndIf
EndProcedure
Procedure MonCallback(WindowID, Message, wParam, lParam)
Select Message
Case #WM_MOVE, #WM_SIZE
; Obtenir la position et la taille de la fenêtre
X = WindowX(#Fenetre_Principale)
Y = WindowY(#Fenetre_Principale)
Largeur = WindowWidth(#Fenetre_Principale)
Hauteur = WindowHeight(#Fenetre_Principale)
; Sauvegarder la position et la taille
SauvegarderPositionEtTaille()
EndSelect
; Appel de la procédure de rappel par défaut
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure Programme_principal()
ChargerPositionEtTaille()
If X = -1 Or Y = -1
OpenWindow(#Fenetre_Principale, 0, 0, Largeur, Hauteur, "Gestion des événements périodiques", #PB_Window_ScreenCentered)
Else
OpenWindow(#Fenetre_Principale, X, Y, Largeur, Hauteur, "Gestion des événements périodiques", #PB_Window_BorderLess)
EndIf
CanvasGadget(#Cvs_principal, 0, 0, Largeur, Hauteur, #PB_Canvas_Container)
; Définir le rappel de la fenêtre
SetWindowCallback(@MonCallback(), #Fenetre_Principale)
TextGadget(#Txt_Alarmes, 10, 10, 580, 20, "")
ListViewGadget(#Lst_EvenementPeriodique, 10, 40, 470, 240)
TextGadget(#Txt_Nom, 10, 290, 90, 30, "Nom", #SS_CENTERIMAGE|#SS_RIGHT) : StringGadget(#Str_Nom, 110, 290, 120, 30, "")
TextGadget(#Txt_Date, 10, 340, 90, 30, "Date", #SS_CENTERIMAGE|#SS_RIGHT) : StringGadget(#Str_Date, 110, 340, 120, 30, "")
TextGadget(#Txt_Periode, 10, 390, 90, 30, "Période", #SS_CENTERIMAGE|#SS_RIGHT) : ComboBoxGadget(#Cmb_Periode, 110, 390, 120, 30)
AddGadgetItem(#Cmb_Periode, -1, "annuel")
AddGadgetItem(#Cmb_Periode, -1, "mensuel")
AddGadgetItem(#Cmb_Periode, -1, "hebdomadaire")
AddGadgetItem(#Cmb_Periode, -1, "spécifique")
AddGadgetItem(#Cmb_Periode, -1, "perso")
TextGadget(#Txt_JoursPerso, 10, 440, 90, 30, "Jours perso", #SS_CENTERIMAGE|#SS_RIGHT) : StringGadget(#Str_JoursPerso, 110, 440, 120, 30, "")
TextGadget(#Txt_Frequence, 280, 290, 140, 30, "Fréquence", #SS_CENTERIMAGE|#SS_RIGHT) : StringGadget(#Str_Frequence, 430, 290, 50, 30, "")
TextGadget(#Txt_JourSpecifique, 280, 340, 140, 30, "Jour spécifique", #SS_CENTERIMAGE|#SS_RIGHT) : StringGadget(#Str_JourSpecifique, 430, 340, 50, 30, "")
TextGadget(#Txt_MoisSpecifique, 280, 390, 140, 30, "Mois spécifique", #SS_CENTERIMAGE|#SS_RIGHT) : StringGadget(#Str_MoisSpecifique, 430, 390, 50, 30, "")
CheckBoxGadget(#Chk_AlarmeActive, 340, 440, 200, 30, " Alarme active")
ButtonGadget(#Btn_Ajouter, 10, 490, 100, 30, "Ajouter")
ButtonGadget(#Btn_Modifier, 132, 490, 100, 30, "Modifier")
ButtonGadget(#Btn_Supprimer, 254, 490, 100, 30, "Supprimer")
ButtonGadget(#Btn_Quitter, 380, 490, 100, 30, "Quitter")
CloseGadgetList()
GadgetToolTip(#Str_Nom, "Nom de l'évenement")
GadgetToolTip(#Str_Date, "JJ/MM/AAAA")
GadgetToolTip(#Cmb_Periode, "Période spécifique")
GadgetToolTip(#Str_JoursPerso, "Jour")
GadgetToolTip(#Str_Frequence, "Intervalle de temps")
GadgetToolTip(#Str_JourSpecifique, "Jour du mois ou 0")
GadgetToolTip(#Str_MoisSpecifique, "Mois ou 0")
StartDrawing(CanvasOutput(#Cvs_principal))
Box(0, 0, 490, 530, $3CB7FD)
StopDrawing()
SetWindowColor(#Fenetre_Principale, $3CB7FD)
For i = #Txt_Alarmes To #Txt_JoursPerso
SetGadgetColor(i, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_Principale))
Next i
SetGadgetColor(#Lst_EvenementPeriodique, #PB_Gadget_BackColor, $C1E8FE)
BindEvent(#PB_Event_CloseWindow, @FenetreFermer(), #Fenetre_Principale)
EndProcedure
Procedure FenetreFermer()
; Obtenir la position et la taille de la fenêtre avant de la fermer
X = WindowX(#Fenetre_Principale)
Y = WindowY(#Fenetre_Principale)
Largeur = WindowWidth(#Fenetre_Principale)
Hauteur = WindowHeight(#Fenetre_Principale)
; Sauvegarder la position et la taille
SauvegarderPositionEtTaille()
; Fermer la fenêtre
CloseWindow(#Fenetre_Principale)
End
EndProcedure
Procedure Quitter()
PostEvent(#PB_Event_CloseWindow, #Fenetre_Principale, #PB_Event_CloseWindow)
EndProcedure
; Lancer le programme principal
Programme_principal()
; Attacher le bouton Quitter à la procédure de fermeture de la fenêtre
BindGadgetEvent(#Btn_Quitter, @Quitter())
; Charger la liste de rendez-vous
ChargerEvenements(baseDeDonnees$)
ChargerListeListeEvenements()
VerifierAlarmes()
GestionEvenements()