[Résolu][Calc] Récupération d'un champ de texte dans une boîte de dialogue

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 !
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

[Résolu][Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par FredBauchot »

Bonjour et bon Noël à tous,
Je reprends la programmation après 10 ans d'interruption, et tombe sur un problème pour lequel je n'ai pas trouvé de solution dans ce forum et ailleurs sur le Net. J'ai une boîte de dialogue toute simple avec un textfield et un bouton poussoir qui déclenche une routine chargée de lire le textfield et de mettre sa valeur dans une cellule du tableur. Je joins mon fichier en pièce jointe.
Si quelqu'un pouvait pointer où j'ai fait une erreur et comment la corriger, cela me ferait un joli cadeau de Noël !
Merci d'avance pour l'aide apportée.

Code : Tout sélectionner

Sub Main
	dim FichierIn as string
	dim FeuilleIn as object
	dim Parameter as string
	FichierIn = ThisComponent.URL
	FeuilleIn = ThisComponent.Sheets.getByName("Sheet1")
	StartDialogDemarrage
End Sub

Sub StartDialogDemarrage
    DialogLibraries.LoadLibrary("Standard")
    oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Demarrage )
    oDialog1.Execute()
End Sub

sub GetParameter
REM lecture des champs de la boite de dialogue
	oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Demarrage )
	Parameter = oDialog1.getControl("TextField1").Text
REM écriture dans la cellule B2
	FichierIn = ThisComponent.URL
	FeuilleIn = ThisComponent.Sheets.getByName("Sheet1")
	FeuilleIn.getCellRangeByName("B2").setValue(Parameter)
end sub
TestDialog.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 24 déc. 2024 22:27, modifié 4 fois.
Raison : Balisage
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 10152
Inscription : 28 août 2010 08:45

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par micmac »

Bonjour et bienvenue sur le forum,

Pour faire gagner du temps au bénévoles qui vont vous venir en aide, merci d'éditer votre premier message et d'y ajouter le code de votre macro :
Image

Code : Tout sélectionner

du code visible
Touche Ctrl de Windows = touche cmd⌘ sur Mac
OpenOffice > Outils > Options sur Windows = OpenOffice > Préférences sur macOS
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 17220
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par jeanmimi »

Bonjour,
Je ne sais pas quelle valeur est attendue en B2, mais avec les saisies de texte testées, c'est toujours 0.
LibreOffice : Version : 25.8.4 (x64)(23 février 2026)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par FredBauchot »

Merci jeanmimi pour la rapidité de votre réponse.
En effet je récupère toujours 0 en B2, même si j'ai au préalable renseigné un texte comme "bidon" dans le textfield de la boîte de dialogue. J'ai observé que ma variable Parameter, sensée récupérer le contenu du textfield, reste constamment vide (""), d'où le problème... Visiblement l'instruction

Code : Tout sélectionner

Parameter = oDialog1.getControl("TextField1").Text
ne fait pas ce que j'espérais.
Toute proposition pour remplacer cette instruction par quelque chose qui fonctionne sera la bienvenue.
A nouveau merci pour le support.
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 541
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par Noonours »

Bonjour à tous
ton instruction :

Code : Tout sélectionner

FeuilleIn.getCellRangeByName("B2").setValue(Parameter)
avec ".setValue()" affecte une valeur numérique dans la cellule B2. Ta variable Parameter étant un texte, elle a pour valeur... zéro.
Si tu attends une valeur texte, remplace la ligne citée ci-dessus par:

Code : Tout sélectionner

FeuilleIn.getCellRangeByName("B2").String = Parameter
 Ajout : Plutôt que les deux macros d'origines, j'ai synthétisé en une macro ce que tu souhaites réaliser:
FredBauchot_TEST_Dialog.ods
avec le code ci dessous:

Code : Tout sélectionner

Sub Main
	oDoc = ThisComponent
	oFeuil = oDoc.Sheets.GetByName("Sheet1")
	
	DialogLibraries.LoadLibrary("Standard")
    oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Demarrage )
    if oDialog1.Execute() = com.sun.star.ui.dialogs.ExecutableDialogResults.OK then
    	Parameter = oDialog1.getControl("TextField1").Text
    	oFeuil.GetCellRangeByName("B2").String = Parameter	
    else
    	msgBox "Pas d'écriture en cellule B2"
    endif
End Sub
 

Bonne fête de Noël à tous
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 26.2.6.3 (recommandée) et OpenOffice 4.1.16 sous Windows 10
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par FredBauchot »

Merci Noonours pour votre réponse.
J'ai corrigé et testé mon code suivant votre suggestion et également testé votre macro réunissant les deux miennes.
Malheureusement je tombe dans les deux cas toujours sur le même écueil, à savoir que l'instruction

Code : Tout sélectionner

Parameter = oDialog1.getControl("TextField1").Text
ne retourne pas dans la variable Parameter le contenu du champ TextField1, mais plutôt "" (j'ai mis un point d'arrêt sur mon code à l'instruction suivante et mis Parameter en témoin). Pour la suite du code, j'obtiens dans la cellule B2 "" au lieu de "0", ce qui reflète bien que Parameter est un string vide.
Je retourne donc à mon point de départ, ayant corrigé, et je vous en remercie, une erreur que je n'avais pas encore vue (string vs value), mais toujours incapable de récupérer le contenu de TextField1. Comme ce genre d'opération me parait relativement basique, je reste perplexe sur ce qui pourrait expliquer le comportement de ma macro.
Vos conseils et suggestions restent les bienvenus. Merci.

Pour info, je viens de trouver dans un forum anglophone de Libre Office (voir https://ask.libreoffice.org/t/extract- ... ogue/59562) la suggestion d'utiliser un Model, mon instruction fautive devenant

Code : Tout sélectionner

MyParameter = oDialog1.Model.getByName("TextField1").Text
. Cela ne marche pas mieux, obtenant le même résultat.
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 541
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par Noonours »

Bonjour
Dans la routine "GetParameter" que tu fournis en exemple, tu crées un nouveau dialogue:

Code : Tout sélectionner

sub GetParameter
REM lecture des champs de la boite de dialogue
	oDialog1 = CreateUnoDialog( DialogLibraries.Standard.Demarrage )
	Parameter = oDialog1.getControl("TextField1").Text
	[...suite du code...]
Or ta macro fait ce que tu lui demandes: elle crée un autre dialogue oDialog1 (donc différent de celui que tu as renseigné préalablement), et elle récupère dans la variable "Parameter" le contenu texte du TexteField d'un dialogue tout neuf, donc vide, ce qui explique la chaine vide.

Dans la routine que j'ai posté plus haut, j'ai changé la propriété du bouton "Type de bouton" en "OK".
Cela permet de tester quel bouton a été actionné après l'exécution du dialogue:

Code : Tout sélectionner

if oDialog1.Execute() = com.sun.star.ui.dialogs.ExecutableDialogResults.OK then [...]
et ensuite récupérer le contenu du textField AVANT sa fermeture.
As-tu testé le fichier que j'ai posté plus haut?

Autre chose:
Vos conseils et suggestions restent les bienvenus.
Certains te diront que la programmation ne s'effectue pas au "pifomètre", je t'invite à consulter les divers liens et tutos de ce forum qui te permettent de bien débuter en Basic. De plus, tu devrais te mettre à jour de la dernière version de Libre Office :wink:

Cordialement,
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 26.2.6.3 (recommandée) et OpenOffice 4.1.16 sous Windows 10
FredBauchot
NOOuvel adepte
NOOuvel adepte
Messages : 12
Inscription : 24 déc. 2024 11:07

Re: [Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par FredBauchot »

Bonsoir Noonours,
en fait j'avais précédemment testé le code que vous m'aviez proposé en le copiant dans mon propre fichier, n'ayant pas réalisé que le fichier envoyé contenait une boite de dialogue différente de la mienne. J'ai corrigé le tir et observe maintenant que ça a l'air de fonctionner correctement. Je vous remercie donc de votre persévérance à m'aider.
Je déclare donc mon problème résolu et vous souhaite à nouveau un joyeux Noël.
LibreOffice version 24.8.4.2 (x86_64), sur Windows 11 Famille, version 23H2
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 26242
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Résolu][Calc] Récupération d'un champ de texte dans une boîte de dialogue

Message par Dude »

Salut,

Avec zBasic, on fait ça en quelques lignes :

Code : Tout sélectionner

Sub Main
GlobalScope.BasicLibraries.loadLibrary ("zBasic")

	oDlg = zDial.Charge("Demarrage")
	oRetour = zDial.Lance(oDlg)
	'Si le dialogue a été annulé, on sort de la routine
	if oRetour.Tag = 0 then exit Sub
	'C'est validé alors on continue
	oCtrl = zDial.Liste(oRetour, "TextField1")
	sValeur = zCtrl.Propriete(oCtrl, "Valeur")
	zCellule.Ecrit("Sheet1", "B2", "N", sValeur)
End Sub
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.