Liste pour exécuter dans un programme tiers

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Liste pour exécuter dans un programme tiers

Message par Micoute »

Bonjour à tous,

fabriquer une horloge avec PB, je sais faire.

Ce que je souhaite faire c'est une liste que le programme de l'horloge charge et exécute par exemple "Rendez-vous à 16 heures 20 avec le docteur Machin" et à l'heure indiquée elle dirait le message grâce au système S.A.P.I.

Je sais faire cette chose en programmant en dur, mais j'aimerais utiliser une liste de commande en chargeant une base de données.

Pouvez-vous me mettre sur la voie ? Je ne vous remercierai jamais assez.
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
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Liste pour exécuter dans un programme tiers

Message par Ar-S »

Je te dirai que SATI est SAPI, que tu importes ton texte d'un string ou d'une BDD c'est pareil.
Il te faut poser un genre de plan :
- 1 stocker rendez vous et heure dans BDD
- 2 avoir un timer qui vérifie l'heure/minute
- 3 avoir un timer qui vérifie la bdd.
Faudrait que tu post un truc minimaliste.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Liste pour exécuter dans un programme tiers

Message par Micoute »

Merci Ar-s,

- La BDD c'est à ça que je pensais.
- Le timer est une excellente idée

Je vais donc à partir de ces préceptes construire une idée et la mettre en pratique.

Merci encore.

Voici ce que j'ai déjà fait

https://www.dropbox.com/s/hpjcbfutg1th9 ... e.zip?dl=1
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
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Liste pour exécuter dans un programme tiers

Message par Ar-S »

Surtout que tu utilises déjà un timer dans ton horloge (qui est très jolie dit en passant !) :)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Liste pour exécuter dans un programme tiers

Message par Micoute »

Bonjour Ar-s,

merci, oui j'aime les belles choses, car je pense que quand c'est beau, ça marche forcément mieux puisque le programmeur s'est efforcé à fignoler le logiciel.

Maintenant, il me faut trouver une solution pour faire un tandem entre l'horloge et la gestion des praticiens et des patients que j'ai déjà posté sur ce forum.
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
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Liste pour exécuter dans un programme tiers

Message par Ar-S »

Tu peux t'inspirer de cet exemple d'SQLITE que j'ai posté ici : https://www.purebasic.fr/french/viewtopic.php?t=18688
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Liste pour exécuter dans un programme tiers

Message par Ollivier »

Ça sent l'homme désoeuvré par les fuites de données de doctolib !
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Liste pour exécuter dans un programme tiers

Message par Micoute »

Bonjour Ar-s,

ma ma BDD est construite et nourrie par mon programme de gestion de praticiens qui me fabrique mes rendez-vous en choisissant un patient, une date dans le calendrier, une heure dans le combo qui est éditable pour pouvoir taper l'heure voulue, le praticien, sa profession et le complément.

avec la BDD dont je viens de parler, je filtre les données pour éviter d'afficher des rendez-vous passés, ça me donne ça :

Code : Tout sélectionner

;{ Fichiers inclus
XIncludeFile "D:\Programmation\Prg Perso\M\Modules\DateQ.pbi"
UseModule DateQ
;}
;{ Enumérations
Enumeration Json
  #FichierJSON
EndEnumeration  

Enumeration Fenetres
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Cvs_principal
  #Btn_Quitter
  #Minuteur
EndEnumeration

Enumeration Polices
  #Police
EndEnumeration  
;}
;{ Structure
;Rendez-vous
Structure Rdv
  Qui.s             ;Qui a Rdv
  Quand.s           ;Quand
  Avec.s            ;Avec qui
  Ou.s              ;Endroit du Rdv
  Heure.s           ;A quelle heure
  Complement.s
  Date.i
  Jour.i
  Mois.i
  Annee.i
  JDA.i
EndStructure
;Mes variables
Structure sVar
  Rep$
  Evenement.i
  Largeur.i
  Hauteur.i
  CoulFnd.i
  CoulTxt.i
  FichierJSON$
  I.i
  J.i
  X.i
  Y.i
  Texte$
  Delai.i
  Annee.w
  Mois.w
  Jour.i
  JourActuel.i
EndStructure
;}
;{ Variables
Global NewList RDV.Rdv()
Global.sVar Mavar
Mavar\Rep$ = GetPathPart(ProgramFilename()) : SetCurrentDirectory(Mavar\Rep$)
Mavar\Largeur = 1420 : Mavar\Hauteur = 350
Mavar\FichierJSON$ = "D:\Programmation\Prg Perso\G\Gestion des rendez-vous\Gestion de prises de rendez-vous praticiens et patients\Donnees\GESRDV JSON V1.JSON"
Mavar\X = 10: Mavar\Y = 15: Mavar\Annee = AnneeQ(DateQ()): Mavar\Mois = MoisQ(DateQ()): Mavar\JourActuel = JourQ(DateQ())
;}
;{ Chargement des polices
LoadFont(#Police, "DejaVu Sans Mono", 20, #PB_Font_Bold)
SetGadgetFont(#PB_Default, FontID(#Police))
;}
;{ Procédures
Procedure Affichage_Btn()
  Select Second(Date())
    Case  0, 2, 4, 6, 8,10,12,14,16,18,20,22,24,26,28,
          30,32,34,36,38,40,42,44,46,48,50,52,54,56,58
      SetGadgetColor(#Btn_Quitter, #PB_Gadget_BackColor, Mavar\CoulFnd)
      SetGadgetColor(#Btn_Quitter, #PB_Gadget_FrontColor, Mavar\CoulTxt)
    Default            
      SetGadgetColor(#Btn_Quitter, #PB_Gadget_BackColor, Mavar\CoulTxt)
      SetGadgetColor(#Btn_Quitter, #PB_Gadget_FrontColor, Mavar\CoulFnd)
  EndSelect
EndProcedure
Procedure Quitter()
  CloseWindow(EventWindow())
  End
EndProcedure
Procedure ChargerRDV()
  If ReadFile(#FichierJSON, Mavar\FichierJSON$)
    CloseFile(#FichierJSON)
    
    ;Lecture du fichier JSON
    LoadJSON(#FichierJSON, Mavar\FichierJSON$, #PB_JSON_NoCase)
    
    ;Extraction de la chaine JSON vers la liste de RDV
    ExtractJSONList(JSONValue(#FichierJSON),RDV())
  EndIf
  ForEach RDV()
    With RDV()
      \Date =RDV()
      \Annee = Val(Right(\Quand, 4))
      \Mois = Val(Mid(\Quand, 4, 2))
      \Jour = Val(Left(\Quand, 2))
      \JDA = DayOfYear(Date(\Annee,\Mois,\Jour,0,0,0))
    EndWith
  Next  
  SortStructuredList(RDV(), #PB_Sort_Ascending, OffsetOf(rdv\Jour), TypeOf(rdv\Jour))
  SortStructuredList(RDV(), #PB_Sort_Ascending, OffsetOf(rdv\Mois), TypeOf(rdv\Mois))
  SortStructuredList(RDV(), #PB_Sort_Ascending, OffsetOf(rdv\Annee), TypeOf(rdv\Annee))
EndProcedure
Procedure Procedure_principale()
  If OpenWindow(#Fenetre_principale, 0, 0, Mavar\Largeur, Mavar\Hauteur, "Rdv du jour", #PB_Window_BorderLess|#PB_Window_ScreenCentered)
    
    CanvasGadget(#Cvs_principal, 0, 0, Mavar\Largeur, Mavar\Hauteur, #PB_Canvas_Container)
    
    StartDrawing(CanvasOutput(#Cvs_principal))
    DrawingFont(FontID(#Police))
    Mavar\CoulFnd = $00007FFF
    Mavar\CoulTxt = $0000FFFF
    Box(0, 0, Mavar\Largeur, Mavar\Hauteur, Mavar\CoulFnd)
    Mavar\i = Aujourdhui_0Q()
    Mavar\j = JourDAnneeQ(Mavar\i)
    ForEach RDV()
      With RDV()
        While Mavar\i <= DateQ() + 518400 And \Annee = AnneeQ(Mavar\i) And \Mois >= MoisQ(Mavar\i) And \Jour >= JourQ(Mavar\i)
          If Mavar\j = \JDA
            Mavar\Delai = Val(Left(\quand, 2)) - Val(Left(FormatDateQ("%dd/%mm/%yyyy",DateQ()), 2))
            
            Mavar\Texte$ = "Le " + Left(\quand, 2) + " " + \Qui + " Rendez-vous avec " + \Avec + " à " + \Heure + " dans " + Mavar\Delai
            If Mavar\Delai < 2
              Mavar\Texte$ + " jour"
            Else
              Mavar\Texte$ + " jours"
            EndIf  
            DrawText(10, Mavar\y, Mavar\Texte$, Mavar\CoulTxt, Mavar\CoulFnd)
            Mavar\Y + TextHeight(" ")
          EndIf
          Mavar\i + 86400
          Mavar\j + 1
        Wend
      EndWith
    Next
    
    StopDrawing()
    
    ResizeWindow(#Fenetre_principale, #PB_Ignore, #PB_Ignore, #PB_Ignore, Mavar\Y + 60)
    
    Mavar\hauteur = Mavar\Y + 10 
    
    StringGadget(#Btn_Quitter, (Mavar\Largeur - 200) / 2, Mavar\hauteur, 200, 40, "< Quitter >")
    SetGadgetColor(#Btn_Quitter, #PB_Gadget_BackColor, Mavar\CoulFnd)
    SetGadgetColor(#Btn_Quitter, #PB_Gadget_FrontColor, Mavar\CoulTxt)
    
    AddWindowTimer(#Fenetre_principale, #Minuteur, 500)
    CloseGadgetList()
    
    BindGadgetEvent(#Btn_Quitter, @Quitter())
    BindEvent(#PB_Event_Timer, @Affichage_Btn())
  EndIf
  ;- Boucle
  Repeat
    Mavar\Evenement = WaitWindowEvent()
  ForEver
EndProcedure
;}
;{ Initialisation et lancement du programme principal
ChargerRDV()
Procedure_principale()
;}
je joins le code de DateQ

Code : Tout sélectionner

; Description: fonctions de date avec chiffres quad (Années 0000-9999)
EnableExplicit
DeclareModule DateQ
  ;{ Enumération
  Enumeration
    #Date_AnneeQ
    #Date_MoisQ
    #Date_SemaineQ
    #Date_JourQ
    #Date_HeureQ
    #Date_MinuteQ
    #Date_SecondeQ
  EndEnumeration
  ;}  
  ;{ Structure
  Structure sDiffTemps 
    TotalJours.q
    JoursRestants.q 
    Annees.q 
    Mois.q 
    Heures.q
    Minutes.q 
    Secondes.q
    
    sTotalJours.s
    sJoursRestants.s
    sAnnees.s
    sMois.s
    sHeures.s
    sMinutes.s
    sSecondes.s
  EndStructure 
  ;}
  ;{ Constantes
  #SecsParJourQ = 86400
  #UniteTemps = "an|s,mois,jour|s,heure|s,minute|s,seconde|s"
  ;}
  ;{ Variables
  Global UniteDateQ.q = 10000000 ; Unité de granularité, initialement 1 seconde pour la compatibilité avec les routines date de PB 4.xx
  Global UniteJourQ.q = 86400    ; Nombre de granularité unités par jour
  Global MaDiff.sDiffTemps
  Global Dim  TabNomJour$(6), Dim TabNomMois$(11)
  TabNomJour$(0) = "dimanche":TabNomJour$(1) = "lundi   ":TabNomJour$(2) = "mardi   ":TabNomJour$(3) = "mercredi"
  TabNomJour$(4) = "jeudi   ":TabNomJour$(5) = "vendredi":TabNomJour$(6) = "samedi  "
  TabNomMois$(0) = "janvier  ":TabNomMois$(1) = "février  ":TabNomMois$(2) = "mars     ":TabNomMois$(3) = "avril    ":TabNomMois$(4)  = "mai      ":TabNomMois$(5)  = "juin     "
  TabNomMois$(6) = "juillet  ":TabNomMois$(7) = "août     ":TabNomMois$(8) = "septembre":TabNomMois$(9) = "octobre  ":TabNomMois$(10) = "novembre ":TabNomMois$(11) = "décembre "
  ;}
  ;{ Déclaration des procédures
  Declare SiAnneeBissextileQ(Annee.q) ;Indique si l'année donnée est bissextile
  Declare JoursDansMoisQ(Annee, Mois) ;Retoure le nombre de jours dans le mois donné
  Declare.q DateQ()                   ;Retourne le nombre de secondes écoulées depuis le 1er Janvier 0001
  Declare.q DateQ2(Annee, Mois, Jour, Heure = 0, Minute = 0, Seconde = 0) ;Retourne la date julienne de la date donnée
  Declare.b SecondeQ(Date.q)                                              ;Retourne la valeur de la seconde de la date spécifiée (entre 0 et 59).
  Declare.b MinuteQ(Date.q)                                               ;Retourne la valeur de la minute de la date spécifiée (entre 0 et 59).
  Declare.b HeureQ(Date.q)                                                ;Retourne la valeur de l'heure de la date spécifiée (entre 0 et 23).
  Declare.b JourQ(Date.q)                                                 ;Retourne la valeur du jour de la date spécifiée (entre 1 et 31).
  Declare.b MoisQ(Date.q)                                                 ;Retourne la valeur du mois de la date spécifiée (entre 1 et 12).
  Declare.w AnneeQ(Date.q)                                                ;Retourne la valeur de l'année de la date spécifiée (entre 0 et 9999).
  Declare.w JourDAnneeQ(Date.q)                                           ;Retourne le nombre de jours écoulés depuis le début de l'année de la date spécifiée (entre 1 et 366).
  Declare.b JourDeSemaineQ(Date.q)                                        ;Renvoie la valeur du jour dans la semaine de la date spécifiée (0 = dimanche, 6 = samedi).
  Declare.q AjouterDateQ(Date.q, Champ.b, Compensation.q)                 ;Retourne une nouvelle date.
  Declare.s FormatDateQ(Masque.s, Date.q)                                 ;Retourne une représentation de chaîne de la date, selon le masque spécifié
  Declare.q AnalyserDateQ(Masque.s, Date.s)                               ;Retourne une représentation de chaîne de la date, selon le masque spécifié
  Declare.s NomMoisQ(Date.q)                                              ;Retourne le nom du mois donné.
  Declare.s NomJourSemaineQ(Date.q)                                       ;Retourne le nom du jour de la semaine de la date donnée.
  Declare.i SemaineDAnneeQ(date.q=-1, Premier_Jour=0)                     ;Retourne le nombre de semaines (1 .. 53) écoulées depuis le début de l'année pour la date donnée.
  Declare.i DateSemaine1Q(Annee=-1, Premier_Jour=0)                       ;Renvoie la première date de janvier de la semaine
  Declare.q AujourdhuiQ()                                                 ; Renvoie la date actuelle
  Declare.q Aujourdhui_0Q()                                               ; Renvoie la date actuelle à minuit
  Declare.q DiffDatesQ(datedebut.q, datefin.q=-1, Unite=#Date_JourQ, multiple.q=1)	; Différence entre deux dates
  Declare.q DateDiffQ(dateAvant,dateApres,*diff.sDiffTemps)                        ;Calcule la difference entre 2 dates en années, mois, jours, heures, minutes et secondes
  Declare.s AjouterUniteTemps(nombre.q, unite.q) 
  Declare.s DiffTempsQ(Secondes.q) 
  Declare.s Premier_Ouvre_Mois(Annee,Mois)
  Declare   ChercherVendredi13(Annee,Mois)
  
  Declare.q DatePaques(Annee.q=0)  ; Retourne la date du dimanche de Pâques pour l'année donnée (valable jusqu'à 4099)
  Declare.q Paques(annee.l = -1)	
  Declare Mardi_Gras(annee.l = -1)	
  Declare Cendres(annee.l = -1)
  Declare Passion(annee.l = -1)
  Declare Rameaux(annee.l = -1)
  Declare Jeudi_Saint(annee.l = -1)
  Declare Vendredi_Saint(annee.l = -1)
  Declare.q PaquesLundi(annee.l = -1)	
  Declare.q Ascension(annee.l = -1)	
  Declare.q Pentecote(annee.l = -1)
  Declare.q PentecoteLundi(annee.l = -1)	
  Declare.q Trinite(annee.l = -1)
  Declare.q NouvelAn(annee.l = -1)	
  Declare.q FeteDuTravail(annee.l = -1)	
  Declare.q Victoire1945(annee.l = -1)	
  Declare.q FeteNationale(annee.l = -1)	
  Declare.q Assomption(annee.l = -1)	
  Declare.q Toussaint(annee.l = -1)	
  Declare.q Armistice(annee.l = -1)	
  Declare.q Noel(annee.l = -1)	
  Declare.q Saint_Sylvestre(annee.l = -1)
  Declare.q Fete_des_grand_meres(annee = -1)
  Declare.q Fete_des_meres(annee.l = -1)
  Declare.q Fete_des_peres(annee = -1)
  Declare.q Fete_des_grand_peres(annee= -1)
  
  Declare.i DecalageHoraire(type) ; Retourne l'heure de la zone d'information de polarisation
  Declare.s ZoneFuseau()          ; Retourne le nom du fuseau horaire
                                  ;}
EndDeclareModule
Module DateQ
  Procedure.q AnalyserDateQ(Masque.s, Date.s)
    Protected Annee = 0, Mois = 0, Jour = 0, Heure = 0, Minute = 0, Seconde = 0
    Annee = Val(Mid(Date, 7, 4))
    Mois = Val(Mid(Date, 4, 2))
    Jour = Val(Left(Date, 2))
    Heure = Val(Mid(Date, 12, 2))
    Minute = Val(Mid(Date, 15, 2))
    Seconde = Val(Mid(Date, 18, 2))
    ProcedureReturn DateQ2(Annee, Mois, Jour, Heure, Minute, Seconde)
  EndProcedure
  Procedure SiAnneeBissextileQ(Annee.q) ;Indique si l'année donnée est bissextile
    If ((Annee % 4) = 0)
      If (Annee % 100) Or ((Annee % 400) = 0)
        ProcedureReturn #True
      EndIf
    EndIf
  EndProcedure
  Procedure JoursDansMoisQ(Annee, Mois) ;Retoure le nombre de jours dans le mois donné
    Select Mois
      Case 1,3,5,7,8,10,12
        ProcedureReturn 31
      Case 4,6,9,11
        ProcedureReturn 30
      Default
        ProcedureReturn 28 + SiAnneeBissextileQ(Annee)
    EndSelect
  EndProcedure
  Procedure.q DateQ() ;Retourne le nombre de secondes écoulées depuis le 1er Janvier 0001
    Protected time.SYSTEMTIME
    GetLocalTime_(time)
    ProcedureReturn DateQ2(time\wYear, time\wMonth, time\wDay, time\wHour, time\wMinute, time\wSecond)
  EndProcedure
  Procedure.q DateQ2(Annee, Mois, Jour, Heure = 0, Minute = 0, Seconde = 0) ;Retourne la date julienne de la date donnée
    Protected sec.q, i.w, Jours.b
    If (Annee < 1) Or (Annee > 9999) Or 
       (Mois < 1) Or (Mois > 12) Or 
       (Jour < 1) Or 
       (Heure < 0) Or (Heure > 23) Or 
       (Minute < 0) Or (Minute > 59) Or 
       (Seconde < 0) Or (Seconde > 59)
      ProcedureReturn -1
    EndIf
    If (Jour > JoursDansMoisQ(Annee, Mois))
      ProcedureReturn -1
    EndIf
    sec = (Annee-1)*365*24*60*60
    For i = 4 To (Annee-1) Step 4
      If SiAnneeBissextileQ(i)
        sec + 24*60*60
      EndIf
    Next
    For i = 1 To Mois-1
      Jours = JoursDansMoisQ(Annee, i)
      sec + Jours*24*60*60
    Next
    sec + (Jour-1)*24*60*60
    sec + Heure*60*60
    sec + Minute*60
    sec + Seconde
    ProcedureReturn sec
  EndProcedure
  Procedure.b SecondeQ(Date.q) ;Retourne la valeur de la seconde de la date spécifiée (entre 0 et 59).
    Protected Seconde.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Seconde = Date % 60
    ProcedureReturn Seconde
  EndProcedure
  Procedure.b MinuteQ(Date.q) ;Retourne la valeur de la minute de la date spécifiée (entre 0 et 59).
    Protected minute.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    minute = (Date % (60*60)) / 60
    ProcedureReturn minute
  EndProcedure
  Procedure.b HeureQ(Date.q) ;Retourne la valeur de l'heure de la date spécifiée (entre 0 et 23).
    Protected Heure.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Heure = (Date % (24*60*60)) / (60*60)
    ProcedureReturn Heure
  EndProcedure
  Procedure.b JourQ(Date.q) ;Retourne la valeur du jour de la date spécifiée (entre 1 et 31).
    Protected Annee.w, Mois.b, Jours.w, DateBis.q
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      DateBis = Date
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    Date = DateBis
    Mois = 0
    Repeat
      DateBis = Date
      Jours = JoursDansMoisQ(Annee, Mois + 1)
      Date - Jours*24*60*60
      Mois + 1
    Until (Date < 0)
    Jours = Round(DateBis/24/60/60, 0) + 1
    ProcedureReturn Jours
  EndProcedure
  Procedure.b MoisQ(Date.q) ;Retourne la valeur du mois de la date spécifiée (entre 1 et 12).
    Protected Annee.w, Mois.b, Jours.w, DateBis.q
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      DateBis = Date
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    Date = DateBis
    Mois = 0
    Repeat
      Jours = JoursDansMoisQ(Annee, Mois + 1)
      Date - Jours*24*60*60
      Mois + 1
    Until (Date < 0)
    ProcedureReturn Mois
  EndProcedure
  Procedure.w AnneeQ(Date.q) ;Retourne la valeur de l'année de la date spécifiée (entre 0 et 9999).
    Protected Annee.w, Jours.w
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    ProcedureReturn Annee
  EndProcedure
  Procedure.w JourDAnneeQ(Date.q) ;Retourne le nombre de jours écoulés depuis le début de l'année de la date spécifiée (entre 1 et 366).
    Protected Annee.w, Mois.b, Jours.w, DateBis.q
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      DateBis = Date
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    Jours = Round(DateBis/24/60/60, 0) + 1
    ProcedureReturn Jours
  EndProcedure
  Procedure.b JourDeSemaineQ(Date.q) ;Renvoie la valeur du jour dans la semaine de la date spécifiée (0 = dimanche, 6 = samedi).
    Protected Jours.q, joursemaine.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Jours = Date/24/60/60
    Jours + 1
    joursemaine = Jours % 7
    ProcedureReturn joursemaine
  EndProcedure
  Procedure.q AjouterDateQ(Date.q, Champ.b, Compensation.q) ;Retourne une nouvelle date.
    Protected Mois.b, Annee.w
    If (Date < 0)
      ProcedureReturn Date
    EndIf
    If (Champ = #Date_SecondeQ)
      Date + Compensation
    ElseIf (Champ = #Date_MinuteQ)
      Date + Compensation * 60
    ElseIf (Champ = #Date_HeureQ)
      Date + Compensation * 60 * 60
    ElseIf (Champ = #Date_JourQ)
      Date + Compensation * 24 * 60 * 60
    ElseIf (Champ = #Date_SemaineQ)
      Date + Compensation * 7 * 24 * 60 * 60
    ElseIf (Champ = #Date_MoisQ)
      Mois = MoisQ(Date) + Compensation * 1
      Annee = AnneeQ(Date)
      While (Mois < 1)
        Mois + 12
        Annee - 1
      Wend
      While (Mois > 12)
        Mois - 12
        Annee + 1
      Wend
      Date = DateQ2(Annee, Mois, JourQ(Date), HeureQ(Date), MinuteQ(Date), SecondeQ(Date))
    ElseIf (Champ = #Date_AnneeQ)
      Date = DateQ2(AnneeQ(Date) + Compensation * 1, MoisQ(Date), JourQ(Date), HeureQ(Date), MinuteQ(Date), SecondeQ(Date))
    EndIf 
    ProcedureReturn Date
  EndProcedure
  Procedure.s FormatDateQ(Masque.s, Date.q) ;Retourne une représentation de chaîne de la date, selon le masque spécifié
    Protected Annee.s
    Annee = Str(AnneeQ(Date))
    Masque = ReplaceString(Masque, "%yyyy", RSet(Annee,4,"0"))
    Masque = ReplaceString(Masque, "%aaaa", RSet(Annee,4,"0"))
    Masque = ReplaceString(Masque, "%yy", Right(RSet(Annee,4,"0"),2))
    Masque = ReplaceString(Masque, "%aa", Right(RSet(Annee,4,"0"),2))
    Masque = ReplaceString(Masque, "%mm", RSet(Str(MoisQ (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%dd", RSet(Str(JourQ   (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%jj", RSet(Str(JourQ   (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%hh", RSet(Str(HeureQ  (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%ii", RSet(Str(MinuteQ(Date)),2,"0"))
    Masque = ReplaceString(Masque, "%ss", RSet(Str(SecondeQ(Date)),2,"0"))
    ProcedureReturn Masque
  EndProcedure
;  Macro MacroAnalyserDate(var)
;    s = k
;    While ((PeekB(@Date + k) => $30) And (PeekB(@Date + k) <= $39))
;      k + 1
;    Wend
;    var = Val(PeekS(@Date + s, k - s))
;  EndMacro
;  Procedure.q AnalyserDateQ(Masque.s, Date.s) ;Transforme une date donnée sous la forme d'une chaîne de caractères en valeur numérique, selon le masque spécifié
;    Protected i.w, k.w, s.w
;    Protected Annee, Mois, Jour, Heure, minute, Seconde
;    Masque = LCase(Masque)
;    For i = 0 To Len(Masque) - 1
;      If (PeekB(@Masque + i) = $25); '%'
;        If (PeekL(@Masque + i + 1) = $79797979) Or (PeekL(@Masque + i + 1) = $61616161); 'yyyy' ou 'aaaa'
;          MacroAnalyserDate(Annee)
;          i + 4
;        ElseIf (PeekW(@Masque + i + 1) = $7979) Or (PeekW(@Masque + i + 1) = $6161); 'yy' ou 'aa'
;          MacroAnalyserDate(Annee)
;          If (Annee <= 30)
;            Annee + 2000
;          Else
;            Annee + 1900
;          EndIf
;          i + 2
;        ElseIf (PeekW(@Masque + i + 1) = $6D6D); 'mm'
;          MacroAnalyserDate(Mois)
;          i + 2
;        ElseIf (PeekW(@Masque + i + 1) = $6464) Or (PeekW(@Masque + i + 1) = $6A6A); 'dd' ou 'jj'
;          MacroAnalyserDate(Jour)
;          i + 2
;        ElseIf (PeekW(@Masque + i + 1) = $6868); 'hh'
;          MacroAnalyserDate(Heure)
;          i + 2
;        ElseIf (PeekW(@Masque + i + 1) = $6969); 'ii'
;          MacroAnalyserDate(minute)
;          i + 2
;        ElseIf (PeekW(@Masque + i + 1) = $7373); 'ss'
;          MacroAnalyserDate(Seconde)
;          i + 2
;        Else
;          k + 1
;        EndIf
;      Else
;        k + 1
;      EndIf
;    Next
;    ProcedureReturn DateQ2(Annee, Mois, Jour, Heure, minute, Seconde)
;  EndProcedure
  Procedure.s NomMoisQ(Date.q) ;Retourne le nom du mois donné.
    Protected M = MoisQ(Date.q)
    Protected NomMois.s = "janvier février mars avril mai juin juillet août septembre octobre novembre décembre"
    ProcedureReturn StringField(NomMois, M , " ")
  EndProcedure
  Procedure.s NomJourSemaineQ(Date.q) ;Retourne le nom du jour de la semaine de la date donnée.
    Protected J = JourDeSemaineQ(Date.q)
    Protected NomJours.s = "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi"
    ProcedureReturn StringField(NomJours, J + 1, ",")
  EndProcedure
  Procedure.i SemaineDAnneeQ(date.q=-1, Premier_Jour=0)
    ; Retourne le nombre de semaines (1 .. 53) écoulées depuis le
    ;   début de l'année pour la date donnée
    ; Si la date est absente, la date d'aujourd'hui est utilisée
    ; L'argument 'Premier_Jour' identifie la "premier jour de chaque semaine"
    ;   Dimanche=0 .. Samedi=6
    Protected jandate ; Date en janvier au début de la semaine 1
    If date<0
      date = DateQ()
    EndIf ; Maintenant
    jandate = DateSemaine1Q(AnneeQ(date), Premier_Jour)
    ProcedureReturn (JourDAnneeQ(date)-jandate)/7+1
  EndProcedure
  Procedure.i DateSemaine1Q(Annee=-1, Premier_Jour=0)
    ; Renvoie la première date de janvier de la semaine 1 de l'année donnée
    ;   Une date de retour <= 0 implique le mois de décembre précédent à la place:
    ;   -2=Dec29  -1=Dec30  0=Dec31
    ; La semaine 1 est la première semaine comportant au moins 4 jours dans l'année
    ;   Cela signifie que la première semaine comportera toujours le 4 janvier
    ;   qui est conforme à la norme ISO 8601 (& CalendarGadget)
    ;   mais peut-être pas avec le calendrier de la barre d'état du système Windows
    ;   comme (sous Windows ME au moins) le décalage est de 3 au lieu de 4
    ; L'argument 'Premier_Jour' identifie le "premier jour de chaque semaine"
    ;   Dimanche=0 .. Samedi=6
    ; Si l'année est absente, l'année en cours est utilisée
    Protected Decalage=4 ; La date de Janvier qui tombe toujours dans la semaine 1
    Protected Jourjan    ; Jour de la semaine de Janvier du décalage de date
    Protected jandate    ; Date de décembre/janvier du début de la semaine 1
    If Annee<=0
      Annee = DateQ()
    EndIf ; Cette année
    Jourjan = (DateQ2(Annee, 1, Decalage, 0, 0, 0))%7 ; Jour de la semaine
    jandate = Decalage+Premier_Jour-Jourjan
    If Premier_Jour>Jourjan
      jandate - 7
    EndIf
    ProcedureReturn jandate
  EndProcedure
  Procedure.q AujourdhuiQ() ;Retourne la date julienne de la date actuelle
    ProcedureReturn DateQ2(AnneeQ(DateQ()), MoisQ(DateQ()), JourQ(DateQ()), HeureQ(DateQ()), MinuteQ(DateQ()), SecondeQ(DateQ()))
  EndProcedure
  Procedure.q Aujourdhui_0Q()
    ProcedureReturn DateQ2(AnneeQ(DateQ()), MoisQ(DateQ()), JourQ(DateQ()))
  EndProcedure
  Procedure.q DiffDatesQ(datedebut.q, datefin.q=-1, Unite=#Date_JourQ, multiple.q=1)
    ; Différence entre deux dates
    ; Calcule datefin-datedebut le résultat est retourné dans l'unité donnée [ou de son multiple]
    ; Si datefin est absente ou négatif, Aujourd_huiF est utilisé
    ; Retourne 0 en cas d'erreur
    ; Unité est une de:
    ;   #PB_Date_Year   = #Date_Annee   = 0
    ;   #PB_Date_Month  = #Date_Mois    = 1
    ;   #PB_Date_Week   = #Date_Semaine = 2
    ;   #PB_Date_Day    = #Date_Jour    = 3
    ;   #PB_Date_Hour   = #Date_Heure   = 4
    ;   #PB_Date_Minute = #Date_Minute  = 5
    ;   #PB_Date_Second = #Date_Seconde = 6
    ; Les exemples de l'utilisation de l'argument de multiples (>0) sont:-
    ;   La différence de date (qui peut être négative) est retournée dans:
    ;     Semaines si l'unité   = #PB_Date_Week  ou #Date_Semaine et multiple = 1 (par défaut)
    ;     Quinzaines si l'unité = #PB_Date_Week  ou #Date_Semaine et multiple = 2
    ;     Trimestres si l'unité = #PB_Date_Month ou #Date_Mois et multiple    = 3
    Protected signe=1, Secondes, diff.q, date.q
    If multiple <= 0
      ProcedureReturn 0
    EndIf ; Erreur
    If datefin<0
      datefin = DateQ()
    EndIf ; Aujourd_huiF
    If datedebut>datefin
      signe = -1
      Swap datedebut, datefin
    EndIf
    ; Obtenir la différence de date en secondes
    diff = datefin-datedebut
    If UniteDateF=1 ; Pour éviter les débordements quad
      diff = (diff+5000000)/10000000
    Else
      diff = (diff*#SecsParJourQ+UniteJourQ/2)/UniteJourQ
    EndIf
    Select Unite
      Case #Date_AnneeQ
        Secondes = 366*#SecsParJourQ
      Case #Date_MoisQ
        Secondes = 31*#SecsParJourQ
      Case #Date_SemaineQ
        Secondes = 7*#SecsParJourQ
      Case #Date_JourQ
        Secondes = 1*#SecsParJourQ
      Case #Date_HeureQ
        Secondes = 3600
      Case #Date_MinuteQ
        Secondes = 60
      Case #Date_SecondeQ
        Secondes = 1
      Default
        ProcedureReturn 0 ; Erreur
    EndSelect
    ; Obtenir une réponse approximative
    diff / (multiple * Secondes)
    ; Améliorer l'approximation
    date = AjouterDateQ(datedebut, Unite, multiple * diff)
    While date<datefin
      date = AjouterDateQ(date, Unite, multiple)
      diff + 1
    Wend
    ProcedureReturn signe*diff
  EndProcedure
  Procedure.q DateDiffQ(dateAvant,dateApres,*diff.sDiffTemps)
  
  Protected.q TotalJours,Annees,Mois,JoursRestants,Heures,Minutes,Secondes,DateCourante,dateTest,jourDebut
  
  If dateAvant>dateApres
    Swap dateAvant,dateApres
  EndIf
  
  DateCourante=dateAvant
  dateTest=dateAvant
  jourDebut=Day(dateAvant)
  TotalJours=0
  JoursRestants=0
  
  While dateTest<=dateApres
    dateTest=AddDate(DateCourante,#Date_JourQ,1)
    If dateTest<=dateApres
      DateCourante=dateTest
      TotalJours+1
      JoursRestants+1
      If Day(DateCourante)=jourDebut
        Mois+1
        JoursRestants=0
      EndIf
    EndIf
  Wend
  
  dateTest=DateCourante
  Heures=0
  While dateTest<dateApres
    dateTest=AddDate(DateCourante,#Date_HeureQ,1)
    If dateTest<=dateApres
      DateCourante=dateTest
      Heures+1
    EndIf
  Wend
  
  dateTest=DateCourante
  Minutes=0
  While dateTest<dateApres
    dateTest=AddDate(DateCourante,#Date_MinuteQ,1)
    If dateTest<=dateApres
      DateCourante=dateTest
      Minutes+1
    EndIf
  Wend
  
  dateTest=DateCourante
  Secondes=0
  While dateTest<dateApres
    dateTest=AddDate(DateCourante,#Date_SecondeQ,1)
    If dateTest<=dateApres
      DateCourante=dateTest
      Secondes+1
    EndIf
  Wend
  
  Annees=Mois/12
  If Annees
    Mois % 12
  EndIf
  
  *diff\TotalJours=TotalJours
  *diff\Annees=Annees
  *diff\Mois=Mois
  *diff\JoursRestants=JoursRestants
  *diff\Heures=Heures
  *diff\Minutes=Minutes
  *diff\Secondes=Secondes
  
  *diff\sTotalJours=Str(TotalJours)
  If TotalJours<2
    *diff\sTotalJours+" jour"
  Else
    *diff\sTotalJours+" jours"
  EndIf
  *diff\sAnnees=Str(Annees)
  If Annee<2
    *diff\sAnnees+" an"
  Else
    *diff\sAnnees+" ans"
  EndIf
  *diff\sMois=Str(Mois)+" mois"
  *diff\sJoursRestants=Str(JoursRestants)
  If JoursRestants<2
    *diff\sJoursRestants+" jour"
  Else
    *diff\sJoursRestants+" jours"
  EndIf
  *diff\sHeures=Str(Heures)
  If Heures<2
    *diff\sHeures+" heure"
  Else
    *diff\sHeures+" heures"
  EndIf
  *diff\sMinutes=Str(Minutes)
  If Minutes<2
    *diff\sMinutes+" minute"
  Else
    *diff\sMinutes+" minutes"
  EndIf
  *diff\sSecondes=Str(Secondes)
  If Secondes<2
    *diff\sSecondes+" seconde"
  Else
    *diff\sSecondes+" secondes"
  EndIf
EndProcedure
Procedure.s AjouterUniteTemps(nombre.q, unite.q) 
  Protected Resultat.s, uniteSeconde.s
  If nombre = 0 : ProcedureReturn "" : EndIf
  If nombre < 0 : nombre * -1 : EndIf
  uniteSeconde = StringField(#UniteTemps, unite, ",")
  If nombre > 1
    uniteSeconde = RemoveString(uniteSeconde, "|")
  Else
    uniteSeconde = StringField(uniteSeconde, 1, "|")
  EndIf
  Resultat + Space(1) + Str(nombre) + Space(1) + uniteSeconde 
  ProcedureReturn Resultat 
EndProcedure 
Procedure.s DiffTempsQ(Secondes.q) 
  Protected Resultat.s
  Protected annees.q, mois.q, semaines.q, jours.q, heures.q, Minutes.q
  annees = Secondes / 31557600 : Secondes = Secondes % 31557600
  mois = Secondes / 2629800 : Secondes = Secondes % 2629800
  jours  = Secondes / 86400 : Secondes = Secondes % 86400
  heures = Secondes / 3600 : Secondes = Secondes % 3600 
  Minutes = Secondes / 60  : Secondes = Secondes % 60
  
  MaDiff\Annees = annees
  MaDiff\Mois = mois
  MaDiff\JoursRestants = jours
  MaDiff\Heures = heures
  MaDiff\Minutes = minutes
  MaDiff\Secondes = Secondes
  MaDiff\TotalJours = annees * 365.25 + mois * 30.4375 + jours
  MaDiff\sAnnees = Str(annees)
  MaDiff\sMois = Str(mois)
  MaDiff\sJoursRestants = Str(jours)
  MaDiff\sHeures = Str(heures)
  MaDiff\sMinutes = Str(Minutes)
  MaDiff\sSecondes = Str(Secondes)
  MaDiff\sTotalJours = Str(annees * 365.25 + mois * 30.4375 + jours)
  Resultat = AjouterUniteTemps(annees, 1)
  Resultat + AjouterUniteTemps(mois, 2)
  Resultat + AjouterUniteTemps(jours,3)
  ProcedureReturn Resultat
EndProcedure

  Procedure.s Premier_Ouvre_Mois(Annee,Mois) ;Retourne la date "Jds jj/mm/aaaa" du premier jour ouvré du mois et de l'année donnés.
    Protected Jour=1, Joursem
    Protected DatePremierJourOuvre.q=DateQ2(Annee,Mois,Jour,0,0,0)
    JourSem = JourDeSemaineQ(DateQ2(Annee, Mois, Jour, 0, 0, 0))
    Select Mois
      Case 1, 5, 11
        Select JourSem
          Case 0:Jour + 1:JourSem = 1
          Case 1 To 4:Jour + 1:JourSem + 1
          Case 5:Jour + 3:JourSem = 1
          Case 6:Jour + 2:JourSem = 1
        EndSelect 
      Case 2 To 4, 6 To 10, 12
        Select JourSem
          Case 0:Jour + 1:JourSem = 1
          Case 1 To 5:DatePremierJourOuvre=DateQ2(Annee,Mois,Jour,0,0,0)
          Case 6:Jour + 2:JourSem = 1
        EndSelect
    EndSelect
    DatePremierJourOuvre=DateQ2(Annee,Mois,Jour,0,0,0)
    
    ProcedureReturn TabNomJour$(JourDeSemaineQ(DatePremierJourOuvre)) + " "  + Jour + " " + TabNomMois$(Mois - 1) + " " + Annee
  EndProcedure
  Procedure ChercherVendredi13(Annee,Mois) ;Retourne la date "ds jj/mm/aaaa" du mois et de l'année donnés
    If Annee < 1
      Annee = AnneeQ(DateQ())
    EndIf  
    If Mois < 1
      Mois = MoisQ(DateQ())
    EndIf  
    Protected Jour=13
    Protected.q DateVendredi13=DateQ2(Annee,Mois,Jour)
    
    ;Cherche le vendredi 13
    While JourDeSemaineQ(DateVendredi13)<>5
      Jour+1
      DateVendredi13=DateQ2(Annee,Mois,Jour)
    Wend
    
    ProcedureReturn DateVendredi13
  EndProcedure
  ;- Dates Mobiles
  Procedure.q DatePaques(Annee.q=0)
    ; Retourne la date du dimanche de Pâques pour l'année donnée (valable jusqu'à 4099)
    ; S'il n'y a aucun argument, l'année en cours est utilisée
    ; Si l'argument est > 9999, c'est supposé être une date, pas une année
    ; Définition:
    ;   www.merlyn.demon.co.uk/estrdate.htm
    ;   Dimanche Pâques est le premier dimanche après la date de la
    ;   pleine lune estimée se produisant le 21 Mars ou après.
    ;   Les dates possibles vont donc, du 22 Mars au 25 avril
    ; Utilise la méthode 3 à:
    ;   users.sa.chariot.net.au/~gmarts/eastalg.htm
    Protected FirstDig, Reste19, temp, d ; résultats intermediaires
    Protected tA, tB, tC, tD, tE         ; Résultats table A à E
    If Annee<=0
      Annee = AnneeQ(Annee) ; Cette année
    ElseIf Annee>9999
      Annee = AnneeQ(Annee) ; Convertir date à l'année
    EndIf
    FirstDig = Annee / 100 ; Siècle
    Reste19 = Annee%19     ; Nombre d'or de l'année dans le cycle métonique
                           ; Calculer Date de la pleine lune pascale du jour de mars (PFM)
    temp = (FirstDig - 15) / 2 + 202 - 11 * Reste19
    Select FirstDig
      Case 21, 24, 25, 27 To 32, 34, 35, 38
        temp = temp - 1
      Case 33, 36, 37, 39, 40
        temp - 2
    EndSelect
    temp = Mod(temp, 30)
    tA = temp + 21
    If temp=29
      tA - 1
    EndIf
    If (temp=28 And Reste19>10)
      tA - 1
    EndIf
    ; Trouver le dimanche suivant
    tB = (tA - 19)%7
    tC = (40 - FirstDig)%4
    If tC=3
      tC + 1
    EndIf
    If tC>1
      tC + 1
    EndIf
    temp = Annee%100
    tD = (temp + temp / 4)%7
    tE = ((20 - tB - tC - tD)%7) + 1
    d = tA + tE ; Jours après le 0 Mars
    ProcedureReturn AjouterDateQ(DateQ2(Annee, 3, 1, 0, 0, 0), #Date_JourQ, d-1)
  EndProcedure
  Procedure.q Paques(annee.l = -1)	
    mois = 3 
    
    If annee = -1 
      annee = DateQ() 
    EndIf 
    
    jour = JourQ(DatePaques(annee))
    If jour < 21
      mois = 4
    EndIf  
    
    ProcedureReturn DateQ2(annee, mois, jour, 0, 0, 0)
  EndProcedure 
  Procedure Mardi_Gras(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -47)
  EndProcedure
  Procedure Cendres(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -46)
  EndProcedure
  Procedure Passion(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -14)
  EndProcedure
  Procedure Rameaux(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -7)
  EndProcedure
  Procedure Jeudi_Saint(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -3)
  EndProcedure
  Procedure Vendredi_Saint(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -2)
  EndProcedure
  Procedure.q PaquesLundi(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 1)	
  EndProcedure 
  Procedure.q Ascension(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 39)	
  EndProcedure
  Procedure.q Pentecote(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_SemaineQ, 7) ;#Date_Jour,49)
  EndProcedure
  Procedure.q PentecoteLundi(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 50)	
  EndProcedure 
  Procedure.q Trinite(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 56)
  EndProcedure
  ;-
  ;- Fêtes fixes
  Procedure.q NouvelAn(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 1, 1, 0, 0, 0)	
  EndProcedure 
  Procedure.q FeteDuTravail(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf 	
    ProcedureReturn DateQ2(annee, 5, 1, 0, 0, 0)	
  EndProcedure 
  Procedure.q Victoire1945(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 5, 8, 0, 0, 0)	
  EndProcedure
  Procedure.q FeteNationale(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 7, 14, 0, 0, 0)	
  EndProcedure 
  Procedure.q Assomption(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 8, 15, 0, 0, 0)	
  EndProcedure 
  Procedure.q Toussaint(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 11, 1, 0, 0, 0)	
  EndProcedure 
  Procedure.q Armistice(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 11, 11, 0, 0, 0)	
  EndProcedure 
  Procedure.q Noel(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 12, 25, 0, 0, 0)	
  EndProcedure 
  Procedure.q Saint_Sylvestre(annee.l = -1)
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 12, 31, 0, 0, 0)	
  EndProcedure
  ;-Fêtes familliales
  Procedure.q Fete_des_grand_meres(annee = -1)
    Protected Mois = 3, Jour=1,
              DatePremierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le premier dimanche
    While JourDeSemaineQ(DatePremierDimanche)<>0
      
      jour + 1
      DatePremierDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ProcedureReturn DatePremierDimanche
  EndProcedure
  Procedure.q Fete_des_meres(annee.l = -1)
    Protected Mois = 5, Jour=31,
              DateDernierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le dernier dimanche
    While JourDeSemaineQ(DateDernierDimanche)<>0
      
      jour - 1
      DateDernierDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    
    If JourDeSemaineQ(DateDernierDimanche) = DayOfYear(Pentecote(annee))
      DateDernierDimanche = AjouterDateQ(DateDernierDimanche, #Date_JourQ, 7)
    EndIf
    
    ProcedureReturn DateDernierDimanche	
    
  EndProcedure
  Procedure.q Fete_des_peres(annee = -1)
    Protected Mois = 6, Jour=21,
              DateTroisiemeDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le troisième dimanche
    While JourDeSemaineQ(DateTroisiemeDimanche)<>0
      
      jour - 1
      DateTroisiemeDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ProcedureReturn DateTroisiemeDimanche
    
    ProcedureReturn AjouterDateQ(NouvelAn(annee)-1, #Date_JourQ, DayOfYear(Paques(annee)-DayOfYear(Fete_des_peres(annee))))
    
  EndProcedure
  Procedure.q Fete_des_grand_peres(annee= -1)
    
    Protected Mois = 10, Jour=1,
              DatePremierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le premier dimanche
    While JourDeSemaineQ(DatePremierDimanche)<>0
      
      jour + 1
      DatePremierDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ProcedureReturn DatePremierDimanche
    
    ProcedureReturn AjouterDateQ(NouvelAn(annee)-1, #Date_JourQ, DayOfYear(Paques(annee)-DayOfYear(Fete_des_grand_peres(annee))))
    
  EndProcedure
  Procedure.i DecalageHoraire(type)
    ; Retourne l'heure de la zone d'information de polarisation en quelques minutes
    ; Decalage=1 retourne (localtime-UTCTime) excluant l'heure d'été
    ; Decalage=2 retourne (localtime-UTCTime), y compris l'heure d'été
    ; Decalage=3 retourne la polarisation d'été locale qui est
    ;   en vigueur à ce moment et sera de 0 en hiver
    ; Decalage=4 retourne la polarisation d'été locale fixe (généralement 60)
    ; N.B. DecalageHoraireQ(2)=DecalageHoraireQ(1)+DecalageHoraireQ(3)
    ; L'heure UTC utilisée est appelée GMT
    Protected zoneid, tz.TIME_ZONE_INFORMATION, daylight
    zoneid = GetTimeZoneInformation_(tz)
    With tz
      If zoneid=#TIME_ZONE_ID_DAYLIGHT
        daylight = tz\DaylightBias
      Else
        daylight = 0
      EndIf
      Select type
        Case 1
          ProcedureReturn -tz\Bias
        Case 2
          ProcedureReturn -tz\Bias-daylight
        Case 3
          ProcedureReturn -daylight
        Case 4
          ProcedureReturn -tz\DaylightBias
      EndSelect
      ProcedureReturn 0
    EndWith
  EndProcedure
  Procedure.s ZoneFuseau()
    ; Retourne le nom du fuseau horaire
    Protected TimeZoneInfo.TIME_ZONE_INFORMATION
    Protected i=0, NomStandard$=""
    GetTimeZoneInformation_(TimeZoneInfo)
    While TimeZoneInfo\StandardName[i]<>0 And i<=32
      NomStandard$ + Chr(TimeZoneInfo\StandardName[i])
      i + 1
    Wend
    ProcedureReturn NomStandard$
  EndProcedure
EndModule
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
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Liste pour exécuter dans un programme tiers

Message par MLD »

Allez Micoute fabrique nous un Doctolib bis :lol:
a+
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Liste pour exécuter dans un programme tiers

Message par Micoute »

Bonjour Michel,

fastoche à faire, surtout que j'adore programmer, mon seul regret c'est de n'avoir jamais appris à le faire, j'ai donc tout appris par moi-même ce n'est peut-être pas la bonne méthode, mais ça fonctionne bien quand même.
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 !
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Liste pour exécuter dans un programme tiers

Message par Ollivier »

Il y a tellement de détail que tu peux même faire des messages de prévention : << Attention ! Vous êtes en train de prévoir une coloscopie la veille de la fête des pères. Pouvez-vous confirmer ce RDV ? [Oui] [Non, reporter] [Appeler un ami, pour me remplacer] >>
Avatar de l’utilisateur
MLD
Messages : 1097
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Liste pour exécuter dans un programme tiers

Message par MLD »

@Micoute
Bonsoir Michel
J'espère que tu as pris cela comme une blague. D'avoir appris seul est tout a ton honneur. Mais si tu arrive a faire un Doctolib bis, sur tu vas les avoir en or massif :oops: :oops: :lol: :lol:
Bonne soirée et bon WE
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Liste pour exécuter dans un programme tiers

Message par Ollivier »

En tout cas, une chose admirable (parmi d'autres bien sûr), c'est la faculté à maintenir des noms de variables en français, bien qu'accents et cédilles soient impossibles. Je suis admirable de ça, déjà, en plus du code global qui démarque un bon niveau de programmation.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Liste pour exécuter dans un programme tiers

Message par Micoute »

MLD a écrit : sam. 10/sept./2022 17:17 J'espère que tu as pris cela comme une blague.
Oui bien entendu.
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