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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Problème de prototypage dynamique[OnFailure de TNMFTP]


Sujet :

C++Builder

  1. #1
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut Problème de prototypage dynamique[OnFailure de TNMFTP]
    Bonjour,
    afain d'essayer de suivre le comportement de mon appli,
    je souhaite traiter l'event Onfailure de TNMFTP

    et je m'en sors pas .
    le proto:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __fastcall myOnFailure(bool& handled, TCmdType Trans_Type)
    l'erreur :
    [C++ Erreur] MyTools.cpp(346): E2034 Impossible de convertir 'void (_fastcall *)(bool &,TCmdType)' en 'void (_fastcall * (_closure )(bool &,TCmdType))(bool &,TCmdType)'
    merci d'avance

    P.S: désolé si je suis un peu insistant aujourd'hui...

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 7
    Par défaut
    void __fastcall TForm1::NMFTP1Failure(bool &Handled, TCmdType Trans_Type)
    {

    }

  3. #3
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    alors, en fait, c'était le proto dans le .h que j'ai donné, en fait, il manquait ici la résolution de portée mais c pas le cas ds mon .cpp.
    Par ailleurs, je ne peux pas faire un double click vu que je crée le composant dynamiquement.

    De plus, il est possible d'affecter une méthode générique à un événement du moment, qu'elle reprend les mêmes paramètres voir d'autres éventuellement.

    merci quand même...

    ceci dit avec le double clic j'aurais le proto en effet, je vais en poser un pour voir.

  4. #4
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    on est bien d'accord que dans l'erreur :
    [C++ Erreur] MyTools.cpp(346): E2034 Impossible de convertir 'void (_fastcall *)(bool &,TCmdType)' en 'void (_fastcall * (_closure )(bool &,TCmdType))(bool &,TCmdType)'
    c ma fonction qui ne peut être convertie. je pige pas puisque si je travaille avec un composant statique, le OnFailure a exactement la même signature que ma fonction....
    Suis dégouté

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Si tu regardes ton erreur non à priori ce n'est pas la même chose.
    Il y a ce fameux _closure. Je me souviens l'avoir déjà rencontré et qu'en fait tous les gestionnaires d'évènement sont des _closure.
    Maintenant je ne sais pas exactement ce que c'est ni comment remédier au problème.

  6. #6
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    bon...
    suis paumé alors je vais peut-etre dire des betises.

    j'ai tenté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void __fastcall myOnFailure(__closure *TFailureEvent)(bool &Handled, TCmdType Trans_Type);
    bon, ça compile pas non plus

    [C++ Erreur] MyTools.h(19): E2138 Conflit de modificateurs de type
    [C++ Erreur] MyTools.h(19): E2091 Les fonctions ne peuvent pas renvoyer de tableaux ou de fonctions

  7. #7
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    Citation Envoyé par Neilos
    Si tu regardes ton erreur non à priori ce n'est pas la même chose.
    Il y a ce fameux _closure. Je me souviens l'avoir déjà rencontré et qu'en fait tous les gestionnaires d'évènement sont des _closure.
    Maintenant je ne sais pas exactement ce que c'est ni comment remédier au problème.
    oui, en effet, le closure identifie les gestionnaires d'événements.
    je bossais justement sur le problème mais je sais pas comment l'utiliser. (cf. mon post précédent)

    dans le nmftp.hpp :
    typedef void __fastcall (__closure *TFailureEvent)(bool &Handled, TCmdType Trans_Type);

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Si j'ai bien compris, le mot clé "_closure" sert à utiliser un pointeur sur une fonction... Le problème, c'est qu'il y a beaucoup de limites en C++ quand à ce type de pointeurs (http://www.codeproject.com/cpp/FastDelegate.asp). C'est pourquoi Borland a ajouté la "closure".

    L'approche de Borland a une limitation: la fonction référencée doit être contenue dans une classe!

    Peut-être que la fonction que tu essaies d'attribuer à OnFailure n'est pas contenue dans une classe?? Si c'est bien le cas, tu peux faire une classe bidon qui contient ta fonction et une instance pour qu'elle soit toujours accessible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // Je crée une class bidon qui ne sert qu'à contenir la fonction
    class dummyClass {
      public:
        void __fastcall Button1Click(TObject *Sender) {
           MessageDlg("Hello world",mtInformation,TMsgDlgButtons()<<mbYes,0);
        }
    };
     
     
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      // Je crée un objet _global_ qui ne sert qu'à rendre la fonction accessible
      dummyClass dummy; 
     
      TNotifyEvent hello=&dummy.Button1Click; // J'assigne la fonction au bouton
      Button1->OnClick=hello;
    }
    mais le plus simple reste de déclarer ta fonction dans la fiche pour qu'elle soit automatiquement "closure"...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::Button1Click(TObject *Sender) {
      MessageDlg("Hello world",mtInformation,TMsgDlgButtons()<<mbYes,0);
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      TNotifyEvent hello=&Button1Click; // J'assigne la fonction au bouton
      Button1->OnClick=hello;
    }

  9. #9
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    J'ai oublié d'enlever le "_global_"... En fait l'objet n'a pas a être global... Il ne sert qu'à inclure la classe dans le projet et à accéder à son adresse!

  10. #10
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    En effet, lorqu'elle est déclarée dans la fiche, cela ne pose pas de problèmes, je l'avais fait.

    Sauf que là je suis dans une classe à moi...donc un peu plus embêté.
    Ceci dit, je n'ai pas d'instance de ma classe, tout en static...ça expliquerai..
    bon je vais voir comment m'organiser

    merci

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Par défaut
    Si tu as ta propre classe, alors crée juste une instence locale le temps d'attribuer l'adresse de la fonction à OnFail et ce n'est pas grave si l'instence disparaît ensuite... Voir le premier exemple que j'avais fait

  12. #12
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    Citation Envoyé par Patrick Seuret
    Si tu as ta propre classe, alors crée juste une instence locale le temps d'attribuer l'adresse de la fonction à OnFail et ce n'est pas grave si l'instence disparaît ensuite... Voir le premier exemple que j'avais fait
    ok, je vais essayer ça....

  13. #13
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    et bien, on dirait bien que ça fonctionne...en tout cas, ça compile.
    ça corrige mon problème de base...j'avais besoin de ça juste pour debug, suis pas encore rendu.

    c bizarre, elle a pas l'air d'être appelée ma fonction...je continue à creuser


    A+

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Par défaut
    Merci à Patrick Seuret pour les explications sur le _closure !

  15. #15
    say
    say est déconnecté
    Membre Expert
    Avatar de say
    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 176
    Par défaut
    bien sur...et pour le reste aussi...

    en fait, ma fonction est bien appelé, c juste que l'évent que j'attendais n'intervenais pas.

    merci à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HTML+CSS] Problème de menu "dynamique"
    Par Invité dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 06/04/2005, 12h48
  2. Question sur les problèmes d'allocation dynamique
    Par slylafone dans le forum C++
    Réponses: 23
    Dernier message: 25/10/2004, 14h18
  3. [JSP]Problème liste deroulante dynamique
    Par besco dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 09/09/2004, 17h58
  4. problèmes de textes dynamique dynamiquement générés
    Par stephane eyskens dans le forum Flash
    Réponses: 18
    Dernier message: 05/09/2003, 13h13
  5. [Rave Report] problème de création dynamique
    Par Nivux dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2003, 00h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo