Voici un petit guide de développement d'une extension (fichier wdl) pour les versions Ax.
Les wdl de Windev sont l’équivalent des dll de Windows : ce sont des bibliothèques de ressources, contenant tout ce que peut contenir un projet windev, et pouvant être appelées par tout programme windev. Elles permettent d’ajouter des fonctionnalités infinies à Gestan, dont l’exécution peut rester conditionnelle.
Pour développer des extensions, un engagement de confidentialité doit avoir été signé avec ICS-Informatique.
Toute extension développée pour Gestan A1 et suivantes doit :
Dans le cas où l'extension est payante, elle embarque le système de gestion de licences développé par ICS. Les factures de licences sont émises par le développeur et adressées directement à son client, et le n° de licence est délivré par ICS.
Actuellement, Gestan est développé sous Windev 2024, les extensions doivent aussi être développées en version 2024 ou inférieure.
Pour développer des extensions, sont nécessaires les éléments suivants :
Vous trouverez ces ressources sur la page dédiée.
La bibliothèque doit se nommer GESTAN_[nom wdl].wdl, par exemple GESTAN_PROSTEP.wdl.
Il doit y avoir une collection de procédures nommées PG_[nom wdl], par exemple PG_PROSTEP (pour éviter les conflits de liés à l’utilisation par plusieurs WDL du même nom « Procédures Globales » standard Windev.
Cette collection doit comporter trois procédures globales normalisées :
Les procédures globales copiées de Gestan doivent être stockées dans une collection PG_MAP_[nom wdl], par exemple PG_MAP_PROSTEP (MAP pour “Mise au point”)
Les autres procédures globales doivent être stockées dans une autre collection de procédure, nommée PG_SPEC_[nomwdl] (SPEC pour Spécifique).
Comme Gestan, les extensions sont traduites en deux langues : Espagnol et Anglais (dans cet ordre).
Dans le code d'initialisation de projet de la WDL, adaptez le code ci dessous.
SI EnModeTest() ALORS
EXTERNE PRODUIT, MACHINE, JOURNALAPP, LIBTRADUIT, CONTACT, PARAMLIB, CNX, PROJET, CONSO, FACTURE, TACHE, ADRESSEPOST, gf_Renvoyer_AuthKey
EXTERNE PAYS
EXTERNE gf_USER_AlimenterListe
// Les variables qui servent à Gestan, et qui sont utilisées aussi dans l'extension
gCdUser est une chaîne // Code de l'utilisateur connecté
gbAdmin est un entier // 0 = user simple, 1= admin gestan
gIniFile est une chaîne // Nom complet du fichier de paramétrage
gOptFile est une chaîne // Nom complet du fichier des options de paramétrage pour la base
// Fichier de paramétrage spécifique à Gestan Cloud
gCloudFile est une chaîne = ComplèteRep(SysRep(srAppDataCommun))+"GESTAN\gestan_cloud.ini"
gRepGestan est une chaîne // Chemin du répertoire Gestan
gDHConnect est une chaîne = DateHeureSys() // Date Heure de connexion
gNumVersion est un entier // Numéro de version de Gestan (2=Standard ou 3=Pro)
// N° de version de l'exécutable (x.15.0A.00)
gVersionExe est une chaîne = EnModeTest() ? "x.15.08" SINON ExeInfo(exeVersion)[[À 7]]
gNumRev est un entier = EnModeTest() ? "MT" SINON ExtraitChaîne(ExeInfo(exeVersion),4,".")
gbPatch est un booléen
gSupport est un entier // 0=rien, 1=ICS, 2=Partenaires
gNbDecEcr est un entier
gNbDecQteProd, gnbDecTVA, gNbDecPrxProd sont des entiers
gNbHeuresParJournee est un réel
gLST_Fichiers_Externes est une chaîne
gCléRegistre est une chaîne
gbBibChargée_COMPTA est un booléen
gNBUnitésBib est un entier = 20 // Nombre d'unités de bibliothèques
gVersionWindev est une chaîne = "27.0" // A changer si la version de Windev change
gDestinationPDF est un entier
gNumDatabase est un entier sur 8 // Numéro de la database connectée
xxNumPostit est un entier sur 8 // Pour le dragndrop des postit vers l'agenda
gPriv est un tableau associatif d'entiers
gbJournalConnexion est un booléen
gbEffacerSaint est un booléen
gbNoTimeStamp est un booléen // Pour bypasser la mise à jour de USMOD & DHMOD
gModeConnect est un entier
gbEnCloud est un booléen // Vrai si on est en cloud
gCouleurAppli est un tableau de 3 entiers
tablo_LICENCE est un tableau associatif d'entiers
gCodeAdminCloud est une chaîne
gRefExt est une chaîne // Pour utilisation de wdl externes
gDescToolBar est une chaîne // Pour l'utilisation de toolbars en provenance de wdl externes
gSysRepMesDocs est une chaîne // Répertoire MesDocuments (U en Cloud)
gbNoDéconnect est un booléen // pour ne pas déconnecter l'instance qui a demandé une déconnexion générale
gCodeExtension est une chaîne
gbRuban est un booléen
gNbBoutonsMétier est un entier
DateHeureParDéfaut("19000101","0000")
// Constantes diverses
CONSTANTE
COUL_Bleu = 14249279
COUL_BleuClair = 16250347
COUL_BleuCredit = 14526242 // rvb(34 167 221)
Coul_BleuLigne = 16438176
COUL_Brun = 5014704 // RVB(176,132,76)
COUL_GrisClair = 16314090
COUL_GrisMoyen = 12632256
COUL_Jaune = 10092543
COUL_Kaki = 10070188
COUL_OrangeClair = 9884415
COUL_OrangeFoncé = 37119
COUL_Rouge = 7643
COUL_RougeClair = 7434721
COUL_Vert = 905472
COUL_VertClair = 4122527 // RVB(159,231,62) anc :1687808
COUL_VertFoncé = 1344030 // 1994280
COUL_Rose = 16764159
COUL_OrangeLeger = 13434879
COUL_LivingCoral = 7368191
COUL_VertFerie = 11337689
COUL_BleuWeekEnd = 16314087
// Couleurs de Windows 8 (utilisées dans les widgets, notamment)
COUL8_bleuClair = 14852379 // rvb(27,161,226)
COUL8_bleuMoyen = 15697965 // 45,136,239
COUL8_bleu = 12473610 // 10,85,190
COUL8_vert = 40960 // 0,160,0
COUL8_violine = 11141283 // 163,0,170
COUL8_violet = 11810905 // 89 56 180
COUL8_orange = 2574803 // 211,73,39
COUL_ToastOK = VertClair
COUL_ToastKO = RougeClair
COUL_OK = 65280
COUL_KO = 255
MSG_RIEN_IMPRIMER = 1
MSG_SUPPRIMER = 2
MSG_ERRINATTENDUE = 3
MSG_FICHIERVIDE = 4
MSG_PARAMKO = 5
MSG_DUPLIQUER = 6
MSG_APPELINCORRECT = 7
MSG_OPSIMPOSSIBLE = 8
MSG_OPERATIONADMIN = 9
MSG_SUPPRIMER_SELECTION = 10
MSG_PBHFSQL = 11
MSG_DROITSWINDOWS = 12
MSG_PRIVILINSUFF = 13
MSG_RIENAAFF = 14
MSG_VERSIONENTREPRISE = 15
MODE_CLASSIC = 0
MODE_CS_LAN = 1
MODE_CS_WAN = 2
GPSSWD = "************"
FIN
// Déclaration éventuelle de fichiers présents dans l'analyse de Gestan mais pas dans celle de l'extension
LOCAL
NomAna est une chaîne="E:\Mes Projets\GESTAN_15\Gestan.ana\Gestan.wdd"
HDéclare("PAYS",NomAna)
HDéclare("PARAMLIB",NomAna)
HDéclare("CONTACT",NomAna)
HDéclare("ADRESSEPOST",NomAna)
// Déclaration mots de passe des fichiers utilisés par l'extension
HPasse("*",GPSSWD)
HPasse(PARAMAPPLI,GPSSWD)
HPasse(USER,GPSSWD)
HPasse(PARAMPLUS,GPSSWD)
HPasse(CIVILITE,GPSSWD)
HPasse("PAYS",GPSSWD)
HPasse("PARAMLIB",GPSSWD)
HPasse("CONTACT",GPSSWD)
HPasse("ADRESSEPOST",GPSSWD)
// Si on a besoin de CNX
HDéclareExterne(gf_Renvoyer_Répertoire("ADD")+"CNX.fic","CNX",GPSSWD)
// Initialisation du répertoire et du code user, pour l'usage en mode test
gRepGestan="C:\GESTAN_15\TEST\"
gCdUser ="EN"
HFerme("*")
HSubstRep("?",gRepGestan+"DATABASE")
// Déclaration des triggers sur les fichiers de l'extension et les fichiers externes
HDécritTrigger(Z43_PROSPECT,"HAJOUTE,HMODIFIE,HSUPPRIME","Horodate",hTriggerAvant)
HDécritTrigger(EMPLACEMENT,"HAJOUTE,HMODIFIE,HSUPPRIME","Horodate",hTriggerAvant)
HDécritTrigger(CONTACT,"HAJOUTE,HMODIFIE,HSUPPRIME","Horodate",hTriggerAvant)
//[etc...]
FIN
Elles sont au nombre de trois :
Cette procédure est toujours identique. Copiez le code ci-dessous.
// Résumé : Ouvre une fenêtre depuis une extension
// Syntaxe :
// Charger_Fenêtre (<StrParam>)
//
// Paramètres :
// StrParam : Nom de la fenêtre, éventuellement avec des paramètres séparés par TAB
// Valeur de retour :
// Aucune
//
PROCÉDURE Charger_Fenêtre(StrParam)
NomFenetre est une chaîne = ExtraitChaîne (StrParam,1)
P1 est une chaîne = ExtraitChaîne (StrParam,2)
SI P1 DANS ("",EOT) ALORS Ouvre (NomFenetre) SINON Ouvre (NomFenetre,P1)
Cette procédure est exécutée au moment du chargement de la bibliothèque par Gestan.
Elle renvoie Vrai ou Faux à Gestan, selon qu’elle est exécutée correctement ou pas. Elle est appelée avec une chaîne vide en paramètre, pour pouvoir traiter le message d'erreur éventuel.
PROCÉDURE GESTAN_PROSTEP_Init(MsgErr="")
// Identification de l'extension
gCodeExtension = "ICS-INFORMATIQUE"+TAB+"GESTAN_PROSTEP"+TAB+"43"+TAB+"1815"+TAB+"A1"+TAB...
+"PAYS|CONTACT|MSG_TYPE|ADRESSEPOST|PARAMPLUS|USER|PRODUIT|MACHINE|LIBTRADUIT|CNX|PARAMAPPLI|CIVILITE"+TAB...
+"Z43_PROCESS|Z43_PROSPECT"
// -----------------------------------------------------------
// -- Fonctions normalisées - Ne pas modifier sous ce trait --
NomExt, Préfix, wVersionWDL,wVersionSCR, Lst_Fichiers sont des chaînes
// Vérification de la version de l'extension (anti-downgrade)
NomExt = ExtraitChaîne(gCodeExtension,2)
Préfix = ExtraitChaîne(gCodeExtension,3)
wVersionWDL = ComposantInfo ("", ciVersion,gf_Renvoyer_Répertoire("ADD")+(NomExt+".wdl"))
gf_PARAMPLUS("L","Z"+Préfix+"_VERSION","",wVersionSCR,"")
SI wVersionSCR="" ALORS
gf_PARAMPLUS("E","Z"+Préfix+"_VERSION","",wVersionWDL,"Version de l'extension "+NomExt)
SINON
SI wVersionWDL<wVersionSCR ALORS
MsgErr=ChaîneConstruit("La version de l'extension %1 installé sur ce poste (%2) est inférieure à la version en cours (%3). Procédez à la mise à jour.", NomExt, wVersionWDL, wVersionSCR)
RENVOYER Faux
FIN
FIN
// Déclaration des fichiers spécifiques à l'extension
Lst_Fichiers = ExtraitChaîne(gCodeExtension,7)
SI Lst_Fichiers<>"" ALORS
POUR TOUTE CHAÎNE nmFic DE Lst_Fichiers SÉPARÉE PAR "|"
SI PAS HDéclare(nmFic,NomExt+".wdd",GPSSWD,nmFic,hWDL) ALORS Erreur(HErreurInfo());RENVOYER Faux
// Assignation des fichiers, et création si inexistant
SI HSubstRep(nmFic,ComplèteRep(gRepGestan)+"DATABASE") ALORS
QUAND EXCEPTION DANS
SI PAS HCréationSiInexistant(nmFic,GPSSWD) ALORS Erreur(ChaîneConstruit("Impossible de créer %1",nmFic));RENVOYER Faux
FAIRE
ExceptionActive()
SI ExceptionInfo(errCode)=70016 ALORS
SI PAS HModifieStructure(nmFic,hmsNormal,Null) ALORS
MsgErr = "Une erreur de format de fichier a été détectée et n'a pas pu être réparée."+RC+HErreurInfo()
RENVOYER Faux
SINON
Info(ChaîneConstruit("Un des fichiers de l'extension %1 avait changé de structure, et a été modifié correctement. Vous pourrez redémarrer Gestan et utiliser à nouveau l'extension.",NomExt))
FIN
SINON
MsgErr = HErreur()
RENVOYER Faux
FIN
FIN
FIN
FIN
// Déclaration obligatoire pour la prise en compte dans l'écran de réindexation des fichiers=
gLST_Fichiers_Externes+=[RC]+Remplace(Lst_Fichiers,"|",RC)
FIN
// -- Fin des fonctions normalisées --
// -----------------------------------
// Ajout des menus de l'extension dans Gestan
QUAND EXCEPTION DANS
// Ajout de la fenêtre spécifique
SI gbRuban ALORS
EXTERNE Ruban1,mnuRub_ContactPlus
// Ajout de la fenêtre de paramétrage
MenuAjouteOption("mnuRub_Paramétrage_application.Paramétrage_Extensions","MNU_EXT_PROSTEP_param","Étapes prospection", "Paramétrer_Addon", "FI_PARAMPLUS_PROSTEP|Extension PROSTEP")
// Ajout du menu spécifique (option dans le bouton StatPlus)
Ruban1.ContactPlus..Visible=Vrai
MenuAjouteOption("mnuRub_ContactPlus","MNU_EXT_PROSTEP","Étapes prospection", Charger_Fenêtre,"Table_Z43_PROSPECT")
{"MNU_EXT_PROSTEP", indChamp}..Image = "prostep_16_1.png"
mnuRub_ContactPlus.OptAjoutContactPlus..Visible=Faux
SINON
// Ajout de la fenêtre de paramétrage
MenuAjouteOption("Menu._Menu.mnuOutils.Paramétrage_application.Paramétrage_addons", "MNU_EXT_PROSTEP_param", "Étapes prospection", "Paramétrer_Addon", "FI_PARAMPLUS_PROSTEP|Extension PROSTEP")
{"MNU_EXT_PROSTEP_param", indChamp}..Image = "prostep_16_1.png"
// Ajout du menu spécifique (option dans le menu Stats)
MenuInsèreOption("Menu._Menu.mnuContacts", "mnuAction_commerciale", "MNU_EXT_PROSTEP", "Étapes prospection", Charger_Fenêtre,"Table_Z43_PROSPECT")
{"MNU_EXT_PROSTEP", indChamp}..Image = "prostep_16_1.png"
FIN
FAIRE
MsgErr=ChaîneConstruit("Erreur dans la mise en place du menu de l'extension %1",NomExt+RC+ErreurInfo(errComplet))
RENVOYER Faux
FIN
// La procédure a été effectuée OK : renvoyer Vrai
RENVOYER Vrai
Cette fonction-type comporte trois parties :
Ces trois parties sont détaillées ci-dessous.
Cette procédure est exécutée au moment du déchargement de la bibliothèque par Gestan.
Elle renvoie Vrai ou Faux, selon qu’elle est exécutée correctement ou pas.
Elle supprime les menus qui avaient été ajoutés, annule les déclarations, et ferme les fichiers utilisés.
Ci-dessous la fonction GESTAN_PROSTEP_Terminer, de l'extension GESTAN_PROSTEP.
PROCÉDURE GESTAN_PROSTEP_Terminer()
// Identification de l'extension
gCodeExtension = "ICS-INFORMATIQUE"+TAB+"GESTAN_PROSTEP"+TAB+"43"+TAB+"0245"+TAB+"A0"+TAB...
+"PAYS|CONTACT|MSG_TYPE|ADRESSEPOST|PARAMPLUS|USER|PRODUIT|MACHINE|LIBTRADUIT|CNX|PARAMAPPLI|CIVILITE"+TAB...
+"Z43_PROCESS|Z43_PROSPECT"
// - Suppression du menu de paramétrage
MenuSupprime("MNU_EXT_PROSTEP_param")
// Suppression du menu spécifique
SI gbRuban ALORS
// Pour le menu spécifique, il faut effacer le bouton ContactPlus et le menu d'ajout d'option
EXTERNE mnuRub_ContactPlus
mnuRub_ContactPlus.OptAjoutContactPlus..Visible=Faux
mnuRub_ContactPlus..Visible=Faux
FIN
MenuSupprime("MNU_EXT_PROSTEP")
// ------------------------------------
// -- Fonctions normalisées - Ne pas modifier sous ce trait --
// Fermeture des fichiers et annulation des déclarations
Lst_Fichiers est une chaîne = ExtraitChaîne(gCodeExtension,7)
SI Lst_Fichiers<>"" ALORS
POUR TOUTE CHAÎNE nmFic DE Lst_Fichiers SÉPARÉE PAR "|"
HFerme(nmFic)
HAnnuleDéclaration(nmFic)
FIN
// Mise à jour de la liste des fichiers
gLST_Fichiers_Externes = Remplace(RC+gLST_Fichiers_Externes, Remplace(Lst_Fichiers,"|",RC), "")
FIN
// Fin des fonctions normalisées
RENVOYER Vrai
Dans cette procédure, il faut :
Pour l'indentification de l'extension, c'est simplement le code ci-dessous.
// Identification de l'extension gCodeExtension = "ICS-INFORMATIQUE"+TAB+"GESTAN_PROSTEP"+TAB+"43"+TAB+"0245"+TAB+"A0"+TAB... +"PAYS|CONTACT|MSG_TYPE|ADRESSEPOST|PARAMPLUS|USER|PRODUIT|MACHINE|LIBTRADUIT|CNX|PARAMAPPLI|CIVILITE"+TAB... +"Z43_PROCESS|Z43_PROSPECT"
Pour la suppression du/des menus spécifique, cela dépend de la mise en place. Ci-dessous l'exemple de PROSTEP.
// - Suppression du menu de paramétrage
MenuSupprime("MNU_EXT_PROSTEP_param")
// Suppression du menu spécifique
SI gbRuban ALORS
// Pour le menu spécifique, il faut effacer le bouton ContactPlus et le menu d'ajout d'option
EXTERNE mnuRub_ContactPlus
mnuRub_ContactPlus.OptAjoutContactPlus..Visible=Faux
mnuRub_ContactPlus..Visible=Faux
FIN
MenuSupprime("MNU_EXT_PROSTEP")
Si vous avez besoin de paramètres pour vos extensions, utilisez pour cela une fenêtre interne de dimension 777*404, qui sera appelée par l'écran standard de paramétrage de Gestan (voir ci-dessous) :
Cette fenêtre est redimensionnable : pensez à gérer les ancrages de votre fenêtre interne.
Pour afficher le numéro de version :
NomWDL est une chaîne="GESTAN_CHRONSTAT.wdl" // Mettre ici le nom de l'extension, ne pas modifier en dessous
LaVersion est une chaîne = ComposantInfo ( "", ciVersion,gf_Renvoyer_Répertoire("ADD")+NomWDL)
LibVersion = LaVersion
LibVersion..Bulle = ChaîneConstruit("Version de l'extension : %1",LaVersion)
SI PAS EnModeTest() ALORS
REQ est une Source de Données
MaRequete est une chaîne = [
SELECT VERSION FROM
GSTN_ADDON_AX AS NUMVERSION WHERE NOMADDON='%1'
]
MaRequete = ChaîneConstruit(MaRequete, NomWDL)
SI HExécuteRequêteSQL(REQ, hRequêteDéfaut, MaRequete) ALORS
SI REQ.NUMVERSION>LaVersion ALORS
LibVersion..Couleur=RougeClair
LibVersion..Bulle += RC+ChaîneConstruit("La version %1 est disponible.",REQ.NUMVERSION)
FIN
HLibèreRequête(REQ)
FIN
FIN
Ainsi, cette fenêtre sera accessible depuis le menu d'administration (donc seulement aux administrateurs Gestan).
Les paramètres d'extension sont stockés dans le fichier PARAMPLUS. Ce fichier permet de stocker tout type de paramètre. Il fonctionne classiquement avec un code paramètre, un code user éventuel, et une valeur de paramètre.
Les paramètres utilisés par vos bibliothèques doivent commencer par le préfixe Zxx_, xx étant votre n° d'addon communiqué par ICS. Tout autre code est susceptible d'être écrasé par Gestan.
Voici un exemple :
// Identification de l'extension gCodeExtension = "ICS-INFORMATIQUE"+TAB+"GESTAN_PROSTEP"+TAB+"43"+TAB+"0245"+TAB+"A1"+TAB+"PAYS|CONTACT|MSG_TYPE|ADRESSEPOST|PARAMPLUS|USER|PRODUIT|MACHINE|LIBTRADUIT|CNX|PARAMAPPLI|CIVILITE"+TAB+"Z43_PROCESS|Z43_PROSPECT"
Cette chaîne est construite comme suit :
Dans Gestan, la liste des fichiers et de leurs version sert de référence. Par exemple, si en version A2, seul le fichier ECRITURE a été modifié, l'extension, qui n'utilise pas le fichier ECRITURE, pourra fonctionner même si elle est en version A1 et que Gestan est en A2.
Cette partie est normalisée, vous n'avez rien à faire
La partie de test de l'erreur 70016 (SI ExceptionInfo(errCode)=70016 ALORS, etc.) est utile dans le cas où vous avez changé les structures de vos fichier Zxx : elle permet d'en déclencher la remise au format automatique via une fonction de Gestan “core”.
Cette fonction nécessite un peu d'attention pour son fonctionnement correct. Elle doit fonctionner pour l'option “menu classique”, ou pour l'option “menu ruban”.
S'il y a une fenêtre de paramétrage pour l'extension, l'écran de paramétrage doit être disponible dans :
Pour le menu classique :
// Ajout de l'option dans le menu
MenuAjouteOption("Menu._Menu.mnuOutils.Paramétrage_application.Paramétrage_addons", "MNU_EXT_PROSTEP_param", "Étapes prospection", "Paramétrer_Addon", "FI_PARAMPLUS_PROSTEP|Extension PROSTEP")
// Eventuellement, une image pour cette option
{"MNU_EXT_PROSTEP_param", indChamp}..Image = "prostep_16_1.png"
Pour le menu ruban :
// Ajout de la fenêtre de paramétrage
EXTERNE Ruban1,mnuRub_ContactPlus
MenuAjouteOption("mnuRub_Paramétrage_application.Paramétrage_Extensions","MNU_EXT_PROSTEP_param","Étapes prospection", "Paramétrer_Addon", "FI_PARAMPLUS_PROSTEP|Extension PROSTEP")
// Eventuellement, une image pour cette option
{"MNU_EXT_PROSTEP_param", indChamp}..Image = "prostep_16_1.png"
On a :
Il y a différents cas possibles, qui donnent lieu à un codage différent.
L'ajout dans un menu
// Ajout du menu spécifique (option dans le menu Stats)
MenuInsèreOption("Menu._Menu.mnuContacts", "mnuAction_commerciale", "MNU_EXT_PROSTEP", "Étapes prospection", Charger_Fenêtre,"Table_Z43_PROSPECT")
{"MNU_EXT_PROSTEP", indChamp}..Image = "prostep_16_1.png"
Avec le menu classique, ce code va ajouter une option dans le menu “Contacts” de Gestan, juste avant l'option “Action Commerciale”, option qui va ouvrir la table Table_Z43_PROSPECT.
Pour le menu ruban le codage est un peu différent : il faut d'abord activer le bouton ContactPlus, puis ajouter le menu.
Cela donne :
EXTERNE Ruban1,mnuRub_ContactPlus
// Ajout du menu spécifique (option dans le bouton StatPlus)
Ruban1.ContactPlus..Visible=Vrai
MenuAjouteOption("mnuRub_ContactPlus","MNU_EXT_PROSTEP","Étapes prospection", Charger_Fenêtre,"Table_Z43_PROSPECT")
{"MNU_EXT_PROSTEP", indChamp}..Image = "prostep_16_1.png"
mnuRub_ContactPlus.OptAjoutContactPlus..Visible=Faux
L'ajout d'un menu sur le bouton “Plus”
C'est le cas d'un menu déroulant qui n'est pas repris dans le menu ruban. Pour le menu classique, rien ne change :
// On insère une option dans le menu Stat de Gestan
MenuInsèreOption("Menu._Menu.mnuStatistiques", "mnuSuivi_des_transformations", "MNU_EXT_CHRONSTAT", "Séries statistiques", Charger_Fenêtre, "Table_Z1_SERIESTAT")
En revanche, pour le menu ruban, on active un bouton “+”, ici StatP+, on ajoute l'option dans le menu lié au bouton, et on efface l'option qui sert à l'ajout. Cela donne :
// On ajoute une option au bouton StatPlus
Ruban1.StatsPlus..Visible=Vrai
MenuAjouteOption("mnuRub_StatsPlus", "MNU_EXT_CHRONSTAT", "Séries statistiques", Charger_Fenêtre, "Table_Z1_SERIESTAT")
mnuRub_StatsPlus.OptAjoutStatPlus..Visible=Faux
L'ajout dans le menu “métier”
Dans le cas du menu classique, on affiche le menu métier et on ajoute l'option. Cela donne :
MenuInsèreMenu(MENU._Menu.mnuMétier, "Pour_ajout_possible", "MNU_EXT_DEV", "Développement")
{"MNU_EXT_DEV", indChamp}..Image = "gear_blue_16_1.png"
Menu._Menu.mnuMétier..Visible=Vrai
MenuAjouteOption("MNU_EXT_DEV", "MNU_EXT_DEV_devs", "Développements", Charger_Fenêtre, "Table_Z28_DEV")
MenuAjouteOption("MNU_EXT_DEV", "MNU_EXT_DEV_versions", "Versions", Charger_Fenêtre, "Table_Z28_VERSION")
MenuAjouteOption("MNU_EXT_DEV", "MNU_EXT_DEV_domaines", "Domaines", Charger_Fenêtre, "Table_Z28_DOMAINE")
{"MNU_EXT_DEV_devs", indChamp}..Image = "gear_blue_16_1.png"
Et pour le menu ruban :
EXTERNE Ruban1,btnRub_Metier1,mnuRub_Métier1
Ruban1.Métier..Visible=Vrai
gNbBoutonsMétier++
{"btnRub_Metier"+(gNbBoutonsMétier),indChamp}..Visible =Vrai
{"btnRub_Metier"+(gNbBoutonsMétier),indChamp}..Libellé="Dev"
{"btnRub_Metier"+(gNbBoutonsMétier),indChamp}..Image="gear_blue_32_1.png"
MenuAjouteMenu("mnuRub_Métier"+(gNbBoutonsMétier), "MNU_EXT_DEV", "Développement")
MenuAjouteOption("MNU_EXT_DEV", "MNU_EXT_DEV_devs", "Développements", Charger_Fenêtre, "Table_Z28_DEV")
MenuAjouteOption("MNU_EXT_DEV", "MNU_EXT_DEV_versions", "Versions", Charger_Fenêtre, "Table_Z28_VERSION")
MenuAjouteOption("MNU_EXT_DEV", "MNU_EXT_DEV_domaines", "Domaines", Charger_Fenêtre, "Table_Z28_DOMAINE")
{"MNU_EXT_DEV_devs", indChamp}..Image = "gear_blue_16_1.png"
Par exemple, vous voulez utiliser les fichiers PAYS et PARAMLIB de Gestan. Vous avez alors trois options :
Mais ça, c'était avant !
Le plus simple à partir de la version 2024 de Windev est de fonctionner en mode multi-analyse, et d'intégrer l'analyse de Gestan.
Pensez à indiquer la bonne version au moment de la compilation de la WDL, ici, 3.A1.05.07.
Si A1 n'est pas précisé, Gestan refusera de charger la bibliothèque.
Autres articles “Développement”