Connaître l'origine d'une action sur un composant (utilisateur ou code)
cs_orelien
Messages postés137Date d'inscriptiondimanche 7 juillet 2002StatutMembreDernière intervention11 janvier 2009
-
18 oct. 2006 à 23:21
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 2013
-
19 oct. 2006 à 15:05
Bonjour,
Je prend le cas d'un composant TEdit sur lequel une actio est placée sur son évènement OnChange.
Comment faire pour contrôler si c'est l'utiisateur qui appel cet évènement en modifiant le texte du TEdit ou bien le code en lui même comme une procédure modifiant le TEdit également ?
J'aimerais ainsi éxécuter cette action OnChange uniquement lorsque l'utilisateur éffectue ce changement.
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 18 oct. 2006 à 23:56
Salut,
Tu peux placer une variable booléenne dans l'évènement OnKeyPress de l'Edit.
Exemple :
var
UserKeyPress: Boolean;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if UserKeyPress then
begin
ShowMessage('Changement effectué par l''utilisateur');
UserKeyPress := False;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
UserKeyPress := True;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Edit1.Text + 'X';
end;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 19 oct. 2006 à 09:38
sauf que si l'utilisateur fait click droit->coller, ca marche pas.
moi j'te conseille plutot d'utiliser la meme technique mais dans l'autre sens, c'est a dire que tu te fait une fonction
var
UserEdit: Boolean=true;
procedure SetEditText(str: string);
var
save: boolean;
begin
save := UserEdit;
UserEdit := false;
MonEdit.Text := str;
UserEdit := save;
end;
et dans ton onChange de l'edit tu peu verifier si c'est l'utilisateur qui effectue l'action
procedure MonEditChange(Sender: TObject);
begin
if UserEdit then
showmessage('utilisateur')
else
showmessage ('code');
end;
sinon, encore plus propre je pense, mais plus long : tu fais un composant herité en rajoutant une propriete UserEdit et en surchargant la methode SetText un peu comme ca :
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 19 oct. 2006 à 11:38
Salut,
est ce que quelqu'un l'a testé au moins
moi il y a juste un truc qui me chagrine dans la proposition de Guillemouze et c'est dans la Procedure SetEditText :
UserEdit renvoie toujours False au moment du changement de Texte !!!
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 19 oct. 2006 à 12:08
Salut Cirec,
Oui, quelqu'un l'a testée, moi...
Sinon j'aurais pas envoyé des fleurs à Guillemouze (elles sont chères, lol).
Sérieux, chez moi y'a pas de problème...
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 19 oct. 2006 à 12:24
l'evenement OnChange est appelé par la procedure Change, qui correspond à l'interception d'un message EN_CHANGE .
ce que tu peux faire, qui est un peu de la bidouille, c'est de stocker la valeur precedente de l'edit, et lorsque le onchange est appelé, tu verifie si la valeur correspond a ta variable. ton SetEditText (procedure que tu appele si tu veu modifier l'edit a partir du code) ressemblerai plus a ca:
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 19 oct. 2006 à 12:29
oui useredit renvoie toujours false au moment du changement du texte, si tu modifie le texte grace a cette fonction.
par contre ce qui me fait peur, c'est que, vu que c'est un message de notification de change, il se peut que la ligne
userEdit := save;
soit appelée avant l'interception du message de change, mais je ne sais pas si c'est possible etant donné qu'on ne manipule pas de threads, a quel moment le message est intercepté? juste apres le monedit.text := Value; ou alors on ne sait pas vraiment?
la j'avoue que cette question me chagrine quand meme !!!
cs_orelien
Messages postés137Date d'inscriptiondimanche 7 juillet 2002StatutMembreDernière intervention11 janvier 2009 19 oct. 2006 à 12:54
Bonjour,
merci des réponses.
N'y a t'il pas un moyen autre que de passer par des variables booléennes comme celles-ci pour détecter l'origine de l'action ?
Par exemple, pour connaitre le nom du composant concerné on peut utiliser "Sender", n'y a t'il pas une soltution de ce genre pour cela ?
japee
Messages postés1727Date d'inscriptionvendredi 27 décembre 2002StatutModérateurDernière intervention 6 novembre 20218 19 oct. 2006 à 13:15
Salut orelien,
Oui, je pense qu'on pourrait faire comme ça :
var
EditText: string;
procedure TForm1.Edit1Change(Sender: TObject);
begin
if Sender is TEdit then
ShowMessage('utilisateur')
else
begin
Edit1.OnChange := nil;
ShowMessage ('code');
Edit1.Text := EditText;
Edit1.OnChange := Edit1Change;
end;
end;
Guillemouze
Messages postés991Date d'inscriptionsamedi 25 octobre 2003StatutMembreDernière intervention29 août 20136 19 oct. 2006 à 13:44
si, tu peux utiliser la variable "Sender.UserName" qui te renverra le "nom, prenom" de l'utilisateur qui a modifié l'edit ("Borland, Delphi" si la modification a ete faite par le code)
la solution de japee me semble pas mal, meme si ca fait un peu bidouille
a toi de voir dans quelles circonstances tu doi utiliser tout ca !