Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | Calendrier |
|
| | Squelette d'un programme | |
| | Auteur | Message |
---|
Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Squelette d'un programme Ven 16 Mar 2012 - 1:21 | |
| Quelques jours d'absence, sans liaison internet. Suffisamment pour se poser et restructurer certaines choses. Et voici un premier résultat, fortement influencé par le code généré par mon IDE, mais plus lisible: le squelette d'un programme Panoramic Ce morceau de code est complet et exécutable, mais il ne fait rien: il pose le cadre général d'un programme gérant un fichier, avec les fonctions habituelles, y compris la génération d'un menu "fichiers", "édition" et d'une page d'aide et d'à-propos. Il y a aussi la gestion d'un fichier ini, et un moyen de gérer les clics dans un GRID et la saisie des zones d'un GRID. On peut reprendre ce code et l'adapter à tout type de programme, en obtenant ainsi une structure cohérente à travers tous les programmes concernés. Pour ma part, j'ai appliqué cette technique à 3 programmes que je poste dans séparément: - emploi du temps - utilitaire pour élèves, parents d'élèves et enseigants - horloge - eh oui, encore une... - test 3d - petite démonstration de cette technique dans le domaine de la 3D Voici le sqelette: - Code:
-
' squelette de programme.bas
' Ce fichier contient l'ossature d'un programme permettant de ' gérer un fichier de données, l'utilisation d'un fichier de ' configuration "ini", un écran a_propos et une page d'aide. ' Ce fichier est pleinement opérationnel et exécutable. Il faut ' ajouter les champs de saisie dans la form 0 (fichier à gérer) ' et dans la fenêtre des options, les traitements spécifiques pour ' chaque fonction, adapter les pages d'aide et à-propos,gérer la ' mémorisation et la modification des paramètres de configuration. ' Les variables ' i%, j%, k%, s$, x%, y%, lig%, col% ' sont librement utilisables (variables de travail).Le menu peut ' être étendu en respectant la logique de construction.
' Le principe de construction impose la numérotationi automatique ' de chaque objet. Les numéros des objets auxquels il faut pouvoir ' accéder directement, doivent être mémorisés dans des variables ' spécifiques (ce sont les no_xxx).
' *** routine principale label labels : gosub labels gosub variables gosub form0 gosub menu gosub GUI gosub initialisations end
' *** définition de tous les labels labels: label variables, form0, menu, GUI, initialisations, close_options label new, opn, svg, svx, clsx, raz, sortir, options, val_options label aide, apropos, gerer_menu, close_saisie, close_apropos label effacer, click_grille return
' *** définition de toutes les variables variables: dim no%, parent_1%, parent_2% dim nom_fichier$, no_open%, no_save%, no_options% dim flag_present%, flag_modif%, no_modif%, no_val_options% dim no_obj_si_present%(10), no_obj_si_modif%(10) dim n_obj_si_present%, n_obj_si_modif% dim no_apropos%, no_aide% dim i%, j%, k%, s$, x%, y%, lig%, col% dim nl$ : nl$ = chr$(13)+chr$(10) dim version$ : version$ = "V01.00" dim creation$ : creation$ = "9 Mars 2012" dim nom_rep$, nom_ini$ return ' *** configuration de l'écran principal form0: ' full_space 0 width 0,850 : height 0,570 caption 0,"<nouveau>" return
' *** création des menus menu: no% = no% + 1 : main_menu no% : parent_1% = no% no% = no% + 1 : sub_menu no% : parent no%,parent_1% parent_2% = no% : caption no%,"Fichiers" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Nouveau" : on_click no%,new no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Ouvrir..." : on_click no%,opn no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no% caption no%,"Enregistrer" : on_click no%,svg n_obj_si_present% = n_obj_si_present% + 1 no_obj_si_present%(n_obj_si_present%) = no% no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no% caption no%,"Enregistrer sous.." : on_click no%,svx n_obj_si_present% = n_obj_si_present% + 1 no_obj_si_present%(n_obj_si_present%) = no% no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no% caption no%,"Fermer" : on_click no%,clsx n_obj_si_present% = n_obj_si_present% + 1 no_obj_si_present%(n_obj_si_present%) = no% no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"------------------" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Sortir" : on_click no%,sortir
no% = no% + 1 : sub_menu no% : parent no%,parent_1% parent_2% = no% : caption no%,"Edition" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Effacer" : on_click no%, raz : inactive no% n_obj_si_present% = n_obj_si_present% + 1 no_obj_si_present%(n_obj_si_present%) = no% no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"------------------" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Options" : on_click no%, options no% = no% + 1 : sub_menu no% : parent no%,parent_2% : inactive no% no_val_options% = no% caption no%,"Valider les options" : on_click no%, val_options
no% = no% + 1 : sub_menu no% : parent no%,parent_1% parent_2% = no% : caption no%,"Aide" no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"Aide" : on_click no%, aide no% = no% + 1 : sub_menu no% : parent no%,parent_2% caption no%,"A-propos" : on_click no%, apropos
return création de tous les objets Panoramic GUI: ' *** d'abord les objets invisibles ' dialogues, list, timer, ... no% = no% + 1 : open_dialog no% : no_open% = no% filter no%,"Fichier texte|*.txt" no% = no% + 1 : save_dialog no% : no_save% = no% filter no%,"Fichier texte|*.txt" ' *** les objets de la form 0
' *** la page de gestion des options avec ses champs no% = no% + 1 : form no% : hide no% : no_options% = no% : parent_1% = no% caption no%,"Options" top no%, 30 : left no%,30 : height no%,screen_y-60 : width no%,screen_x-60 on_close no%,close_options
' *** la fenêtre de saisie avec ses champs no% = no% + 1 : form no% : hide no% : no_modif% = no% : parent_1% = no% caption no%,"Saisie" top no%, 200 : left no%,200 : height no%,100 : width no%,250 on_close no%,close_saisie no% = no% + 1 : edit no% : parent no%,parent_1% top no%,20 : left no%,20 : width no%,130
' *** la fenêtre a-propos avc ses champs no% = no% + 1 : form no% : hide no% : no_apropos% = no% : parent_1% = no% caption no%,"A-propos" top no%, 200 : left no%,200 : height no%,150 : width no%,250 on_close no%,close_apropos no% = no% + 1 : alpha no% : parent no%,parent_1% top no%,20 : left no%,20 s$ = "Application Panoramic "+nl$ s$ = s$ + "Version: "+version$+nl$ s$ = s$ + "Date: "+creation$+nl$ s$ = s$ + "Auteur: Klaus"+nl$ caption no%,s$
' *** la fenêtre d'aide avec ses champs no% = no% + 1 : form no% : hide no% : no_aide% = no% : parent_1% = no% caption no%,"Aide" top no%, 200 : left no%,200 : height no%,400 : width no%,400 on_close no%,close_apropos no% = no% + 1 : alpha no% : parent no%,parent_1% top no%,20 : left no%,20 s$ = "Mode d'emploi"+nl$+nl$ caption no%,s$
return ' *** toutes les initialisations du programme initialisations: ' répertoire de l'application, nom du fichier ini s$ = param_value$(0) nom_rep$ = file_extract_path$(s$) if instr(lower$(s$),"\temp\")>0 then nom_rep$ = "C:\temp\" nom_ini$ = nom_rep$ + "xxxx.ini" : ' adapter le nom du fichier ini dir_dialog no_open%,nom_rep$ dir_dialog no_save%,nom_rep$ if dir_exists(nom_rep$)=0 then dir_make nom_rep$ if file_exists(nom_ini$)=0 : ' créer le fichier ini vide s'il n'existe pas file_open_write 1,nom_ini$ file_writeln 1,"; créé le "+date$+" à "+time$+" heures" file_close 1 end_if ' traiter le fichier ini file_open_read 1,nom_ini$ file_readln 1,s$ while file_eof(1)=0 ' charger le fichier ini end_while file_close 1 return
' *** fonction "nouveau fichier" new: clsx: if flag_present%=1 gosub effacer flag_present% = 0 flag_modif% = 0 end_if flag_present% = 1 caption 0,"<nouveau>" gosub gerer_menu nom_fichier$ = "" return
' *** fonction "ouvrir un fichier existant" opn: s$ = file_name$(no_open%) if s$="_" then return gosub effacer flag_present% = 1 gosub gerer_menu nom_fichier$ = s$ caption 0,file_extract_name$(nom_fichier$) file_open_read 1,nom_fichier$ ' charger le fichier file_close 1 return
' *** fonction "sauvegarder le fichier" svg: if nom_fichier$="" message "Aucun nom de fichier connu pour ce plan" return end_if if file_exists(nom_fichier$)=1 if message_confirmation_yes_no("Ce fichier existe déjà."+nl$+"Voulez-vous le remplacer ?")<>1 then return end_if file_open_write 1,nom_fichier$ ' sauver le fichier file_close 1 return
' *** fonction "sauvegarder le fichier sous un autre nom" svx: s$ = file_name$(no_save%) if s$="_" then return if instr(right$(s$,5),".")=0 then s$ = s$ + ".txt" nom_fichier$ = s$ caption 0,file_extract_name$(nom_fichier$) gosub svg return ' *** fonction "sortir dur programme" sortir: terminate ' *** fonction "effacer tout" raz: ' effacer toutes les données en mémoire
return ' *** afficher la page d'aide en mode non-modal aide: show no_aide% to_foreground no_aide% return
' *** afficher la page à-propos en mode modal apropos: inactive 0 show no_apropos% return ' *** fermer la page a-propos close_apropos: hide no_apropos% active 0 to_foreground 0 return
' *** adapter les menus si effacement effacer: flag_present% = 0 flag_modif% = 0 gosub gerer_menu return
' *** adapter les menus en fonction de la situation gerer_menu: if flag_present%=1 if n_obj_si_present% >0 for i%=1 to n_obj_si_present% active no_obj_si_present%(i%) next i% end_if else if n_obj_si_present% >0 for i%=1 to n_obj_si_present% inactive no_obj_si_present%(i%) next i% end_if end_if if flag_modif%=1 if n_obj_si_modif% >0 for i%=1 to n_obj_si_modif% active no_obj_si_modif%(i%) next i% end_if else if n_obj_si_modif% >0 for i%=1 to n_obj_si_modif% inactive no_obj_si_modif%(i%) next i% end_if end_if return
' *** montrer la page de gestion des options en mode modal options: inactive 0 : show no_options% return
' *** fermer la page des options close_options: hide no_options% active 0 to_foreground 0 return
' *** modèle de gestion d'un clic dans un GRID ' avec affichage de la fenêtre de saisie en mode modal click_grille: x% = mouse_x_left_down(no_grille%) y% = mouse_y_left_down(no_grille%) col% = grid_x_to_column(no_grille%,x%) lig% = grid_y_to_row(no_grille%,y%) ' ici gérer la case cliquée caption no_modif%,"Saisie" inactive 0 show no_modif% return ' *** fermeture de la fenêtre de saisie close_saisie: s$ = text$(no_modif%+1) ' ici, gérer la nouvelle valeur présente dans s$ flag_modif% = 1 flag_present% = 1 gosub gerer_menu hide no_modif% active 0 to_foreground 0 return
' *** enregistrer les options modifiées val_options: file_open_write 1,nom_ini$ file_writeln 1,"; créé le "+date$+" à "+time$+" heures" ' écrire les options dans le fichier ini file_close 1 inactive no_val_options% return | |
| | | Invité Invité
| Sujet: Re: Squelette d'un programme Ven 16 Mar 2012 - 14:49 | |
| Je viens de récupérer ton programme, et l'analyserai plus tard. J'ai un problème de virus qui m'empoisonne. |
| | | Invité Invité
| Sujet: Re: Squelette d'un programme Mar 27 Mar 2012 - 8:39 | |
| Bonjour Klaus. Je suis en train de regarder tat recette, enfin ton squelette (ici c'est la même chose). C'est pour mon Puding que je suis en train de faire. J'essaye de le faire digeste. Je regardais pour les dim, car j'avais une idée particulière que le résoudre, mais là je ne sais plus trop quoi penser. Ton système n'est pas mal, d'autant que j'ai déjà utilisé ce type pour un programme particulier, et qu'en plus celà me permettais de décomposer le programme, de le mettre par morceau dans des onglets différents, et d'avoir un rassembleur pour l'exécuter. Si j'interviens, c'est que je m'aperçois qu'il y a un problème. Ce système généraliste, ne va pas avec des includes qui doivent avoir des noms d'étiquettes et de dim différents. Il faudrait que tu trouves le moyen de faire disparaitre ceux-ci, en quelque sorte, de faire du KLAUS-UP! |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Squelette d'un programme Mer 28 Mar 2012 - 21:45 | |
| Je veux bien regarder cela d'un peu plus près, mais il faudrait que tu sois un peu plus clair. Qu'est-ce qu'exactement que je dois faire disparaître ? Peux-tu me montrer cela dans le source du squelette dont tu parles ? | |
| | | Invité Invité
| Sujet: Re: Squelette d'un programme Mer 28 Mar 2012 - 23:44 | |
| Bonsoir Klaus. Je réponds bien souvent à ce que je lis dans le forum, mais la plupart du temps, au moment de poster, je clique ailleurs pour annuler, car je pense que ce que je peux dire n'apporte rien, ou cela entraine sur autre chose, et je dis stop.
En regardant ton squelette, et les programmes que tu as faits avec (lecture rapide), je me suis rendus compte que cela avait pour effet de mettre les mêmes labels et les mêmes dim dans chaque programme, ce qui fait que ce n'est pas valable pour des includes, vu que tu vas faire rentrer des programmes avec des doublons de labels et de dim.
J'étais sur le point d'annuler la remarque, vu ton professionnalisme, et j'ai jeu de mots (il faut le dire vite) qui m'est apparu en écrivant:
recette et squelette, pluging et pouding, close-up et Klaus-Up, et comme cela me faisait sourire avec la recette de pouding et le squelette d pluging, finalement j'ai posté en espérant vous faire sourire (je sais je suis bête) aussi. Je suis fait comme cela, je ne me refais pas. |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Squelette d'un programme Mer 28 Mar 2012 - 23:59 | |
| J'aime bien un peu d'humour dans ce monde bien souvent trop terne ou trop triste ! Le tien est le bienvenu, et je te remercie du rapprochement flatteur entre mon nom et le close-up des manipulateurs de cartes (il se trouve que je suis un fan inconditionnel de Bernard Billis, éblouissant dans ce domaine). Ceci dit, et là encore, juste pour rire, mon nom est trop souvent prononcé "Klos" au lieu de "Kla-o-ous" (avec on "a-o-ou" comme dans "miaou" sans le "i"). Or, "Klos" en allemand, écrit et prononcé de cette manière, veut dire "boule de viande" ce qui me rappelle douloureusement mon embonpoint...
Blaque à part, au sujet des labels: je ne saurais trop recommander l'utilisation du ctrl-R dans l'éditeur Panoramic pour remplacer en une seule opération, des labels ou autres noms afin de personnaliser un source. Mon squelette n'a en aucune façon l'ambition d'être une norme de programmation. Juste un exemple de structuration d'un programme, et encore... Il y a mille et une façon de concevoir son code, et je ne suis pas de ceux qui veulent imposer leur marque. Juste donner une idée à ceux qui cherchent quelque chose de ce genre.
Une solution consisterait à systématiquement préfacer chaque label et chaque variable avec le nom du programme dans lequel on utilise un tel module. Ainsi, mon sous-programme "initialisations" deviendrait "MonAlbumPhoto_initialisations", ma variable i% deviendrait "MonAlbumPhoto_i%" dans un programme "MonAlbumPhoto.bas". El il n'y a plus de conflits. Mais là encore, ce n'est qu'une suggestion. | |
| | | Invité Invité
| Sujet: Re: Squelette d'un programme Jeu 29 Mar 2012 - 11:10 | |
| Bonjour Klaus (ou Klos) Je ne le fais qu'une fois, et je ne recommencerai pas. Surtout ne pas faire pas d'erreur dans tes programmes, sinon tu feras une boulette! (boule de viande). Là tu n'as pas d'excuses, tu as tout fait pour. Mais les blagues les plus courtes étant les meilleurs, je t'ennuierai plus la dessus. As propos, en lisant ton nom, c'est toujours Klaus prononcé à l'allemande, que je te lis. J'ai fais un peu d'allemand, et malheuresement il ne m'en reste rien. |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Squelette d'un programme Jeu 29 Mar 2012 - 13:36 | |
| | |
| | | papydall
Nombre de messages : 7009 Age : 73 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Squelette d'un programme Jeu 29 Mar 2012 - 19:20 | |
| Salut Klaus ! J’ai décidé de faire un programme un peu plus consistant, à mon humble avis. Et ton squelette (si j’ose parler ainsi) m’a apporté une aide inestimable. Mille mercis pour proposer ton aide à tous ceux qui en ont besoin. Nous ne sommes pas tous chevronnés car il y a de nouveaux venus sur ce forum (voir des bleus) et qui veulent apprendre. Pour ma part, j’ai déjà programmé en d’autres langages (en tant qu’amateur et autodidacte) et je connais un peu l’algorithmique et autre méthodologie de programmation. Mais PANORAMIC est nouveau pour moi : ces FORM, ALPHA, MEMO, GRID, COMBO, LIST, DLIST, EDIT etc. Donc merci à toi et à tous les autres qui apportent leurs aides à qui en a besoin.
| |
| | | Klaus
Nombre de messages : 12301 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Squelette d'un programme Jeu 29 Mar 2012 - 21:42 | |
| Merci ! Ca fait plaisir de voir que j'ai pu être utile. N'hésite pas à poser des questions si besoin est - nous sommes tous là pour ça ! | |
| | | Contenu sponsorisé
| Sujet: Re: Squelette d'un programme | |
| |
| | | | Squelette d'un programme | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |