[Résolu][Basic] Equivalent de callByName en VB

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur: Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !

[Résolu][Basic] Equivalent de callByName en VB

Messagepar dominique.desmet » 15 Juil 2009 09:17

Je cherche un equivalent OpenOffice à la fonction callByName que j'utilisais avec VB .
Auriez-vous une piste?

en gros je cherche à faire quelque chose comme :

Code : Tout sélectionner   AgrandirRéduire
sub essai
      callByName("nomFonction")
end sub

function nomFonction
   ......
end function


Le Modérateur a écrit: :alerte: "Bonjour", "merci", "à bientôt"

La politesse n'est pas une option même sur un forum. L'omettre peut compromettre vos chances d'obtenir une réponse.
viewtopic.php?p=6050#p6050


Merci de ne pas inventer et de respecter la syntaxe des balises : ftopic1369.html
Le balisage doit bien sûr être correctement orthographié (première lettre en majuscule puis le reste en minuscules).


La solution que j'ai trouvée est dans le fichier joint

1 JavaScript dans la bibliothèqe Java (recherche l'existence d'une SUB ... dans un module avec une expression régulière
Code : Tout sélectionner   AgrandirRéduire
//recherche d'un string à l'aide d'une expression régulière
// D.DESMET
sSource     = String(ARGUMENTS[0])
sRegExp     = String(ARGUMENTS[1])
sGlobUpcase = String(ARGUMENTS[2])

myRe   = new RegExp(sRegExp, sGlobUpcase)

ARGUMENTS[0] = sSource.search(myRe)


1 module basic qui contient la SUB CallByName
Code : Tout sélectionner   AgrandirRéduire
sub callByName(sFonction as string ,aParams as variant)
dim oDS as object       'objet dispatch helper utilisé pour le call de la sub
dim sURL as string      'string qui contient l'URL de la fonction a appeler

on error goto CallByName_error

   'initilisation objet dispatchhelper
   oDS = createUnoService("com.sun.star.frame.DispatchHelper")

   'initialisation de l'URL du script Basic a appeler : Standard,CallByName."+sFonction+"?language=Basic&location=document
   'le script est dans la bibliothèque Standard du document contenant les macro
   'le script a appeler est dans le module CallByName
   'le nom du script basic a appeller est dans la variable sFonction
   sURL = "vnd.sun.star.script:Standard."+getModule(sFonction)+"."+sFonction+"?language=Basic&location=document"
      
   'appel du script
   oDS.executeDispatch(ThisComponent.CurrentController.frame,sURL,"",0,aParams())
   
   exit sub
CallByName_error:
   on error resume next
   msgbox "erreur dans la procédure CallByName"
   on error goto 0
end sub

'détermine le module basice de la bibliothèque standard qui contient la sub à exécuter
'-------------------------------------------------------------------------------------
function getModule(sFunction as string) as string
CONST LibraryName = "Standard"

dim oLib as object      'objet libarie Standard
dim aModules()         'tableau de tous les modules de la librairie Standard
dim iC as Integer      'indice de boucle
dim sModule   'le module à analyser (texte basic)

on error goto getModule_error

   oLib = BasicLibraries.getByName( LibraryName )   'initialise l'objet librarie
   getModule = ""
   aModules = oLib.getElementNames()         'initialise le tableau qui contient tous les modules
   for iC = 0 to ubound(aModules)            'pour chacun des modules
      sModule = oLib.getByName(aModules(iC))   'charge le contenu texte du module dans la variable Smodule
       if RegExpFind(sModule, sFunction) <> "-1" then
          getModule = aModules(iC)
          exit function
       end if
   next iC
   exit function
getModule_error:
   on error resume next
   msgbox "erreur dans la procédure getModule"
   on error goto 0
end function



avec des exemples d'appel

Code : Tout sélectionner   AgrandirRéduire
Sub Main

   dim aParams(0) as New com.sun.star.beans.PropertyValue  'Les paramètres passés à la fonction, ici 1 paramètre
   dim sFonction as string                                 'Le nom de la fonction passée en paramètre
   
   on error goto Main_error
  'Essai n°1, appel de la fonction : MaFonction
  '--------------------------------------------
  'initialisation du paramètre Nom de la fonction appelée
   aParams(0).Name = "Nom"
   aParams(0).Value = "Valeur du paramètre transmis à la fonction"
   'nom de la fonction a appeler
   sFonction = "MaFonction"
   CallByName(sFonction,aParams)   'appel de la fonction dont le nom est dans sFonction avec le parametre contenu dans aParams
   
   'Essai n°2 appel de la fonction : MonAutreFonction
   '-------------------------------------------------
   'initialisation du paramètre Nom de la fonction appelée
   aParams(0).Name = "Nom"
   aParams(0).Value = "Valeur du paramètre transmis à mon autre fonction"
   'nom de la fonction a appeler
   sFonction = "MonAutreFonction"
   CallByName(sFonction,aParams)   'appel de la fonction dont le nom est dans sFonction avec le parametre contenu dans aParams
   
   exit Sub

Main_error:
   on error resume next
   msgbox "erreur dans la sub main"
   on error goto 0
End Sub


1 autre module basic pour "appeler" le javascript
Code : Tout sélectionner   AgrandirRéduire
option explicit

global oJSFind as object   'objet javaScript qui recherche une chaine dans une autre à partir
                     'd'une expression régulière. Cette fonctionnalité n'existe pas en
                     'basic OO, elle est programmée en JavaScript
                     

function RegExpFind(sModule as String, sFuncOrSuB as String) as variant
'
' recherche dans le moddule sModule, l'existence de la fonction ou sub-routine SFuncOrSub
' retourne -1 si non trouvé
' retourne 0 si trouvé

dim oSP as object         'objet script provider
dim sRegExp as string      'expression régulière recherchant le nom de la fonction ou sub-routine


   on error goto RegExpFind_error
   
   'test si l'objet oJSFind est déjà chargé
   '---------------------------------------
'   if isEmpty(oJSFind) then
      'initialisation de l'objet : Java.FindString.js?language=JavaScript&location=document
      'le script est écrit en JavaScript
      'le script est dans la bibliothèque java du document contenant les macros
      'le script s'appelle FindString.js dans cette bibiliothèque
      oSP = ThisComponent.getScriptProvider()
      oJSFind = oSP.getScript("vnd.sun.star.script:Java.FindString.js?language=JavaScript&location=document")
'   end if
   
   'Appelle le JavaScript qui recherche l'existence de la function ou sub dans le module
   '------------------------------------------------------------------------------------
   sRegExp = "Sub *"+sFuncOrSub                                       'fabrique l'expression régulière
   RegExpFind = oJSFind.invoke(Array(sModule, sRegExp, "gi" ), Array(), Array())    'appel le javascript
   exit function
RegExpFind_error:
   on error resume next
      msgbox "Erreur dans le sous-programme RegExpFind"
   on error goto 0
end function


Merci à ceux qui m'ont mis sur la piste ; à charge de revanche
Pièces jointes
essai_callByName.ods
fichier calc de test
(13.24 Kio) Téléchargé 76 fois
Dernière édition par dominique.desmet le 17 Juil 2009 14:50, édité 2 fois.
OpenOffice 3.1 - XP - Vista - Ubuntu
dominique.desmet
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 12
Inscrit le : 15 Juil 2009 09:07

Re: [Basic] Equivalent de callByName en VB

Messagepar Pierre-Yves Samyn » 15 Juil 2009 09:28

Bonjour et bienvenue sur ce forum

Squenson donne ici un lien vers une piste... :)
Pierre-Yves Samyn
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 11276
Inscrit le : 02 Mai 2006 09:42

Re: [Basic] Equivalent de callByName en VB

Messagepar dominique.desmet » 15 Juil 2009 09:55

Bonjour à tous!
Acceptez mes excuses pour la brutalité de mon premier message sur ce forum.
C'est promis, je vais m'efforcer de respecter l'étiquette de ce forum fort bien tenu.
Je ne manquerai pas de transmettre la solution au pb que j'ai soumis à votre sagacité.

Bien cordialement
DD
Dernière édition par Oukcha le 15 Juil 2009 10:06, édité 1 fois.
Raison: Suppression citation intégrale du premier message, nuisant à la lisibilité du sujet
OpenOffice 3.1 - XP - Vista - Ubuntu
dominique.desmet
NOOuvel adepte
NOOuvel adepte
 
Message(s) : 12
Inscrit le : 15 Juil 2009 09:07

Re: [Basic] Equivalent de callByName en VB

Messagepar Loopingss » 15 Juil 2009 09:58

Bonjour,
Si l'on se réfère à cette description de la fonction VB "CallByName" : http://msdn.microsoft.com/fr-fr/library/chsc1tx6(VS.80).aspx, il n'y a pas d'équivalent directement en OOo basic, à ma connaissance.
COOordialement.
Avatar de l’utilisateur
Loopingss
PassiOOnné
PassiOOnné
 
Message(s) : 693
Inscrit le : 17 Déc 2008 02:50


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Google [Bot] et 7 invité(s)