Bienvenu @As_sembleur,
As_sembleur a écrit :
Ma question était double
Je n'ai pas cru voir la deuxième question dans la suite de ton déroulé
As_sembleur a écrit :
J'aurais besoin d'aide pour contrôler l'architecture du programme dès le départ [...]
Il n'y a pas de règle architecturale absolue. Mais en général, pour ce type d'application, on construit l'interface utilisateur, on créé une boucle (While...Wend, Repeat...Until, etc au choix) chargée d'intercepter les évènements déclenchés par l'utilisateur et à partir desquels on lance des actions soit codées directement à l'intérieur de la boucle soit, si le jeu d'instructions est plutôt long (mais cela n'est pas une obligatoire, c'est plus par souci de lisibilité et surtout pour la possibilité de pouvoir y recourir à plusieurs endroits du code) de faire appel à des procédures qui jouent le rôle d'un Gosub...Return.
Dans ce dernier cas, la seule règle qui s'impose, c'est qu'au moment de la compilation, les procédures doivent être connues (par le compilateur) avant leur appel. Donc, deux possibilités :
• Une procédure a été écrite avant son 1er appel :
Code : Tout sélectionner
Procedure MaProcedure() ; Procédure qui contient le jeu d'instructions
[...]
EndProcedure
MaProcedure() ; Appel de la procédure
Ici, le code s'exécutera sans souci.
• Une procédure a été écrite après son 1er appel :
Code : Tout sélectionner
MaProcedure() ; Appel de la procédure
Procedure MaProcedure() ; Procédure qui contient le jeu d'instructions
[...]
EndProcedure
Ici, le code ne pourra être compilé parce que la procédure n'a pas été définie avant son appel.
Il faudra ajouter l'instruction Declare (déclarer la procédure donc) avant le 1er appel :
Code : Tout sélectionner
Declare MaProcedure()
MaProcedure() ; 1er appel de la procédure
[...]
MaProcedure() ; 2e appel de la procédure
Procedure MaProcedure() ; Procédure qui contient le jeu d'instructions
[...]
EndProcedure
Autre conseil très important qui fait gagner beaucoup de temps en terme de débogage, l'utilisation de l'instruction EnableExplicit.
Généralement placée en tout début de code, elle oblige le programmeur à déclarer toutes ses variables (et leur typage s'il est différent de celui par défaut) avant leur utilisation. On peut trouver cela contraignant mais elle évite bien des soucis. Le contrôle se faisant en amont de la compilation, elle évite bien des erreurs en aval, lors de l'exécution, et dispense en conséquence de l'écriture de code de gestion d'erreurs potentielles en lien.
Pour résumer, en terme architectural, il n'y pas de règle stricte. PB est assez souple pour tout permettre pour peu qu'on s'y prenne de la bonne manière. On a connu sur le forum des membres (très très rares certes) qui se refusaient à utiliser les procédures et ne juraient que par les Goto, Gosub...Return.
L'intérêt de l'utilisation des procédures est à mes yeux incontournable ne serait-ce qu'en termes de réemploi et de lisibilité.
Personnellement, je construis mes applis fenêtrées plus ou moins, selon les contraintes, de la manière suivante :
• Initialisation des plugins
• Déclaration des structures
• Déclaration des Enumeration
• Déclaration des constantes
• Macros
• Déclaration des tableaux, listes et maps
• Déclaration des variables globales
• Déclaration des procédures
• Import des fichiers inclus (code, images, etc)
• Traitement des données (images, sons, etc) inclus en DataScetion
• Fonctions (procédures qui retournent un résultat) globales (pouvant être appelées par n'importe quelle fenêtre)
• Procédures globales (pouvant être appelées par n'importe quelle fenêtre)
et ensuite, pour chaque fenêtre :
• Fonctions locales (qui ne seront appelées que par la fenêtre)
• Procédures locales
• Boucle d'évènements de la fenêtre locale (s'ils ne sont pas gérés par la boucle d'évènements de la fenêtre principale)
• Définition de l'UI de la fenêtre locale
puis
• Boucle d'évènements de la fenêtre principale
• Définition de l'UI de la fenêtre principale
et enfin,
• Appel de la procédure qui lance la fenêtre principale
• Données des DataSection
Cette façon de procéder est en partie l'héritage de l'époque lointaine où j'utilisais VisualBasic et son niveau d'organisation.
Bien évidemment, cette arborescence pourra un peu différer, notamment lorsqu'il n'y a pas de fenêtre parente prédominante.
Voilà, voilà pour l'aspect architectural. Quant aux aspects techniques, tu trouveras sur le forum français, anglais (et allemand) tout plein de codes qui répondront en partie à tes besoins et si tel n'est pas le cas, n'hésite pas à poster pour demander de l'aide, il se trouvera toujours une bonne âme pour essayer de (t'aider à) résoudre ton problème.
PS : Dans PB, F1 est une touche magique !!!
