Nous sommes le Jeu 18 Sep, 2025 13:16
Supprimer les cookies

Le retour du bureau portable

Image Image Forum dédié à notre projet de clé USB nomade libre sous Windows

Ven 10 Déc, 2010 11:39

Bonjour à tous

il y a au moins deux ans, j'avai demandé de l'aide sur ce forum, pour la création d'un lanceur d'applications, accessible pour mal et non voyants, utilisé dans la NVDAKey intitulé le bureau portable , depuis je l'ai fait évolué au rythme de mes disponibilitées qui n'ont pas toujours été très nombre"uses.

Ce lanceur est créer en autohotkey

aujourd'hui j'ia besoin de votre aide affin de lui apporté la touche finale pour une version entièrement fonctionelle.

Je dois implémenter l'ajout la modification et la supopression d'applications dans le fichier ini, ainsi que l'ajout supression et modiffications de catégories.

c'est cette partie manquante mais nécessaire que j'aimerai faire maintenant, mais je rencontre quelques difficultées.

Avant de commencer, voici pour télécharger les sources :
http://dl.dropbox.com/u/6144159/Bureau_ ... src_r60.7z

Donc j'aimerai créer un menu contextuel pour ajouter modiffier etc... je sais très bien le gérer pour une seule fenêtre, mais pas pour la deuxième intitulé 2: ou le menu ne s'ouvre pas, et je en sais pas comment écrire la sub GuiContextMenu: pour le 2ème fenêtre qui sert à afficher la liste des programmes.

Si vous connaissez comment faire merci de me l'explisuer

Luc
lucs

Messages : 16

Ven 10 Déc, 2010 22:42

Bonjour lucs,

Je viens de télécharger les sources et j'ai une erreur à l'ouverture à cause de l'absence d'un fichier ini.

Cyrille
cyrille

Avatar de l’utilisateur
Messages : 953
Géo : Seine et Marne

Sam 11 Déc, 2010 00:01

Bonjour

eh oui faut un fichier ini pour l'exécuter, mais pour le problème dont je parle pas le peine de l'exécuter pour comprendre de quoi il s'agit, en plus ça ne marche pas.

C'est dans le code qu'il faut regarder en l'éditant avec un éditeur de texte, presque à la fin du source dans la sub nomé GuiContextMenu: qui ne fonctionne que dans la première fenêtre, mais qui dans l'état actuel du code ne fonctionne pas du tout, car le menu ne s'ouvre que si on clique droit sur la liste des programmes

dong pour résuper ce que j'ai besoin c'est de pouvoir gérer le menu contextuel dans la deuxième fenêtre chose que je ne sait pas faire.

Merci d'avance
lucs

Messages : 16

Sam 11 Déc, 2010 09:12

Bonjour,
lucs a écrit:... mais pour le problème dont je parle pas le peine de l'exécuter pour comprendre de quoi il s'agit, en plus ça ne marche pas...

Ben en fait, si, ça peut aider à comprendre la structure de ton programme.

C'est pour ça que j'ai été récupérer la NVDAKey.

Pour répondre de manière courte à ta question : renomme GuiContextMenu en 2GuiContextMenu.

Pour répondre de manière un peu plus longue :
Quel est l'intérêt de créer une 2e GUI ? il me semble qu'il serait plus simple de tout gérer au sein d'une seule GUI.
Soit en jouant sur l'affichage / activation des listbox soit, beaucoup plus simplement en utilisant les onglets (Gui, Tab).
Dans ce cas, il suffit de transformer les "Menus" en onglets, chaque onglet contenant sa ListBox

Autre remarque concernant le fichier ini :
Il est possible de limiter le nombre d'accès en lecture/écriture au fichier ini en utilisant les fonctions de Tuncay : http://www.autohotkey.com/forum/viewtopic.php?t=46226
Ça permet de charger l'ensemble du fichier en mémoire et de travailler directement dessus. c'est largement plus rapide que des accès multiples sur une clé USB.
En outre, ça permettrait aussi d'éclaircir la structure de ton fichier ini. En effet, le gros problème auquel tu vas être confronté va être la renumérotation de toutes tes sections [AppXXX] au moment de la suppression d'une appli.
J'explicite un peu :
Admettons que tu aies 15 applis donc 15 sections numérotées de App1 à App15. Si tu supprimes l'appli 8, tu vas devoir renuméroter les applis 9 à 15 en applis 8 à 14 sinon ton programme ne les traitera pas (il détectera un AppName = false pour TabCount = 8 ).
L'utilisation de la Lib ini de Tuncay te permettra de construire une structure de ce type :
Code: Tout sélectionner
[Fenetre]
Titre="NVDA Key - Version 2009.1"
StartAppName="NVDA"
Start="nvda\nvda.exe"
Stop="nvda\nvda.exe -q"

[Menus]
MenuName1="Bureautique"
MenuName2="Internet"
MenuName3="Multimédia"
MenuName5="NVDA"
MenuName6="Utilitaires"

[Bureautique]
AppNum1=3
AppNum3=4

[Multimédia]
AppNum1=1
AppNum2=5
AppNum3=3

...

[App1]
AppName="Bloc-notes"
AppPath="apps\scite\Sc201.exe"

[App3]
AppName="Mozilla Thunderbird"
AppPath="apps\ThunderbirdPortable\ThunderbirdPortable.exe"
AppDir="apps\ThunderbirdPortable\"

[App4]
AppName="RadioSure - Ecoutez vos radios favorites"
AppPath="apps\RadioSure\RadioSure.exe"
AppDir="apps\RadioSure"

[App5]
AppName="VLC - Lecteur multimédia"
AppPath="apps\VLCPortable\VLCPortable.exe"


Ensuite, il "suffit" d'utiliser la fonction ini_getAllKeyNames et des boucles loop parse pour récupérer ce que tu veux.
La structure ci-dessus n'est pas parfaite non plus puisqu'il faudra gérer le numéro max des sections App. Elle a l'avantage de permettre l'utilisation d'une appli dans plusieurs "Menus". Exemple, l'App3 est présente dans les menus Bureautique et Multimédia.

Une autre façon d'envisager le fichier ini est la suivante :
Code: Tout sélectionner
[Menus]
MenuName1="Bureautique"
MenuName2="Internet"
MenuName3="Multimédia"
MenuName5="NVDA"
MenuName6="Utilitaires"

[Bureautique]
AppName1="Bloc-notes"
AppPath1="apps\scite\Sc201.exe"
AppName2="Mozilla Thunderbird"
AppPath2="apps\ThunderbirdPortable\ThunderbirdPortable.exe"
AppDir2="apps\ThunderbirdPortable\"

[Multimédia]
AppName1="RadioSure - Ecoutez vos radios favorites"
AppPath1="apps\RadioSure\RadioSure.exe"
AppDir1="apps\RadioSure"
AppName2="VLC - Lecteur multimédia"
AppPath2="apps\VLCPortable\VLCPortable.exe"

Après, il suffit d'utiliser des boucles pour récupérer ce que l'on souhaite. Ça tombe bien les boucles c'est la spécialité d'AutoHotkey :)
Vécu : "J'ai une version crackée d'OpenOffice, c'est pour ça qu'elle est en anglais"
fat115

Avatar de l’utilisateur
Messages : 930
Géo : Ardèche ... du nord

Sam 11 Déc, 2010 09:40

Pour les fenêtres et les listbox, j'ai tout fait pour que les débutants puissent utiliser le probrammes sans se compliquer. c'est pour ça que je n'ai pas choisit de faire des onglets, la deuxième raison est que j'avai prévu pour plus tard, de faire des onglets pour mettre des documents, et de las lancer avec les applications de la clé.

en fait je n'utilise pas le fichier ini et fur et à mesure, je charge au lancement du programme une sub quipermet de mettre toutes les valeurs du fichier ini dans des variables et des tableaux.

c'est d'ailleur ça qui vas me permettre de pouvoir réécrire le fichier ini en suite.

je regarderai le fonctionnement de cette librairie,

Pour la structure que vous me proposez pour le fichier ini, c'est le même problème il y a des chiffres, et en plus il faut créer beaucoup plus de tableaux, en plus si j'ai mis des numéros aux catégories c'est pas juste un pur hazard, c'est que je me sert de ces numéros pour la liste des catégories.

en fait le numéro correspond au positionnment de chaques catégories dans la liste,

pour la suppression j'avai prévu de modiffier le tableau, et de réécrire entièrement le fichier ini.

bon voilà, je vais voir donc pour la librairie pour les fichiers ini.

Merci déjà pour l'aide que vous m'avez apporté, je vais y travailler dessus et reviens pour dire els choix que j'ai fait

Merci d'avance

Luc
lucs

Messages : 16

Sam 11 Déc, 2010 10:19

Rebonjour

Apparament tu n'a pas vu la sub GetFromIniFile: qui fait exactement ce que tu dit, c'est à dire grace à des boucles récupère le contenu du fichier ini et les stocke dans des variables ou des tableaux.

autre chose, pour la deuxième proposition de fichier ini le problème reste le même, puisque tout est numéroté, je dirai même il est plus compliqué à gérer, car au lieu d'un numéro à modiffier par applications suprimé là il y en aura 3

Voila je continuer à réffléchir sur tout ça et peut-être que je réagirait encore

donc vas voir la sub GetFromIniFile: et dit moi si ça fait pareil que la librairie

apprès on reparlera de la structure du fichier ini
lucs

Messages : 16

Sam 11 Déc, 2010 11:54

j'ai quelques problèmes avec A_EventInfo voici le code :

Code: Tout sélectionner

; s'exécute quand on clique droit et ouvre le menu contextuel

2GuiContextMenu:
   if A_GuiControl = ChoiceApp
   {
            Menu, ContextMenuApps, Show, %A_GuiX%, %A_GuiY%
   }
Return

;-----------------------------------------------------------------------------------------------------------

; ajoute un programme au fichier ini

ContextAddApp:



Return

;-------------------------------------------------------------------------------------------------------

; Editer un programme dans le fichier ini

ContextEditApp:
         
   number := %AppNumber%%A_EventInfo%          ; met dans la variable number le numéro correspondant à l'applicatioh choisit
   NameApp := %AppName%%A_EventInfo%
   Msgbox, Le numéro de la liste choisit est le : %A_EventInfo%,`n le numéro du programme à éditer est %number% `n et son nom est %NameApp%
Return

;-----------------------------------------------------------------------------------------------------------

; Supprime un programme du fichier ini

ContextRemoveApp:
   number := %AppNumber%%A_EventInfo%                  ; met dans la variable number le numéro correspondant à l'applicatioh choisit
   NameApp := %AppName%%A_EventInfo%
   Msgbox, le numéro du programme à supprimer est %number% `n et son nom est %NameApp%
Return


Dans ce cas-ci A_EventInfo, si j'ai bien compris devraie renvoyé le numéro de l'option qui est cliqué droit dans la zone de liste, pourtant quand j'exécute elle toujours à zéro
D'oû viens le pb ?

Je termine avec le menu contextuel en suite je m'occuperai du fichier ini et de comment l'organiser pour pouvoir supprimer le plus simplement un programme.

Luc
lucs

Messages : 16

Sam 11 Déc, 2010 13:05

lucs a écrit:Rebonjour

Apparament tu n'a pas vu la sub GetFromIniFile: qui fait exactement ce que tu dit, c'est à dire grace à des boucles récupère le contenu du fichier ini et les stocke dans des variables ou des tableaux.
Non, elle travaille complètement différemment.
Nombre d'accès à la clé USB avec GetFromIniFile = Nombre d'applis déclarées dans l'ini * 3 (1 pour chaque IniRead * par le nombre d'applis soit 20 dans le fichier que j'ai récupéré = 60 accès juste pour la lecture)
Nombre d'accès à la clé USB avec les fonctions de Tuncay : 1 au lancement du script, c'est tout ensuite c'est une variable en mémoire

autre chose, pour la deuxième proposition de fichier ini le problème reste le même, puisque tout est numéroté, je dirai même il est plus compliqué à gérer, car au lieu d'un numéro à modiffier par applications suprimé là il y en aura 3
Sauf que la fonction ini_getAllKeyNames ne tient absolument pas compte des numéros, tu es donc sûr de tout récupérer même si les numéros ne se suivent pas.

Voilà une portion de code permettant la lecture d'une telle structure :
Code: Tout sélectionner
; on s'assure de travailler dans le dossier du script
SetWorkingDir, %A_ScriptDir%
; on inclut les fonctions INI
#Include %A_ScriptDir%\ini.ahk

; on charge le fichier ini en mémoire
ini_load(f_IniContent, "bureau_portable.ini")

; on liste les clés des menus
MenusList := ini_getAllKeyNames(f_IniContent, "Menus", NbMenus)
; à noter qu'elles peuvent s'appeler MenuNameXX ou Toto ou MachinTruc, peu importe

Loop, parse, MenusList, `,
   {
   ; réindexation des menus
   NumMenu := A_Index
   Menu_%NumMenu% := ini_getValue(f_IniContent, "Menus", A_LoopField)
   MenuItems := ini_getAllKeyNames(f_IniContent, Menu_%NumMenu%)
   AppItems := ""
   Loop, parse, MenuItems, `,
      {
      IfInString, A_LoopField, AppName
         {
         AppItems .= A_LoopField . "|"
         }
      }
   StringTrimRight, AppItems, AppItems, 1
   ; la chaine AppItems contient les références AppNameXX,qq soit XX
   Loop, parse, AppItems, |
      {
      ; on construit un tableau : App_n°dumenu_n°appli
      StringReplace, i_Index, A_LoopField, AppName
      AppName_%NumMenu%_%A_Index% := ini_getValue(f_IniContent, Menu_%NumMenu%, "AppName" . i_Index)
      AppPath_%NumMenu%_%A_Index% := ini_getValue(f_IniContent, Menu_%NumMenu%, "AppPath" . i_Index)
      AppDir_%NumMenu%_%A_Index% := ini_getValue(f_IniContent, Menu_%NumMenu%, "AppDir" . i_Index)
      ; on stocke le nombre d'applis du menu
      NbApplis_%NumMenu% := A_Index
      }
   }

   
; relecture de la totalité des menus et applications par boucle double

; on boucle sur le nombre de menus, peu importe leur numéro dans l'ini
Loop, %NbMenus%
   {
   MsgBox % "Menu : " . Menu_%A_Index%
   NumMenu := A_Index
   NumApplis := NbApplis_%NumMenu%
   ; on boucle sur les applis du menu
   Loop, %NumApplis%
      {
      MsgBox % "Appli : " . AppName_%NumMenu%_%A_Index%
      }
   }

La partie finale n'est là que pour montrer la relecture des éléments mis en tableau. C'est le seul truc qu'il manque vraiment dans AutoHotkey : des vrais tableaux.
Vécu : "J'ai une version crackée d'OpenOffice, c'est pour ça qu'elle est en anglais"
fat115

Avatar de l’utilisateur
Messages : 930
Géo : Ardèche ... du nord

Sam 11 Déc, 2010 13:17

lucs a écrit:Dans ce cas-ci A_EventInfo, si j'ai bien compris devraie renvoyé le numéro de l'option qui est cliqué droit dans la zone de liste, pourtant quand j'exécute elle toujours à zéro
D'oû viens le pb ?

Je ne suis pas sûr de comprendre.
Si tu veux récupérer le numéro de l'item de la ListBox sur lequel a eu lieu le clic droit, tu ne le fais pas au bon moment.
Il faut le faire dans 2GuiContextMenu
Vécu : "J'ai une version crackée d'OpenOffice, c'est pour ça qu'elle est en anglais"
fat115

Avatar de l’utilisateur
Messages : 930
Géo : Ardèche ... du nord

Sam 11 Déc, 2010 13:56

Oui c'étai exactement ce que je voulai faire récupérer l'item.

c'est vrai qu'il faut la récupérer dans la sub qui traite le menu contextuel, c'est logique, je sais pas pourquoi j'ai fait différament, je vais affecter une variable qui contiendra cete valeur .
lucs

Messages : 16

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit