Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Access > Sondages et Débats

Sondages et Débats Forum destiné à recevoir les échanges, avis et sondages autour de la technologie Access.

Réponse
 
Outils de la discussion
Vieux 22/08/2006, 18h41   #1 (permalink)
Rédacteur/Modérateur
 
Avatar de Papy Turbo
 
Date d'inscription: mars 2004
Messages: 618
Par défaut [Cours pt-04]les bases du débogage

>>>> Merci de noter toutes remarques concernant ce cours dans le sujet parallèle : [Cours papyturbo]Commentaires, remarques et suggestions
-------------------------------------------------------------------------
Ce cours est la suite
- du [Cours pt-01][Débutants]Analyse structure base de données simple et
- du [Cours pt-02][Débutants]Requête avec plusieurs sommes
- et représente une "pause" dans le déroulement du [Cours pt-03]turbo-formulaire (les bases), pause destinée à défricher les bases du débogage avant de retourner finir notre formulaire.
Il commence donc par une réponse aux questions posées par Serge57, dans la réponse #10 du cours précédent (le 03),
et nous travaillons à partir du dernier .mdb :
SuiviAffaire 2006-08-17.zip (89,0 ko) -------------------------------------------------------------------------

Zzzzzzap!, zoooing ! tiou tiou tiou tiou, sortez vos lasers quantiques et vos tromblons zappeurs, enfilez le costard de Blade Runner, on part à la chasse aux bugs , en espérant que ce ne soient pas eux qui nous flinguent les premiers.

D'abord, se référer au débat [Conseils] Comment retrouver un problème , qui traite de ce sujet assez à fond. Il contient tous les principaux aspects du débogage et mérite d'être relu par tous.
Ici, nous détaillerons surtout les étapes de base pour débutants.

----------------
Je reprends le bug déjà signalé et apparemment corrigé dans la réponse #9.

La 1ère étape consiste à identifier le bug. Si un message d'erreur s'affiche, facile. Là, ce n'était le cas qu'à condition de faire des tests. En l'occurence, réduire le formulaire à sa taille la plus petite, à partir du coin inférieur droit (mais également : le passer en plein écran, puis en réduction, etc.)

La 2ème étape, c'est le travail du beta testeur qui doit décrire aux développeurs "Comment reproduire le bug". En tant que développeurs, on doit au moins savoir faire cela, et ça a consisté en (dans la réponse #9 du cours 03) :
Citation:
Je n'ai peut être pas été assez clair, donc, pour reproduire le bug, avec ta dernière version du .mdb :
1- démarrer l'application 'Affaires'
2- agrandir Access en plein écran,
3- réduire le formulaire Affaires, pour pouvoir le redimensionner à la souris,
4- saisir le bord inférieur, et remonter jusqu'à ce que la section détail, qui contient le sous-formulaire ssfAffaires, disparaisse.
Dès qu'il disparaît complètement, on a une erreur 2100 'Contrôle ou sous-formulaire trop grand.'


La 3ème étape consiste à comprendre ce qu'il se passe et, lors de l'affichage du message, j'ai une boîte de dialogue avec le message et 2 boutons actifs : Fin (on arrête tout, sans commentaire) ou Débogage (clic)
Le bouton Débogage m'amène sur une ligne de code jaune, la ligne qui provoque l'erreur :
Code :
            Me.Section(acDetail).Height = NewHeight
Là, je regarde les 2 valeurs qui pourraient être concernées.
Pour ça, les techniques de base sont :
- laisser la souris au dessus du nom d'une variable, comme 'NewHeight' : sa valeur s'affiche dans une bulle.

Ça ne marche pas toujours pour une expression plus complexe, comme 'Me.Section(acDetail).Height (si la souris est au dessus de 'acDetail', la bulle affiche 'acDetail = 0', ce qui ne nous intéresse pas). Donc :
- sélectionner l'expression et appuyer sur Maj+F9 : la valeur s'affiche dans une boîte de dialogue.

Troisième méthode :
- ouvrir la fenêtre de débogage avec Ctrl+G, et, dans la fenêtre d'exécution qui s'ouvre sous le code, taper un '?' suivi d'un espace et de la valeur, le nom de la variable ou l'expression à évaluer :
Code :
? Me.Section(acDetail).Height
 105 
 
Maintenant, je sais que
- ma section détail, avant le Form_resize, mesurait 105 twips en hauteur,
- la variable NewHeight est négative (-5).
D'où vient cette NewHeight négative ?
Elle est calculée au dessus, en gros :
Code :
NewHeight = Me.InsideHeight - Me.Section(acHeader).Height
On peut ignorer la section acFooter, dont la hauteur est 0.
Ce qui veut juste dire que je suis remonté tellement vite que InsideHeight (la fenêtre) est plus petit que la section acHeader (l'en-tête du formulaire).
4ème étape : trouver la solution.
Il paraît ici évident qu'on ne peut pas demander à Access de dessiner une section Détails dont la hauteur serait négative !
D'où, solution :
Code :
        If NewHeight > 0 Then
            Me.Section(acDetail).Height = NewHeight
            .Height = NewHeight - (.Top * 2)
        End If
 
On ne va ajuster la hauteur de la section détails que si elle est positive.

5ème étape : documenter le probème.
Et ça devient :
Code :
        'Pour empêcher l'erreur de dimensionnement du formulaire (erreur 2100)
        If NewHeight > 0 Then
            Me.Section(acDetail).Height = NewHeight
            .Height = NewHeight - (.Top * 2)
        End If
Étape qu'on oublie trop souvent, indispensable pour permettre de se relire quelques mois plus tard.
Trop de commentaires tueraient les commentaires ?
Peut être, mais il en faut beaucoup pour que ce soit trop et au minimum, il faut signaler toute correction de bug ou de message d'erreur, comme ici.
---------------------
Voilà, en 5 étapes, comment le premier message d'erreur a été "corrigé".

Et tu me signales qu'il est encore là ?
Citation:
Envoyé par Serge57
En reproduisant la manip sur la base corrigée , l’erreur 2100 existe toujours ???.
Mais c'est pas croyable, ça.

Donc, même méthode -> reste plus qu'à trouver la solution appropriée ?

Dernière modification par Papy Turbo ; 24/10/2006 à 18h29 Motif: pièce jointe
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 23/08/2006, 22h40   #2 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2006
Messages: 79
Par défaut

Citation:
Envoyé par Papy Turbo
Mais c'est pas croyable, ça.

Donc, même méthode -> reste plus qu'à trouver la solution appropriée ?
Et voici le nouveau code
Code :
        If NewHeight > (.Top * 2) Then
        'If NewHeight > 0 Then
            Me.Section(acDetail).Height = NewHeight
            'ssfAffaires.Top = 0 : juste au cas où ou mettrait une bordure autour du sous-form, ou...
            .Height = NewHeight - (.Top * 2)
        End If
On m’a soufflé le code (merci pour le souffleur, il se reconnaîtra, je ne balance pas ). En suivant ta méthode, je pense que j'y serai arrivé tout seul.

Citation:
La 1ère étape consiste à identifier le bug. Si un message d'erreur s'affiche, facile. Là, ce n'était le cas qu'à condition de faire des tests. En l'occurence, réduire le formulaire à sa taille la plus petite, à partir du coin inférieur droit (mais également : le passer en plein écran, puis en réduction, etc.)
Et oui, voilà l’expérience (ou le retour d’expérience) qui parle. Ce que je veux dire : Au début je n’avais même pas détecté le bug (l'erreur 2100), pas assez d ‘essai … Du coup, j’ai fait tout plein essais sur le formulaire et, je n’ai plus vu apparaître d’erreur. C’est BIEN ??
Serge57 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 24/08/2006, 17h53   #3 (permalink)
Rédacteur/Modérateur
 
Avatar de Papy Turbo
 
Date d'inscription: mars 2004
Messages: 618
Par défaut

Citation:
Envoyé par Serge57
Du coup, j’ai fait tout plein essais sur le formulaire et, je n’ai plus vu apparaître d’erreur. C'est bien ?
Que demande le peuple ?
C'est top cool, et c'est ce qu'il faut maintenant, à chaque routine, quelle qu'elle soit.
Stop : pas vrai. Pas top cool. Et l'étape 5 ?
In-dis-pen-sa-ble : noter un commentaire aussi concis que possible, mais clair !

Puisque tu commences à être rôdé, continuons avec un bug un poil plus difficile.
Dans la réponse #8 du cours pt03, tu as écrit :
Citation:
Envoyé par Serge57
J’ai remarqué que si access à plus de 2 de 2 lignes de menu, une barre d’ascenseur vertical se crée dans le conteneur.
Il semble bien que tu aies détecté quelque chose (1ère étape), mais...
- il faut peut être compléter cette première étape, en identifiant clairement le problème ("qu'est-ce qu'il fait ?" et "qu'est-ce qu'il devrait faire" ? ou bien "qu'est-ce qu'il fait qui ne va pas ?"
- étape 2 : comment reproduire le bug ?
et puis : 3, 4 et 5, bien sûr, mais il risque d'y avoir des pièges.
Comme quoi, si quelque chose semble bizarre, faut fouiner ou, au minimum, le noter pour plus tard, mais jamais laisser passer, sinon, ça ne peut qu'empirer après...

Coups de pouce (je conseille à chacun, dont Serge, de ne pas trop se faire aider, ça pert tout son fun) :
1- pour arrêter le code qui pose problème, pouvoir inspecter les valeurs des variables et autres paramètres, et détecter la ou les instructions qui font que ça déc..., il va falloir, soit
- appuyer sur F9 (ou menu Débogage > Basculer le point d'arrêt, dans l'IDE (espace de travail en VBA : I pour quèque chose genre "Interactive" ? + "Development Environment")
- écrire un Stop dans le code, éventuellement suivi de ":", si tu le mets devant une instruction existante.
Chacun son usage :
Le F9 (point d'arrêt) est temporaire.
Le Stop peut être enregistré avec le code (jusqu'à ce que le bug soit résolu, par exemple).

2- s'il se passe des choses bizarres, ça vaudra le coup d'appuyer sur Ctrl+L (ou menu Affichage > Pile des appels). On en reparlera, mais j'attends tes questions / observations...

Bien entendu, les points d'arrêt et la pile des appels sont documentés dans l'aide d'access.
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/08/2006, 19h14   #4 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2006
Messages: 79
Par défaut

Citation:
Envoyé par Papy Turbo
Il Il semble bien que tu aies détecté quelque chose (1ère étape), mais...
- il faut peut être compléter cette première étape, en identifiant clairement le problème ("qu'est-ce qu'il fait ?" et "qu'est-ce qu'il devrait faire" ? ou bien "qu'est-ce qu'il fait qui ne va pas ?"
Ok , j’ai joint un fichier .doc ou j’ai insérer deux images pour montrer le bug.


1ère étape - Identification du bug -– un ascenseur apparaît verticalement quand je rajoute une ligne de menu access supplémentaire.


2éme étape reproduction du bug – dans application « SuiviAffaire » ouvrir le formulaire 10-100 Affaires, si dans la barre de menu il y a plus de deux lignes « de boites outils » un ascenseur vertical apparaît.


3éme étape comprendre ce qui se passe – Il n’y a pas de message d’erreur. Je suppose qu’il y a un petit hic sur la valeur de la variable « InsideHeight » retournée par access. J’ai remarqué qu’a chaque affichage d'un nouveau menu, la variable prend une autre valeur. Mais je n’ai pas trouvé de relation cohérante pour faire un "IF" ….
Suis-je sur la bonne piste ?

-------
Fichiers attachés : reponse-4.doc (158,0 ko)
-------

Dernière modification par Papy Turbo ; 24/10/2006 à 18h27 Motif: pièce jointe
Serge57 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/08/2006, 17h58   #5 (permalink)
Rédacteur/Modérateur
 
Avatar de Papy Turbo
 
Date d'inscription: mars 2004
Messages: 618
Par défaut

Bon pour l'identification du bug, et on peut le reproduire sans problème (étape 2). Sauf que j'aurais précisé : il faut que le formulaire Affaires soit en 'plein écran' pour que l'ascenseur apparaisse à droite (ça tombe bien, il se met en plein écran au démarrage ).

Par contre, attention : la phrase
Citation:
Envoyé par Serge57
1ère étape - Identification du bug -– un ascenseur apparaît verticalement quand je rajoute une ligne de menu access supplémentaire.
est plus précise que la suivante
Citation:
Envoyé par Serge57
2éme étape reproduction du bug – dans application « SuiviAffaire » ouvrir le formulaire 10-100 Affaires, si dans la barre de menu il y a plus de deux lignes « de boites outils » un ascenseur vertical apparaît.
En faisant le test que tu prescris, je constate que :
- quel que soit le nombre de barres d'outils,
- si j'en supprime une (menu Affichage > Barres d'outils, ou clic droit dans l'espace des barres d'outils) : aucun problème, pas d'ascenseur,
- si j'en ajoute une : apparition de l'ascenseur, ce qui permet, en le faisant glisser vers le bas, de voir une bande orange en dessous du sous-formulaire ssfAffaires. De plus, à l'oeil nu, cette bande semble avoir à peu près la hauteur d'une barre d'outils.
Citation:
Envoyé par Serge57
3éme étape comprendre ce qui se passe – Il n’y a pas de message d’erreur.
Et voilà le hic ! Ce bug fait partie des pires qui soient . Donc, ça vaut le coup d'y passer un moment, en détail.
Donc tu as dû
- ouvrir le code (Alt+F11) de l'évènement Form_Resize()
- cliquer sur la 1ère ligne (ou autre ?) et appuyer sur F9 pour insérer un 'point d'arrêt'
ou bien
- taper l'instruction Stop
- revenir vers le formulaire,
- faire le test (afficher une nouvelle barre d'outils),
- chercher la valeur de InsideHeight et autres variables, lorsque l'exécution du code s'arrête sur le point d'arrêt ou sur le Stop.
Citation:
Envoyé par Serge57
Je suppose qu’il y a un petit hic sur la valeur de la variable « InsideHeight » retournée par access. J’ai remarqué qu’a chaque affichage d'un nouveau menu, la variable prend une autre valeur. Mais je n’ai pas trouvé de relation cohérante pour faire un "IF" ….
A priori, je ne pense pas qu'il "y ait un hic" sur la propriété « InsideHeight » de notre formulaire.
Je pense qu'elle change, en fonction de la taille allouée au formulaire.
Le bon sens nous dit :
- la fenêtre d'Access contient tout : barre de titre + menu (1 bande) + toutes les barres d'outils (1 bande chacune) + le formulaire, qui occupe "le reste".
- quand on ajoute une barre d'outils ou de menu, on réduit l'espace vertical alloué au formulaire -> à vérifier de test en test.

Je comprends que tu aies du mal à suivre ce qu'il se passe.
Suite des outils de débogage : -------------
Une fois l'exécution du code arrêtée par un point d'arrêt ou une instruction Stop, on peut :
- (rappel) inspecter chaque valeur avec la souris, ou avec Shift+F9,
- appuyer sur F8 pour exécuter chaque instruction en pas à pas.
Normalement !
Ce que je constate aussi :
- si j'ai mis l'arrêt sur la 1ère ligne :
Code :
Private Sub Form_Resize()
Dim NewHeight As Long
Dim NewWidth As Long
 
    Stop: With ssfAffaires
        '1- redimensionnement VERTICAL .....................................
        'Me.InsideHeight = somme de toutes les sections
        'footer est à 0.  Juste mentionnée à titre de précaution (si on met quelque chose dedans + tard)
        NewHeight = Me.InsideHeight - Me.Section(acHeader).Height - Me.Section(acFooter).Height
et que j'appuies sur F8, l'instruction suivante (en jaune) passe sur 'NewHeight = Me.InsideHeight - Me.Section...'
Ce qui est bien.
Mais, si j'appuie encore sur F8 pour exécuter cette instruction, la ligne jaune (prochaine à exécuter) remonte en arrière !!!
L'exécution repasse sur la 1ère ligne !
Non, il n'y a pas vraiment de bug dans Access. Le problème ici, c'est que, à chaque fois qu'on exécute cette 2ème ligne de code, Access considère qu'on a changé la taille du formulaire et relance l'exécution de l'évènement Form_Resize.
Ce qu'on peut constater en appuyant sur Ctrl+L : affichage de la pile des appels.

Ce qu'on voit c'est que, à chaque fois qu'on exécute une ligne de code, la 'Fenêtre de débogage' relance l'exécution de l'évènement !
Résultat : les évènement Form_Resize sont parmi les pires à déboguer , et on ne pourra pas utiliser F8 (faire du pas à pas) dans un évènement Form_Resize().

On va devoir utiliser un autre outil : Debug.Print
L'instruction Debug.Print (sur une ligne de code, il suffit de taper 'Debug.?') va afficher ce qu'on veut, dans la fenêtre d'exécution.
Par exemple :
Code :
 
Private Sub Form_Resize()
Dim NewHeight As Long
Dim NewWidth As Long
 
    With ssfAffaires
Debug.? "InsideHeight" Me.InsideHeight
va afficher la valeur de 'InsideHeight' à chaque exécution, sans qu'on ait besoin d'arrêter le code pour autant.
Comme l'instruction est tout en haut de la subroutine, elle affiche la valeur avant d'exécuter notre code. Mais on pourrait aussi en mettre d'autres après, plus bas, pour avoir les résultats.
Si je rééxécute le test (ajout / suppression d'une barre d'outils), je vois des valeurs défiler dans la fenêtre d'exécution, comme, par exemple :
Code :
InsideHeight= 6660 
InsideHeight= 6270 
InsideHeight= 6660
On est donc toujours dans l'étape 3, mais on va pouvoir
- sans mettre aucun Stop ni point d'arrêt,
- savoir la hauteur de chaque objet (NewHeight + Section(acDetail) + ssfAffaires),
- aussi bien avant d'exécuter le code de l'évènement Form_Resize qu'après,
- à chaque opération (agandissement, réduction...).

Est-ce que, avec ces outils, le problème commence à être plus précis ? ou bien tu nages encore plus ????

Dernière modification par Papy Turbo ; 24/10/2006 à 18h25
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 30/08/2006, 22h11   #6 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2006
Messages: 79
Par défaut

Citation:
Est-ce que, avec ces outils, le problème commence à être plus précis ? ou bien tu nages encore plus ????
Beaucoup plus pratique que les « MsgBox ‘variable’ » que j’utilisais.

Résultat obtenu des variables.
1er lancement
Code :
 
InsideHeight 13185 
acHeader  2040 
acFooter 0 
NewHeight  11145 
Height  11031 
 
Aprés insertion d’une bande de menu supplémentaire
Code :
 
InsideHeight 12795 
acHeader  2040 
acFooter 0 
NewHeight  10755 
Height  10641
 
Constat : Réduction de 390 twips de la fenêtre contenant le sous formulaire (InsideHeight) 13185-12795, et réduction de la hauteur du sous formulaire (height) 11031-10641.
Donc la fenêtre contenant le sous formulaire « ssfAffaires » se corrige.

Il reste le formulaire contenant, le formulaire « Affaires ».
Il faudrait réajuster la hauteur du formulaire ?
Je penche pour la variable windowheight. Suis je sur le bon chemin ?
Serge57 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 31/08/2006, 18h05   #7 (permalink)
Rédacteur/Modérateur
 
Avatar de Papy Turbo
 
Date d'inscription: mars 2004
Messages: 618
Par défaut

On approche, on approche, mais c'est encore froid.
J'aurais mis un peu plus d'indications, dans ces debug.print, concernant tout ce que nous essayons, avec plus ou moins de succès, de modifier.
Les sections Header et Footer ne bougeront jamais, tes tests le confirment.
Mais la section Détail, par contre, devrait être toujours égale à NewHeight, non ? Et le sous-formulaire aussi, à (2*.Top) près.
Et, comme déjà indiqué, je ferais ces tests 2 fois à chaque resize :
- avant nos opérations (au début de la routine), pour vérifier si on a la même valeur qu'au passage précédent,
- après nos opérations, (juste avant le Exit) pour vérifier si les transformations sont bonnes ?
Avec un mot ("avant" ou "après") dans chaque Debug.Print, pour qu'on sache.

Petite astuce qui peut être utile pour mettre des commentaires dans la fenêtre d'exécution(par exemple noter, pour nous, si tu as ajouté ou si tu as masqué une barre d'outil, avant chaque série de mesure) :
- si tu essayes d'aller à la ligne avec Enter, message d'erreur : Access essaye de compiler et exécuter la ligne.
- tu peux aller à la ligne avec Ctrl+Enter sans afficher ce message d'erreur.

Autre (voir la syntaxe de Debug.Print dans l'aide - F1) :
- tu peux mettre autant de noms et de valeurs que tu veux sur la même ligne, en les séparant par des ";"
- une ligne de commande Debug.Print qui se termine par un ";" ne va pas à la ligne. Donc, la prochaine commande continuera sur la même ligne.
Papy Turbo est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 01/09/2006, 15h35   #8 (permalink)
Nouveau membre du Club
 
Date d'inscription: mai 2006
Messages: 79
Par défaut

Citation:
Envoyé par Papy Turbo
J'aurais mis un peu plus d'indications, dans ces debug.print, concernant tout ce que nous essayons, avec plus ou moins de succès, de modifier.
Voici le nouveau code .

Code :
 
Private Sub Form_Resize()
Dim NewHeight As Long
Dim NewWidth As Long
 
    With ssfAffaires
        '1- redimensionnement VERTICAL .....................................
        'Me.InsideHeight = somme de toutes les sections
        'footer est à 0.  Juste mentionnée à titre de précaution (si on met quelque chose dedans + tard)
        NewHeight = Me.InsideHeight - Me.Section(acHeader).Height - Me.Section(acFooter).Height
        Debug.Print "—Avant le IF --";
        Debug.Print "InsideHeight="; Me.InsideHeight; " - "; "NewHeight="; NewHeight; " - "; "Height="; .Height; " - "; "acDetail="; Me.Section(acDetail).Height
        If NewHeight > 0 Then
            Debug.Print "Rentre dans le IF"
            Me.Section(acDetail).Height = NewHeight
            'ssfAffaires.Top = 0 : juste au cas où ou mettrait une bordure autour du sous-form, ou...
            .Height = NewHeight - (.Top * 2)
        End If
            '2- redimensionnement HORIZONTAL ...................................
            'NewWidth = Me.InsideWidth
            '.Width = NewWidth - (.Left * 2)
        'astuce, pour réduire la largeur du formulaire à
        '   la largeur du contrôle le plus à droite :
        Me.Width = 0
        Debug.Print "—Aprés le IF --";
        Debug.Print "InsideHeight="; Me.InsideHeight; " - "; "NewHeight="; NewHeight; " - "; "Height="; .Height; " - "; "acDetail="; Me.Section(acDetail).Height
    End With
    Debug.Print " --------------------------------"
End Sub
- Lors du premier lancement le résultat dans la fenêtre exécution est:
Code :
 --------------------------------
-- Avant le IF --InsideHeight= 13185  - NewHeight= 11145  - Height= 10641  - acDetail= 10755 
Rentre dans le IF
-- Aprés le IF --InsideHeight= 13185  - NewHeight= 11145  - Height= 11031  - acDetail= 11145 
 --------------------------------
Je constate que la section Détail (acdétail) est bien égale à la variable NewHeight et que la hauteur du sous formulaire (height) aussi à (2*Top) près. Donc BON.

Insertion d’une nouvelle barre de menu, résultat dans la fenêtre exécution est :
Code :
 --------------------------------
-- Avant le IF --InsideHeight= 12795  - NewHeight= 10755  - Height= 11031  - acDetail= 11145 
Rentre dans le IF
-- Aprés le IF --InsideHeight= 12795  - NewHeight= 10755  - Height= 10641  - acDetail= 11088 
 --------------------------------
Le constat n’est plus le même. La section Détail n’a rein à voir avec la variable NewHeight par la la Hauteur du formulaire (Height) elle oui à (2*Top) prés.

Après plusieurs essais et lecture des variables,
- dés que la hauteur du sous formulaire est modifiée, Access recalcule la hauteur du de la section détail.
D’où le nouveau code :
Code :
        If NewHeight > 0 Then
            Debug.Print "Rentre dans le IF"
            .Height = NewHeight - (.Top * 2)
            Me.Section(acDetail).Height = NewHeight
            'ssfAffaires.Top = 0 : juste au cas où ou mettrait une bordure autour du sous-form, ou...
        End If
la différence : D’abord j’impose la hauteur du sous formulaire, puis celle de la section détail du formulaire.

Revenons à nos étapes.

1 - Identification du bug réponse # 4
2 - reproduction du bug réponse #4 corrigé par Papy Turbo dans réponse #5
3 - Comprendre ce qui se passe Si l'on modifie la hauteur d'un sous formulaire (ou sous état), Access recalcul la hauteur de la section ou se trouve "ce sous formulaire."
4 - Trouver la solution Une fois la hauteur du sous formulaire imposer, il faut impose la hauteur de la section contenant le sous formulaire. (Tout en restant logique avec la variable "InsideHeight"
5 - documenter le problème
d'où le nouveau code:
Code :
        If NewHeight > 0 Then
            ' Toujours imposer la hauteur du Sous Formulaire avant la redéfinition de la section le contenant.
            .Height = NewHeight - (.Top * 2) ' hauteur du sous formulaire
            Me.Section(acDetail).Height = NewHeight 'hauteur de la section le contenant
            'ssfAffaires.Top = 0 : juste au cas où ou mettrait une bordure autour du sous-form, ou...
        End If
 

Citation:
On approche, on approche, mais c'est encore froid.
c'est chaud ??
Serge57 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/09/2006, 15h44   #9 (permalink)
Rédacteur/Modérateur
 
Avatar de Papy Turbo
 
Date d'inscription: mars 2004
Messages: 618
Par défaut


Ben voilà.
Dans ce sens là, ça marche.

Comme je suis vicieux et à l'intention de tous ceux qui meurent d'envie de se plonger dans le monde fascinant du Form_Resize(), je vais juste montrer ce que j'ai fait (c'est quasi identique à ce que tu as fait, juste une ligne de plus) , et les conclusions.
L'ancien code, au complet, avec les Debug.Print :
Code :
Private Sub Form_Resize()
Dim NewHeight                           As Long
Dim NewWidth                            As Long
 
    With ssfAffaires
        '1- redimensionnement VERTICAL .....................................
        'Me.InsideHeight = somme de toutes les sections
        'footer est à 0.  Juste mentionnée à titre de précaution
        '   (si on met quelque chose dedans + tard)
        NewHeight = Me.InsideHeight - Me.Section(acHeader).Height - _
                    Me.Section(acFooter).Height
        If NewHeight > (.Top * 2) Then
Debug.Print "1 | InsideHeight="; Me.InsideHeight; "| NewHeight="; NewHeight; _
            "| Section(acDetail)="; Section(acDetail).Height; _
            "| hauteur ssf avec bordure="; .Height + (.Top * 2); _
            "| ssfAffaires"; .Height; "| (.Top * 2)="; (.Top * 2)
            Me.Section(acDetail).Height = NewHeight
Debug.Print "2 | InsideHeight="; Me.InsideHeight; "| NewHeight="; NewHeight; _
            "| Section(acDetail)="; Section(acDetail).Height; _
            "| hauteur ssf avec bordure="; .Height + (.Top * 2); _
            "| ssfAffaires"; .Height; "| (.Top * 2)="; (.Top * 2)
            .Height = NewHeight - (.Top * 2)
Debug.Print "3 | InsideHeight="; Me.InsideHeight; "| NewHeight="; NewHeight; _
            "| Section(acDetail)="; Section(acDetail).Height; _
            "| hauteur ssf avec bordure="; .Height + (.Top * 2); _
            "| ssfAffaires"; .Height; "| (.Top * 2)="; (.Top * 2)
Debug.Print "----------------------------------"
        End If
        '2- redimensionnement HORIZONTAL ...................................
        NewWidth = Me.InsideWidth
        .Width = NewWidth - (.Left * 2)
        ''End If
        'astuce, pour réduire la largeur du formulaire à
        '   la largeur du contrôle le plus à droite :
        Me.Width = 0
    End With
 
End Sub
Note : j'utilise l'autre outil de base, indispensable sous Access pour y voir clair : SmartIndenter de Stephen Bullen (OA Ltd), disponible gratuitement depuis la page Outils
Il a la particularité se mettre (en option seulement, mais ça me plaît) tous les Debug.? dans la marge, à gauche, et plein d'autres options...
Et le résultat, copié de la fenêtre d'exécution ou j'ai rajouté le type d'action (ajout ou suppression barre d'outils) :
Code :
Suppression d'une barre d'outils (formulaire s'aggrandit)
1 | InsideHeight= 9705 | NewHeight= 7665 | Section(acDetail)= 7275 | hauteur ssf avec bordure= 7275 | ssfAffaires 7161 | (.Top * 2)= 114 
2 | InsideHeight= 9705 | NewHeight= 7665 | Section(acDetail)= 7665 | hauteur ssf avec bordure= 7275 | ssfAffaires 7161 | (.Top * 2)= 114 
3 | InsideHeight= 9705 | NewHeight= 7665 | Section(acDetail)= 7665 | hauteur ssf avec bordure= 7665 | ssfAffaires 7551 | (.Top * 2)= 114 
----------------------------------
Ajout d'une barre d'outils (formulaire est réduit)
1 | InsideHeight= 9315 | NewHeight= 7275 | Section(acDetail)= 7665 | hauteur ssf avec bordure= 7665 | ssfAffaires 7551 | (.Top * 2)= 114 
2 | InsideHeight= 9315 | NewHeight= 7275 | Section(acDetail)= 7608 | hauteur ssf avec bordure= 7665 | ssfAffaires 7551 | (.Top * 2)= 114 
3 | InsideHeight= 9315 | NewHeight= 7275 | Section(acDetail)= 7608 | hauteur ssf avec bordure= 7275 | ssfAffaires 7161 | (.Top * 2)= 114 
---------------------------------- apparition de l'ascenseur (acDetail trop petite)
? 114/2
 57 
? 7551 + 57
 7608
Comme tu le constates, je me suis demandé pourquoi, en réduction, la section détail ne faisait que 7608 twips, et pas 7275 "comme tout le monde" ?
Lorsqu'on essaye de réduire la section acDetail,
- elle contient un sous formulaire qui mesure encore 7551 twips (il n'a pas encore été réduit),
- le ssf démarre à 57 twips (=.Top) du haut de la section.
Access essaie en fait de le réduire, mais (bon sens ?), il ne peut pas le réduire plus que ce qu'il contient !!!

Dans l'autre sens, en inversant les 2 lignes comme toi, on constate des choses intéressantes :
Code :
        If NewHeight > (.Top * 2) Then
Debug.Print "1 | InsideHeight="; Me.InsideHeight; "| NewHeight="; NewHeight; _
            "| Section(acDetail)="; Section(acDetail).Height; _
            "| hauteur ssf avec bordure="; .Height + (.Top * 2); _
            "| ssfAffaires"; .Height; "| (.Top * 2)="; (.Top * 2)
            'Toujours imposer la hauteur du Sous Formulaire (contenu)
            '            AVANT la redéfinition de la section le contenant.
            .Height = NewHeight - (.Top * 2)
Debug.Print "2 | InsideHeight="; Me.InsideHeight; "| NewHeight="; NewHeight; _
            "| Section(acDetail)="; Section(acDetail).Height; _
            "| hauteur ssf avec bordure="; .Height + (.Top * 2); _
            "| ssfAffaires"; .Height; "| (.Top * 2)="; (.Top * 2)
            Me.Section(acDetail).Height = NewHeight
Debug.Print "3 | InsideHeight="; Me.InsideHeight; "| NewHeight="; NewHeight; _
            "| Section(acDetail)="; Section(acDetail).Height; _
            "| hauteur ssf avec bordure="; .Height + (.Top * 2); _
            "| ssfAffaires"; .Height; "| (.Top * 2)="; (.Top * 2)
Debug.Print "----------------------------------"
        End If
Résultat :
Note : ne pas oublier la gomme, sur la barre d'outils de mzTools, pour nettoyer la fenêtre d'exécution
Code :
Ajout d'une barre d'outils
1 | InsideHeight= 9315 | NewHeight= 7275 | Section(acDetail)= 7608 | hauteur ssf avec bordure= 7665 | ssfAffaires 7551 | (.Top * 2)= 114 
2 | InsideHeight= 9315 | NewHeight= 7275 | Section(acDetail)= 7608 | hauteur ssf avec bordure= 7275 | ssfAffaires 7161 | (.Top * 2)= 114 
3 | InsideHeight= 9315 | NewHeight= 7275 | Section(acDetail)= 7275 | hauteur ssf avec bordure= 7275 | ssfAffaires 7161 | (.Top * 2)= 114 
----------------------------------
Suppression barre
1 | InsideHeight= 9705 | NewHeight= 7665 | Section(acDetail)= 7275 | hauteur ssf avec bordure= 7275 | ssfAffaires 7161 | (.Top * 2)= 114 
2 | InsideHeight= 9705 | NewHeight= 7665 | Section(acDetail)= 7608 | hauteur ssf avec bordure= 7665 | ssfAffaires 7551 | (.Top * 2)= 114 
3 | InsideHeight= 9705 | NewHeight= 7665 | Section(acDetail)= 7665 | hauteur ssf avec bordure= 7665 | ssfAffaires 7551 | (.Top * 2)= 114 
------------------