thonyboy
Messages postés165Date d'inscriptionmercredi 23 avril 2003StatutMembreDernière intervention16 février 2011
-
29 avril 2003 à 11:25
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 2005
-
29 avril 2003 à 12:43
Bonjour,
Presque tous les evenement d'un message envoient comme parametre Sender: Tobject
Comment utiliser ce parametre quand le code d'un evenement est commun a plusieurs composants ?
Genre, on a cinq boutons, et quand on clique sur un, on retourne son nom dans un TLabel, mais cela a partit d'une seule procedure commune....
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 29 avril 2003 à 12:10
Salut !
Pour effectuer ce que tu demandes, il faut effectuer ce qu'on appelle un transtypage !
C'est simple : la classe TObject est une classe parent dont dérive la plupart (peut-être tous ?!) des composants... Le but est donc de faire "comprendre" au programme quel composant il doit utiliser... Dans ta procédure, tu feras donc ainsi : Label1.Caption := TButton(Sender).Name;
Le transtypage, c'est le fait de mettre Sender entre paranthèse avec TButton... Le compilateur "sait" qu'il doit alors considérer Sender comme un objet de classe TButton !
Pour la propriété Name, un transtypage avec TComponent suffirait cependant !
Bonne prog' !
[mailto:bestiol@cario.fr Bestiol.]
PS: Attention toutefois en faisant ce genre de transtypage... Si jamais tu fais un transtypage d'un "Sender" avec TLabel, par exemple, et que c'est un TEdit qui appelle la procédure (qui devient donc le sender), l'accès à une propriété comme Caption, qui n'existe pas dans la classe TEdit, provoquera une exception !
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 29 avril 2003 à 12:28
C'est ça la magie du polymorphisme !
Appliquer la méthode de l'objet réel (ici un TButton) alors que le paramètre reçu est du type ancêtre de toutes les classes, c.a.d. TObject (voir le poster avec la hiérarchie de la VCL pour s'en convaincre).
Autre forme d'écriture pour effectuer un transtypage (en reprenant l'exemple de Bestiol) :
Label1.Caption := (Sender as TButton).Caption;
Au cas où tu brancherais cette routine sur divers composants mais que tu veuilles n'utiliser cette partie de code que pour les TButton :
if Sender is TButton then
Label1.Caption := (Sender as TButton).Caption;
cs_Bestiol
Messages postés833Date d'inscriptiondimanche 6 janvier 2002StatutMembreDernière intervention 3 novembre 20051 29 avril 2003 à 12:43
Pour les remerciements, thonyboy, il n'y a pas de quoi ! Le principal c'est que tu aies bien compris, car c'est quelque chose d'assez important à savoir utiliser, je pense !
Pour le polymorphisme, je pensais bien que ça se retouchait ! Donc en fait, le polymorphisme n'est "q'une" histoire d'héritage avec classes abstraites/classes concrètes ?!