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.
- Créer un formulaire basé sur la table "Products".
- Ajouter tous les champs de la table dans le formulaire.
- 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:
Function GetLineNumber()
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
Select Case RS.Fields(KeyName).Type
Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
DB_DOUBLE, DB_BYTE
RS.FindFirst "[" & KeyName & "] = " & KeyValue
Case DB_DATE
RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
Case DB_TEXT
RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
Case Else
MsgBox "ERROR: Invalid key field data type!"
Exit Function
End Select
Do Until RS.BOF
CountLines = CountLines + 1
RS.MovePrevious
Loop
Bye_GetLineNumber:
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
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.
|