IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Que signifie __fastcall
auteur : Geronimo
Si le nom d'une fonction est précédé de __fastcall, cela signifie que les trois premier paramètres de la fonction seront placés dans des registres du processeurs (eax, edx et ecx), si leur taille le permet. Cela permet d'accélérer le traitement de certaines fonctions. Evitez de l'utiliser pour des fonctions récursives car les registres devraient être vidés à chaque nouvel appel de la fonction, donc cette directive perdrait de son intérêt. Selon l'aide, "toutes les fonctions membre de classe fiche doivent utiliser la convention __fastcall."

Que représente le TObject *Sender dans les fonctions de la VCL ?
auteur : Geronimo
Dans beaucoup de fonctions, on trouve comme argument TObject *Sender . Cet argument est utilisé par les événements pour savoir quel est l'objet qui a appellé la fonction. Voici un exemple simple pour clarifier : dans un nouveau projet, placez sur votre fiche deux boutons. Double-cliquez sur le premier (Button1). Vous obtenez alors le code suivant :
void __fastcall TForm1::Button1Click(TObject *Sender)
{

}
Dans ce cas, vous imaginez bien que le Sender ne peut être que Button1. Donc Sender n'est pas très utile. Sélectionnez maintenant votre deuxième bouton sur la fiche (Button2). Dans l'inspecteur d'objets, dans l'onglet événements, pour l'événement OnClick, sélectionnez la fonction Button1Click. Maintenant, la fonction Button1Click est appelée lorsque vous cliquez sur Button1 ou lorsque vous cliquez sur Button2. Sender permet alors de savoir quelle objet a appelé la fonction Button1Click. Voici donc la fonction Button1Click d'au-dessus réécrite :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    if (dynamic_castTButton *(Sender) == Button1) 
        ShowMessage("Button1");
    else
        ShowMessage("Button2");
}
Sender étant un pointeur de type TObject*, il faut le convertir en un pointeur de type TButton* pour pouvoir vérifier quel est le bouton qui a envoyé. Pour cela, on utilise dynamic_cast . Voici une version plus perfectionnée ci-dessous qui permet de récupérer le pointeur sur le bouton :
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TButton *Button;
    Button = dynamic_castTButton *(Sender);
    if (Button == Button1)
    ShowMessage("Button1");
    else
    if (Button == Button2)
	    ShowMessage("Button2");
    else
	    ShowMessage("C'est louche");
    Button->Caption = "Appuyé";
}
On voit ainsi que l'on peut accéder à toutes les propriétés du bouton. Dans ce cas, nous modifions son texte et y plaçons "Appuyé".