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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Remplir un rectangle/textbox à coins arrondis [AC-2007]


Sujet :

IHM

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Remplir un rectangle/textbox à coins arrondis
    Bonjour à tous,

    Tout d'abord, j'espère que j'écris ce post dans la bonne section du forum (oui je suis tout nouveau ici), veuillez m'en excuser sinon.

    Je cherche depuis quelques jours à entourer les textboxs présentes sur un état access d'un rectangle à coin arrondis (pourquoi faire compliqué...).
    Ces textboxs sont dynamiques et leur taille varie selon l'enregistrement qu'elles renvoient.


    Pour cela, je suis tombé sur un excellent tuto de ce site http://starec.developpez.com/tuto/ecriredessineretats/, et j'ai réussi à tracer ce fameux rectangle en utilisant la fonction roundrectangle proposée par l'auteur, à la section III-A2. Mes textboxs sont donc désormais entourées de rectangles à bords arrondis, et c'est déjà pas mal.

    Mon problème est que je souhaiterais remplir ce rectangle, avec un fond et une couleur bien particulière. J'ai donc essayé de modifier le code de ce tuto code en intégrant des "fillstyle" et "fillcolor" mais rien n'y fait.

    Je pense que le problème vient du fait que la la méthode employée ne trace pas des rectangles à proprement parler, mais plutôt un ensemble de lignes, c'est à dire que l'objet dessiné n'existe pas réellement.

    Quelqu'un aurait-il une piste ou une solution pour pouvoir remplir un tel rectangle, sachant que je veux conserver le fait qu'il dépende de la taille de mes textboxs?

    Merci beaucoup,

    Xavi

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Rebonjour à tous,

    Pour info, voici le code que j'utilise (qui n'est ni plus ni moins que ce qui se trouve dans le tuto, n'arrivant toujours pas à insérer ce qui me permettrait de colorier le fond du rectangle, en ayant déja testé pas mal de variantes)

    Il est inséré dans une procédure évènementielle "au formatage" de mon état et fonctionne parfaitement.



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Sub RoundRectangle(rpt As Report, ctrlDebut As Control, ctrlFin As Control, _
                              blnHautGauche As Boolean, blnHautDroit As Boolean, _
                              blnBasGauche As Boolean, blnBasDroit As Boolean, _
                              lngRayon As Long, lngDecalage As Long, lngColorTrait As Long)
        ' ======================================================================================
        ' Procedure     : Module :Routiones // Procédure : RoundRectangle
        ' DateTime      : 01/11/2007 18:11
        ' Auteur        : Starec - Philippe JOCHMANS - http://starec.developpez.com
        ' Description   : Cette procédure va permettre de réaliser un groupe de rectangles avec
        '                 pleins d'options
        '                 rpt : nom de l'état
        '                 ctrlDebut : nom du contrôle le plus en haut à gauche
        '                 ctrlFin : nom du contrôle le plus en bas à droite
        '                 blnBasHautGauche : si true, l'angle est arrondi et ainsi de suite pour les autres
        '                 lngRayon : rayon de l'arrondi
        '                 lngDecalage : décalage du cadre par rapport au ctrl de début et de fin
        '                 lngColorTrait : Couleur du trait
        '=======================================================================================
     
        ' ===== constante =====
        Const PI = 3.14159265359
     
        ' ===== déclaration des variables =====
        Dim lngTop As Long ' position top du rectangle
        Dim lngLeft As Long ' position left du rectangle
        Dim lngWidth As Long ' largeur du rectangle
        Dim lngHeight As Long ' hauteur du rectangle
     
     
        ' ===== affectation =====
        lngTop = ctrlDebut.Top - lngDecalage
        lngLeft = ctrlDebut.Left - lngDecalage
        lngWidth = ctrlFin.Left + ctrlFin.Width - ctrlDebut.Left + (lngDecalage * 2)
        lngHeight = ctrlFin.Top + ctrlFin.Height - ctrlDebut.Top + (lngDecalage * 2)
     
        ' ==== dessin des angles ====
        If blnHautGauche Then ' si le haut gauche est arrondi
               rpt.Circle (lngLeft + lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, PI / 2, PI
        Else
            rpt.Line (lngLeft, lngTop)-(lngLeft + lngRayon, lngTop), lngColorTrait
            rpt.Line (lngLeft, lngTop)-(lngLeft, lngTop + lngRayon), lngColorTrait
     
        End If
        If blnHautDroit Then ' si le haut droit est arrondi
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, 0, PI / 2
     
        Else
            rpt.Line (lngLeft + lngWidth - lngRayon, lngTop)-(lngLeft + lngWidth, lngTop), lngColorTrait
            rpt.Line (lngLeft + lngWidth, lngTop)-(lngLeft + lngWidth, lngTop + lngRayon), lngColorTrait
     
        End If
        If blnBasDroit Then ' si le bas droit est arrondi
            rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI + PI / 2, 0
     
        Else
     
            rpt.Line (lngLeft + lngWidth, lngTop + lngHeight - lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight), lngColorTrait
            rpt.Line (lngLeft + lngWidth, lngTop + lngHeight)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngColorTrait
        End If
        If blnBasGauche Then ' si le bas gauche est arrondi
            rpt.Circle (lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI, PI + PI / 2
        Else
            rpt.Line (lngLeft, lngTop + lngHeight - lngRayon)-(lngLeft, lngTop + lngHeight), lngColorTrait
            rpt.Line (lngLeft, lngTop + lngHeight)-(lngLeft + lngRayon, lngTop + lngHeight), lngColorTrait
        End If
     
        ' ==== dessin des cotés =====
        ' coté haut
     
        rpt.Line (lngLeft + lngRayon, lngTop)-(lngLeft + lngWidth - lngRayon, lngTop), lngColorTrait
        ' coté droit
        rpt.Line (lngLeft + lngWidth, lngTop + lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight - lngRayon), lngColorTrait
          ' coté bas
        rpt.Line (lngLeft + lngRayon, lngTop + lngHeight)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngColorTrait
         ' coté gauche
        rpt.Line (lngLeft, lngTop + lngRayon)-(lngLeft, lngTop + lngHeight - lngRayon), lngColorTrait
     
     
    End Sub
    ' Appel de la routine
    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
     
     
     Call RoundRectangle(Me, Me.Étiquette58, Me.txtboxdescri_act, True, True, True, True, 200, 50, vbBlack)
     
    End Sub
    En espérant que ça puisse aider...

    Une bonne âme?

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 365
    Points : 23 835
    Points
    23 835
    Par défaut
    Bonjour,

    en effet je ne pense pas que tu puisse remplir la forme que tu as déssiné et je te suggère un remplissage par morceaux.

    Au lieux de tracer un arc de cercle, trace un angle de la couleur que tu veux dans chacun des coins puis dessine 5 rectangles pleins (ou seulement 3) pour compléter le dessin.

    Donc tu traces
    • les 4 "angles" (1/4 de rond).
    • 1 rectangle entre l'arc supérieur gauche et supérieur droit. Ce rectangle à la hauteur du rayon de l'arc et la largeur du rectangle - 2 * rayon arc.
    • 1 rectangle entre l'arc supérieur droit et inférieur droit. Ce rectangle à la largeur du rayon de l'arc et la hauteur du rectangle - 2 * rayon arc.
    • 1 rectangle entre l'arc inférieur gauche et inférieur droit. Ce rectangle à la hauteur du rayon de l'arc et la largeur du rectangle - 2 * rayon arc.
    • 1 rectangle entre l'arc supérieur gauche et inférieur gauche. Ce rectangle à la largeur du rayon de l'arc et la hauteur du rectangle - 2 * rayon arc.
    • 1 rectangle insrcit qui à pour dimension (Hauteur du rectangle - 2 * rayon) arc et (Largeur du rectangle - 2 * rayon arc)


    Si la bordure et le remplissage sont de couleur différentes, il se peut que tu doives tracer le "rectange composite" de couleur d'abors puis les bordures ensuite pour que les bordures soient visibles.

    Et il faudra sans doutre mettre le texte après.

    A+

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Les rectangles arrondis sont une succession de lignes et courbes, il ne s'agit donc pas d'une forme fermée qui peut-être remplie.

    Comme il est dit précédemment, il faut faire une succession de figures en utilisant ce qu'il y a dans le tuto comme ici pour les angles : http://starec.developpez.com/tuto/ec...etats/#LII-G-7

    Philippe

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour à tous,

    Merci beaucoup pour ces précieuses informations!

    Je vais tenter d'adapter ça de suite et reviens vers vous dès que j'ai quelquechose qui marche.

    Merci encore,

    Xavi

  6. #6
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Bonjour,


    Ces textboxs sont dynamiques et leur taille varie selon l'enregistrement qu'elles renvoient.
    Peux-tu montrer la partie de ton code qui te permet de récupérer la taille prise par la zone de texte à l'instant où elle est remplie ?

    Mon idée serait de superposer 2 contrôles :

    - la zone de liste, transparente
    - une image en arrière-plan

    et d'adapter les dimensions de l'image en fonction de celles de la zone de liste.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour ClaudeLELOUP,

    Je ne suis pas sûr de comprendre parfaitement la question, mais cela vient peut-être du fait que je me suis mal exprimé en parlant de textboxs dynamiques.

    En fait, j'ai créé les textboxs dans l'état (donc elles existent sans aucun code préalable), et elles renvoient le contenu d'un champ qui varie (beaucoup lui) selon les choix de l'utilisateur du formulaire.

    Toutes ces instructions sont gérées par un code placé dans la procédure événementielle du bouton de commande qui affiche l'état.
    Ces textboxs sont auto-réductibles/autoextensible (ce qui n'est pas très optimal d'après ce que j'ai pu lire) mais il 'y a pas de code à proprement parler (autre que celui que j'ai collé) qui récupère la taille des textboxs.

    En espérant répondre à votre question...

  8. #8
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Merci.

    La hauteur instantanée de la zone de texte peut être récupérée dans l'événement Sur impression de la section qui contient la zone de texte, mais c'est alors trop tard pour adapter la hauteur d'un autre contrôle.

    J'avais pensé à ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Détail_Print(Cancel As Integer, PrintCount As Integer)
    Me.Limage.Height = Me.LaZdt.Height
    End Sub
    mais :



    Par contre, on pourrait adapter la hauteur de l’image dans l’événement sur formatage de la section. Par exemple en fonction de la longueur instantanée de la zone de texte.

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
      If Len(Me.LaZdt) > 10 Then
         Me.Limage.Height = 593
        Else
         Me.Limage.Height = 240
      End If
    End Sub
    En creusant, on pourrait trouver un code plus générique.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Rebonjour,

    J'ai suivi les conseils de marot_r et de Philippe (que je remercie beaucoup au passage) et voici ce que j'ai bricolé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Public Sub RondRectangle(rpt As Report, ctrlDebut As Control, ctrlFin As Control, lngRayon As Long, lngDecalage As Long, lngColorTrait As Long)
     
     
     
     
        ' ===== constante =====
        Const PI = 3.14159265359
     
        ' ===== déclaration des variables =====
        Dim lngTop As Long ' position top du rectangle
        Dim lngLeft As Long ' position left du rectangle
        Dim lngWidth As Long ' largeur du rectangle
        Dim lngHeight As Long ' hauteur du rectangle
     
     
        ' ===== affectation =====
        lngTop = ctrlDebut.Top - lngDecalage
        lngLeft = ctrlDebut.Left - lngDecalage
        lngWidth = ctrlFin.Left + ctrlFin.Width - ctrlDebut.Left + (lngDecalage * 2)
        lngHeight = ctrlFin.Top + ctrlFin.Height - ctrlDebut.Top + (lngDecalage * 2)
     
        ' ==== dessin des angles ====
        'haut gauche
        rpt.Circle (lngLeft + lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, PI / 2, PI
        'haut droit
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, 0, PI / 2
        'bas droit arrondi
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI + PI / 2, 0
        'bas gauche
        rpt.Circle (lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI, PI + PI / 2
     
     
     
        ' ==== rectangles horizontaux =====
        ' rectangle haut
     
        rpt.Line (lngLeft + lngRayon, lngTop)-(lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngColorTrait, BF
        ' rectangle bas
        rpt.Line (lngLeft + lngRayon, lngTop + lngHeight - lngRayon)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngColorTrait, BF
     
     
        '=====rectangles verticaux=======
        'rectangle gauche
        rpt.Line (lngLeft, lngTop + lngRayon)-(lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngColorTrait, BF
        'rectangle droit
        rpt.Line (lngLeft + lngWidth - lngRayon, lngTop + lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight - lngRayon), lngColorTrait, BF
        'rectangle central
        rpt.Line (lngLeft + lngRayon, lngTop + lngRayon)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngColorTrait, BF
     
    End Sub
    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
     
       Call RondRectangle(Me, Me.Étiquette58, Me.txtboxdescri_act, 200, 50, vbRed)
     
    End Sub

    Résultat: ça marche plutôt pas mal () SAUF que je ne n'arrive pas à colorier le fond des arcs de cercle. La forme est donc parfaite pour ce que je veux, mais les arcs restent désespérément blancs...

    J'ai essayé d'insérer des fillstyle/fillcolor un peu partout et ils me résistent toujours. Je m'en remets donc une fois de plus à votre science.

    Merci encore.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Salut Claude

    J'avais pensé à cette histoire de l'image, mais lors de l'agrandissement de celle-ci sur un coté, le coin arrondi n'est pas agrandi en proportion, il est déformé.

    Pour garder un coin proportionné, il faut agrandir et élargir proportionnellement.

    Philippe

  11. #11
    Invité
    Invité(e)
    Par défaut
    Re

    Je ne vois pas de FillColor dans ton code ?

    Philippe

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Exact. Je les ai enlevés. La honte sûrement.

    J'avais tenté de les insérer juste avant l'instruction circle comme dans le tuto :
    "rpt.FillColor=lngcolortrait
    "rpt.FillStyle=0

    J'ai aussi essayé avec vbRed à la place de lngcolortrait (qui revient au même ici), et aussi sans le "rpt." (ce qui est une bêtise).

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Plus concrètement, voilà ce que ça donne:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Sub RondRectangle(rpt As Report, ctrlDebut As Control, ctrlFin As Control, lngRayon As Long, lngDecalage As Long, lngColorTrait As Long)
     
     
     
     
        ' ===== constante =====
        Const PI = 3.14159265359
     
        ' ===== déclaration des variables =====
        Dim lngTop As Long ' position top du rectangle
        Dim lngLeft As Long ' position left du rectangle
        Dim lngWidth As Long ' largeur du rectangle
        Dim lngHeight As Long ' hauteur du rectangle
     
     
        ' ===== affectation =====
        lngTop = ctrlDebut.Top - lngDecalage
        lngLeft = ctrlDebut.Left - lngDecalage
        lngWidth = ctrlFin.Left + ctrlFin.Width - ctrlDebut.Left + (lngDecalage * 2)
        lngHeight = ctrlFin.Top + ctrlFin.Height - ctrlDebut.Top + (lngDecalage * 2)
     
        ' ==== dessin des angles ====
        'haut gauche
        rpt.FillColor = lngColorTrait
        rpt.FillStyle = 0
        rpt.Circle (lngLeft + lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, PI / 2, PI
        'haut droit
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngRayon, lngColorTrait, 0, PI / 2
        'bas droit arrondi
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI + PI / 2, 0
        'bas gauche
        rpt.Circle (lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngColorTrait, PI, PI + PI / 2
     
     
     
        ' ==== rectangles horizontaux =====
        ' rectangle haut
     
        rpt.Line (lngLeft + lngRayon, lngTop)-(lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngColorTrait, BF
        ' rectangle bas
        rpt.Line (lngLeft + lngRayon, lngTop + lngHeight - lngRayon)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngColorTrait, BF
     
     
        '=====rectangles verticaux=======
        'rectangle gauche
        rpt.Line (lngLeft, lngTop + lngRayon)-(lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngColorTrait, BF
        'rectangle droit
        rpt.Line (lngLeft + lngWidth - lngRayon, lngTop + lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight - lngRayon), lngColorTrait, BF
        'rectangle central
        rpt.Line (lngLeft + lngRayon, lngTop + lngRayon)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngColorTrait, BF
     
    End Sub
    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
     
       Call RondRectangle(Me, Me.Étiquette58, Me.txtboxdescri_act, 200, 50, vbRed)
     
    End Sub

  14. #14
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Points : 281 917
    Points
    281 917
    Par défaut
    Bonjour,

    Pour le fun !
    Cette image :



    logée n’importe où dans la section Détail, en arrière-plan :




    À l’ouverture de l’état

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Option Compare Database
    Option Explicit
      Const iBordure = 150  '150 twips débordement de la zone de texte
      Const iMaxParLigne = 21 'Nbre de caractères maximun par ligne
    Private Sub Report_Open(Cancel As Integer)
      Me.Limage.Top = Me.LaZdt.Top - iBordure
      Me.Limage.Left = Me.LaZdt.Left - iBordure
      Me.Limage.Width = Me.LaZdt.Width + 2 * iBordure
    End Sub
    Explication
    Ligne 3 : on définit une constante iBordure par exemple à 150 l’image débordera de 150 twips de tous côtés de la zone de texte extensible.
    Ligne 4 : le nombre de caractères que peut contenir une ligne de la zone de texte contrainte la police du texte doit être non proportionnelle (Courier par exemple).
    Lignes 5 à 9 : on positionne l’image en fonction de la position de la zone de texte cette dernière doit être suffisamment bas pour permettre la bordure.

    Pour la mise au point du code, j’ai d’abord fait un test pour savoir comment la hauteur de la zone de texte évoluait. C’est la seule raison d’être des contrôles HautZdt et HautImage et de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Détail_Print(Cancel As Integer, PrintCount As Integer)
    Me.hautzdt = Me.LaZdt.Height
    Me.hautImage = Me.Limage.Height
    End Sub
    Cela m’a permis de constater que chaque fois que la zone de texte prenait une ligne supplémentaire, sa hauteur augmentait de 211 twips (dont propre à mon exemple).
    J’ai donc calculé la hauteur que devrait avoir l’image pour chaque enregistrement dans l’événement Au formatage de la section Détail

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
       Me.Limage.Height = Me.LaZdt.Height _
                      - (Len(Me.LaZdt) > iMaxParLigne) * (Fix(Len(Me.LaZdt) / iMaxParLigne) - 1) * 211 _
                      + 2 * iBordure + 9  'J'ignore pourquoi ajouter 9
    End Sub
    Explication



    La partie jaune vaudra
    zéro si la zone de texte contient au maximum 21 caractères
    et +1 sinon.
    La partie verte donne le nombre de lignes au-delà de la première.
    J’ignore pourquoi, mais j’ai constaté durant les tests que j’étais systématiquement 9 twips trop court : je les ai ajoutés, sans scrupules, pour que le compte soit bon (300 twips de plus que la zone de texte.

    Philippe a raison, l’image est un peu biaisée lorsqu’on doit l’agrandir, voyez dans l’exemple quand la zone de texte contient 17 lignes.

    La BdD qui m’a servi à mettre au point est ici : http://claudeleloup.developpez.com/&...ArrondiZdt.mdb

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Bonjour Claude,

    Tout d'abord un grand merci pour s'être penché aussi longtemps sur mon problème, et bravo pour la solution de l'image qui s'adapte, je trouve ça génial.

    Cependant, j'ai un petit soucis avec cette solution. J'utilise en effet une charte graphique bien précise (avec plusieurs couleurs correspondant à des codes RGB précis). Le problème que je rencontre en important de Word sur ACCESS une image comme le cadre bleu que tu présentes en exemple, c'est que bien qu'en générant ce cadre avec le même code RGB sur Word, la couleur change légèrement une fois sur ACCESS, et cela n'est visible qu'à l'impression.

    Je m'explique. Sur Word, je choisis un code rgb précis pour le cadre aux angles arrondis. Dès que l'image est importée sous Access en suivant ta méthode ou pas, la couleur est différente à l'impression de celle choisie et imprimée sous ACCESS ou Word avec le même code. Je sais bien que ce sont des détails, mais ils ont leur importance...

    Voila pourquoi je m'entête et continue d'espérer une solution pour pouvoir remplir les 4 quarts de cercles blancs directement en écrivant dans la procédure modifiée de Philippe sur ACCESS.

    En tout cas merci encore.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Eurêka !

    Mon soucis provenait du fait que j'avais tracé des quarts de cercle, et non des cercles. Cela importe peu mais ACCESS n'arrive pas à colorier les fond de quarts de cercle...

    En traçant des cercles, le fond est rempli et tout mon rectangle est uniforme.

    Comme le fond des coins est le même que le fond du rectangle entier, ça ne change absolument rien au résultat.

    Bref ça marche!

    Voici le code final que j'utilise pour info:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Sub RondRectangle(rpt As Report, ctrlDebut As Control, ctrlFin As Control, lngRayon As Long, lngDecalage As Long, lngcolortrait As Long)
     
     
     
     
        ' ===== constante =====
        Const PI = 3.14159265359
     
        ' ===== déclaration des variables =====
        Dim lngTop As Long ' position top du rectangle
        Dim lngLeft As Long ' position left du rectangle
        Dim lngWidth As Long ' largeur du rectangle
        Dim lngHeight As Long ' hauteur du rectangle
     
     
        ' ===== affectation =====
        lngTop = ctrlDebut.Top - lngDecalage
        lngLeft = ctrlDebut.Left - lngDecalage
        lngWidth = ctrlFin.Left + ctrlFin.Width - ctrlDebut.Left + (lngDecalage * 2)
        lngHeight = ctrlFin.Top + ctrlFin.Height - ctrlDebut.Top + (lngDecalage * 2)
     
        ' ==== dessin des angles ====
        'haut gauche
        rpt.FillColor = lngcolortrait
        rpt.FillStyle = 0
        rpt.Circle (lngLeft + lngRayon, lngTop + lngRayon), lngRayon, lngcolortrait
        'haut droit
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngRayon, lngcolortrait
        'bas droit arrondi
        rpt.Circle (lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngcolortrait
        'bas gauche
        rpt.Circle (lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngRayon, lngcolortrait
     
     
     
     
        ' ==== rectangles horizontaux =====
        ' rectangle haut
        rpt.Line (lngLeft + lngRayon, lngTop)-(lngLeft + lngWidth - lngRayon, lngTop + lngRayon), lngcolortrait, BF
        ' rectangle bas
        rpt.Line (lngLeft + lngRayon, lngTop + lngHeight - lngRayon)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight), lngcolortrait, BF
     
     
        '=====rectangles verticaux=======
        'rectangle gauche
        rpt.Line (lngLeft, lngTop + lngRayon)-(lngLeft + lngRayon, lngTop + lngHeight - lngRayon), lngcolortrait, BF
        'rectangle droit
        rpt.Line (lngLeft + lngWidth - lngRayon, lngTop + lngRayon)-(lngLeft + lngWidth, lngTop + lngHeight - lngRayon), lngcolortrait, BF
     
        '======rectangle central=======
        'rectangle central
        rpt.Line (lngLeft + lngRayon, lngTop + lngRayon)-(lngLeft + lngWidth - lngRayon, lngTop + lngHeight - lngRayon), lngcolortrait, BF
     
     
     
     
     
    End Sub
    Private Sub Détail_Format(Cancel As Integer, FormatCount As Integer)
     
    Call RondRectangle(Me, Me.Étiquette58, Me.txtboxdescri_act, 200, 50, vbRed)
     
    End Sub
    Merci à tous pour vos précieuses contributions!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rectangles avec coins arrondis
    Par ver_for dans le forum IHM
    Réponses: 2
    Dernier message: 10/11/2008, 14h44
  2. XAML : un rectangles avec les coins arrondies en haut.
    Par Archeone dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 09/11/2008, 22h11
  3. [Photoshop] Transformer un rectangle au coins arrondis
    Par stanley dans le forum Imagerie
    Réponses: 1
    Dernier message: 22/04/2008, 13h16
  4. Ihm aux coins arrondis
    Par nico31120 dans le forum Agents de placement/Fenêtres
    Réponses: 10
    Dernier message: 25/11/2005, 07h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo