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

Composants VCL Delphi Discussion :

ComboBox - évènement OnDrawItems appelé en boucle infinie


Sujet :

Composants VCL Delphi

  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut ComboBox - évènement OnDrawItems appelé en boucle infinie
    Bonjour à tous,

    Je programme en delphi sous XE2...

    Je souhaite mettre en couleur certaines lignes d'une comboBox (certains items).

    J'utilise donc l'évènement OnDrawItem. J'ai bien mis au préalable la propriété de la combobox à csOwnerDrawFIxed.

    Seulement j'ai un soucis, cette fonction est appelée en boule infinie. Lors du débugage, la fonction MaComboBox.OnDrawItem est appelée, puis ça passe dans AdvFocusHelper.pas (Composant TMS) ou la fonction MsgHookPro est appelée, et ça revient appeler ma fonction OnDrawItem.

    Lorsque je clique sur la flèche de ma comboBox dans l'IHM, tout plante.
    Nom : print_errror.png
Affichages : 556
Taille : 43,2 Ko

    Voilà la fonction DrawItems:

    Nom : drawitem.jpg
Affichages : 622
Taille : 133,0 Ko

  2. #2
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 123
    Par défaut Etes-vous sûr qu'il y a une boucle infinie?
    Bonjour,
    Déboguer un événement "OnDrawItem" n'est pas facile. Avec Windows, vous allez avoir cet événement récurrent dans votre application, et votre débogueur ne va pas pouvoir vous aider.
    Etes-vous sûr qu'il y a une boucle infinie?

    Puis-je vous suggérer de mettre en place un mémo sur votre fiche et d'y écrire un texte chaque fois que vous recevez le message "OnDrawItem"?

    Cordialement,
    Thierry

  3. #3
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par wilfryjules Voir le message
    Bonjour à tous,

    Je programme en delphi sous XE2...
    Moi je suggérerais surtout de poster dans le bon forum spécialisé pour ça...

  4. #4
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Oui il y a bel et bien une boucle infinie j'ai testé en mode debug.
    Comme décrit ci-dessus. Après peut être qu'il y a une interférence avec le composant TMS, qui n'a sûrement pas lieu d'être appelé ici..

  5. #5
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Dans le OnDrawItem, appelles-tu une fonction de rafraichissement (Invalidate, Repaint, Paint, ....) ?
    Appelles-tu une fonction d'un composant qui fait un rafraichissement ?

  6. #6
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Non pas du tout, voir ma fonction je l'ai jointe plus haut dans la description.

  7. #7
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    attention DrawItem est supposé ne dessiner qu'UN item, celui donné en Index

    est-ce que ce code est attaché uniquement à cette combo ? car tu mélanges le Control en paramètre et le Canvas de la combo

    est-ce que la query que tu lances peux influencer le contenu de la combo ? .. et ça me parait pas une bonne idée de lancer des query dans OndrawItem en fait (pour des questions de performances)

    NB: en plaçant ton code dans une balise "CODE" c'est tout de même plus pratique pour commenter le code
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Membre très actif
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 260
    Par défaut
    Tu as raison PAUL j'ai modifié le code, ça marche, je le poste dès que possible. La boucle sur l'index était une erreur.
    Cependant je ne pense pas avoir résolu la boucle infinie.
    Aussi, appeler une requête, même simple, pour chaque index, fait complètement ramer le programme.
    J'ai donc pré-rempli un tableau contenant les résultats de la requête, appelé hors de cette fonction Ondraw.
    Images attachées Images attachées  

  9. #9
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Tu as trouvé l'erreur le temps que je tape mon texte, tant mieux
    Je laisse tout de même mon explication ci-dessous qui pourrait répondre à ta dernière interrogation.

    Citation Envoyé par wilfryjules Voir le message
    cette fonction est appelée en boule infinie.
    Citation Envoyé par wilfryjules Voir le message
    Lorsque je clique sur la flèche de ma comboBox dans l'IHM, tout plante.
    Si "ça plante", tu as un message d'erreur non ?
    S'il y a un message d'erreur, apparaît-il par dessus la liste déroulante, même partiellement (la chevauche-t-il) ?

    La boucle ne doit pas dépasser Count -1, ce code va de toute façon soulever une exception.
    Si le message d'erreur est affiché sur la liste, celle-ci va être redessinée lorsque la fenêtre d'exception sera fermée entraînant un nouvel appel des fonctions de repeinture, qui générera une nouvelle exception et ainsi de suite, indéfiniment.

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Il est évident que la boucle "for count" est inapproprié
    EDIT : Comme AndNotOr, j'étais en train de faire autre chose et ma réponse est donc trop tardive

    Pour un projet, je dessinais un petit carré de couleur
    Je te conseille d'éviter le SQL durant le Draw, il serait préférable de charger les données avant (soit en ouvrant le DataSet pour tous les éléments du combo ou alors créer un objet métier gérant ces données, moi c'est BulkChannelReservation dans le code ci-dessous

    Code cpp : 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    //---------------------------------------------------------------------------
    /*static*/ void TComboChannelManager::DrawComboChannel(TComboBox *ACombo, TIdentObjChannel* AChannel, TRect &Rect, TOwnerDrawState State, ISygalDVRDahuaBulkCamerasConfigurationManager* ABulk/* = NULL*/)
    {
      if (ACombo && AChannel)
      {
        TCanvas *ComboCanvas = ACombo->Canvas;
     
        // Choix de la couleur de fond selon sélection
        ComboCanvas->Brush->Color = State.Contains(odSelected) ? clHighlight : ACombo->Color;
        ComboCanvas->Pen->Color = ComboCanvas->Brush->Color;
        // Dessin du fond
        ComboCanvas->Rectangle(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
     
        // Texte
        ComboCanvas->TextOut(Rect.Left + 2, Rect.Top + 1, AChannel->Ident);
     
        // Vérifie l'état du canal
        if (ABulk)
          AChannel->Reserved = ABulk->BulkChannelReservation[AChannel->FriendlyChannel];
     
        // Choix de la couleur indiquant l'affectation d'un canal
        ComboCanvas->Brush->Color = AChannel->Selected ? clSkyBlue : AChannel->Affected ? clWebLightCoral : AChannel->Reserved ? clWebLavenderBlush : clMoneyGreen;
        ComboCanvas->Pen->Color = ComboCanvas->Brush->Color;
     
        // Dessin du pseudo icone d'indication d'état
        int l = Rect.Left + ComboCanvas->TextWidth(AChannel->Ident) + 4 + 2;
        ComboCanvas->Rectangle(l , Rect.Top + 4, l + 8, Rect.Top + 4 + 8);
      }
    }
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2016, 18h38
  2. Boucle infinie quand appel à printf
    Par donkeyquote dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 11/11/2008, 07h13
  3. Réponses: 3
    Dernier message: 27/03/2008, 11h53
  4. [Socket] Pb de boucle infinie
    Par Myogtha dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 10/06/2004, 14h10
  5. [C#] Comment eviter les boucles infinies ?
    Par Thomas Lebrun dans le forum C#
    Réponses: 12
    Dernier message: 09/06/2004, 00h04

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