Fonction incluse dans une autre

cs_MLine Messages postés 20 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 11 juin 2003 - 14 mai 2003 à 12:09
cs_MLine Messages postés 20 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 11 juin 2003 - 15 mai 2003 à 09:56
Slut,
est-il possible d'imbriquer une fonction dans une autre ??
Voilà ce que je voudrais faire : je crée une fiche dynamiquement dans la méthode ci-dessous et je lui ajoute des composants (Button11 et ComboBox1) et je voudrais définir la méthode Button11Click dans cette méthode (comme c'est écrit ci-dessous...) pour pouvoir accéder à FormH et ComboBox1 (sinon, si je définis Button11Click hors de cette méthode, je ne peux plus y accéder). Mais ça ne compile pas de cette façon...

Alors y-a-t-il moyen de corriger, ou alors faut-il carrément faire autrement ? Dans ce cas, comment accéder aux composants FormH et ComboBox1 hors de la méthode Button3Click ?

(extrait)

void __fastcall TForm1::Button3Click(TObject *Sender)
{ unsigned int Winh 300, Winl 300;

TForm *FormH = new TForm(Form1); /*create a new form dynamically to choose the file to edit*/
FormH->Width=Winl; /*set the height and width of the child window*/
FormH->Height=Winh;
FormH->Visible=true; //display the child window
FormH->Align=alNone;
FormH->OnClose=FormCloseW;

TComboBox *ComboBox1 = new TComboBox (FormH);
ComboBox1->Parent = FormH;
ComboBox1->Style = csDropDownList;

TButton *Button11 = new TButton (FormH);
Button11->OnClick = Button11Click(TObject *Sender)
{
filetoedit = ComboBox1->Text;
ShellExecute(NULL, // Handle de la fenêtre parent
"open", // Action à effectuer
"notepad.exe", // Fichier
filetoedit.c_str(), // Paramètres
"", // Répertoire par défaut
SW_SHOWDEFAULT // Manière d'afficher
);
FormH->Close();
}
Button11->Parent = FormH;
Button11->Caption = "OK" ;
Button11->Left = 50;
Button11->Top = 50;

//ETC.....
}

2 réponses

cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
14 mai 2003 à 23:06
Hum, oui, tu peux définir une fonction dans une autre mais en tout comme tu fé ça va pas du tout!

tu ne peux pas faire ça !!!!!!!

Button11->OnClick = Button11Click(TObject *Sender)
{
filetoedit = ComboBox1->Text;
ShellExecute(NULL, // Handle de la fenêtre parent
"open", // Action à effectuer
"notepad.exe", // Fichier
filetoedit.c_str(), // Paramètres
"", // Répertoire par défaut
SW_SHOWDEFAULT // Manière d'afficher
);
FormH->Close();
}

il vaut mieux que tu définisses ta fonction en dehors et en passant comme paramêtre en référence le ComboBox1 et le FormH.

Button11Click(TypeDeComboBox1 & a, TypeDeFormH & b)
{
filetoedit = a->Text;
ShellExecute(NULL, // Handle de la fenêtre parent
"open", // Action à effectuer
"notepad.exe", // Fichier
filetoedit.c_str(), // Paramètres
"", // Répertoire par défaut
SW_SHOWDEFAULT // Manière d'afficher
);
b->Close();
}

ensuite tu fé

Button11->OnClick = Button11Click(ComboBox1, Form1);

PAr contre je ne vois pas a quoi sert Sender!!!!
al", a+.
Bouba
0
cs_MLine Messages postés 20 Date d'inscription jeudi 8 mai 2003 Statut Membre Dernière intervention 11 juin 2003
15 mai 2003 à 09:56
En fait le prototype avec le Sender :
void _fastcall TForm1::Button11Click (TObject *Sender)
est créé automatiquement par C++ Builder. J'ai testé ce que tu as dit, avec la fonction :
void Button11Click2 (TComboBox &a, TForm &b)
Mais cela ne fonctionne pas car C++ Builder attend obligatoirement un prototype du premier type pour l'événement OnClick.
Et j'ai essayé d'utiliser la fonction ci-dessus en fonction puis en méthode de Form1 (fiche principale) -> ça revient au même.
Donc j'ai finalement mis FormH et ComboBox1 en attributs de la classe TForm1, ce qui fait que j'ai abandonné l'allocation dynamique :'[
Merci (ton idée me semblait bonne mais bon, on dirait bien que C++ Builder n'est pas commode :/)
MLine
0
Rejoignez-nous