IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

Windev gestion modulaires


Sujet :

Contribuez

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2010
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 283
    Points : 263
    Points
    263
    Par défaut Windev gestion modulaires
    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

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Dans l'init du projet, pourquoi déclarer 15 instances dans 15 variables différentes (qui ne sont d'ailleurs jamais utilisées), au lieu d'utiliser un tableau associatif ?
    Avec un tableau associatif tu n'aurais plus besoin d'utiliser des indirections, et tu n'es plus limité à 15 modules.
    Avec le nom du module comme indice du tableau, tu n'as plus besoin de boucle pour trouver le module courant dans le tableau. L'accès est direct !
    Et en utilisant dans ce tableau une structure (ou une classe) de ce genre:
    Code WinDev : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Module est une structure
    Uid est une chaine
    Module est un ModuleApp dynamique
    fin
    Ton code gagnera en lisibilité, puisqu'il n'y a plus à se souvenir que l'indice 1 est l'UID, le 2 le module. Tout est clair et nommé, et le jour où tu veux ajouter une autre donnée, il suffit d'enrichir la structure en question.

    Pour finir je ne comprends pas bien ton gtabListeModule, comment est-il déclaré ?

    Tatayo.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2010
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2010
    Messages : 283
    Points : 263
    Points
    263
    Par défaut
    Salut tatayo.


    L'utilisation des variables était utilisé pour test seulement. J'aurais s'en doutes pu utiliser 2-3 variables et ça aurait fonctionné. Je me rendais compte que la plupart n'étaient pas utilisés et que les boucles n'étaient pas la meilleur solution.


    Je suis justement entrain de convertir le tout en tableau associatif (d'où le sujet ouvert quelques jour plus tôt dans le forum).

    Le tableau est un simple tableau de chaines.

Discussions similaires

  1. Windev : Gestion de liaison série par événement série
    Par jurassic pork dans le forum Contribuez
    Réponses: 2
    Dernier message: 02/10/2023, 11h11
  2. Réponses: 20
    Dernier message: 17/09/2009, 16h58
  3. Gestion d'une bibliothèque en Windev
    Par Lenalyon dans le forum WinDev
    Réponses: 5
    Dernier message: 23/08/2007, 15h01
  4. [WinDev 9 ] Gestion de flux http
    Par hegros dans le forum WinDev
    Réponses: 3
    Dernier message: 02/08/2006, 16h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo