Pourquoi a-t-on besoin de créer dynamiquement un formulaire quand l'assistant d'Access le fait parfaitement et rapidement ?
Si on veut par exemple afficher une
table en mode continu et que le nombre de colonnes de la table varie par exemple ou quand on ne veut afficher que quelques
colonnes d'une table !! notre méthode sera appliqué comme filtre alors. Soit sql la chaine sql contenant les colonnes d'une table à afficher:
sql ="SELECT T.CHAMP1, T.CHAMP2, T.CHAMP5 FROM T"
Cette fonction permet de créer un formulaire dynamique et de le mettre en page, d'ajouter aussi des évenements, ...
il est conseillé d'utiliser un formulaire existant au lieu de créer un nouveau formulaire parce que Access aura du mal dans le cas de la création
d'un nouveau formulaire à voir ce formulaire récemment crée. Dans cet exemple nous utilisons un formulaire existant soit "F_AFFICHAGE"
que nous modifions à notre guise.
PublicFunction create_form(sql AsString) AsBooleanDim frm AsFormDim rst AsRecordset
dim ctl as control
dim i, j as integer
' --Ouvrir le formulaire en mode modification et cachéDoCmd.OpenForm"F_AFFICHAGE", acDesign
, , , , acHidden
' --suppression de tous les contrôles avant de les créer de nouveauForEach ctl InForms!F_AFFICHAGE.Controls
ctl.DeleteControl "F_AFFICHAGE", ctl.NameNext ctl
' --Source de données de mon formulaireForms![F_AFFICHAGE].RecordSource = sql
Set rst = Currentdb.OpenRecordset(sql)
' --nous ne pensons pas que vous aurez plus de 100 contrôlesDim controle(1 To 100) As Control
' --Création des contrôlesIf rst.RecordCount <> 0 Then
i = 1
j = 1000
While i < rst.Fields.Count
' -- Créer le contrôle iSet controle(i) = CreateControl("F_AFFICHAGE", acTextBox)
' --lui affecter un nom
controle(i).Name = "TXT_" & rst.Fields(i).Name ' --le positionner sur le formulaire
controle(i).Left = 100 + j
' --Définir sa largeur
controle(i).Width = 1150
' --Définir sa couleur de fond
controle(i).BackColor = "14742270" ' --Définir son effet visuel
controle(i).SpecialEffect = 0
controle(i).BackStyle = 0
controle(i).BorderStyle = 1
' --source de données de ce contrôle
controle(i).ControlSource = rst.Fields(i).Name
i = i + 1
j = j + 1150
WendEndIf
' --Création des entêtes
j = 1000
i = 1
While i < rst.Fields.Count
Set controle(i) = CreateControl("F_AFFICHAGE", acTextBox, acHeader)
controle(i).Name = "HD_" & rst.Fields(i).Name
controle(i).Left = 100 + j
controle(i).Width = 1150
controle(i).Height = 700
controle(i).BackColor = "10081789"
controle(i).SpecialEffect = 0
controle(i).BorderStyle = 1
controle(i).TextAlign = 2
controle(i).FontWeight = 700
controle(i).ControlSource = "='" & rst.Fields(i).Name & "'"
i = i + 1
j = j + 1150
Wend
rst.close
set rst = Nothing
' --Sauvegarder le formulaireDoCmd.Save acForm, "F_AFFICHAGE"EndFunction
Vous pouvez enrichir cet exmple en vous rendant sur l'aide d'Access pour d'autres propriétés telles que SpecialEffect ou BorderStyle mais aussi ajouter un évenement
tel qu'un double clic en cherchant OnDblClick ou OnClick ...
Voila vous n'avez maintenant qu'a changer la requête sql et votre formulaire est prêt en quelques secondes.
Une position est défini par 4 coordonnées, droite, gauche, bas et haut. Nous allons donc créer un type POSITION pour nos 4 coordonnées.Dans la section déclarations copier et coller ce code:
Private Type Position
LeftAsLong
Top AsLongRightAsLong
Bottom AsLongEnd Type
Pour déterminer la position de notre formulaire actif, nous ferons appel à une API GetWindowRect. Toujours dans la section déclaration ajouter ce code:
Dans un formulaire, ajouter un bouton dont le code de l'évenement sur clic est le suivant:
PrivateSub Position_Click()
Dim Position As Position
Call GetWindowRect(Me.hwnd, Position)
With Position
MsgBox"Position de mon formulaire" & vbCrLf & "Gauche:" & .Left & vbCrLf _
& "Droite:" & .Right & vbCrLf & "Inférieur:" & .Bottom & vbCrLf & "Supérieur:" & .Top
EndWithEndSub
La position du formulaire est donnée en pixel. Certainement vous vous dites ce que vous pourriez faire avec les positions du formulaire ?
justement c'est très utile si vous voulez "figer" un formulaire ou changer l'emplacement sur l'écran bien sûr d'un formulaire, il suffit pour ça
d'utiliser la fonction MoveSize de DoCmd et dont la traduction est DéplacerDimensionner. Un exemple d'utilisation de cette méthode:
DoCmd.MoveSize 2440, 2400, , 4000
Attention, cette propriété prend les coordonnées en twips qui correspond à 1/20 de points. Pour plus d'informations et
d'exemples sur tout ces fonctions rendez vous sur l'aide d'Access.
Aprés avoir obtenu la position d'un formulaire, on va le centrer maintenat pour rendre "joli" et des fois trés utiles.
Reprenons dés le début, on va créer un type POSITION pour la position de notre formulaire et ajouter quelques API windows qui s'avèrent
utiles pour déterminer les propriétés de l'écran et déplacer le formulaire. Dans la séction des déclarations d'un nouveau module
juste aprés Options Explicites, ajouter ce bout de code:
Private Type Position
LeftAsLong
Top AsLongRightAsLong
Bottom AsLongEnd Type
' --Pour obtenir les coordonnées de la fenêtre parentPublicDeclareFunction GetParent Lib"user32" (ByVal hwnd AsLong) AsLong
' --Pour obtenir les coordonnées de notre formulairePublicDeclareFunction GetWindowRect Lib"user32" (ByVal hwnd AsLong, _
lpRect As Position) AsLong
' --Pour obtenir les coordonnées de l'écranPublicDeclareFunction GetDesktopWindow Lib"user32" () AsLong
' --Pour positionner et dimensionner la fenêtrePublicDeclareFunction MoveWindow Lib"user32" (ByVal hwnd AsLong, _
ByVal x AsLong, ByVal y AsLong, ByVal nWidth AsLong, _
ByVal nHeight AsLong, ByVal bRepaint AsLong) AsLong
Pour positionner au centre notre formulaire, on fait appel à une procédure Positionner() dont on passe le formulaire à centrer.
Dans notre exemple, c'est un bouton
qui centre le formulaire et donc on fait appel à la fonction avec Me.