Question de propreté de code... et de fonctionnement
Publié : lun. 05/mars/2012 22:11
Pour mon programme domotique, je souhaite avoir une fenêtre principale avec plusieurs gadgets (de l'ordre d'une centaine) : des graphes, des champs éditables, des boutons reflétant l'état des lampes, etc.
Je veux aussi utiliser un listicongadget pour indiquer les évènements à venir (allumage de lampe à 7h, volet roulant XX à 7h15,...) et comme je veux pouvoir changer cette programmation, un double-clic sur cette liste doit faire quelque chose : idéalement, éditer le champ sélectionné (mais la programmation employée sur les différents post me rebute un peu par la complexité et surtout le risque de non-compatibilité Win/linux) ou bien ouvrir une boite de dialogue.
Là, ça devient un peu moche car soit je rajoute mes constantes dans mon encart ENUM (ça commence à faire des constantes nombreuses), soit je peux utiliser des valeurs locales à ma procédure d'édition...
Enfin, durant mon édition, je souhaite que ce ne soit pas bloquant pour l'ensemble du programme (qui effectue des relevés de température par exemple, ou stocke les messages en provenance du BUS) : comment dois-je gérer cela ?
Actuellement, j'utilise des eventtimer
Bref, une vision du bon fonctionnement m'intéresse pour ne pas être bloquant comme en automatisme 
Pour le moment, j'ai une procédure qui est lancée en cas de double-clic pour afficher la fenêtre d'édition (très basique) :
Puis dans ma boucle principale, je surveille le bouton
Ca me paraît très "crade" comme structure de codage mais je ne sais pas s'il y a d'autres moyens plus d'en "l'état de l'Art"
Merci
Je veux aussi utiliser un listicongadget pour indiquer les évènements à venir (allumage de lampe à 7h, volet roulant XX à 7h15,...) et comme je veux pouvoir changer cette programmation, un double-clic sur cette liste doit faire quelque chose : idéalement, éditer le champ sélectionné (mais la programmation employée sur les différents post me rebute un peu par la complexité et surtout le risque de non-compatibilité Win/linux) ou bien ouvrir une boite de dialogue.
Là, ça devient un peu moche car soit je rajoute mes constantes dans mon encart ENUM (ça commence à faire des constantes nombreuses), soit je peux utiliser des valeurs locales à ma procédure d'édition...
Enfin, durant mon édition, je souhaite que ce ne soit pas bloquant pour l'ensemble du programme (qui effectue des relevés de température par exemple, ou stocke les messages en provenance du BUS) : comment dois-je gérer cela ?
Actuellement, j'utilise des eventtimer
Code : Tout sélectionner
If EventID=#PB_Event_Timer
Select EventTimer()
Case 100
WriteTempFile()
GraphTemp()
Case 101
VelbusBPCalc()
Case 102
ClearOldMsg(4)
EndSelect
EndIf

Pour le moment, j'ai une procédure qui est lancée en cas de double-clic pour afficher la fenêtre d'édition (très basique) :
Code : Tout sélectionner
Procedure EditEvent(ligne)
OpenWindow(#EE_Window,50,50,200,120,"Editer événement",#PB_Window_ScreenCentered|#PB_Window_Normal)
StringGadget(#EE_StrHM, 100, 10, 80, 18, GetGadgetItemText(#Editor_Reveil,ligne,2))
StringGadget(#EE_StrDay, 100, 30, 80, 18, GetGadgetItemText(#Editor_Reveil,ligne,1))
StringGadget(#EE_StrAdr, 100, 50, 80, 18, GetGadgetItemText(#Editor_Reveil,ligne,4))
StringGadget(#EE_StrMod, 100, 70, 80, 18, GetGadgetItemText(#Editor_Reveil,ligne,5))
ButtonGadget(#EE_ButtonOK,70,90,80,18,"OK")
EndProcedure
Puis dans ma boucle principale, je surveille le bouton
Code : Tout sélectionner
Case #EE_ButtonOK
ligne = GetGadgetState(#Editor_Reveil)
SetGadgetItemText(#Editor_Reveil,ligne,GetGadgetText(#EE_StrHM),2)
SetGadgetItemText(#Editor_Reveil,ligne,GetGadgetText(#EE_StrDay),1)
SetGadgetItemText(#Editor_Reveil,ligne,GetGadgetText(#EE_StrAdr),4)
SetGadgetItemText(#Editor_Reveil,ligne,GetGadgetText(#EE_StrMod),5)
CloseWindow(#EE_Window)
EndSelect

Merci