![]() |
| 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é. | |||||||
|
|||||||
| Sondages et Débats Forum destiné à recevoir les échanges, avis et sondages autour de la technologie Access. |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) | ||
![]() Date d'inscription: mars 2004
Messages: 618
|
>>>> 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:
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 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 - 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 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 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 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:
![]() Donc, même méthode -> reste plus qu'à trouver la solution appropriée ?
__________________
Les cours sont terminés. [Cours pt-05]Moteur de mise à jour de base de données [Cours pt-04]les bases du débogage [Cours pt-03]turbo-formulaire (les bases) [Cours pt-02][Débutants]Requête avec plusieurs sommes [Cours pt-01][Débutants]Analyse structure base de données simple + Commentaires sur les cours Dernière modification par Papy Turbo ; 24/10/2006 à 18h29 Motif: pièce jointe |
||
|
|
|
|
|
#2 (permalink) | ||
|
Nouveau membre du Club
![]() Date d'inscription: mai 2006
Messages: 79
|
Citation:
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 Citation:
|
||
|
|
|
|
|
#3 (permalink) | ||
![]() Date d'inscription: mars 2004
Messages: 618
|
Citation:
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:
- 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.
__________________
Les cours sont terminés. [Cours pt-05]Moteur de mise à jour de base de données [Cours pt-04]les bases du débogage [Cours pt-03]turbo-formulaire (les bases) [Cours pt-02][Débutants]Requête avec plusieurs sommes [Cours pt-01][Débutants]Analyse structure base de données simple + Commentaires sur les cours |
||
|
|
|
|
|
#4 (permalink) | |
|
Nouveau membre du Club
![]() Date d'inscription: mai 2006
Messages: 79
|
Citation:
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 |
|
|
|
|
|
|
#5 (permalink) | ||||
![]() Date d'inscription: mars 2004
Messages: 618
|
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:
Citation:
- 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:
. 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:
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 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 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 - 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 ????
__________________
Les cours sont terminés. [Cours pt-05]Moteur de mise à jour de base de données [Cours pt-04]les bases du débogage [Cours pt-03]turbo-formulaire (les bases) [Cours pt-02][Débutants]Requête avec plusieurs sommes [Cours pt-01][Débutants]Analyse structure base de données simple + Commentaires sur les cours Dernière modification par Papy Turbo ; 24/10/2006 à 18h25 |
||||
|
|
|
|
|
#6 (permalink) | |
|
Nouveau membre du Club
![]() Date d'inscription: mai 2006
Messages: 79
|
Citation:
Résultat obtenu des variables. 1er lancement Code :
InsideHeight 13185 acHeader 2040 acFooter 0 NewHeight 11145 Height 11031 Code :
InsideHeight 12795 acHeader 2040 acFooter 0 NewHeight 10755 Height 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 ? |
|
|
|
|
|
|
#7 (permalink) |
![]() Date d'inscription: mars 2004
Messages: 618
|
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.
__________________
Les cours sont terminés. [Cours pt-05]Moteur de mise à jour de base de données [Cours pt-04]les bases du débogage [Cours pt-03]turbo-formulaire (les bases) [Cours pt-02][Débutants]Requête avec plusieurs sommes [Cours pt-01][Débutants]Analyse structure base de données simple + Commentaires sur les cours |
|
|
|
|
|
#8 (permalink) | ||
|
Nouveau membre du Club
![]() Date d'inscription: mai 2006
Messages: 79
|
Citation:
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 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 -------------------------------- 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 -------------------------------- 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 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:
|
||
|
|
|
|
|
#9 (permalink) |
![]() Date d'inscription: mars 2004
Messages: 618
|
![]() 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 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 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 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 ------------------ |