Alors bonjour à tous!
Voilà maintenant quelques temps que je travaille sur cette petite idée à temps libre.
Le concept est très simple.
J'ai mon logiciel principal qui comporte ma Classe "ModulesAPP".
J'ai d'autres projet windev qui ont leur propre classes, fenêtres, analyses.
Mon logiciel principal récupère la bibliothèque et l'analyse de ce dernier projet et l'éxécute dans mon logiciel principal comme une fenêtre normal.
Je la met à votre disposition pour pouvoir l'améliorer à votre guise et peut-être pouvoir obtenir au final une classes qui gère de A-Z les modules indépendant. *Je tien à dire que j'ai appris à programmer par moi-même par essaie/erreur et ma syntaxe et/ou code ne peuvent pas être à 100% correct.
Voici une simple explication qui, dans mon cas fonctionne parfaitement.
Dans mon logiciel Maître (appelons le comme ceci)
J'ai ce code sous Initialisation du projet
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 gpclMod_1 est un ModulesApp dynamique gpclMod_2 est un ModulesApp dynamique gpclMod_3 est un ModulesApp dynamique gpclMod_4 est un ModulesApp dynamique gpclMod_5 est un ModulesApp dynamique gpclMod_6 est un ModulesApp dynamique gpclMod_7 est un ModulesApp dynamique gpclMod_8 est un ModulesApp dynamique gpclMod_9 est un ModulesApp dynamique gpclMod_10 est un ModulesApp dynamique gpclMod_11 est un ModulesApp dynamique gpclMod_12 est un ModulesApp dynamique gpclMod_13 est un ModulesApp dynamique gpclMod_14 est un ModulesApp dynamique gpclMod_15 est un ModulesApp dynamique pclModCourant est un ModulesApp dynamique //Modules courant pclModCourant = allouer un ModulesApp
Pour chaque modules obtenue par l'utilisateur. Je décris une structure dans les dossiers windows.
"%appdata%/Monsoft/bin/modules/" sera mon dossier contenant mes modules téléchargés.
J'assigne à chaque modules développez un "UID" unique. (ex. 1A4T7E)
J'obtient donc un fichier .ini ("%appdata%/Monsoft/bin/modules/1A4T7E.APP.ini") et un dossier ("%appdata%/Monsoft/bin/modules/1A4T7E.APP").
C'est dans ce dossier "/1A4T7E.APP" que je vais avoir un dossier "img" (qui sert à récupéré "l'icon" du modules), un dossier "config" (pour enregistrer localement les configurations relié à ce modules), mon analyse et ma bibliothèque (qui doivent avoir le même nom -> "Nomcourt" .. voir plus bas dans la structure du fichier .ini).
Mon fichier ini est structuré comme ceci :
[Module]
UID=C8ER45 //Identifiant unique du modules
Name=Gestion de contact //Nom logique de mon modules
WindowsName=FI_Contact //Fenêtre principal à afficher lors de l'appel
Desc=Gérer vos contact avec ce fantastique modules //Description du modules
Version=1.0 //la version
NomCourt=Modu_Contact //Nom utilisé pour rechercher l'analyse et la bibliothèque (Modu_Contact.WDD, Modu_Contact.WDL)
[Image]
AppMenuImage=\img\2.png //Icon du modules pour le "menu"
AppMenuImageActive=\img\2.png //Icon du modules pour le "menu" style "en cours"
AppTileImage=\img\2.png //Icon du modules pour le "launcher" style
AppTileImageActive=\img\2.png //Icon du modules pour le "launcher" style "survol"
Une fois mon fichier .ini créer, mes fichiers importants copiés. On peut commencer à utilisé la classe.
Je me suis créer une fenêtre "Launcher" qui me permet de passer d'un modules à l'autre. (Un genre de menu démarrer)
//Chargement et listage des modules
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33 ZoneRépétéeSupprimeTout(MenuApp) sTitres, sDescription, sVersion, sIcon sont des chaînes SI GetLocalModule() <> Faux ALORS y est un entier POUR i = 1 A gtabListeModule..Occurrence/2 //On ajoute un modules à notre liste y = ZoneRépétéeAjouteLigne(MenuApp) //Obtient informations du module selon le fichier .ini sTitres = INILit("Module","Name","",gsRepertoireAppData+"\bin\modules\"+gtabListeModule[i,1]+".APP.ini") //Image inactif sIcon = INILit("Image","AppTileImage","",gsRepertoireAppData+"\bin\modules\"+gtabListeModule[i,1]+".APP.ini") MenuApp[y].IMG_Inactive = gsRepertoireAppData+"\bin\modules\"+gtabListeModule[i,1]+".APP"+sIcon //Image actif sIcon = INILit("Image","AppTileImageActive","",gsRepertoireAppData+"\bin\modules\"+gtabListeModule[i,1]+".APP.ini") MenuApp[y].IMG_Active = gsRepertoireAppData+"\bin\modules\"+gtabListeModule[i,1]+".APP"+sIcon MenuApp[y].LIB_ModulesName = sTitres MenuApp[y].LIB_UID = gtabListeModule[i,1] //UID MenuApp[y].LIB_Nom = gtabListeModule[i,2] //Nom de mon objet associé au UID (gpclMod_xx) //Le modules est-il déjà lancé? POUR TOUT LIGNE DE FEN_Main_v2.MenuApp SI FEN_Main_v2.MenuApp.LIB_Nom = MenuApp[y].LIB_UID ALORS SI FEN_Main_v2.MenuApp.IMG_Active..Visible=Vrai ALORS MenuApp[y].IMG_Active ..Visible=Vrai MenuApp[y].IMG_Inactive ..Visible=Faux FIN FIN FIN FIN FIN
//GetLocalModule()
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
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 //On recherche les UID des modules installé localement sNomFichier est une chaîne sListeFichiers est une chaîne = fListeFichier(gsRepertoireAppData+"\bin\modules\*.APP.ini") x est un entier //Comptage SI sListeFichiers = "" ALORS RENVOYER Faux FIN TableauSupprimeTout(gtabListeModule) POUR TOUT CHAÎNE sNomFichier DE sListeFichiers SEPAREE PAR RC SI sNomFichier <> "" ALORS x++ UID est une chaîne = INILit("Module","UID","",sNomFichier) // on redimensionne le tableau pour avoir le nombre de ligne voulu Dimension(gtabListeModule,x,2) gtabListeModule[x,1] = UID gtabListeModule[x,2] = "gpclMod_"+x SINON RENVOYER Faux FIN FIN RENVOYER Vrai
À ce point ci, on devrait avoir dans une zone répétée tous nos modules qui sont dans notre dossier \modules
Dans ma ZR, j'ai un image "inactif" qui me sert de bouton "lancé"
Dans le code Clic de "IMG_inactif" :
Code windev : Sélectionner tout - Visualiser dans une fenêtre à part
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 //On recherche l'objet contenue le bon UID x est un entier POUR i = 1 A gtabListeModule..Occurrence/2 SI gtabListeModule[i,1] = LIB_UID ALORS {gtabListeModule[i,2]} = allouer un ModulesApp x = i SORTIR FIN FIN sNomFichier est une chaîne = gsRepertoireAppData+"\bin\modules\"+gtabListeModule[x,1]+".APP.ini" SI {gtabListeModule[x,2],indVariable}:GetInfoByIni(sNomFichier) = Vrai ALORS SI {gtabListeModule[x,2],indVariable}:CheckWindows() = Faux ALORS {gtabListeModule[x,2],indVariable}:LoadWDL() {gtabListeModule[x,2],indVariable}:LoadWDD() {gtabListeModule[x,2],indVariable}:SetClassName(gtabListeModule[x,2]) {gtabListeModule[x,2],indVariable}:CreateWindows() SINON FIN FIN pclModCourant = {gtabListeModule[x,2]} pclModCourant:ShowWindows()
Votre fenêtre Interne de votre modules s'affiche parfaitement dans votre logiciel maître. Et l'on peut utiliser l'analyse du modules dans la connexion HF en cours du logiciel maître.
N'hésitez pas à m'envoyer vos correctif et/ou solutions.
ModulesApp.zip
Partager