OooBasic : Initialisation des variables et Singleton...

Bonjour,

Je programme avec Ooobasic une application dans un document Calc.

Pour initialiser les variables globales et un singleton de mon application Calc je cherche quel événement du document je devrais gérer afin que ma procédure d'initialisation soit la première à s'exécuter (avant l'exécution des fonctions de ma feuille de calcul). Notez que j'ai essayé avec l'événement */"Document Ouvrir"/* mais j'ai compris, peut être à tord, que cet événement arrivait parfois après l'exécution des premières fonctions de la feuille de calcul. Il ne me conviendrait donc pas...

J'ai également essayé d'instancier le singleton du modèle de mon application dans l'appel de la première fonction exécutée sur ma feuille de calcul. Mais j'ai de nombreuses fonctions similaires et concurentes sur la même feuille. Et j'observe dans mes tests que l'appel à la procédure de création du modèle singleton est doublé et entrelacé par des appels aux autres fonctions concurrentes de ma feuille de calcul !

Pour résumer Je me pose donc trois questions :

1. *Quel événement du document pourrait être géré pour initialiser les
    variables de mon application avant l'exécution de la première
    fonction dans les cellules de ma feuille de calcul ?*
2. Sinon existe t-il un moyen d'empêcher l'exécution des fonctions de
    ma feuille tant que le code de création de mon modèle singleton n'a
    pas fini son exécution ?
3. Existe t-il enfin une méthode plus élégante que l'usage d'une
    variable *Global Boolean* pour gérer la création d'un singleton ?

C'est la première fois que j'envoie un message sur cette liste, peut être pour la programmation existe t-il une autre liste plus spécialisée. Dans ce cas je vous remercie par avance de bien vouloir me communiquer la liste vers laquelle envoyer ma demande d'aide.

Je vous remercie pour votre aide.
Patrick

Bonjour et bienvenue

Je commence par la fin :

Patrick Gelin wrote

C'est la première fois que j'envoie un message sur cette liste, peut
être pour la programmation existe t-il une autre liste plus spécialisée.
Dans ce cas je vous remercie par avance de bien vouloir me communiquer
la liste vers laquelle envoyer ma demande d'aide.

Tu peux contacter directement les développeurs, par IRC ou mailing
liste. Les coordonnées sont données ici :
http://fr.libreoffice.org/community/developers/

Sinon...

Patrick Gelin wrote

Je programme avec Ooobasic une application dans un document Calc.

L'API de LibreOffice évolue différemment sur certains points par rapport
à Apache OpenOffice (en particulier gestion des dates, des propriétés
personnalisées).
Tu trouveras les différences sur les pages de notes de version, par exemple
pour la 4.3 :
https://wiki.documentfoundation.org/ReleaseNotes/4.3/fr#Changements_dans_l.27API

Patrick Gelin wrote

Pour initialiser les variables globales et un singleton de mon
application Calc je cherche quel événement du document je devrais gérer
afin que ma procédure d'initialisation soit la première à s'exécuter
(avant l'exécution des fonctions de ma feuille de calcul).

Puisque tu gères par programme, le plus simple me semble être de désactiver
le recalcul automatique à l'enregistrement (fermeture) du document et
à ne le rétablir qu'après tes traitements d'ouverture.

thisComponent.enableAutomaticCalculation(true)
thisComponent.calculateAll

Cordialement
Pierre-Yves

Bonjour,

Merci pour la réponse précédante de Pierre-Yves qui m'a permis d'aller un peu plus loin dans le debuggage de mon application de petite comptabilité. J'ai donc désactiver le calcul automatique qui n'est réactivié au lancement de l'application qu'après initialisation du singleton "LeBilan".

Néanmoins il reste un problème incompréhensible pour moi : la boucle de calcul du bilan est interrompue de façon plus ou moins aléatoire avant la fin. Comme c'est un problème compliqué à analyser j'ai produit un fichier de trace et j'ai modifié ma feuille de calcul pour la communiquer a ceux qui veulent m'aider. Elle est en pièce jointe de ce massage. Avant d’exécuter les macros commande vous devez modifier la constante du nom de fichier de debuggage dans le module Test.

CONST NomFichier="/home/gelinp/Desktop/debug_livre_de_bord.txt"

*Le classeur contient trois feuilles :*

1. Plan comptable : défini le plan comptable de l'application en
    hiérarchisant les catégories au débit et au crédit
2. Journal : le journal des opérations au débit et au crédit
3. Bilan : un bilan annuel sur deux ans.

*Il y a ****8 modules :*

1. Bilan : défini l emodèle qui est un bilan comptable annuel
2. Calculs : défini une macro pour faciliter la gestion des collections
3. Compte : Défini un compte
4. Controler : le controler de l'application
5. Iterateur : Défini un itérateur de ligne de feuille de calcul
6. Journal : Défini et gère la feuille de calcul du journal des opérations
7. PlanComptable : Défini et gère la feuille de calcul du plan comptable
8. Test : la module pour les debugage et la gestion du fichier de trace

J'ai besoin de votre aide pour comprendre la raison de l'arrête de la boucle de calcul du bilan dans la procédure du *module Bilan : **Sub Bilan_Calculer(unBilan As Variant)*

Merci pour votre aide !
Patrick

Bonjour,

Elle est en pièce jointe de ce
massage.

les pièces jointes ne passent pas sur la liste. Pour échanger des
fichiers, il faut utiliser un site dépôt, genre cjoint ou free.

Bonjour,

Je vous prie de bien vouloir m'excuser pour ce petit problème... Ci-joint le lien vers le document Calc :

http://patrick.gelin.free.fr/telechargement/Livre_de_bord_2.ods

Merci pour votre aide !

Bonjour

Ta gestion de trace rend difficile à suivre ton programme...

S'investir "fonctionnellement" me demanderait par ailleurs pas mal de temps
pour tenter de comprendre ce que tu veux faire.

Toutefois un rapide examen du code me pose question : tu ne prévois
aucune gestion de sortie normale dans tes procédures d'erreur.

Tu fais toujours quelque chose comme :

'**********************************************
Sub Controler_Calcule(Optional evt As Object)

On Error goto Erreur
...
... Bilan_Calculer(Controler_LeBilan())

Erreur:
  LeBilanExiste = false
  LeBilan = Null
  Debug_Catch("Controler")
  Debug_Fin()
End Sub
'**********************************************

Autrement dit, tu exécutes systématiquement tes procédures d'erreur.
Ceci explique peut-être tes problèmes... En général on fait qq chose comme:

'**********************************************
Sub Controler_Calcule(Optional evt As Object)

On Error goto Erreur
...
... Bilan_Calculer(Controler_LeBilan())

Controler_Calcule_Exit:
exit sub

Erreur:
  LeBilanExiste = false
  LeBilan = Null
  Debug_Catch("Controler")
  Debug_Fin()
       Resume Controler_Calcule_Exit:
End Sub
'**********************************************

Cordialement
Pierre-Yves