Première utilisation ; appel d'une fonction publique de Ponx 

Ouvrez Paradox.
Créez une nouvelle fiche.
Ajoutez un bouton.
Dans le code du "PushButton" du bouton, ajoutez :

var
   px oleauto
   str string

endvar
px.open("Ponx.Mci")
str = px.PVersion()
msginfo("Version de PONX", str)

Explications : 

On commence par ouvrir Ponx (se connecter à Ponx), dans la variable px. Cela est fait avec la ligne px.open("Ponx.Mci"). A noter que la session de Ponx sera ouverte jusqu'à la sortie de Paradox.

La ligne suivante  str = px.PVersion() appelle une fonction de Ponx, et récupère le résultat dans la variable str.

La dernière ligne affiche le résultat.

Nous venons de voir, ici, comment appeler une fonction simple de Ponx. Apprenez les éléments suivants :
   - Les fonctions publiques sont appelées directement ; aucune déclaration n'est nécessaire.
   - en cas d'erreur de syntaxe, le compte-rendu de l'erreur sera retourné dans la variable de retour.

 

 Deuxième utilisation ; exécution d'un code-source Ponx 

Dans un nouveau bouton, mettez le code suivant :

var
   px oleauto
   str,sret string
endvar
px.open("Ponx.Mci")
str="a=123456789012345678901234567890
b=987654321
c=11223344
r=str(int(a*b/c))
chaineretour=str(r)"
sret=px.PRun(str)
msgStop("Résultat : ",sret)

Explications : 

Le code Ponx proprement dit est mis dans la variable str. Ensuite, on le fait exécuter par ponx, et on récupère le résultat.
On peut donc voir ce que fait la fonction publique  PRun  ; elle exécute simplement un code-source python, passé en paramètre.
Ponx permettant d'exécuter du code Python à la volée, il n'y a plus de limites à son usage.
Au passage, notez que la possibilité de gérer, en ObjectPal, des chaînes littérales multi-lignes facilite largement la lecture du code. Dommage que ces chaînes littérales soient limitées à 255 caractères (en ObjectPal).
Remarquez aussi que, Paradox ne gérant pas les entiers aussi grands, le résultat a été retourné sous forme d'une chaîne de caractères.

 

 Troisième utilisation ; Ponx dynamique 

Dans un nouveau bouton, mettez le code suivant :

var
   pd oleauto
   str,sret string
endvar
pd.open("Ponxd.Mci")  ; remarquez le 'd' (d comme dynamique)
sret=pd.sinverse("AAbbccddee")
msgStop("Inverse de 'AAbbccddee'",sret)

Explications : 

La fonction  sinverse  inverse simplement une chaîne de caractère (ABC ==> CBA).  Il faut savoir que  sinverse  n'est pas une fonction publique. L'intérêt de Ponx dynamique, c'est que cela permet d'appeler n'importe quelle fonction de Ponx directement. Mais, aussi, n'importe quelle fonction de Python, ou des modules importés par Ponx.
De plus, comme rien n'empêche de créer des fonctions à la volée, depuis votre programme en ObjectPal, un mécanisme est prévu pour rendre ces fonctions accessibles par Ponx dynamique.
Enfin, une syntaxe spéciale permet d'accéder aux méthodes d'une classe définie dans Ponx.
Cependant, on ne peut pas tout faire. Il ne faut pas oublier :
  - Que l'on passe par COM (OLE-automation), et donc par des appels / retour.
  - Les limites de Paradox et d'ObjectPal : impossible de passer des tableaux en paramètres, de recevoir plusieurs valeurs en retour, d'utiliser des procédures comme paramètres, d'utiliser des objets complexes, de faire du callback, etc.

 

 Quatrième utilisation ; Ponx V 

Dans PonxV, le V signifie "Variable". Le principe, c'est de partager des variables, entre l'appelant et Ponx.
Dans un nouveau bouton, mettez le code suivant :

var
   px,pv oleauto
   sret anytype
endvar
px.open("Ponx.Mci")
pv.open("Ponxv.Mci")  ;notez le 'v'
pv.ABC="AABBCC"
msginfo("Paradox  pv.ABC",pv.ABC)
px.PRun("msginfo('vpublic.ABC',vpublic.ABC)")
sret=px.PRet("vpublic.ABC")
msginfo("Retourné par Ponx (ABC)",pv.ABC)

pv.NOMBRE=1111.11
msginfo("NOMBRE Etape_1", pv.NOMBRE)
px.PRun("vpublic.NOMBRE+=222.22")
msginfo("NOMBRE Etape_2", pv.NOMBRE)
pv.NOMBRE=pv.NOMBRE+333.33
msginfo("NOMBRE Etape_3", pv.NOMBRE)
px.PRun("msginfo('vpublic.NOMBRE',str(vpublic.NOMBRE))")

Explications : 

La ligne pv.ABC="AABBCC" permet de créer, depuis ObjectPAL, une variable dans Ponx. Dès lors, la variable est accessible des deux côtés. Dans ObjectPAL, par pv.ABC ; dans Ponx, par  vpublic.ABC.
Un point important : Avec ObjectPAL, les noms des variables doivent toujours être en majuscules. Cela n'est pas nécessaire avec d'autres langages.
Les lignes suivantes montrent comment on peut visualiser la variable dans ObjectPAL, ou dans Ponx.

Le deuxième paragraphe montre que l'on peut bien modifier une variable, créée depuis ObjectPAL, aussi bien dans Ponx que dans objectPAL.