--- Soumis par 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
La procédure ci-dessous s'intéresse principalement à mettre en évidence l'enregistrement ACTUEL dans un tel formulaire. Voir les notes à la fin pour voir ce que la procédure NE FAIT PAS.
L'exemple est basé sur la table "Products" table de Northwinds. Les changements requis pour individualiser la procédure sont annotés.
Name: CtlBack
Control Source: =IIf([SelTop]=[ctlCurrentLine],"ÛÛÛÛÛÛÛÛÛÛÛÛ",Null)
"Û" est le caractère 0219. Le copier d'ici si votre clavier ne peut mettre d'accent sur les majuscules. La police de caractère à utiliser est 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 background pour celle de "highlight" et mettre, par après, choisir le mode transparent pour leur background. (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
Add the following code behind the form:
'****************** 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 enregistrement, 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 faire 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.