IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Créer dynamiquement un formulaire
auteur : Morsi
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.

Public Function create_form(sql As String) As Boolean Dim frm As Form Dim rst As Recordset 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 nouveau For Each ctl In Forms!F_AFFICHAGE.Controls ctl.DeleteControl "F_AFFICHAGE", ctl.Name Next ctl ' --Source de données de mon formulaire Forms![F_AFFICHAGE].RecordSource = sql Set rst = Currentdb.OpenRecordset(sql) ' --nous ne pensons pas que vous aurez plus de 100 contrôles Dim controle(1 To 100) As Control ' --Création des contrôles If rst.RecordCount <> 0 Then i = 1 j = 1000 While i < rst.Fields.Count ' -- Créer le contrôle i Set 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 Wend End If ' --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 formulaire DoCmd.Save acForm, "F_AFFICHAGE" End Function
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.


Position d'un formulaire
auteur : Morsi
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 Left As Long Top As Long Right As Long Bottom As Long End 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:

Private Declare Function GetWindowRect Lib "User32" _ (ByVal hwnd As Long, lpRect As RECT) As Long
Dans un formulaire, ajouter un bouton dont le code de l'évenement sur clic est le suivant:

Private Sub 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 End With End Sub
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.


Centrer un formulaire
auteur : Morsi
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 Left As Long Top As Long Right As Long Bottom As Long End Type ' --Pour obtenir les coordonnées de la fenêtre parent Public Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long ' --Pour obtenir les coordonnées de notre formulaire Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, _ lpRect As Position) As Long ' --Pour obtenir les coordonnées de l'écran Public Declare Function GetDesktopWindow Lib "user32" () As Long ' --Pour positionner et dimensionner la fenêtre Public Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, _ ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, _ ByVal nHeight As Long, ByVal bRepaint As Long) As Long
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.

Private Sub Centrer_Click() Call Positionner(Me) End Sub
Revenons au module précédent et ajoutons ce code commenté

Public Sub Positionner(frm As Form) Dim FParent As Position '--Fenêtre Parent Dim Fenetre As Position Dim Largeur As Integer Dim Hauteur As Integer Dim LParent As Integer ' --Largeur Fenêtre Parent Dim HParent As Integer ' --Hauteur Fenêtre Parent Dim PParent As Long ' --Posion parent On Error GoTo Erreur ' --Trouver les coordonnées de mon formulaire à centrer. PParent = GetParent(frm.hwnd) ' --Obtenir les coordonnées de mon formulaire et celles de son parent. Call GetWindowRect(frm.hwnd, Fenetre) ' --Si le parent est la fenêtre Access, pas de soustracion If PParent <> Application.hWndAccessApp Then Call GetWindowRect(PParent, FParent) Else ' -- les coordonnées du Desktop Call GetWindowRect(GetDesktopWindow(), FParent) End If ' --Calcul de la largeur et de la hauteur du parent With FParent LParent = .Right - .Left HParent = .Bottom - .Top End With ' --Calcul de la largeur et de la hauteur de mon formulaire With Fenetre Largeur = .Right - .Left Hauteur = .Bottom - .Top .Left = (LParent - Largeur) \ 2 .Top = (HParent - Hauteur) \ 2 End With ' --Centrer mon formulaire Call MoveWindow(frm.hwnd, Fenetre.Left, Fenetre.Top, Largeur, Hauteur, bRepaint:=True) Exit Sub Erreur: MsgBox "Erreur: " & Err.Number & vbCrLf & Err.Description End Sub