Suite au topic de Micoute ici : viewtopic.php?t=19320
J'ai fait un petit gestionnaire autonome de prise de médicaments et de stock.
Démo vidéo ici : https://www.youtube.com/shorts/BcmbRaJQnIk
V1
- Ajout de médicament
- Modification d'un médicament existant
- Suppression d'un médicament
- Bouton "Prise de médicament" qui va gérer le nouveau stock
Tout Fonctionne avec un simple fichier pref donc le logiciel et portable
ça faisait un moment que j'avais pas fais de PB ça fait plaisir.
EnJoYeZ
Code : Tout sélectionner
; Medocostock - Gestion de stock de médicaments
; Codé par Ar-S // LDV MULTIMEDIA - feb 2025
; V1.0
;GNU GENERAL PUBLIC LICENSE Version 3
;Copyright (C) 2025 LDVMULTIMEDIA
;Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU General Public License publiée par la Free Software Foundation,
;soit la version 3 de la licence, soit (à votre choix) toute version ultérieure.
;Ce programme est distribué dans l'espoir qu'il sera utile, mais sans aucune garantie, sans même la garantie implicite de commercialisation ou d'adéquation à un besoin particulier.
;Consultez la GNU General Public License pour plus de détails. (voir https://www.gnu.org/licenses/)
; ============================================================================
;- =========================== INITIALISATION =============================
; ============================================================================
Enumeration
#LDVMULTIMEDIA
#FRAME_EDIT
#STRING_NOM
#STRING_STOCK
#STRING_NPP
#TEXT_NOM
#TEXT_NPP
#TEXT_STOCK
#BUTTON_AJOUTER
#BUTTON_SUPPRIMER
#BUTTON_MODIFIER
#LIST_MEDOCS
#BUTTON_PRISE
#STRING_INFO
#T
EndEnumeration
Structure medocinfo
Nom.s
NombreParPrise.i
NombreEnStock.i
EndStructure
Global NewList medoc.medocinfo()
Global Pref$ = GetCurrentDirectory()+"medoc.pref"
Global.i NbrDeMedocDifferents
; Taille ide
Global L = 400 ,H = 625, Lframe1 = L-20
Global NOM$, NPP$, STOCK$
Global message$ = "Bienvenue sur Medocostock"
Global G,UP ; Gestion pour le timer
Declare.s Message(MessageInfo.s)
Declare LirePref(FichierPref.s)
Declare InitPref(FichierPref.s)
Declare SauvePref(FichierPref.s)
Declare UpdatePref(FichierPref.s)
Declare RefreshList()
; ============================================================================
;- ============================ PROCEDURES ===============================
; ============================================================================
Procedure.s Message(MessageInfo.s)
SetGadgetText(#STRING_INFO,MessageInfo)
EndProcedure
Procedure LirePref(FichierPref.s)
; Chargement des préférences
Protected preference
ResetList(medoc())
preference = OpenPreferences(Pref$)
ExaminePreferenceGroups()
While NextPreferenceGroup() ; Tant qu'il existe un groupe à afficher
AddElement(medoc())
With medoc()
\Nom = PreferenceGroupName()
\NombreParPrise = ReadPreferenceLong ("NPP", 0)
\NombreEnStock = ReadPreferenceLong ("TOTAL", 0)
EndWith
Wend
ClosePreferences()
ProcedureReturn preference
EndProcedure
Procedure InitPref(FichierPref.s)
; Création d'un fichier pref vide
Protected preference
If FileSize(FichierPref.s) = -1
CreatePreferences(FichierPref.s)
ClosePreferences()
Else
preference = LirePref(Pref$)
EndIf
EndProcedure
Procedure SauvePref(FichierPref.s)
; Sauvegarde des préférences
Protected preference
SortStructuredList(medoc(), #PB_Sort_Ascending, OffsetOf(medocinfo\Nom),TypeOf(medocinfo\Nom))
CreatePreferences(FichierPref.s)
ForEach medoc()
PreferenceGroup(medoc()\Nom)
WritePreferenceLong("NPP",medoc()\NombreParPrise)
WritePreferenceLong("TOTAL",medoc()\NombreEnStock)
Next
ClosePreferences()
EndProcedure
Procedure UpdatePref(FichierPref.s)
; Sauvegarde des préférences
Protected preference
ForEach medoc()
If GetGadgetText(#STRING_NOM) = medoc()\Nom
medoc()\NombreParPrise = Val(GetGadgetText(#STRING_NPP))
medoc()\NombreEnStock = Val(GetGadgetText(#STRING_STOCK))
EndIf
Next
SauvePref(FichierPref.s)
EndProcedure
Procedure RefreshList()
Protected id, alerte, N
SortStructuredList(medoc(), #PB_Sort_Ascending, OffsetOf(medocinfo\Nom),TypeOf(medocinfo\Nom))
ClearGadgetItems(#LIST_MEDOCS)
id = 0 : alerte = 0
ForEach medoc()
AddGadgetItem (#LIST_MEDOCS,-1,medoc()\Nom + Chr(10) + medoc()\NombreEnStock + Chr(10) + medoc()\NombreParPrise)
N = medoc()\NombreEnStock
If N < 6 Or medoc()\NombreEnStock <= medoc()\NombreParPrise
SetGadgetItemColor(#LIST_MEDOCS, id, #PB_Gadget_BackColor, #Red, 1)
alerte + 1
EndIf
id+1
Next
If alerte > 1
message$ = "Des médicaments vont manquer"
EndIf
For i = #STRING_NOM To #STRING_NPP
SetGadgetColor(i,#PB_Gadget_BackColor,#White)
SetGadgetColor(i,#PB_Gadget_FrontColor,$0)
SetGadgetText(i,"")
Next
NOM$ = "" : NPP$ = "" : STOCK$ = ""
ProcedureReturn
EndProcedure
; ============================================================================
;- =========================== LE PROGRAMME =============================
; ============================================================================
If Not LirePref(Pref$)
InitPref(Pref$)
EndIf
If ListSize(medoc()) = 0
MessageRequester("Bienvenue sur Medocostock","Aucun médicament n'est répertorié (1er lancement ?)"+Chr(10)+"Une fois l'interface ouverte, merci de créer votre base.",#PB_MessageRequester_Info)
EndIf
; Ouverture de la fenêtre principale
If OpenWindow(#LDVMULTIMEDIA, 0, 0, L, H, "Medocostock", #PB_Window_SystemMenu | #PB_Window_ScreenCentered |#PB_Window_MinimizeGadget)
; SetWindowColor(#LDVMULTIMEDIA, $cbcbcb)
; Partie édition
FrameGadget(#FRAME_EDIT, 10, 10, Lframe1, H-45, "Création/Édition de médicament")
TextGadget(#TEXT_NOM, 20,45,90,25,"Médicament",#PB_Text_Right)
StringGadget(#STRING_NOM, Lframe1-260, 40, 260, 25, "",#PB_String_UpperCase)
TextGadget(#TEXT_STOCK, 20,75,90,25,"Stock Total",#PB_Text_Right)
StringGadget(#STRING_STOCK, Lframe1-260, 70, 260, 25, "",#PB_String_Numeric)
TextGadget(#TEXT_NPP, 20,105,90,25,"Nbr par Prise",#PB_Text_Right)
StringGadget(#STRING_NPP, Lframe1-260, 100, 260, 25, "",#PB_String_Numeric)
ButtonGadget(#BUTTON_AJOUTER, 20, 140, 110, 30, "Ajouter")
ButtonGadget(#BUTTON_SUPPRIMER, 145, 140, 110, 30, "Supprimer")
ButtonGadget(#BUTTON_MODIFIER, 270, 140, 110, 30, "Modifier")
DisableGadget(#BUTTON_MODIFIER,1)
DisableGadget(#BUTTON_SUPPRIMER,1)
; Liste des médicaments
ListIconGadget(#LIST_MEDOCS, 20, 190, Lframe1-20, 390, "Médicament", 220, #PB_ListIcon_GridLines)
AddGadgetColumn(#LIST_MEDOCS,1, "Stock",60)
AddGadgetColumn(#LIST_MEDOCS,2, "Prise",60)
; Prise de médoc
ButtonGadget(#BUTTON_PRISE, 10, H-30, 100, 25,"Prise OK")
GadgetToolTip(#BUTTON_PRISE, "En validant ce bouton, la prise de médicament est validée et les stocks mis à jours.")
; Info
StringGadget(#STRING_INFO, 115, H-30, 280, 25, "", #ES_CENTER | #PB_String_ReadOnly)
SetGadgetColor(#STRING_INFO, #PB_Gadget_BackColor, $0)
SetGadgetColor(#STRING_INFO, #PB_Gadget_FrontColor, #Green)
If ListSize(medoc()) > 0
RefreshList()
EndIf
AddWindowTimer(#LDVMULTIMEDIA, #T, 20)
;- OoOo Boucle principale oOoO
Repeat
event = WaitWindowEvent()
Select event
Case #PB_Event_Timer
If G < 5
UP = 5
ElseIf G > 250
UP = -5
EndIf
SetGadgetColor(#STRING_INFO, #PB_Gadget_FrontColor, RGB(0,G,0) )
Message(message$)
G+UP
Case #PB_Event_CloseWindow
quit = 1
Case #PB_Event_Gadget
Select EventGadget()
;- >>> Ajouter un médicament
Case #BUTTON_AJOUTER
; Code pour ajouter un médicament
NOM$ = GetGadgetText(#STRING_NOM)
NPP$ = GetGadgetText(#STRING_NPP)
STOCK$= GetGadgetText(#STRING_STOCK)
If ListSize(medoc())>0
ForEach medoc()
If NOM$ = medoc()\Nom
doublon = #True
MessageRequester("Doublon","Un médicament du même nom existe déjà, vous pouvez modifier son stock ou les prises en le selectionnant"+Chr(10)+"dans la liste et en cliquant sur le bouton modifier.",#PB_MessageRequester_Error)
Break
EndIf
Next
EndIf
If doublon = #False
If Val(STOCK$) >= Val(NPP$)
If NOM$ = "" Or NOM$ = "DONNÉE MANQUANTE"
BGcolor = #Red
FColor = $111111
SetGadgetText(#STRING_NOM,"DONNÉE MANQUANTE")
Else
BGcolor = #Green
FColor = $0
EndIf
SetGadgetColor(#STRING_NOM,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_NOM,#PB_Gadget_FrontColor,FColor)
If NPP$ = "" Or NPP$ = "DONNÉE MANQUANTE"
BGcolor = #Red
FColor = $111111
SetGadgetText(#STRING_NPP,"DONNÉE MANQUANTE")
Else
BGcolor = #Green
FColor = $0
EndIf
SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
If STOCK$ = "" Or STOCK$ = "DONNÉE MANQUANTE"
BGcolor = #Red
FColor = $111111
SetGadgetText(#STRING_STOCK,"DONNÉE MANQUANTE")
Else
BGcolor = #Green
FColor = $0
EndIf
SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
If NOM$ <> "" And NOM$ <> "DONNÉE MANQUANTE" And NPP$ <> "" And NPP$ <> "DONNÉE MANQUANTE" And STOCK$ <> "" And STOCK$ <> "DONNÉE MANQUANTE"
AddElement(medoc())
medoc()\Nom = NOM$
medoc()\NombreParPrise = Val(NPP$)
medoc()\NombreEnStock = Val(STOCK$)
SauvePref(Pref$)
RefreshList()
message$ = "Medicament ajouté !"
EndIf
Else
BGcolor = #Red
FColor = $111111
SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
MessageRequester("Erreur","Le nombre en stock ne peux pas être plus petit que le nombre de médicament à prendre",#PB_MessageRequester_Warning)
EndIf
EndIf
Case #BUTTON_SUPPRIMER
;- >>> Supprimer un médicament
Efface = MessageRequester("Supprimer ?","Souhaitez vous vraiment supprimer "+ medoc()\nom +" de la liste des médicaments ?"+Chr(10)+"Cette action est irreversible",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
HideWindow(#LDVMULTIMEDIA,1)
Select Efface
Case #PB_MessageRequester_Yes
DeleteElement(medoc(),1)
HideWindow(#LDVMULTIMEDIA,0)
SauvePref(Pref$)
RefreshList()
message$ = "Médicament supprimé !"
Case #PB_MessageRequester_No
HideWindow(#LDVMULTIMEDIA,0)
EndSelect
;- >>> Modifier un médicament
Case #BUTTON_MODIFIER
; Code pour Modifier un médicament
If GetGadgetText(#BUTTON_MODIFIER) = "Modifier"
For i = #STRING_NOM To #STRING_NPP
SetGadgetColor(i,#PB_Gadget_BackColor,#White)
SetGadgetColor(i,#PB_Gadget_FrontColor,$0)
Next
DisableGadget(#STRING_NOM,1)
DisableGadget(#BUTTON_AJOUTER,1)
DisableGadget(#BUTTON_SUPPRIMER,1)
DisableGadget(#BUTTON_PRISE,1)
SetGadgetText(#BUTTON_MODIFIER, "Valider")
SetGadgetText(#STRING_NOM,medoc()\Nom)
SetGadgetText(#STRING_STOCK,Str(medoc()\NombreEnStock))
SetGadgetText(#STRING_NPP,Str(medoc()\NombreParPrise))
ElseIf GetGadgetText(#BUTTON_MODIFIER) = "Valider"
NOM$ = GetGadgetText(#STRING_NOM)
NPP$ = GetGadgetText(#STRING_NPP)
STOCK$= GetGadgetText(#STRING_STOCK)
If NPP$ = ""
BGcolor = #Red
FColor = $111111
SetGadgetText(#STRING_NPP,"DONNÉE MANQUANTE")
Else
BGcolor = #Green
FColor = $0
EndIf
SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
If STOCK$ = ""
BGcolor = #Red
FColor = $111111
SetGadgetText(#STRING_STOCK,"DONNÉE MANQUANTE")
Else
BGcolor = #Green
FColor = $0
EndIf
SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
If NOM$ <> "" And NOM$ <> "DONNÉE MANQUANTE" And NPP$ <> "" And NPP$ <> "DONNÉE MANQUANTE" And STOCK$ <> "" And STOCK$ <> "DONNÉE MANQUANTE"
If Val(NPP$) < Val(STOCK$)
medoc()\Nom = NOM$
medoc()\NombreParPrise = Val(NPP$)
medoc()\NombreEnStock = Val(STOCK$)
SauvePref(Pref$)
SetGadgetText(#BUTTON_MODIFIER,"Modifier")
DisableGadget(#STRING_NOM,0)
DisableGadget(#BUTTON_AJOUTER,0)
DisableGadget(#BUTTON_PRISE,0)
DisableGadget(#BUTTON_MODIFIER,1)
DisableGadget(#BUTTON_SUPPRIMER,1)
RefreshList()
Message$ = "Stock mis à jour"
ElseIf Val(NPP$) > Val(STOCK$)
BGcolor = #Red
FColor = $111111
SetGadgetColor(#STRING_STOCK,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_STOCK,#PB_Gadget_FrontColor,FColor)
SetGadgetColor(#STRING_NPP,#PB_Gadget_BackColor,BGcolor)
SetGadgetColor(#STRING_NPP,#PB_Gadget_FrontColor,FColor)
MessageRequester("Erreur","Le nombre en stock ne peux pas être plus petit que le nombre de médicament à prendre",#PB_MessageRequester_Warning)
Message$ = "Problème de stock!"
EndIf
EndIf
EndIf
;- >>> Autres gadgets
Case #STRING_NOM, #STRING_NPP, #STRING_STOCK
gadget = EventGadget()
If GetGadgetText(gadget) = "DONNÉE MANQUANTE" And EventType() = #PB_EventType_Focus
SetGadgetText(gadget,"")
SetGadgetColor(gadget,#PB_Gadget_BackColor,#White)
SetGadgetColor(gadget,#PB_Gadget_FrontColor,$0)
EndIf
If GetGadgetText(#BUTTON_MODIFIER) <> "Valider"
DisableGadget(#BUTTON_AJOUTER,0)
DisableGadget(#BUTTON_MODIFIER,1)
EndIf
;- Liste des Médicaments
Case #LIST_MEDOCS
Choix = GetGadgetState(#LIST_MEDOCS)
If choix <> -1
; vérification
SelectElement(medoc(),choix)
If GetGadgetItemText(#LIST_MEDOCS,choix,0) = medoc()\nom
DisableGadget(#BUTTON_MODIFIER,0)
DisableGadget(#BUTTON_AJOUTER,1)
EndIf
DisableGadget(#BUTTON_SUPPRIMER,0)
If GetGadgetText(#BUTTON_MODIFIER) = "Valider" And GetGadgetText(#STRING_NOM) <> medoc()\Nom
DisableGadget(#BUTTON_SUPPRIMER,1)
DisableGadget(#STRING_NOM,0)
DisableGadget(#BUTTON_AJOUTER,0)
DisableGadget(#BUTTON_PRISE,0)
DisableGadget(#BUTTON_MODIFIER,1)
SetGadgetText(#BUTTON_MODIFIER,"Modifier")
RefreshList()
EndIf
Else
DisableGadget(#BUTTON_MODIFIER,1)
DisableGadget(#BUTTON_SUPPRIMER,1)
DisableGadget(#BUTTON_PRISE,0)
DisableGadget(#BUTTON_AJOUTER,0)
EndIf
Case #BUTTON_PRISE
Prise = MessageRequester("Valider la prise du jour ?","Êtes vous sur d'avoir pris tous les médicaments de la journée ? "+Chr(10)+"Cette action entrainera la mise à jour des stocks de tous les médicaments et est irreversible.",#PB_MessageRequester_YesNo|#MB_ICONQUESTION)
Select Prise
Case #PB_MessageRequester_Yes
avertissement = 0
ForEach medoc()
NouveauStock = medoc()\NombreEnStock - medoc()\NombreParPrise
If NouveauStock < 6
avertissement +1
EndIf
medoc()\NombreEnStock - medoc()\NombreParPrise
Next
SauvePref(Pref$)
RefreshList()
If avertissement > 0
Message$ = "Des medicaments se font rares"
Else
Message$ = "Stock mis à jour"
EndIf
Case #PB_MessageRequester_No
HideWindow(#LDVMULTIMEDIA,0)
EndSelect
EndSelect
EndSelect
Until quit
; Fermeture de la fenêtre
CloseWindow(#LDVMULTIMEDIA)
EndIf