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 :

[TListBox][OnDrawItem] Signature de son implémentation


Sujet :

C++Builder

  1. #1
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut [TListBox][OnDrawItem] Signature de son implémentation
    Bonjour,
    Hé oui encore une demande de ma part...
    J'ai un souci sur qqchose qui ne me parraissait pas si méchant :
    Pour les composants crées dynamiquement, j'ai bien trouvé ds les nombreuses pages d'aide comment lui affecter un évènement de base de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form1->ButtonX->OnClick = MonAction;
    mais pour les évènements de type 'OnDrawItem' pour les ListBox(par ex), je n'ai pas l'impression qu'il soit tout a fait d'accord pour faire de meme...
    Ou alors je m'y prend mal... (ca se pourrai hein!).
    Merci d'avance ...

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Lorsque j'ai un message d'erreur du type :
    "Impossible de convertir 'void(_fastcall *)(TWincontrol *etc,etc,etc...)' en 'void(_fastcall *(_closure)(TWincontrol *etc,etc,etc...)' "
    que dois je saisir exactement ?
    Ou plutot qu'etais je censé comprendre ?

  3. #3
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Je crois comprendre votre question. Vous n'avez pas de problème avec un événement du type OnClick mais vous avez du mal à créer une action du type OnDrawItem.

    À mon avis, ce qu'il vous manque comme information, c'est que le prototype de l'événement doit être respecté.

    Le mieux pour connaître ce prototype est de le faire créer artificiellement par C++ Builder lui-même. Par exemple pour le OnClick d'un bouton, vous cliquez sur un bouton et C++ Builder vous crée le schéma :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    }
    Vous voyez qu'ici il n'y a qu'un seul argument à savoir un pointeur de type TObject. Ce sera d'ailleurs le prototype le plus classique.

    Mais pour un OnDrawItem, le prorotype est différent, créez-le avec C++ Builder, vous aurez ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void __fastcall TForm1::ListBox1DrawItem(TWinControl *Control, int Index,TRect &Rect, TOwnerDrawState State)
    {
    }
    Il faut donc absolument respecter ce prototype quand vous annoncer la fonction suite à une création dynamique. Sinon, bien entendu, le compilateur ne s'y retrouve pas et vous obtenez une erreur.

    Il en va de même pour tout événement, il faut absolument respecter le prototype de l'événement et comme il est difficile de le connaître à l'avance, on le crée par C++ Builder, on fait un copier-coller, on change son nom et on donne ce nouveau nom au moment de la désignation de l'événement dans le code.

    À bientôt
    Gilles

  4. #4
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 060
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 060
    Points : 8 296
    Points
    8 296
    Par défaut
    Le prototype de la méthode doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            void __fastcall LBDrawItem(TWinControl *Control, int Index,
                          const TRect &Rect, TOwnerDrawState State);

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Merci CGi. Mais où doit-il être déclaré ? En public dans la class de TForm.. ? En global ?

    J'ai essayé pleins de combinaisons et c'est sans cesse réfusé pour cette histoire
    de __closure ! Comme si ça ne pouvait être mis en place qu'à l'édition par
    le biais de l'inspecteur d'objets !

    __property TDrawItemEvent OnDrawItem = {read=FOnDrawItem, write=FOnDrawItem};
    et ce qui fonctionne bien avec un OnClick :
    __property Classes::TNotifyEvent OnClick = {read=FOnClick, write =FOnClick};
    ... je finis par m'y perdre avec cette notion de __closure !

    A plus !

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    Le prototype qui passe chez moi (BCB3 Pro) est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void __fastcall LBDrawItem(TWinControl *Control, int Index,
                             const Windows::TRect &Rect, TOwnerDrawState State)
    et n'avait donc rien à voir avec le __closure.
    Dans mes essais précédents j'avais omis le const pour le TRect !

    A plus !

  7. #7
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Bon alors la :

    . J'avais bien un probleme avec le prototype de l'évènement
    . const etait bien la valeur manquante avant ' TRec &Rec '
    . le compilateur ainsi s'est calmé et me fait les yeux doux...

    Mais ce qui est étonnant, c'est qu'en créeant cet évènement en 'manuel' sur un objet déja existant, la fonction apparait sous la forme :
    void __fastcall ListeBaseDrawItem(TWinControl *Control, int Index,
    TRect &Rect, TOwnerDrawState State);
    ce qui est génant pour les 'petits' comme moi...un homme averti en vaut deux, je le saurai pour la prochaine.

    Maintenant, je danse devant le PC !!

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 390
    Points : 1 777
    Points
    1 777
    Par défaut
    Salut !

    C'est pareil pour moi avec le const !

    En tout cas un grand merci à CGi !

    A plus !

  9. #9
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Je n'avais pas vérifié car je faisais confiance à C++ Builder.

    En effet, si vous déposez sur la forme un ListBox et si vous cliquez l'événement OnDrawItem, C++ Builder vous crée le prototype que j'ai indiqué précédemment donc sans le const et ça marche parfaitement si on l'utilise. Mais il faut ajouter const si l'objet est créé dynamiquement.

    J'avoue ne pas m'expliquer pour quelle raison cette précision est obligatoire s'agissant d'un objet créé dynamiquement, c'est la première que je constate une différence de déclaration suivant que l'objet est déposé sur la forme ou créé par programme.

    À bientôt
    Gilles

  10. #10
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Malgré cela merci a tous ceux qui m'ont aidé

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

Discussions similaires

  1. Vérifier son implémentation de rétropropagation du gradient
    Par Simboubou dans le forum Méthodes prédictives
    Réponses: 1
    Dernier message: 10/05/2010, 20h02
  2. Réponses: 1
    Dernier message: 26/01/2009, 14h02
  3. Réponses: 0
    Dernier message: 20/01/2009, 13h13
  4. Réponses: 3
    Dernier message: 03/10/2008, 12h48
  5. Comment fait-on pour ajouter une signature à son profil ?
    Par mullger dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 28/04/2006, 16h42

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