Bonjour,
Je cherche un moyen pour tester la présence ou non des scrollbars de la fenêtre Access.
Merci de votre aide.
Version imprimable
Bonjour,
Je cherche un moyen pour tester la présence ou non des scrollbars de la fenêtre Access.
Merci de votre aide.
Dans la contribution http://www.developpez.net/forums/d35...registrements/ tu trouveras le code qui applique des scrollbars quand la hauteur du form dépasse la hauteur de la fenetre.
Bonne pêche
:D
Bonjour,
As-tu un besoin particulier nécessitant le test des scrollbars ?
Sinon, il serait (peut-être) mieux de les afficher ou non en fonction d'une condition :!:
Généralement, l'utilisation d'un scrollbar répond à un besoin....
Bonsoir,
Si tu parles des barre de défilement de la fenêtre de l'application Access,
voila ce que j'ai trouvé, qui fonctionne avec 2003 mais pas avec 2007 et + :
[correction]Fonctionne dans 2007. Merci micniv pour avoir testé.[/correction]
A+Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 Option Compare Database Option Explicit ' == début déclarations =================================== ' Trouver Handler d'une fenêtre fille par sa classe Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, ByVal lpszWindow As String) As Long ' --- Style Fenêtre --------------------------------------- Private Const WS_HSCROLL As Long = &H100000 Private Const WS_VSCROLL As Long = &H200000 ' --- Get/Set WindowLong ---------------------------------- Private Const GWL_STYLE As Long = -16 ' --- GetWindowLong --------------------------------------- Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Integer) As Long ' == fin déclarations ===================================== ' --- La fenêtre client MDI a-t-elle une barre de défilement ' verticale ? Function MDIhasVtlSB() As Boolean Dim lgMDIProp As Long, hWndMDIClientWindow As Long hWndMDIClientWindow = FindWindowEx(Application.hWndAccessApp, 0, "MDIClient", "") lgMDIProp = GetWindowLong(hWndMDIClientWindow, GWL_STYLE) MDIhasVtlSB = CBool(lgMDIProp And WS_VSCROLL) End Function ' --- La fenêtre client MDI a-t-elle une barre de défilement ' horizontale ? Function MDIhasHrzSB() As Boolean Dim lgMDIProp As Long, hWndMDIClientWindow As Long hWndMDIClientWindow = FindWindowEx(Application.hWndAccessApp, 0, "MDIClient", "") lgMDIProp = GetWindowLong(hWndMDIClientWindow, GWL_STYLE) MDIhasHrzSB = CBool(lgMDIProp And WS_HSCROLL) End Function
Merci pour vos réponses, mais il ne s'agit pas des scrollbars d'un formulaire ou d'un état mais des scrollbars de la fenêtre Access.
J'arrive à dimensionner mon formulaire (créé dynamiquement, selon le résultat d'un recordset) presque comme je veux :
1 - je dimensionne les colonnes en fonction de la largeur des données et de l'entête
2 - je dimensionne le formulaire selon la largeur et la hauteur totale des données (avec les scrollbars du formulaire si besoin)
3 - je centre le formulaire sur la fenêtre Access
4 - enfin, je retaille si ça ne rentre pas dans la fenêtre Access.
Mais si les scrollbars d'Access sont présents, la zone d'affichage est plus petite que ce qui est calculé. Il faudrait donc que je sache si les scrollbars sont présentes ou non afin d'en tenir compte dans mon calcul de taille de mon formulaire.
Voilà, voilà.
Edit : Le bout de code de LedZepp II m'a l'air pas mal. A tester demain ...
(mais dommage que ça ne fonctionne pas avec Acc07 ...)
Apparemment, bonne nouvelle : le code de Ledzep marche sous ACC2007 !
Pour infos : on a des scrollbars seulement si on affiche les formulaires en mode superposés mais il n'y en en pas en mode Onglet (configurerable dans les options -base active)
:D
Testé et approuvé.
C'est nickel.:ccool:
Bonsoir,
Ah ben oui, tiens, ça fonctionne avec 2007.:whistle2:
J'ai fait une mauvaise supposition.
Il y a deux type de barres de défilement (cf About Scroll Bars).
Celles qui font partie du style de la fenêtre et celles qui sont créées en tant que contrôles (=fenêtre enfant).
Quand j'ai listé les fenêtres enfants (ça peut être de vrais fenêtres ou bien des contrôles) de la fenêtre client MDI,
j'ai trouvé deux fenêtres enfants de classe NUIScrollbar.
L'une avait comme titre Horizontal et l'autre Vertical.
J'étais persuadé que dans Access 2007 c'étaient elles les barre de défilement de l'application.
Et comme mon code teste les attributs de style, je me suis dit que ce n'était pas applicable à Access 2007.
Erreur :aie: J'aurais du essayer quand même, comme micniv.
A+
Je pensais utiliser le code de LedZeppII pour savoir si mon formulaire (ou le sous-formulaire) a une barre de défilement affichée, mais ça ne fonctionne pas :
J'ai toujours "Faux".Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 Dim iBln_VSB As Boolean Dim iBln_HSB As Boolean Dim ilng As Long ' Sous form ilng = pFrm.Form("grille").Form.hWnd ilng = GetWindowLong(ilng, GWL_STYLE) iBln_VSB = CBool(ilng And WS_VSCROLL) iBln_HSB = CBool(ilng And WS_HSCROLL) 'Form ilng = pFrm.hWnd ilng = GetWindowLong(ilng, GWL_STYLE) iBln_VSB = CBool(ilng And WS_VSCROLL) iBln_HSB = CBool(ilng And WS_HSCROLL)
Où est le problème ?
Bonsoir,
Voila ce que j'ai trouvé pour un formulaire (principal) :
Testé (2007 et 2003) comme ceci dans un formulaire (principal, fenêtre non indépendante)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147 Option Explicit ' == début déclarations =================================== ' --------------------------------------------------------- ' Divers ' --------------------------------------------------------- ' --- Trouver Handler d'une fenêtre fille par sa classe Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, ByVal lpszWindow As String) As Long ' --- Fenêtre est visible ? Private Declare Function IsWindowVisible Lib "user32.dll" _ (ByVal hWnd As Long) As Boolean ' --------------------------------------------------------- ' Style Fenêtre ' --------------------------------------------------------- 'Private Const WS_HSCROLL As Long = &H100000 'Private Const WS_VSCROLL As Long = &H200000 ' --- Get/Set WindowLong ---------------------------------- Private Const GWL_STYLE As Long = -16 ' --- GetWindowLong --------------------------------------- Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Integer) As Long ' --------------------------------------------------------- ' Barre de défilement ' --------------------------------------------------------- ' --- Style fenêtre ScrollBar (contrôle) Private Const SBS_HORZ = &H0& Private Const SBS_VERT = &H1& ' --- Structure Info Défilement Private Type typSCROLLINFO cbSize As Long fMask As Long nMin As Long nMax As Long nPage As Long nPos As Long nTrackPos As Long End Type ' --- Constantes pour fMask de SCROLLINFO Private Const SIF_RANGE = 1 ' --- Constantes pour GetScrollInfo Private Const SB_CTL As Long = 2 ' Barre de défilement type contrôle ' --- GetScrollInfo Private Declare Function GetScrollInfo Lib "user32.dll" _ (ByVal hWnd As Long, ByVal nBar As Long, _ ByRef lpsi As typSCROLLINFO) As Long 'BOOL ' == fin déclarations ===================================== ' --- La fenêtre a-t-elle un contrôle barre de défilement ' verticale ? (Access 2003) Function WndHasVtlSBctl(hWnd As Long) As Boolean Dim hChildWnd As Long, infScroll As typSCROLLINFO Dim lgProp As Long, blnFound As Boolean, LoopCnt As Long Dim retVal As Long, blnReturn As Boolean ' Recheche fenêtre enfant (contrôle) de classe ' Scrollbar avec attribut de style SBS_VERT Do hChildWnd = FindWindowEx(hWnd, hChildWnd, "Scrollbar", "") If hChildWnd <> 0 Then lgProp = GetWindowLong(hChildWnd, GWL_STYLE) If (lgProp And SBS_VERT) <> 0 Then blnFound = True End If LoopCnt = LoopCnt + 1 Loop Until blnFound Or (LoopCnt = 2) ' Si trouvée If blnFound Then infScroll.cbSize = Len(infScroll) infScroll.fMask = SIF_RANGE retVal = GetScrollInfo(hChildWnd, SB_CTL, infScroll) If retVal <> 0 Then ' Pour que le contrôle soit visible il faut deux conditions : blnReturn = IsWindowVisible(hChildWnd) _ And (infScroll.nMax > infScroll.nMin) End If End If WndHasVtlSBctl = blnReturn End Function ' --- La fenêtre a-t-elle un contrôle barre de défilement ' horizontale ? (Access 2003) Function WndHasHrzSBctl(hWnd As Long) As Boolean Dim hChildWnd As Long, infScroll As typSCROLLINFO Dim lgProp As Long, blnFound As Boolean, LoopCnt As Long Dim retVal As Long, blnReturn As Boolean ' Recheche fenêtre enfant (contrôle) de classe ' Scrollbar avec attribut de style <> SBS_VERT Do hChildWnd = FindWindowEx(hWnd, hChildWnd, "Scrollbar", "") If hChildWnd <> 0 Then lgProp = GetWindowLong(hChildWnd, GWL_STYLE) If (lgProp And SBS_VERT) = 0 Then blnFound = True End If LoopCnt = LoopCnt + 1 Loop Until blnFound Or (LoopCnt = 2) ' Si trouvée If blnFound Then infScroll.cbSize = Len(infScroll) infScroll.fMask = SIF_RANGE retVal = GetScrollInfo(hChildWnd, SB_CTL, infScroll) If retVal <> 0 Then ' Pour que le contrôle soit visible il faut deux conditions : blnReturn = IsWindowVisible(hChildWnd) _ And (infScroll.nMax > infScroll.nMin) End If End If WndHasHrzSBctl = blnReturn End Function ' --- La fenêtre a-t-elle un contrôle barre de défilement ' vertical ? (Access 2007) Function WndHasVtlNUISB(hWnd As Long) As Boolean Dim hChildWnd As Long Dim blnReturn As Boolean ' Recheche fenêtre enfant (contrôle) de classe ' NUIScrollbar avec titre=Vertical hChildWnd = FindWindowEx(hWnd, hChildWnd, "NUIScrollbar", "Vertical") If hChildWnd <> 0 Then blnReturn = IsWindowVisible(hChildWnd) End If WndHasVtlNUISB = blnReturn End Function ' --- La fenêtre a-t-elle un contrôle barre de défilement ' horizontal ? (Access 2007) Function WndHasHrzNUISB(hWnd As Long) As Boolean Dim hChildWnd As Long Dim blnReturn As Boolean ' Recheche fenêtre enfant (contrôle) de classe ' NUIScrollbar avec titre=Vertical hChildWnd = FindWindowEx(hWnd, hChildWnd, "NUIScrollbar", "Horizontal") If hChildWnd <> 0 Then blnReturn = IsWindowVisible(hChildWnd) End If WndHasHrzNUISB = blnReturn End Function
Pour 2003, le code est un peu complexe car IsWindowVisible() renvoie vrai même lorsque la barre n'est pas visible.Code:
1
2
3
4
5
6
7
8
9
10 Dim AccVer As Single AccVer = Val(Application.SysCmd(acSysCmdAccessVer)) Me.txtHwnd = Me.hWnd If AccVer < 12 Then Me.txtSBctlHorz = WndHasHrzSBctl(Me.hWnd) Me.txtSBctlVert = WndHasVtlSBctl(Me.hWnd) Else Me.txtSBctlHorz = WndHasHrzNUISB(Me.hWnd) Me.txtSBctlVert = WndHasVtlNUISB(Me.hWnd) End If
Je teste les valeurs Min et Max car quand Min=Max=0 (et peut être plus généralement quand Min=Max) la barre de défilement n'est pas visible.
A+
Je n'aurais qu'un smiley : :ccool: