Modifier

Introduction

En parcourant les forums, je suis tombé sur cette question : comment mettre en place un événement sur un groupe de champs ?

La solution initiale est d'utiliser la fonction Evenement et elle est très pertinente.

Je vous propose ici une autre solution qui est d'utiliser la propriété ..Traitement des champs. Elle permet d'ajouter un comportement à un champ lorsqu'un événement se produit.

Nous allons utiliser ce système pour ajouter un nouvel événement à tous les champs du groupe.

Les étapes

Etape 1 - Lister les champs du groupe

Dans un premier temps, je souhaite obtenir la liste des champs qui sont associé au groupe. Pour cela, nous allons utiliser la méthode EnumèreChamp. Cette méthode permet de lister les champs d'un groupe (mais aussi d'une fenêtre et d'autres éléments).

Vous pouvez définir une procédure locale à la fenêtre, mais je vous encourage à créer une procédure globale, vous pourrez ainsi l'utiliser dans toutes vos fenêtres.

PROCEDURE lister_champs_du_groupe(groupe est un Champ) : tableau de Champs
champs est un tableau de Champs

indice_champ est entier = 1

nom_champ_courant est une chaîne = EnumèreChamp(groupe, indice_champ)
TANTQUE ChampExiste(nom_champ_courant)
    champ est un Champ <- {nom_champ_courant, indChamp}
    Ajoute(champs, champ)

    indice_champ ++
    nom_champ_courant = EnumèreChamp(groupe, indice_champ)
FIN

RENVOYER champs

Etape 2 - Associer le nouveau traitement au champ

Une fois que j'ai obtenu mes champs, je souhaite associer le traitement à l'ensemble du groupe. J'ai séparé le travail en deux méthodes.

La première permet d'associer le traitement au groupe :

PROCEDURE associer_traitement_au_groupe(identifiant_traitement est entier, 
procédure_traitement est une Procédure, groupe est un Champ)

POUR TOUT champ DE lister_champs_du_groupe(groupe)
    associer_traitement_au_champ(identifiant_traitement, procédure_traitement, champ)
FIN

La seconde permet d'associer le traitement au champ, c'est dans ce code que vous verrez la syntaxe intéressante. La propriété ..Traitement permet d'associer un nouveau traitement au champ sous la forme d'une procédure (les variables de type procédure sont acceptées).

Cette propriété possède elle même deux propriétés ..Avant et ..Après qui permettent de définir si on ajoute la nouvelle procédure avant ou après la procédure déjà définie.

Enfin, il faut faire très attention à l'opérateur d'ajout. Dans l'exemple, j'utilise += pour ne pas écraser d'éventuelles traitement déjà défini sur le champ.

PROCEDURE associer_traitement_au_champ(identifiant_traitement est entier, procédure_traitement est une Procédure, champ est Champ)

champ..Traitement[identifiant_traitement]..Après += procédure_traitement

Etape 3 - Mettre en place le nouveau comportement

Je suis fin prêt à mettre en place le nouveau traitement dans ma fenêtre. Je place ce code dans le traitemet Fin d'initialisation de ma fenêtre.

Pour l'exemple, je crée les éléments suivants dans ma fenêtre :

  • un groupe de champ nommé gcSaisie ;

  • quatre champs de saisie associés au groupe gcSaisie ;

  • un libellé nommé lbChampEtHeureModification.

Je vais aussi utiliser une procédure interne nommé enregistrer_modification qui contiendra le nouveau comportement. Il faut noter que pour connaître le champ courant dans la procédure interne, on peut utiliser le mot clé MoiMême.

La constante trtModification correspond au traitement à chaque modification de lorsque vous allez dans le code du champ. Mais d'autres constantes sont disponibles sur la page associée.

associer_traitement_au_groupe(trtModification, enregistrer_modification, gcSaisie)

    PROCEDURE INTERNE enregistrer_modification()
        lbChampEtHeureModification = MoiMême..Nom + " : " + HeureVersChaîne(HeureSys(), "hh:mm:ss")
    FIN

Le libellé se met à jour chaque fois que l'un des champs est modifié en indiquant le nom du champ à l'origine de la modification et l'heure de modification.

Conclusion

Je vous ai montré comment mettre en place un traitement spécifique sur plusieurs champs sans devoir coder l'ensemble de tous les champs. Vous pouvez vous servir de cette fonctionnalité pour détecter si une fiche a été modifiée et activer / désactiver le bouton de Validation.

Vous pouvez aussi vous en servir pour mettre en place un undo / redo sur l'ensemble des champs de votre fiche.

Vous souhaitez un bonus ? C'est à vous de passer à l'action

Je vous invite à tester cette fonctionnalité et à me faire vos retours dans les commentaires. Dîtes moi dans quels contextes vous utiliseriez cette astuce. Si j'obtiens une dizaine de commentaires pertinents, je me ferai un plaisir de créer un projet mettant en scène les meilleures suggestions.

N'hésitez pas à partager ce billet sur les réseaux sociaux, cela m'aiderait beaucoup.

Enfin, si vous souhaitez vraiment m'aider à améliorer mon blog, je vous invite à répondre à ce sondage.

Merci !

J'espère que ce billet vous a plu.

Merci pour votre lecture et à bientot !

Jonathan

Article suivant Article précédent

Blog Comments powered by Disqus.