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
;}