DOCUMENTATION EN LIGNE
DE WINDEVWEBDEV ET WINDEV MOBILE

Aide / Développer en Java
  • Présentation
  • Comment créer une procédure en code Java ?
  • Saisir le code d'une procédure globale en Java
  • Remarques importantes
  • Génération de l'application
  • Comment exécuter une procédure WLangage ?
  • Exécuter une procédure WLangage depuis le code Java
  • Remarques importantes
WINDEV
WindowsLinuxUniversal Windows 10 AppJavaEtats et RequêtesCode Utilisateur (MCU)
WEBDEV
WindowsLinuxPHPWEBDEV - Code Navigateur
WINDEV Mobile
AndroidWidget AndroidiPhone/iPadWidget IOSApple WatchMac CatalystUniversal Windows 10 App
Autres
Procédures stockées
Présentation
Il est possible de saisir du code Java :
  • dans les applications Java générées avec WINDEV.
  • dans les applications Android générées avec WINDEV Mobile.
Vous pouvez ainsi créer des procédures globales entièrement en Java.
Ces procédures Java peuvent appeler directement les procédures WLangage de votre projet.
Comment créer une procédure en code Java ?

Saisir le code d'une procédure globale en Java

Pour saisir le code d'une procédure globale en Java :
  1. Créez une nouvelle procédure globale (par exemple option "Nouvelle procédure globale" du menu contextuel des collections de procédures dans le volet "Explorateur de projet"). Indiquez le nom de cette procédure.
  2. La procédure est créée sous l'éditeur de code.
  3. Dans l'entête de la procédure, cliquez sur le logo "WL" pour changer le type de code.
    Java natif avant
  4. Dans la liste qui s'ouvre, sélectionnez "Java".
  5. Le bandeau devient violet et les caractères "Java" apparaissent devant le nom de la procédure. Le code existant est mis en commentaires.
    Java natif après
  6. Saisissez le code Java directement dans l'éditeur de code de WINDEV et / ou WINDEV Mobile.
Remarque : Pour revenir en code WLangage, il suffit de cliquer sur "Java" dans le bandeau de la procédure et de sélectionner "WLangage".

Remarques importantes

  • Le passage de paramètres à une procédure Java est réalisé automatiquement par valeur.
  • Les paramètres des procédures écrites en code Java doivent obligatoirement être typées avec un type primitif (entier, réel, chaîne, ...).
    Attention : Le type float n'est pas géré, il peut être remplacé par le type double.
  • Les valeurs de retour des méthodes doivent obligatoirement correspondre à un type primitif (entier, réel, chaîne, ...).
    Attention : Le type float n'est pas géré, il peut être remplacé par le type double.
  • Attention : il est nécessaire d'ajouter les imports correspondant aux classes Java utilisées dans le code Java natif saisi (grâce au mot-clé "Import"). Par souci de lisibilité, il est recommandé d'ajouter ces imports avant la déclaration de la méthode.
  • Dans les lignes de code présentes avant le prototype de la fonction Java, seuls les commentaires et les imports sont pris en compte. Tout autre code sera ignoré et pourra déclencher une erreur (notamment de parenthèse manquante).
  • Java est "case-sensitive" : veillez à respecter les minuscules et les majuscules dans les noms des fonctions.
Android Spécificités Android :
  • Si le code Java natif ainsi saisi a besoin de permissions particulières pour être exécuté, vous devrez les définir explicitement lors de la génération de l'application. Pour plus d'information sur les permissions, consultez Génération d'une application pour Android.
  • Les classes et méthodes du SDK Android manipulent souvent une référence sur un objet de type "Context". Dans un projet Android, lors de la saisie de code natif, il est possible de récupérer un objet de type "Context" en obtenant une référence sur l'activité en cours ou sur le contexte de l'application grâce aux méthodes suivantes qui peuvent être appelées directement dans le code de la procédure en code natif :
    // Récupération de l'activité en cours
    getActiviteEnCours()

    // Récupération du "Context" en cours
    getContexteApplication()
  • Pour récupérer l'objet de type View correspondant au composant principal d'un champ, il faut utiliser la méthode getView en lui passant le nom du champ.
    Exemple : Le code suivant retourne l'instance de la classe "Button" utilisée par le champ :
    getView("BTN_Bouton1")

Génération de l'application

  • Android Les classes Java utilisées dans le code Java natif doivent être spécifiées dans l'assistant de génération de l'application Android :
    • étape "Intégration de librairies" pour les classes incluses dans des librairies ".jar" ou ".aar".
    • étape "Intégration des dépendances Maven" pour les dépendances Maven.
      Remarque : Il n'est pas possible de tester ces classes en GO. Il est nécessaire de générer l'application puis de la lancer.
  • Java Les classes Java utilisées dans le code Java natif doivent être spécifiées dans l'assistant de génération de l'application Java (étape "Autres fichiers de l'archive").
    Remarque : Il n'est pas possible de tester ces classes en GO. Il est nécessaire de générer l'application puis de la lancer.
  • Prise en compte automatique des classes externes : Pour que les classes externes Java soient automatiquement prises en compte lors de la génération de l'application :
    • Ajoutez les fichiers dans le dossier "Autres" du volet "Explorateur de projet" (via l'option "Ajouter des éléments" du menu contextuel).
      Attention : Les fichiers Java doivent être encodés en UTF-8.
    • Si la classe Java appartient à un package, la déclaration de ce package doit être la première ligne du fichier de la classe. Si le package n'est pas spécifié, le fichier sera mis dans <Package_NomAppli>.wdgen avec les autres fichiers ".java" générés.
Comment exécuter une procédure WLangage ?

Exécuter une procédure WLangage depuis le code Java

Pour exécuter une procédure WLangage depuis le code Java, il suffit d'appeler une des méthodes suivantes en fonction du type de la valeur renvoyée par la procédure :
Nom de la méthodeType Java de retour
appelProcedureWLvoid (pas de valeur de retour)
appelProcedureWL_StringString
appelProcedureWL_intint
appelProcedureWL_doubledouble
appelProcedureWL_longlong
appelProcedureWL_booleanboolean


Lors de l'appel de la méthode choisie :
  • le premier paramètre à passer à la méthode correspond au nom de la procédure WLangage à exécuter.
  • les paramètres suivants correspondent aux paramètres attendus par la procédure WLangage si nécessaire. Il est possible d'utiliser des paramètres de n'importe quel type simple Java (string, int, double, long, boolean, ...). Si le paramètre spécifié ne correspond pas à un type simple Java, il sera automatiquement converti en "string" par appel de sa méthode "toString()".
Exemple :
Code de la procédure WLangage :
PROCÉDURE GLOBALE MaProcédure(n est un entier, b est un booléen, s est une chaîne)
...
RENVOYER s
Pour appeler la procédure MaProcédure depuis le code Java :
appelProcedureWL_String("MaProcedure",5,false,"test")

Remarques importantes

  • Si la procédure à exécuter est une procédure locale, il est recommandé de donner son nom complet en précisant le nom de l'élément auquel appartient la procédure. Exemple : "FEN_Fenetre1.MaProcedure".
  • Le nom de la procédure à exécuter ne doit contenir que des caractères alphanumériques non accentués.
  • Si la procédure à exécuter retourne une valeur, cette valeur sera automatiquement convertie dans le type primitif Java correspondant à la méthode utilisée pour l'appel de la procédure. Si la conversion ne peut pas être effectuée, une erreur fatale sera déclenchée.
  • Les paramètres de la procédure sont passés par copie.
Liste des exemples associés :
WM Note de frais Exemples multiplateforme (WINDEV Mobile) : WM Note de frais
[ + ] Cet exemple permet de gérer vos notes de frais.

Voici les principales fonctionnalités de cette application :
- La saisie des factures
- Gestion des devises étrangères
- Ajout de justificatif photo pour les factures
- Envoi par mail de la note de frais
- Suivi des notes de frais
- ...
Version minimum requise
  • Version 10
Documentation également disponible pour…
Commentaires
Librairy Java
Quel est la syntaxe exacte à écrire pour l'importation JAVA en ce qui concerne ce code à écrire dans la procédure globale ?
Ézéchias
26 oct. 2016
Listener, interfaces, classes etc .... dans une application ANDROID
Comme indiqué dans la page http://doc.pcsoft.fr/fr-fr/?particularites-des-applications-pour-android, vous pouvez très bien ajouter du code java après la déclaration de la procédure java.

La contrainte principale est que vous devez utiliser des déclarations statiques ("static") car la procédure étant "static", elle ne peut appeler des élements que static.

Par contre, vous pourrez très bien instancier de manière dynamique des listeners, ou des interfaces en utilisant la commande "new". Visiblement ces éléments vont apparaître dans un thread secondaire et il faudra prendre quelques précautions dans la manipulation des données et objets (voir note précédente).

======== exemple de code avec instanciation de 3 interfaces ==
// développé dans le cadre d'une application de communication ANT+

// appel d'une requête pour récupérer des éléments et création des interfaces en dynamique
AntPlusGeocachePcc.requestListAndRequestAccess(myContext,

/////////////////////////////////////////
// 1ere interface
new IPluginAccessResultReceiver<AntPlusGeocachePcc>()
{
@Override
public void onResultReceived(AntPlusGeocachePcc result, int resultCode, int initialDeviceStateCode)
{
//myTextViewG1.setText("avant switch");

switch(resultCode)
{
////////////////////
case AntPluginMsgDefines.MSG_REQACC_RESULT_whatSUCCESS:
geoPcc = result;
geoPcc.requestCurrentDeviceList();
Toast.makeText(getApplicationContext(), "Success Plugin", Toast.LENGTH_SHORT).show();
break;
////////////////

////////////
case AntPluginMsgDefines.MSG_REQACC_RESULT_whatCHANNELNOTAVAILABLE:
Toast.makeText(getApplicationContext(), "Channel not available", Toast.LENGTH_SHORT).show();
break;
////////////

///////////////
case AntPluginMsgDefines.MSG_REQACC_RESULT_whatOTHERFAILURE:
Toast.makeText(getApplicationContext(), "Other failure", Toast.LENGTH_SHORT).show();
break;
////////////

////////////////
case AntPluginMsgDefines.MSG_REQACC_RESULT_whatDEPENDENCYNOTINSTALLED:
Toast.makeText(getApplicationContext(), "Dependency not installed", Toast.LENGTH_SHORT).show();
break;
////////////////

//////////
case AntPluginMsgDefines.MSG_REQACC_RESULT_whatUSERCANCELLED:
Toast.makeText(getApplicationContext(), "User cancelled", Toast.LENGTH_SHORT).show();
break;
////////////

default:
Toast.makeText(getApplicationContext(), "Unrecognized result", Toast.LENGTH_SHORT).show();
break;
}
}
},

///////////////////////////////////////////////////
//Receives state changes and shows it on the status display line
// 2eme interface
new IDeviceStateChangeReceiver()
{

@Override
public void onDeviceStateChange(final int newDeviceState)
{
Toast.makeText(getApplicationContext(), "device state "+geoPcc.getDeviceName() + ": " + AntPlusGeocachePcc.statusCodeToPrintableString(newDeviceState), Toast.LENGTH_SHORT).show();

if(newDeviceState == AntPluginMsgDefines.DeviceStateCodes.DEAD)
geoPcc = null;

}
}

// virgule pour le parametre suivant
,
///////////////////////////////////////////////////
//Receives the device list updates and displays the current list
// 3eme interface
new IAvailableDeviceListReceiver()
{
@Override
public void onNewAvailableDeviceList(int[] deviceIDs, String[] deviceIdentifierStrings, int changeCode, int changingDeviceID)
{
Toast.makeText(getApplicationContext(), "Device list", Toast.LENGTH_SHORT).show();

// appel procédure proxy pour supprimer liste
appelProcedureWL("GResetListeDevices");

if(deviceIDs.length != 0)
{
//bDevicesInList = true;
for(int i=0; i < deviceIDs.length; ++i)
{
if(deviceIdentifierStrings[i].trim().length() == 0){
Toast.makeText(getApplicationContext(), "Unprogrammed", Toast.LENGTH_SHORT).show();
}
else if(deviceIdentifierStrings[i].contentEquals("_________")){
Toast.makeText(getApplicationContext(), "Invalid", Toast.LENGTH_SHORT).show();
}

// appel procédure pour afficher Toast avec WL appelProcedureWL("ToastDevices",deviceIdentifierStrings[i]+"/ "+ Integer.toString(deviceIDs[i]));

// appel procédure proxy pour ajouter éléments dans liste appelProcedureWL("GAjouteDeviceListe",deviceIdentifierStrings[i],Integer.toString(deviceIDs[i]));

}
}
else
{
Toast.makeText(getApplicationContext(), "No device found", Toast.LENGTH_SHORT).show ();

}
}
}
);
jjmonot
03 juin 2013
Appel et thread secondaires dans une application ANDROID
Dans la procédure appelée, si vous devez manipuler des éléments d'une fenêtre, vous risquez un plantage si l'appel dans java se fait dans un thread secondaire. Ceci peut être le cas lorsque vous avez créé un listener, une classe ou une interface, avec la commande "new".

Dans ce cas, il faut passer par un "proxy" :

====code java============
appelProcedureWL("ProcedureProxy",<param>)
======================

====code WL Procedure Proxy====
ExécuteThreadPrincipal(MaProcedure,<param>)
========================

====code WL MaProcedure======
<manipulation éléments fenêtre avec les params>
========================
jjmonot
03 juin 2013

Dernière modification : 23/06/2023

Signaler une erreur ou faire une suggestion | Aide en ligne locale