Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Nouvel outil de lanceur ou menu multi-niveau Mar 29 Oct 2013 - 1:52 | |
| J'ai fait un n-ième programme lanceur, en générant des menus Panoramic (menus Windows), mais à plusieurs niveaux. Le menu complet est défini par un fichier ini, obéissant au format suivant: - Citation :
; Configuration de menu_avec_BDR niveau,libellé,fichier,paramètre,dossier
niveau = niveau de la ligne dans le menu (1=main_menu) libellé = texte à afficher dans le menu fichier = fichier ou exécutable à lancer (optionnel) paramètre = paramètre optionnel pour le programme à lancer dossier = dossier dans lequel le programme devra s'exécuter (optionnel) Tous les éléments contenant des espaces doivent être entourés de guillemets. Voici un exemple d'un tel fichier: - Citation :
- ; Configuration de menu_avec_BDR
1,"menu" 2,"Jeux" 3,"Bulles","C:\jeux\bulles.exe" 3,"Couleurs tombantes","C:\jeux\couleurs.exe" 2,"Panoramic" 3,"Editeur seul","C:\Program files\Panoramic Editor\Panoramic_Editor.exe" 3,"Editeur avec test.bas","C:\Program files\Panoramic Editor\Panoramic_Editor.exe","C:\mes programmes Panoramic\test.bas","C:\mes programmes Panoramic" 2,"Sauvegardes" 3,"Sauvegarde","C:\outils\sauvegarde.bat" 3,"Restauration","C:\outils\restauration.bat"
La ligne 1,"menu" génère le main_menu de Panoramic, les autres genèrent des sub_menu Panoramic. Et voici le programme (adapter les chemins dans la procedure "constantes": - Code:
-
' menu_avec_fichier_ini.bas
labels() constantes() variables() objets_invisibles() initialisations() end
sub labels() label click_menu end_sub
sub constantes() dim kgf$ : kgf$ = "KGF.dll" dim ini$ : ini$ = "c:\documents and settings\klaus\mes documents\mes projets delphi\KGF\menu_avec_fichier_ini.ini" dim tit$ : tit$ = "; Configuration de menu_avec_BDR" dim nox% : nox% = 100 end_sub
sub variables() dim s$, i%, s1$, no%, niv%, base% dim n_menu%, menu%(200,1), menu$(200,3), bases%(10) end_sub
sub objets_invisibles() dlist 1 : ' pile des indices des niveaux ' list 1 : top 1,10 : left 1,10 : height 1,300 ' list 2 : top 2,10 : left 2,150 : height 2,300 : width 2,400 end_sub
sub initialisations() width 0,600 : height 0,60 KGF_initialize(kgf$) if file_exists(ini$)=0 file_open_write 1,ini$ file_writeln 1,tit$ file_writeln 1,"1,main" file_close 1 end_if file_open_read 1,ini$ file_readln 1,s$ if s$<>tit$ message "Le fichier de configuration est invalide" terminate end_if base% = 0 clear 1 while file_eof(1)=0 file_readln 1,s$ n_menu% = n_menu% + 1 KGFDelimitedTextExtract(s$,",",1) if numeric(KGFDelimitedTextExtract$)=0 message "Erreur de syntaxe à la ligne "+s$ terminate end_if niv% = val(KGFDelimitedTextExtract$) if niv%>base% item_add 1,str$(n_menu%) base% = niv% else if niv%<base% while niv%<=count(1) item_delete 1,count(1) end_while item_add 1,str$(n_menu%) base% = niv% end_if end_if menu%(n_menu%,0) = niv% if niv%>1 then menu%(n_menu%,1) = val(item_read$(1,base%-1)) KGFDelimitedTextExtract(s$,",",2) menu$(n_menu%,0) = KGFDelimitedTextExtract$ KGFDelimitedTextExtract(s$,",",3) menu$(n_menu%,1) = KGFDelimitedTextExtract$ KGFDelimitedTextExtract(s$,",",4) menu$(n_menu%,2) = KGFDelimitedTextExtract$ KGFDelimitedTextExtract(s$,",",5) menu$(n_menu%,3) = KGFDelimitedTextExtract$ ' item_add 2,str$(n_menu%)+": "+menu$(n_menu%,0)+" "+str$(menu%(n_menu%,1)) ' message "a" end_while file_close 1 no% = nox% for i%=1 to n_menu% no% = no% + 1 if menu%(i%,0)=1 main_menu no% else ' message "B: "+str$(i%)+": "+str$(no%)+" "+str$(menu%(i%,1)+nox%) sub_menu no% : parent no%,menu%(i%,1)+nox% : caption no%,menu$(i%,0) if len(menu$(i%,1))>0 then on_click no%,click_menu end_if next i% end_sub
click_menu: s$ = menu$(number_click-nox%,1) ' message "lancement de: "+menu$(number_click-nox%,1)+" paramètre: "+menu$(number_click-nox%,2)+" dossier: "+menu$(number_click-nox%,3) ExecuteProgram(menu$(number_click-nox%,1),menu$(number_click-nox%,2),menu$(number_click-nox%,3)) return
#INCLUDE "KGF_SUB.bas"
Il faut KGF.dll et KGF_SUB.bas pour l'exécution. Note complémentaire: Cette technique peut aussi être utilisé dans un programme application, pour avoir des menus configurables par fichier INI. Chaque programme aurait son propre fichier INI, mais le code de chargement est le même, ajouté par n#INCLUDE par exemple. Et le sous-programme click_menu serait modifié légèrement pour gérer les clics internes à l'application: - Code:
-
click_menu: s$ = menu$(number_click-nox%,1) ' message "lancement de: "+menu$(number_click-nox%,1)+" paramètre: "+menu$(number_click-nox%,2)+" dossier: "+menu$(number_click-nox%,3) if left$(menu$(number_click-nox%,1))="$" ExecuteProgram(menu$(number_click-nox%,1),menu$(number_click- nox%,2),menu$(number_click-nox%,3)) else select val(menu$(number_click-nox%,1)) case 1 ... end_select end_if return Et dans ce cas de figure, il faut faire précéder le nom du fichier ou programme externe à lancer par un "$", et les lignes déterminant une fonction interne du programme contiennent un code numérique à la place du nom du fichier. | |
|
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 29 Oct 2013 - 15:16 | |
| Encore un code a étudié de près, même de très près... Bravo Klaus | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Nouvel outil de lanceur ou menu multi-niveau Mar 29 Oct 2013 - 22:28 | |
| Oui c est tres pratique et ca peut permettre facilement de gerer les menus dans differentes langued en changeant de fichier ini | |
|