PC SOFT

DOCUMENTATION EN LIGNE
DE WINDEV, WEBDEV ET WINDEV MOBILE

  • Présentation
  • Comment créer une procédure en code Java ?
  • Saisir le code d'une procédure globale en Java
  • Remarques importantes
  • 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/iPadApple WatchUniversal Windows 10 AppWindows Mobile
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.
Versions 17 et supérieures
Ces procédures Java peuvent appeler directement les procédures WLangage de votre projet.
Nouveauté 17
Ces procédures Java peuvent appeler directement les procédures WLangage de votre projet.
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. Sous l'éditeur de code, cliquez sur les lettres "WL" précédant le libellé de la procédure globale. Le bandeau devient violet et les caractères "Java" apparaissent devant le nom de la procédure. Le code existant est mis en commentaires.
Par exemple :
Procédure WLangage
devient :
Procédure Java
Remarque : Pour revenir en code WLangage, il suffit de cliquer sur "Java" dans le bandeau de la procédure.

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.
  • 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.
Versions 17 et supérieures
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 :
PROCEDURE 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.
Nouveauté 17
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 :
PROCEDURE 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.
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 :
PROCEDURE 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