begin process at 2008 05 16 05:12:24
1 173 215 membres
57 nouveaux aujourd'hui
13 970 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CREER DYNAMIQUEMENT UN FORMULAIRE


Information sur la source

Catégorie :Fichier / Disque Classé sous : form, dynamique Niveau : Débutant Date de création : 27/09/2004 Vu : 9 709

Note :
4,5 / 10 - par 2 personnes
4,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

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.

Source

  • 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
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
  • signaler à un administrateur
    Commentaire de Saros le 27/09/2004 22:21:07

    Met-le dans la catégorie VBA...

  • signaler à un administrateur
    Commentaire de Saros le 27/09/2004 22:22:34

    Enfin sans vouloir t'offenser ni quoi que ce soit, mais en voyant comme ça on a tendance à croire que c'est du VB tout court et bon...
    Enfin c'est comme tu veux

  • signaler à un administrateur
    Commentaire de Inekman le 28/09/2004 12:18:25

    le "DoCmd", c'est bien dans Access que je le trouve.

    Dans Visual Basic 6 j'ai jamais eu l'occasion de l'utiliser et je l'ai jamais vu non plus d'ailleurs :-)

  • signaler à un administrateur
    Commentaire de Saros le 28/09/2004 12:57:42

    C'est un peu ça qui m'a perturbé, au départ je savais plus trop de quoi il était question dans le code...

  • signaler à un administrateur
    Commentaire de dragon le 29/09/2004 14:14:01

    justement ce qu'il va me faloir dans 1 ou 2 mois pour mon projet a ma job.

    Faudra juste améliorer un peu et le convertir en .Net, mais bon, la base est la

    faudrais pouvoir personnaliser un peut (logo et mise en forme personnaliser, qui sera constante pour tout les formulaire)

    en plus faudrais faire des catégories ou regroupement de donnée. Mais bon, dès que je serai rendu la, je vais le faire, a moins que ton projet est pas fini et que c'était dans tes intention de continuer ton créateur de formulaire

  • signaler à un administrateur
    Commentaire de dragon le 29/09/2004 14:15:09

    je suis d'accord, c'est du VBA et non fichier/disque

  • signaler à un administrateur
    Commentaire de trymeup le 08/11/2004 15:09:38

    Merci bcp pour ce code qui m'a bien aidé dans le developpement d'un projet sur access. Toutefois, j'ai eu qq petits soucis avec l'effacement préalable des controles dans le formulaire. En effet, la fonction "ctl.DeleteControl "F_AFFICHAGE", ctl.Name
    " ne fonctionnais pas chez moi. De plus l'effacement d'un controle dans la boucle for each, fait "sauter" Access d'un controle, d'où un controle sur deux effacé. J'ai posté mes solutions dans le topic suivant :

    http://www.vbfrance.com/forum.v2.aspx?ID=328430

    Salutations

  • signaler à un administrateur
    Commentaire de cotmar le 18/05/2005 11:08:38

    Salut amigos,
    Ce code est une vraie aubaine.
    J'ai eu la même difficulté que la personne précédente en fait.
    Sinon, j'aimerais savoir comment créer objets (différents des texbox) qui soient en fonction des types de valeurs qu'il charge de la base (par exemple une checkbox si il trouve du bouléen...).
    J'ai peut être un début de solution, mais c'est pas tellement satisfaisant à ce qu'il me semble.
    Qu'en dites vous ?
    A bientôt.
    Marco.

  • signaler à un administrateur
    Commentaire de observatoire le 03/05/2006 10:27:27

    Bonjour,
    Je crée une interface utilisateur sur VBA Access et je souhaite dans un formulaire (Form1)créer un sous-formulaire (Form2) affichant les données d'une requête. Je me suis servie de ce code pour créer le sous-formulaire, et ça marche plutôt bien, avec quelques modifications :

    ' --suppression de tous les contrôles avant de les créer de nouveau
    boucle:
    i = 0

    For Each ctl In Forms!F_AFFICHAGE.Controls
    i = 1
    DeleteControl "F_AFFICHAGE", ctl.Name
    Next ctl

    While i = 1
    GoTo boucle:
    Wend

    ET

    ' --nous ne pensons pas que vous aurez plus de 100 contrôles
    Dim controle(0 To 100) As Control


    J'ai juste un petit problème: avec ce code, mon sous-formulaire (Form2) serait défini par défaut en mode création (je n'ai pas identifié le pourquoi du comment!) ce qui empêche donc l'ouverture du formulaire (Form1) en mode formulaire.

    Si vous savez comment régler ce problème...

    à bientôt

  • signaler à un administrateur
    Commentaire de drari le 03/05/2007 17:28:15

    Petites incoherences dans le code
    il faut insérer l'égalité aussi sinon il manquera toujours un champs au formulaire
    While i <= rst.Fields.Count

  • signaler à un administrateur
    Commentaire de drari le 03/05/2007 17:36:20

    Autres remarque le count des fields en VBA n'est pas le même que celui des controles
    Les controles commencent bien à 1 d'ou le i = 1
    par contre dans un recordset (rst) le count commence à 0 donc i-1 dans ce cas-ci
    controle(i).Name = "TXT_" & rst.Fields(i-1).Name

Ajouter un commentaire

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS