[Résolu][Basic] Appel indirect de sub via executeDispatch

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 !
Rasalhague
Fraîchement OOthentifié
Messages : 3
Inscription : 30 mars 2021 05:04

[Résolu][Basic] Appel indirect de sub via executeDispatch

Message par Rasalhague »


La modération vous a écrit: Pour la bonne tenue de ce forum, veillez à respecter la syntaxe des balises (première lettre en majuscule puis le reste en minuscules, le tout entre crochets).

Bonjour,

Nouveau sur ce forum, je vous contacte pour une erreur que je ne parviens pas à résoudre.
J'écris actuellement un module de génération de rapports automatique à partir d'un modèle et d'un classeur.
Je ne posterai pas l'ensemble qui contient des milliers de lignes de code ... juste un extrait pour montrer le souci.
Dans ce module, le texte du rapport vient d'un modèle dans lequel figure des fonctions pour récupérer les informations d'un classeur.
J'analyse donc le texte du modèle, repère les fonctions balisées d'une certaine façon. Tout cela fonctionne.

Ensuite, j'avais écris une procédure avec un select case pour appeler telle ou telle fonction.
J'ai ensuite vu sur le net que l'on pouvait appeler une fonction de manière indirecte avec executeDispatch.
Dans le code joint, j'ai donc une fonction main qui appelle une fonction appelFonction en lui transmettant :
  • - le nom de la fonction à appeler (ici la fonction ligne)
    - un contexte à transmettre à ligne
    - un tableau de paramètre de string nommé lvTabParam, toujours pour ligne
Notre fonction appelFonction prépare un tableau de propertyValue.

ligne 46 du code joint, je lance un appel direct pour montrer que ça passe bien.
ligne 48, je tente un appel via executeDispatch ce qui génère une erreur :
  • Erreur d'exécution BASIC
    Variable d'objet non définie
Le contrôle est bien transféré à la fonction ligne
Le debugger stoppe au niveau de la ligne 53, début de sub ligne
J'ai tenté plusieurs paramètres dans ma fonction ligne:
  • Tableau de variant (sub ligne (prObj () as variant))
    Objet (sub ligne (prObj as object))
    Pas de paramètre (sub ligne ())
Rien n'y fait !
testAppel.ods
Je suis preneur de toute expertise sur ce sujet.
Un grand merci par avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 30 mars 2021 08:44, modifié 3 fois.
Raison : Rajout de [Basic] ne supprimez pas cette balise en mettant [Résolu]
Envoyé depuis une machine pilotée par GNU/Linux Debian, dépourvue de #$]@!?? (CrimeAuSoft 20 doses)
libreOffice version: 6.1.5.2 au 30/03/2021
OS : debian stable 64 bits
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [BASIC] Appel indirect de sub via executeDispatch

Message par Dude »

Salut,

La prochaine fois, publie l'intégralité du code. Cela nous évite de télécharger inutilement des documents.

Code : Tout sélectionner

function appelFonction (prFonction as string , prContexte as TContexte, prTabParam () as string) as string

	dim lvDoc as object
	dim lvURL as string
	dim lvResultat as string
	dim lvRepartiteur as object
	dim lvTabPV (3) as new com.sun.star.beans.PropertyValue

	lvTabPV (0).Name = "fonction"
	lvTabPV (0).Value = prFonction
	lvTabPV (1).Name = "contexte"
	lvTabPV (1).Value = prContexte
	lvTabPV (2).Name = "params"
	lvTabPV (2).Value = prTabParam ()
	lvTabPV (3).Name = "resultat"
	lvTabPV (3).Value = ""

	' initialisation objet dispatchHelper
	lvDoc = ThisComponent.CurrentController.Frame
	lvRepartiteur = createUnoService ("com.sun.star.frame.DispatchHelper")
	lvURL = "vnd.sun.star.script:Standard.modAppel." & prFonction & "?language=Basic&location=document"

	ligne(lvTabPV ) ' fonctionne correctement en appel direct !
	' appel via executeDispatch : devrait se comporter comme un appel à « ligne (lvTabPV) »
	lvRepartiteur.executeDispatch (lvDoc, lvURL, "", 0, lvTabPV ()) ' ERREUR !
	appelFonction = lvTabPV (3).Value
	end function
Une structure PropertyValue ne peut pas contenir un tableau.

Code : Tout sélectionner

lvTabPV (2).Value = prTabParam ()
Si tu veux un tableau de tableaux, tu passes par un Array :
https://beaussier.com/sections/viewtopic.php?f=8&t=1563

Comme toujours dans ce type de question, je subodore un problème XY.
Qu'est ce que tu cherches à faire à vouloir exécuter le dispatcher ?
Rasalhague
Fraîchement OOthentifié
Messages : 3
Inscription : 30 mars 2021 05:04

Re: [BASIC] Appel indirect de sub via executeDispatch

Message par Rasalhague »

Un grand merci pour cette prompte réponse !
Je vais donc corriger tout cela ...
Il faut que je trouve comment mettre en "résolu" ...

Concernant le dispatcheur, c'est la première fois que je l'utilise ...
J'aurais préféré quelque chose style "pointeur de fonction" ou "table des méthodes virtuelles" mais là, on est plutôt sur du C ou du C++.

Exemple d'utilisation :

Dans un document, j'ai le texte suivant paramétrique suivant :
Période de $$@info ("Détail", ligne ("0"), colonne ("22"))$$ à $$@info ("Détail", ligne ("0"), colonne ("n"))$$
$$@styleCar("(Ce rapport est issu d’un processus automatisé)", "automatique")$$


J'ai ici des fonctions imbriquées - comme la fonction ligne - (info, ligne, colonne, styleCar) encadrée par des "$$"
Derrière tout ça, j'ai un automate à nombre d'états finis (expression régulière) qui analyse et remplace les appels de fonctions par le résultat.
plutôt qu'un select case volumineux, je préfère appeler la fonction indirectement. Je n'ai trouvé que le dispatcheur pour cette action.
Envoyé depuis une machine pilotée par GNU/Linux Debian, dépourvue de #$]@!?? (CrimeAuSoft 20 doses)
libreOffice version: 6.1.5.2 au 30/03/2021
OS : debian stable 64 bits
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Basic] Appel indirect de sub via executeDispatc

Message par Dude »

Rasalhague a écrit :J'ai ici des fonctions imbriquées - comme la fonction ligne - (info, ligne, colonne, styleCar) encadrée par des "$$"
Split est ton ami.
Rasalhague
Fraîchement OOthentifié
Messages : 3
Inscription : 30 mars 2021 05:04

Re: [Résolu][Basic] Appel indirect de sub via executeDispatc

Message par Rasalhague »

Exact !
Split, Join et moi, nous nous sommes rencontrés de multiples fois ...
Envoyé depuis une machine pilotée par GNU/Linux Debian, dépourvue de #$]@!?? (CrimeAuSoft 20 doses)
libreOffice version: 6.1.5.2 au 30/03/2021
OS : debian stable 64 bits