Bonjour Patrick, Le 19/01/2018 à 09:51, patrick.ge...@free.fr a écrit :
J'utilise Base avec les Macros Basic pour développer une base de donnée documentaire. Lors du traitement de l'évènement du formulaire principal "Changement d'enregistrement" j’exécute une macro un peu longue et je suis confronté à un problème de réentrance. Ma macro est un peu longue car j'utilise des formulaires un peu complexes utilisant des sections pour gérer à la fois des onglets mais aussi l'affichage contextuel de telle ou telle section en fonction des valeurs de certains champs saisies par l'utilisateur... Ce problème de réentrance peut être schématisé par le scénario suivant : t = 0 Enregistrement courrant de la forme est le n°10 t1 EVENEMENT 1 (Enregistrement courrant de la forme devient le n°11) t1 + delta t EVENEMENT 2 (Enregistrement courrant de la forme devient le n°12, Macros évènement 1 interrompue n'importe où...) t2 FIN TRAITEMENT EVENEMENT 2 (synchrone avec l'enregistrement courrant n°12 de la forme) t3 REPRISE ET FIN DU TRAITEMENT DE L'EVENEMENT 1 (/!\ Traitement de l'enregistrement n°11 qui n'est plus l'enregistrement courrant de la forme, et qui devrait au contraire s'interrompre immédiatement par un appel à exit()) Ce problème n'est pas seulement révélé par la durée du traitement de ma macro mais aussi il me semble pour deux raisons spécifiques à l'application LibreOffice: 1. Il me semble que par défaut la barre de navigation des formulaires utiliserait le principe de la répétition sur ses touches (activé après un délai très cours). Si bien que très souvent l'appui sur le bouton (avec le triangle) pour passer à l'enregistrement suivant commande un double changement d'enregistrement... Et donc je reçois deux évènements très rapprochés à traiter... [...] Pour essayer une première solution j'ai caché la barre de navigation des formulaires et j'ai ajouté 2 ou 3 boutons de navigation spécifiques à mon formulaire, en veillant à désactiver la répétition de touche. De fait je suis moins confronté au problème des doubles évènements. Mais cela n'empêche pas l'utilisateur de double cliquer rapidement ou même triple cliquer rapidement sur les boutons, et je me retrouve à nouveau avec le même problème de réentrance... [...]
Tu pourrais, lors de l'événement Clic sur ton bouton de navigation, initialiser un drapeau qui pourrait être lu lors du clic sur les divers boutons de navigation. Tant que ce drapeau serait à True, les événements correspondants ne lanceraient aucune exécution.
Tu pourrais aussi, et ça me semble plus visuel pour l'utilisateur, puisque ces boutons sont sous ton contrôle, les désactiver dès que l'un d'entre eux est cliqué, puis les réactiver lorsque l'événement a été traité.
Ces solutions me semblent plus facile à gérer que d'essayer de gérer la réentrance. Je considère pour ma part que le langage de macro Basic de LibreOffice n'est pas destiné à ça. Si les besoins deviennent très pointus, je pense qu'un autre langage serait plus approprié (Python ?).
Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que la liste reçoive une copie de votre réponse.
Bien cordialement, -- Jean-Francois Nifenecker, Bordeaux -- Envoyez un mail à users+unsubscr...@fr.libreoffice.org pour vous désinscrire Les archives de la liste sont disponibles à https://listarchives.libreoffice.org/fr/users/ Tous les messages envoyés sur cette liste seront archivés publiquement et ne pourront pas être supprimés