Connaître l'origine d'une action sur un composant (utilisateur ou code)

cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 janvier 2009 - 18 oct. 2006 à 23:21
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 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.

Merci

Orélien.

16 réponses

japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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;

Bonne prog'

japee
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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 :

procedure SetText(Value: String); override;
begin
    UserEdit := false;
    inherited;
    UserEdit := true;
end;

j'ai pas testé mais je pense que ca devrait marcher
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
19 oct. 2006 à 10:47
Exact, bien vu Guillemouze.

Je n'avais effectivement pas envisagé le copier-coller.
Ta technique est efficace, je l'adopte...

Bonne prog'
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
19 oct. 2006 à 11:22
merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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 !!!

 
@+
Cirec

<hr size="2" />
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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...
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
19 oct. 2006 à 12:13
Mise en oeuvre simple de la technique à Guillemouze :

- 1 Edit,
- 1 Button, et :

var
    UserEdit: Boolean=true;

procedure SetEditText(str: string);
var
    save: boolean;
begin
    save := UserEdit;
    UserEdit := false;
    Form1.Edit1.Text := str;
    UserEdit := save;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
  begin
    if UserEdit then
       showmessage('utilisateur')
    else
       showmessage ('code');
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetEditText(Edit1.Text + 'X');
end;

Vraiment, je vois pas de problème...

Bonne prog'
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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:

procedure SetEditText(Value: string);
begin
    MaVarDeMemo := Value;
    MonEdit.text := Value;
end;

et

procedure MonEditChange(Sender: TObject);
begin
    if MonEdit.text = MaVarDeMemo then
       showmessage('code')
    else
       showmessage('utilisateur');
end;

par contre la il risque peut etre d'y avoir des cas auxquels je n'ai pas pensé !
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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 !!!
0
cs_orelien Messages postés 137 Date d'inscription dimanche 7 juillet 2002 Statut Membre Dernière intervention 11 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 ?

Merci

Orélien.
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
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;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EditText := Edit1.Text + 'X';
  Edit1Change(nil);
end;

Sauf erreur, y'a pas de bug...

Bonne prog'
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
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 !
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
19 oct. 2006 à 13:58
Ouais, Guillemouze, je suis le plus bidouilleux de tous le bidouilleurs, mdr...
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
19 oct. 2006 à 14:11
"Sender.UserName = Nom, Prénom, ... (2ème prénom ?)" si Sender est l'usager,
sinon "Borland, Delphi" si Sender est le code...

Je crois (j'espère pour lui...) que Guillemouze plaisantait, Cirec...

Bonne prog'

@ +
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
19 oct. 2006 à 14:44
Décidément ... je crois que je vais aller me coucher   








 






@+
Cirec





<hr size="2" />
0
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
19 oct. 2006 à 15:05
ho oui pardon, "nom, prenom, prenom2" => "Borland, Delphi, Kylix, Pascal"
0
Rejoignez-nous