Bonjour Celtic,
Merci pour cette ressource.
Je vous invites dans la mesure du possible à commenter vos sources afin que ceux qui en ont besoin et surtout pour les débutants puissent comprendre le fonctionnement.
J'aimerais aussi faire remarquer quelques points à améliorer.
dans le constructeur de votre classe:
Citation :
Constructeur(monAide est une chaîne="", mafen est une chaîne="")
vous limiter en quelques sorte votre classe certes en optionnel à l'affichage d'une aide et puis à l'application sur une fenêtre, mais l'évenement lui s'applique à toutes tous les champs de toutes les fenêtres
Citation :
:Num_evenement=Evénement("::Numtouche","*.*",256)
::NumTouche : Appel d'une méthode globale qui à mon sens n'est pas justifiée puisque cette méthode d'appel n'est plus lié à l'instance de la classe.
Citation :
TimerSys(::Numtouche,1,999)
Pourquoi ajouter un timer qui va nécessiter des ressources système et ralentir l'application alors que la classe via l'évènement est déjà en attente d'un message windows(ici le N° 258 qui est le message Windows stipulant qu'une touche à été enfoncée.)
Le méthode principale de la classe NumTouche devrait plutot faire appel à une méthode locale ou bien globale en fonction de l'instantation de la classe elle même.
la classe devrait à mon avis ressembler plutot à ceci
//Déclaration de CLTouche
CLTouche est une classe
Num_evenement est un entier //Contient le numéro de l'évenement
l_Ntouch est un entier=0
l_str_procedure est une chaîne
l_str_fen est une chaîne
l_str_champ est une chaîne
FIN
//Méthode Init()
PROCEDURE Init(maprocedure est une chaîne, mafen est une chaîne = "*", monchamp est une chaîne = "*")
//J'utilise une méthode init plutot que constructeur pour bénéficier de l'assistance à la saise sur les paramètre de la méthode
//Ici on passe en paramètre soit:
//Que le nom de la procedure, pour une procedure globale
//Le nom de la fenetre + le nom de la procedure pour une procedure locale ex: mafen.evTouche
//on renseigne mafen si l'on veut limiter l'interception de l'évènement que sur cette fenetre
//on renseigne monchamp si l'on veut limiter sur un seu champ
sBuf est une chaîne
:l_str_procedure = maprocedure
:l_str_fen = mafen
:l_str_champ = monchamp
//Ici on construit la portée de l'évènement
sBuf = mafen
sBuf = sBuf <> "" ? mafen + "." +monchamp SINON monchamp
//On créer l'évènement et on récupère son numéro
//256 est le N° de message pour l'appui sur une touche du clavier
:Num_evenement=Evénement(":Numtouche", sBuf, 256)
//Métode NumTouche
PROCEDURE NumTouche()
nretour est un entier
sBuf est une chaîne
QUAND EXCEPTION DANS
//On execute la procedure défini dans le constructeur de la classe
ExécuteTraitement( :l_str_procedure, trtProcédure, :l_str_fen, :l_str_champ, _EVE.wParam, nretour = Null )
//Ici on donne la possibilité d'inhiber la touche enfoncé en lui passant la valeur 0
//ou bien simuler une autre touche en lui passant la valeur de cette touche.
SI nretour <> Null ALORS _EVE.Retour = nretour
FAIRE
//Ici on arrete le prog si la procedure n'a pas été déclarée dans le programme en lui passant la syntaxe exacte
//Puis on copie cette syntaxte dans le presse papier pour la recopier dans le code.
sBuf = "PROCEDURE " + :l_str_procedure + "( mafen est une chaine, monchamp est une chaine, nummessage est un entier, nretour = Null )"
VersPressePapier(sBuf)
FinProgramme("Problème déclaration de procédure, impossible de trouver la procédure :" + RC...
+ sBuf + RC...
+ "La déclatation de la procédure a été copiée dans le presse papier." )
FIN
Cette classe permet de s'adapter à la procédure créée en locale ou en globale par le développeur sans avoir à modifier la classe
On créer donc une procedure en locale suivant la syntaxe défini dans la classe
PROCEDURE evTouche( mafen est une chaine, monchamp est une chaine, nummessage est un entier, nretour = Null )
//Pour nRetour le type variant n'est pas déclaré Variant provoque une erreur et la procédure n'est plus trouvée.
SI (_EVE.wParam) = 116 OU (_EVE.wParam) = 112 OU (_EVE.wParam)=113 ALORS
SELON nummessage
CAS 116:
FinProgramme()
CAS 112: WHelp("<UneAide>",1)
CAS 113: _EVE.wParam=0
Ouvre("<Une fenetre>")
AUTRE CAS:
//On peut par exemple ici hiniber la touche enfoncé en initialisant nRetour à 0
nretour = 0
FIN
FIN