Page 1 sur 1

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

Publié : 15 juil. 2009 08:17
par dominique.desmet
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

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.
http://user.services.openoffice.org/fr/ ... 6050#p6050


Merci de ne pas inventer et de respecter la syntaxe des balises : http://user.services.openoffice.org/fr/ ... c1369.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

//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

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

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

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

Re: [Basic] Equivalent de callByName en VB

Publié : 15 juil. 2009 08:28
par Pierre-Yves Samyn
Bonjour et bienvenue sur ce forum

Squenson donne ici un lien vers une piste... :)

Re: [Basic] Equivalent de callByName en VB

Publié : 15 juil. 2009 08:55
par dominique.desmet
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

Re: [Basic] Equivalent de callByName en VB

Publié : 15 juil. 2009 08:58
par Loopingss
Bonjour,
Si l'on se réfère à cette description de la fonction VB "CallByName" : http://msdn.microsoft.com/fr-fr/library ... S.80).aspx, il n'y a pas d'équivalent directement en OOo basic, à ma connaissance.
COOordialement.