Gestion surveillance hypertension artérielle

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

Gestion surveillance hypertension artérielle

Message par Micoute »

Bonjour à tous,

ayant vu dans ce forum, un logiciel de pesée, ça m'a donné l'idée de faire un projet analogue, mais pour une de mes nombreuses pathologie, on ne parle bien que de ce qu'on connaît bien.

Code : Tout sélectionner

;**** Gestion surveillance hypertension artérielle  ****
;{ -- Directives du compilateur
EnableExplicit
;}
;{ -- Enumérations
;-- Fenetres 
Enumeration windows
  #Fenetre_principale 
  #Fenetre_Ajouter
EndEnumeration
;-- Gadgets
Enumeration  gadgets     
  #Lst_Tension 
  #Btn_Ajouter
  #Btn_Sauvegarder
  #Btn_Effacer
  #Btn_Valider
  #Btn_Annuler
  #Btn_Quitter
  #Cvs_Ajouter
  #Txt_Date
  #Txt_Heure
  #Txt_Sys
  #Txt_Dia
  #Txt_Pul
  #Str_Date
  #Str_Heure
  #Str_Sys
  #Str_Dia
  #Str_Pul
EndEnumeration
Enumeration Polices
  #Police_Lst
  #Police_Button
  #Police_Champ
EndEnumeration
Enumeration Fichiers
  #Fichier_Hypertension
EndEnumeration
;}
;{ -- Structures
Structure Gestion
  Date.s
  Heure.s
  Systole.s
  Diastole.s
  Pulsation.s
EndStructure

Structure Masque
  Nom.s
  Valeur.s
EndStructure
;}
;{ -- Polices
LoadFont(#Police_Lst, "Arial",15, #PB_Font_Bold)
LoadFont(#Police_Champ, "Arial",15, #PB_Font_Bold)
LoadFont(#Police_Button, "Times New Roman",15, #PB_Font_Bold)
;}
;{ -- Variables 
Global NewList Tension_arterielle.Gestion()
Global Evenement, fenetre, cPos, cEnt, CaractereValide$, Sys, Dia, Pul, Txt$, TxtS$, TxtD$, NumLig
Global Date.Masque  : Date\Nom  = "Date"  : Date\Valeur  = "__/__/____"
Global Heure.Masque : Heure\Nom = "Heure" : Heure\Valeur = "__:__:__"
Global.Masque DateChoisie = Date, HeureChoisie = Heure
Global Fichier_donnees.s = "Hypertension.dat"
;}
;{ -- Délaration des procédures
Declare Filtrer(gHandle,gID, Filtre$, Masque$)
Declare Masque_StringGadget(Masque$)
Declare Quitter()
Declare Verdict()
Declare.b Mise_a_jour_Donnees()
Declare Nouvelle_Saisie()
Declare Sauvegarder()
Declare ChargerListe()
Declare Effacer()
Declare Programme_principal()
;}
;{ -- Lancement du programme principal et Chargement des données sauvegardées
Programme_principal()
ChargerListe()
;}
;{ -- Procédures 
Procedure Filtrer(gHandle,gID, Filtre$, Masque$)
  SendMessage_(gHandle, #EM_GETSEL, @cPos, 0)
  If GetAsyncKeyState_(#VK_DELETE)
    cEnt = SendMessage_(gHandle, #EM_GETLIMITTEXT, 0, 0)
    SendMessage_(gHandle, #EM_SETLIMITTEXT, cEnt - 1, 0)
    SendMessage_(gHandle, #EM_SETSEL, cPos, cPos)
    ProcedureReturn
  EndIf 
  CaractereValide$ = RTrim(GetGadgetText(gID))
  ; Valider le dernier caractère entré dans le StringGadget
  ; Méthode la plus rapide, MAIS permet de coller des caractères inacceptables
  If FindString(Filtre$, Right(CaractereValide$, 1),1)
    ; Le caractère est accepté par le filtre, maintenant le comparer avec le masque
    If Len(Masque$)
      If Right(CaractereValide$, 1) = Mid(Masque$, Len(CaractereValide$), 1)
        ; Le caractère correspond à l’espace réservé du masque, donc l’accepter
      ElseIf Right(CaractereValide$, 1) = "." And FindString(Masque$, ".", 1)
        ; Aligner la décimale reçue avec la décimale dans le masque, utilisé pour la monnaie
        CaractereValide$ = RSet(CaractereValide$, FindString(Masque$, ".", 1), " ")
        SetGadgetText(gID, CaractereValide$)
      ElseIf (Mid(CaractereValide$, Len(CaractereValide$), 1) <> Mid(Masque$, Len(CaractereValide$), 1)) And Mid(Masque$, Len(CaractereValide$), 1) <> "_"
        ; Le caractère ne correspond pas à l’espace réservé du masque,
        ; alors insérer l’espace réservé dans la chaîne
        CaractereValide$ = Left(CaractereValide$, Len(CaractereValide$) -1) + Mid(Masque$, Len(CaractereValide$), 1) + Right(CaractereValide$, 1)
        ; Remplacer le texte dans le StringGadget
        SetGadgetText(gID, CaractereValide$)
      EndIf
    EndIf
  Else
    ; Caractère non accepté par le filtre, le laisser tomber
    SetGadgetText(gID, Left(CaractereValide$, Len(CaractereValide$)-1))
  EndIf
  ; (WinAPI) Obtenir la longueur du champ texte modifié et réinitialiser le curseur
  cPos = SendMessage_(gHandle, #EM_LINELENGTH, 0, 0)
  SendMessage_(gHandle, #EM_SETSEL, cPos+1, cPos+1)
EndProcedure

Procedure Masque_StringGadget(Masque$)
  Protected Filtre$ = "0123456789" + "." + "-"+"_"+"/"+"\"+"|"   ; Vérifier les caractères d’entrée à travers un filtre contrôlé par un masque
  If Len(Masque$)
    SendMessage_(GadgetID(EventGadget()) , #EM_SETLIMITTEXT, Len(Masque$), 0) ; Limiter le nombre de caractères acceptés à la longueur du masque
  EndIf
  Filtrer(GadgetID(EventGadget()), EventGadget(), Filtre$, Masque$) ; Passer la gestion de l'ID du gadget à la procédure de filtre, le filtre choisi et le masque
EndProcedure

;-- Fermer ou quitter le programme 
Procedure Quitter()
  fenetre = EventWindow()
  CloseWindow(fenetre)
  If fenetre=#Fenetre_principale
    End
  EndIf   
EndProcedure
;-- Verdict
Procedure Verdict()
  Select EventType()
    Case #PB_EventType_LeftClick  
      NumLig = GetGadgetState(#Lst_Tension)
      Sys = Val(GetGadgetItemText(#Lst_Tension, NumLig, 2)) 
      Dia = Val(GetGadgetItemText(#Lst_Tension, NumLig, 3))
      Pul = Val(GetGadgetItemText(#Lst_Tension, NumLig, 4))
      
      If Sys < 50 And Dia < 35
        TxtS$ = "< 50":TxtD$ = "< 35":Txt$ = "Hypotension sévère"
      ElseIf (Sys >= 50 And Sys <= 90) And (Dia >= 35 Or Dia <= 90)
        TxtS$ = "50 - 90":TxtD$ = "35 - 90":Txt$ = "Hypotension"
      ElseIf (Sys >= 90 And Sys <= 120) And (Dia >= 60 Or Dia <= 80)
        TxtS$ = "90 - 120":TxtD$ = "60 - 80":Txt$ = "Pression artérielle optimale"
      ElseIf (Sys >= 120 And Sys <= 129) And (Dia >= 80 Or Dia <= 84)
        TxtS$ = "120 -129":TxtD$ = "80 - 84":Txt$ = "Pression artérielle normale"
      ElseIf (Sys >= 130 And Sys <= 139) And (Dia >= 85 Or Dia <= 89)
        TxtS$ = "130 - 139":TxtD$ = "85 - 89":Txt$ = "Pression artérielle normale haute"
      ElseIf (Sys >= 140 And Sys <= 159) And (Dia >= 90 Or Dia <= 99)
        TxtS$ = "140 - 149":TxtD$ = "90 - 99":Txt$ = "Hypertension grade 1 (légère)"
      ElseIf (Sys >= 160 And Sys <= 179) And (Dia >= 100 Or Dia <= 109)
        TxtS$ = "160 - 179":TxtD$ = "100 - 109":Txt$ = "Hypertension grade 2 (modérée)"
      ElseIf Sys >= 180 And Dia >= 110
        TxtS$ = " >= 180":TxtD$ = "100 - 109":Txt$ = "Hypertension grade 3 (sévère)"
      ElseIf Sys > 181 And Dia > 110
        TxtS$ = " > 180":TxtD$ = "> 110":Txt$ = "Hypertension hors limite"
      EndIf
      If Txt$
        MessageRequester("VERDICT", "Le systole est de " + Sys + " (" + TxtS$ + ")" + #LF$ + 
                                    "Le diastole est de " + Dia + " (" + TxtD$ + ")" + #LF$ + 
                                    "Le pouls est de " + pul + "/mn" + #LF$ + #LF$ + Txt$, #PB_MessageRequester_Ok|#PB_MessageRequester_Info)
      EndIf
  EndSelect
EndProcedure
;-- Procédure qui met à jour les données saisies
Procedure.b Mise_a_jour_Donnees()
  LastElement(Tension_arterielle())
  If AddElement(Tension_arterielle())
    With Tension_arterielle()
      \Date=GetGadgetText(#Str_Date)
      \Heure=GetGadgetText(#Str_Heure)
      \Systole=GetGadgetText(#Str_Sys)
      \Diastole=GetGadgetText(#Str_Dia)
      \Pulsation=GetGadgetText(#Str_Pul)
      AddGadgetItem(#Lst_Tension,-1,\Date+#LF$+\Heure+#LF$+\Systole+#LF$+\Diastole+#LF$+\Pulsation)
    EndWith  
  EndIf  
  CloseWindow(#Fenetre_Ajouter)
  ProcedureReturn
EndProcedure

;--Procédure de sauvegarde du fichier
Procedure Sauvegarder()
  ResetList(Tension_arterielle())
  CreateFile(#Fichier_Hypertension,Fichier_donnees)
  ForEach Tension_arterielle()
    With Tension_arterielle()
      WriteStringN(#Fichier_Hypertension,\Date)
      WriteStringN(#Fichier_Hypertension,\Heure)
      WriteStringN(#Fichier_Hypertension,\Systole)
      WriteStringN(#Fichier_Hypertension,\Diastole)
      WriteStringN(#Fichier_Hypertension,\Pulsation)
    EndWith
  Next
  CloseFile(#Fichier_Hypertension)
  MessageRequester("Information","Fichier " + Fichier_donnees + " Sauvegardé!", #PB_MessageRequester_Info)
EndProcedure
;-- Procédure pour charger la liste au démarrage du programme principal
Procedure ChargerListe()
  If OpenFile(#Fichier_Hypertension,Fichier_donnees)<>0 
    ResetList(Tension_arterielle())
    OpenFile(#Fichier_Hypertension,Fichier_donnees)
    While Eof(#Fichier_Hypertension)=0
      If  AddElement(Tension_arterielle())
        With Tension_arterielle()
          \Date=ReadString(#Fichier_Hypertension)
          \Heure=ReadString(#Fichier_Hypertension)
          \Systole=ReadString(#Fichier_Hypertension)
          \Diastole=ReadString(#Fichier_Hypertension)
          \Pulsation=ReadString(#Fichier_Hypertension)
          AddGadgetItem(#Lst_Tension,-1,\Date+#LF$+\Heure+#LF$+\Systole+#LF$+\Diastole+#LF$+\Pulsation)
        EndWith 
      EndIf   
    Wend 
    CloseFile(#Fichier_Hypertension)
  EndIf  
EndProcedure
;--Procédure d'effacement d'un enregistrement dans la liste
Procedure Effacer()
  Protected i,Nombre_elements.l
  Nombre_elements = CountGadgetItems(#Lst_Tension)-1
  For i = Nombre_elements To 0 Step -1
    If GetGadgetItemState(#Lst_Tension,i)&#PB_ListIcon_Checked
      RemoveGadgetItem(#Lst_Tension,i)
      SelectElement(Tension_arterielle(),i)
      DeleteElement(Tension_arterielle())
    EndIf
  Next i
EndProcedure
;-- Fenêtre principale 
Procedure Programme_principal()
  OpenWindow(#Fenetre_principale,0,0,400,575,Space(30)+"GESTION D'HYPERTENSION ARTÉRIELLE",#PB_Window_ScreenCentered)
  ListIconGadget(#Lst_Tension,10,10,380,420,"Date",125, #PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#Lst_Tension,1, "Heure", 100)
  AddGadgetColumn(#Lst_Tension,2,"Sys",50)
  AddGadgetColumn(#Lst_Tension,3,"Dia", 50)
  AddGadgetColumn(#Lst_Tension,4,"Pul", 50) 
  SetGadgetFont(#Lst_Tension,FontID(#Police_Lst)) 
  ButtonGadget(#Btn_Ajouter,10,450,150,30,"AJOUTER")
  GadgetToolTip(#Btn_Ajouter, "Ajoute une mesure de tension à la liste ")
  ButtonGadget(#Btn_Sauvegarder,230,450,160,30,"SAUVEGARDER")
  GadgetToolTip(#Btn_Sauvegarder, "Enregistre la liste")
  ButtonGadget(#Btn_Effacer,10,500,150,30,"EFFACER")
  GadgetToolTip(#Btn_Effacer, "Supprime une tension_arterielle de la liste si la case est cochée")
  ButtonGadget(#Btn_Quitter, 230, 500, 160, 30, "QUITTER")
  ;Couleurs
  SetWindowColor(#Fenetre_principale, $E16941)
  SetGadgetColor(#Lst_Tension, #PB_Gadget_FrontColor,$FFFFFF)
  SetGadgetColor(#Lst_Tension, #PB_Gadget_BackColor, $39B292)
  ;Polices
  SetGadgetFont(#Btn_Ajouter,FontID(#Police_Button)) 
  SetGadgetFont(#Btn_Sauvegarder,FontID(#Police_Button))
  SetGadgetFont(#Btn_Effacer,FontID(#Police_Button))  
  SetGadgetFont(#Btn_Quitter,FontID(#Police_Button)) 
  ;Evènements liés
  BindEvent(#PB_Event_CloseWindow,@Quitter(),#Fenetre_principale)
  BindGadgetEvent(#Lst_Tension, @Verdict())
  BindGadgetEvent(#Btn_Ajouter,@Nouvelle_Saisie())
  BindGadgetEvent(#Btn_Sauvegarder,@Sauvegarder())
  BindGadgetEvent(#Btn_Effacer,@Effacer())
  BindGadgetEvent(#Btn_Quitter,@Quitter())
EndProcedure 
;-- Fenêtre pour saisir la date, l'heure et les paramètres d'une mesure de tension artérielle
Procedure Nouvelle_Saisie()
  OpenWindow(#Fenetre_Ajouter,0,0,260,320,Space(8)+"Ajouter une mesure de tension artérielle",#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  CanvasGadget(#Cvs_Ajouter, 0, 0, 260, 320, #PB_Canvas_Container)
  StartDrawing(CanvasOutput(#Cvs_Ajouter))
  ;Dessin d'un FrameGadget artificiel
  Box(0, 0, 260, 320, $41DEE1)
  Box(5, 5, 250, 220, $E14145)
  Box(7, 7, 246, 216, $41DEE1)
  StopDrawing()
  TextGadget(#Txt_Date,20,20,90,30,"Date", #PB_Text_Right)
  StringGadget(#Str_Date, 120, 20, 120, 30, "")
  GadgetToolTip(#Str_Date, "Date automatique. Tapez seulement les chiffres")
  TextGadget(#Txt_Heure, 20, 60, 90, 30, "Heure", #PB_Text_Right)
  StringGadget(#Str_Heure, 120, 60, 120, 30, "")
  GadgetToolTip(#Str_Heure, "Heure automatique. Tapez seulement les chiffres")
  TextGadget(#Txt_Sys, 20, 100, 90, 30, "Systole", #PB_Text_Right)
  StringGadget(#Str_Sys, 150, 100, 50, 30, "")
  GadgetToolTip(#Str_Sys, "pression maximale exercée dans la phase de contraction du ventricule gauche")
  TextGadget(#Txt_Dia, 20, 140, 90, 30, "Diastole", #PB_Text_Right)
  StringGadget(#Str_Dia, 150, 140, 50, 30, "")
  GadgetToolTip(#Str_Dia, "pression résiduelle au moment de la phase de relâchement du coeur")
  TextGadget(#Txt_Pul, 20, 180, 90, 30, "Pulsation", #PB_Text_Right)
  StringGadget(#Str_Pul, 150, 180, 50, 30, "")
  GadgetToolTip(#Str_Pul, "par minute")
  ButtonGadget(#Btn_Valider, 10, 240, 240, 30, "VALIDER")
  GadgetToolTip(#Btn_Valider, "Ajouter la date et le Tension_arterielle à la liste ")
  ButtonGadget(#Btn_Annuler, 10, 280, 240, 30, "ANNULER")
  GadgetToolTip(#Btn_Annuler, "Annule la saisie et retour à la liste ")
  CloseGadgetList()
  SetActiveGadget(#Str_Date)
  ;Polices
  SetGadgetFont(#Txt_Date,FontID(#Police_Lst)) 
  SetGadgetFont(#Txt_Heure,FontID(#Police_Lst))
  SetGadgetFont(#Txt_Sys,FontID(#Police_Lst))
  SetGadgetFont(#Txt_Dia,FontID(#Police_Lst))
  SetGadgetFont(#Txt_Pul,FontID(#Police_Lst))
  ;Couleurs
  SetWindowColor(#Fenetre_Ajouter, $41DEE1)
  SetGadgetColor(#Txt_Date, #PB_Gadget_FrontColor,$E14145)
  SetGadgetColor(#Txt_Heure, #PB_Gadget_FrontColor,$E14145)
  SetGadgetColor(#Txt_Sys, #PB_Gadget_FrontColor,$E14145)
  SetGadgetColor(#Txt_Dia, #PB_Gadget_FrontColor,$E14145)
  SetGadgetColor(#Txt_Pul, #PB_Gadget_FrontColor,$E14145)  
  SetGadgetColor(#Txt_Date, #PB_Gadget_BackColor, $41DEE1)
  SetGadgetColor(#Txt_Heure, #PB_Gadget_BackColor, $41DEE1) 
  SetGadgetColor(#Txt_Sys, #PB_Gadget_BackColor, $41DEE1)
  SetGadgetColor(#Txt_Dia, #PB_Gadget_BackColor, $41DEE1)
  SetGadgetColor(#Txt_Pul  , #PB_Gadget_BackColor, $41DEE1)
  SetGadgetFont(#Str_Date,FontID(#Police_Champ))
  SetGadgetFont(#Str_Heure,FontID(#Police_Champ))
  SetGadgetFont(#Str_Sys,FontID(#Police_Champ))
  SetGadgetFont(#Str_Dia,FontID(#Police_Champ))
  SetGadgetFont(#Str_Pul,FontID(#Police_Champ))  
  SetGadgetFont(#Btn_Valider,FontID(#Police_Button)) 
  SetGadgetFont(#Btn_Annuler,FontID(#Police_Button))
  ;Evènements liés
  BindGadgetEvent(#Btn_Valider,@Mise_a_jour_Donnees())
  BindGadgetEvent( #Btn_Annuler,@Quitter())
  BindEvent(#PB_Event_CloseWindow,@Quitter(),#Fenetre_Ajouter)
EndProcedure
;}
;{ -- Boucle du programme 
Repeat
  Evenement = WaitWindowEvent()
  Select Evenement
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Str_Date
          Masque_StringGadget(DateChoisie\Valeur)            
        Case #Str_Heure
          Masque_StringGadget(HeureChoisie\Valeur)
      EndSelect
  EndSelect
ForEver
;}
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 : 1105
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Gestion surveillance hypertension artérielle

Message par MLD »

Bonjour mon amis Micoute
Même remarques que pour les poids. La date au démarrage de la fenêtre des données et éventuellement l'heure.
Et pour les BindGadgetEvents cette machine a fabriquer des procédures.Mis un peu partout dans le code, ce sera bientôt, comme avec les gotos du code spaghettis.
C'est seulement mon avis.
a+ Michel
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Gestion surveillance hypertension artérielle

Message par Micoute »

Que veux-tu, il faut vivre avec son temps, le moyen âge est déjà loin.
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
grendizer
Messages : 59
Inscription : mer. 29/mai/2019 6:29

Re: Gestion surveillance hypertension artérielle

Message par grendizer »

salut Micoute

Ton logiciel est mieux que mon logiciel de pesée
moi il manque la courbe graphique
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Gestion surveillance hypertension artérielle

Message par Micoute »

J'aime bien les belles choses, alors je fais de mon mieux.
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