Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Forms: Changer la couleur de l'arrière plan de l'enregistrement ayant le focus, dans un formulaire "continu"

Author(s)
James H Brooks

Changer la couleur de l'arrière plan de l'enregistrement ayant le focus, dans un formulaire "continu".

     Changer la couleur d'arrière plan dans un formulaire présentant les enregistrements "en continu" est souvent demandé comme question dans les groupes de discussions d'Access. Le document suivant vous montre comment on peut y parvenir, de même que la méthodologie derrière le fonctionnement.

     Télécharger ConForm.zip

 

Cet exemple est basé sur la table "Products" de Northwinds. Les modifications apportées sont mentionnées de sorte que vous puissiez adapter le cas à votre situation.

  1. Créer un formulaire basé sur la table "Products".
  2. Ajouter tous les champs de la table dans le formulaire.
  3. Créer les contrôles suivants sur le formulaire

Name: CtlBack
Control Source: =IIf([SelTop]=[ctlCurrentLine],"ÛÛÛÛÛÛÛÛÛÛÛÛ",Null)

    "Û" est le caractère 0219. Une façon de l'obtenir est de le copier-coller depuis ici-même. La police de caractère utilisée doit être Terminal.

    Positionner ce contrôle de sorte qu'il couvre complètement la portion de la section détail que vous désirez couvrir. Expérimenter avec le nombre de  "Û" de même qu'avec la dimension, en point, de la police de caractères (font size). Spécifier un background transparent. La couleur du foreground, du texte, est à votre choix, c'est la couleur "highlight" qui mettra en évidence l'enregistrement actuel. S'assurer que la couleur du fond de la section détail n'est pas la même que celle du "highlight".

    Ensuite, pour tous les contrôles devant être mis en évidence, les sélectionner, changer leur couleur d'arrière plan (background) pour celle de "highlight" et, par après, choisir le mode transparent pour cet arrière-plan. (Oui, cette étape est nécessaire).

    Les deux contrôles suivants peuvent être positionnés n'importe où, et sont cachés. Vous pouvez les laisser visibles pour vous aider à trouver divers bugs, si requis, mais cachez les par la suite.

Name: ctlCurrentLine
Control Source:=GetLineNumber()

Name: ctlCurrentRecordControl
Source: unbound

Ajouter le code qui suit derrière le formulaire:

'****************** Code Start *******************
'
Function GetLineNumber()
'La fonction  "GetLineNumber" est une version modifiée de celle présenté dans la base
' de connaissance de Microsoft (Q120913), la différence étant qu'on a inscrit les constantes
'dans le code:F, KeyName, KeyValue (dans un but d'accroître la performance)
' Changer KeyName et KeyValue pour la clé de votre propre table.

Dim RS As Recordset
Dim CountLines
Dim F As Form
Dim KeyName As String
Dim KeyValue

Set F = Form
KeyName = "productid"
KeyValue = [ProductID]

         On Error GoTo Err_GetLineNumber
         Set RS = F.RecordsetClone
         ' Trouver l'enregistrement actuel.
         Select Case RS.Fields(KeyName).Type
            ' la clé est numérique.
            Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
            DB_DOUBLE, DB_BYTE
               RS.FindFirst "[" & KeyName & "] = " & KeyValue
            ' la clé est une date
            Case DB_DATE
               RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
            ' la clé est une chaîne
            Case DB_TEXT
               RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
            Case Else
            MsgBox "ERROR: Invalid key field data type!"
               Exit Function
               End Select
         ' Compte à rebours.
         Do Until RS.BOF
            CountLines = CountLines + 1
            RS.MovePrevious
            Loop
Bye_GetLineNumber:               ' Retourne le résultat
         GetLineNumber = CountLines
         Exit Function
Err_GetLineNumber:
      CountLines = 0
      Resume Bye_GetLineNumber
End Function

Private Sub Form_Click()
   Me!ctlCurrentRecord = Me.SelTop
End Sub

Private Sub Form_Current()
   Me!ctlCurrentRecord = Me.SelTop
End Sub
'****************** Code End *******************

Fonctionnement du code:

    Lorsque vous ouvrez le formulaire, la fonction  GetLineNumber retourne le numéro de l'enregistrement et l'assigne à "ctlCurrentLine". Lorsque vous naviguez entre les enregistrements, le code "Me!ctlCurrentRecord = Me.SelTop" change la valeur de "ctlcurrentRecord" pour celle de l'enregistrement actuel (Voir le fichier d'aide d'Access au sujet de "SelTop"). Le code de "ctlBack" compare "SelTop" à "ctlCurrentLine" et seulement si les deux valeurs sont égales, c'est-à-dire pour l'enregistrement actuel, le "highlight" apparaît. Puisque le background de tous les contrôles sont transparents, le format fournit la couleur en background.

Notes:

    Même si du premier coup d'oeil il semble que  "ctlCurrentRecord" ne soit pas requis, c'est lui qui effectivement force une mise à jour lorsque vous naviguez entre les enregistrements. Le code tel qu'écrit détecte le changement d'enregistrement par: clic de souris ou de clavier, clic sur un sélecteur (de par Form_Click), et utilisant bien sûr les boutons de navigations. Si vous naviguez de par du code, vous devrez apporter les changements requis pour conserver la fonctionnalité, voir plus bas.

    La performance est affectée par la machine utilisée. Sur les machines les plus lentes, vous observerez que les cellules individuelles prennent la couleur désirée, lentement, puis, toute la ligne prend la couleur du "highlight".

    Il y a plusieurs choses qui peuvent être faite dans un formulaire en continu, tel qu'effacer, ajouter, éditer, etc. Le code présenté ne porte attention qu'aux navigations citées plus haut seulement. Dans les autres cas, c'est de votre responsabilité de modifier votre formulaire de sorte que vous fassiez appel à  "GetLineNumber" (via un  Form.Refresh, par exemple). Puisque cela pénalise la performance, ne le faire que si cela est requis.

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer