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

MFC Discussion :

problème avec listctrl MFC


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut problème avec listctrl MFC
    Bonjour,

    J'utilise une ListCtrl dans une fenêtre et j'y insère des lignes via la commande 'InsertItem'. Ceci marche très bien lorsque je suis en mode DEBUG.

    Par contre quand je passe l'exe en mode RELEASE, je n'ai plus rien d'afficher ! Il semblerait que les lignes soient bien insérées dans la ListCtrl mais on ne peut pas les visualiser !

    Y-a-t-il qqe chose que je n'ai pas fait lors de mon passage en release ? ou bien d'où est-ce que cela peut venir ???

    Merci pour votre aide.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    On pourrait voir le code (ou au moins la portion de code des InsertItem si le projet est volumineux) ? Parce que là, j'ai pas ma boule de cristal.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    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
    20
    21
    22
    23
    24
    25
    26
    27
    ...
        CWnd * pWnd = GetParent();
     
        if (pWnd && !pWnd->IsWindowVisible())
        {
            pWnd->ShowWindow(SW_SHOWNORMAL);
        }
     
        // Set the date field of the new item
        CString csDate;
        csDate.Format("%s.%d",
            event.m_ctTimeStamp.Format("%d/%m/%y %H:%M:%S"),
            event.m_usTenthSeconds
            );
     
     
        int nItem = this->m_ListCtrl.InsertItem(csDate,                         
            event.m_csDirection, 
            event.m_csImat,
            event.m_csAppl,
            event.m_csEventName,                    
            event.m_csParameters,
            event.m_csChannel,
            event.m_csService,
            event.m_csSap
            );
    ...

  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Montre toute la méthode

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    void CGeneralTrafficView::WriteItem(CEvent& event)
    {
        // If it is the first trace (the windows is disabled), then
        // display it
        CWnd * pWnd = GetParent();
     
       if (pWnd && !pWnd->IsWindowVisible())
        {
    	   pWnd->ShowWindow(SW_SHOWNORMAL);
        } 
     
        // Set the date field of the new item
        CString csDate;
        csDate.Format("%s.%d",
            event.m_ctTimeStamp.Format("%d/%m/%y %H:%M:%S"),
            event.m_usTenthSeconds
            );
     
        int nItem = this->m_ListCtrl.InsertItem(csDate,                         
            event.m_csDirection, 
            event.m_csImat,
            event.m_csAppl,
            event.m_csEventName,                    
            event.m_csParameters,
            event.m_csChannel,
            event.m_csService,
            event.m_csSap
            );
     
           this->m_ListCtrl.GiveHighlightNumber(nItem);
     
        if(m_bOnlineUpdate)
        {
            this->m_ListCtrl.SetScrollPos(SB_VERT, 100, TRUE);
            this->m_ListCtrl.EnsureVisible(this->m_ListCtrl.GetItemCount()-1,   FALSE);
        }
    }
    La fct 'GiveHighlightNumber' permet de gérer les couleurs, même en la mettant en commentaire j'ai le même résultat, càd rien n'est affiché.

    Autre remarque, juste après le 'this->m_ListCtrl.InsertItem' je fais un GetItemCount qui s'incrémente bien.

    La fct telle qu'elle est affichée là marche très bien en debug mais en release n'affiche rien.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Les problèmes les plus commun quand le code "marche" en DEBUG et plus en RELEASE sont :
    - utilisation de macro de DEBUG avec du code à l'intérieur
    ASSERT(toto = 1); par exemple ; et pas ASSERT(toto == 1)

    Ca n'a pas l'air d'être cela.

    - problème s'initialisation de la mémoire, toujours à 0x00 ou 0xCC ou 0xCD, selon les types d'allocation en DEBUG. En RELEASE c'est n'importe quoi.

    Dans ce cas, le CEvent event a t'il bien tous ses champs correctement initialisés ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    j'ai fait une passe sur tous les champs passés en paramètre et ils sont tous bien remplie :
    event.m_csDirection,
    event.m_csImat,
    event.m_csAppl,
    event.m_csEventName,
    event.m_csParameters,
    event.m_csChannel,
    event.m_csService,
    event.m_csSap
    Qd je fais un GetItemCount juste après et que j'interroge le résultat, ça s'incrémente bien. De + je gère la scrollbar verticale et je vois qu'elle se crée bien et qu'elle diminue en taille, ce qui veut dire qu'il y a bien des données écrite. Je pense qu'il s'agit d'un pb d'affichage style update ou refresh mais alors je ne vois pas du tout où...

    J'ai essayé en fin de fct de mettre un update mais pareil.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    autre chose, tu parles de macro DEBUG :

    peut-il y avoir qqe chose de définie qqe part dans les settings du projet et qui pourrait faire que cela fonctionne bien en debug mais pas en release ?

    j'ai pas mal de code qui est encapsulé dans du :
    ifdef _DEBUG
    et qui ne s'exécute qu'en mode DEBUG mais dans mon cas je passe bien partout (il me semble).
    Mais pê que je ne passe pas dans une fct qui initialise ma fenêtre ou mes composants ?

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut, tu es sur de passer dedans en release ?
    tu peux essayer de mettre des OutputDebugString pour tracer les éléments de cette méthode et de regarder le résultat avec debugview

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    dans la fct citée + haut, ça c'est sur j'y passe.

    Le debugview marchera même en release ?

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui c'est tout l'intérêt ...

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Question un peu bête.
    Je ne vois pas dans la doc (http://msdn.microsoft.com/en-us/library/8b9s12fc.aspx) une signature de "CListCtrl::InsertItem" compatible avec votre appel.
    N’est-ce pas une customisation du contrôle ? Donc peut-être problème dans cette customisation.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    exact !

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    int CListCtrlProjet::InsertItem(CString csDate, 
                                   CString csDirection, 
                                   CString csImat,
                                   CString csAppl,
                                   CString csEventName,                    
                                   CString csParameters,
                                   CString csChannel,
                                   CString csService,
                                   CString csSap
                                   )
    {
        INT itemIndex = m_Events.Add(new CEvents(csDate, 
            csDirection, 
            csImat,
            csAppl,
            csEventName,                    
            csParameters,
            csChannel,
            csService,
            csSap)
            );
     
        // List item declaration
        LVITEM m_listItem; 
        m_listItem.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; 
        m_listItem.iItem = itemIndex;
        m_listItem.iSubItem = 0;
        m_listItem.state = 0;
        m_listItem.stateMask = 0;
        m_listItem.pszText = LPSTR_TEXTCALLBACK;
        m_listItem.lParam = (LPARAM) m_Events.GetAt(itemIndex);
     
        return CListCtrl::InsertItem(&m_listItem);
    }
    en cherchant sur le net, j'ai trouvé qu'éventuellement cette ligne peut poser problème en release :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_listItem.iSubItem = 0;
    Sinon je ne vois pas de problème dans cette fonction...

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    LVITEM est une structure de Win32.
    Il faut toujours faire un "ZeroMemory(&listItem, sizeof(listItem));" sur ce type de structure avant de s'en servir.

  15. #15
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Pourquoi et pour quel intérêt tu utilises un LPSTR_TEXTCALLBACK dans ton InsertItem

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    même avec "ZeroMemory(&listItem, sizeof(listItem));" ça fait la même chose.

    Le "InsertItem" a l'air de marcher (puisque le GetItemCount me montre que ça s'incrémente bien) mais pas l'affichage.

    Je ne sais vraiment pas où chercher...

  17. #17
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Pourquoi et pour quel intérêt tu utilises un LPSTR_TEXTCALLBACK dans ton InsertItem

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Gabrielly Voir le message
    Pourquoi et pour quel intérêt tu utilises un LPSTR_TEXTCALLBACK dans ton InsertItem
    je ne sais pas, c'est du code que j'ai repris, je ne sais même pas à quoi sert ce LPSTR_TEXTCALLBACK...


    autre rq : pour pouvoir avancer et suivre pas à pas malgré le release, j'utilise du debbogage à l'ancienne en mettant des fwrite dans un fichier trace un peu partout et pouvoir suivre ainsi l'avancé dans le code.

    1- En quoi le debugView peut-il m'aider ? En fait je ne connais pas du tout...

    2- dans mon appli, même en debug, j'ai des plantages complètement aléatoires. L'appli peut planter au bout de 5min ou la fois d'après au bout de 4-5h de tests d'affilé. Nous avons mis des "mouchards" un peu partout pour essayer de voir où ça plantait mais ça n'a rien donné. Pareil en essayant de suivre pas à pas en debug : ça ne donne rien, ça plante on ne sait où.
    Sur ce genre du bug, debugView peut-il m'aider ? Que va-t-il m'apporter ?

    Merci pour votre aide

  19. #19
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Je crois que ton problème vient de là.

    Est-ce que tu gères quelque part l'évènement LVN_GETDISPINFO
    Si oui montre également le code de son gestionnaire.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Points : 56
    Points
    56
    Par défaut
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    BEGIN_MESSAGE_MAP(CListCtrlProjet, CListCtrl)
    	//{{AFX_MSG_MAP(CListCtrlProjet)
    	ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
        ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetDispInfo)
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    ...
    ...
    ...
    void CListCtrlProjet::OnGetDispInfo(NMHDR *pNMHDR, LRESULT *pResult)
    {
        NMLVDISPINFOA* plvdi = (LPNMLVDISPINFOA) pNMHDR;
    
    	// initialisation de la section critique
    	if (! lca_vCriticalSectionInit) {
    	    InitializeCriticalSection(&lca_vCriticalSection);
    	    lca_vCriticalSectionInit = TRUE;
    	}
    	// Entrée dans la section critique
    	EnterCriticalSection(&lca_vCriticalSection);
    
        CGenericEvents* pEvent = (CGenericEvents*)       m_Events.GetAt(plvdi->item.iItem);
    
    	// Sortie de la section critique
    	LeaveCriticalSection(&lca_vCriticalSection);
        
        if (pEvent->ItemType() == "ObsEvent")
        {
            CObsEvents* pObsEvent = (CObsEvents*) m_Events.GetAt(plvdi->item.iItem);
            switch (plvdi->item.iSubItem) 
            { 
            case 0:
                plvdi->item.pszText = pObsEvent->Date();
                break;
            case 1:
                plvdi->item.pszText = pObsEvent->Direction();
                break;     
            case 2:
                plvdi->item.pszText = pObsEvent->ImatCalled();        
                break;        
            case 3:        
                plvdi->item.pszText = pObsEvent->ImatCalling();        
                break;        
            case 4:
                plvdi->item.pszText = pObsEvent->Parameters();        
                break;        
            default:        
                break;
                    
            }
                
        } 
        else if (pEvent->ItemType() == "Event")
        {         
            CEvents* pEvent = (CEvents*) m_Events.GetAt(plvdi->item.iItem);            
            switch (plvdi->item.iSubItem)
            {
            case 0:
                plvdi->item.pszText = pEvent->Date();
                break;
            case 1:
                plvdi->item.pszText = pEvent->Direction();
                break;
            case 2:
                plvdi->item.pszText = pEvent->Imat();
                break;
            case 3:
                plvdi->item.pszText = pEvent->Appl();
                break;
            case 4:
                plvdi->item.pszText = pEvent->EventName();
                break;
            case 5:
                plvdi->item.pszText = pEvent->Parameters();
                break;
            case 6:
                plvdi->item.pszText = pEvent->Channel();
                break;
            default:
                break;
            }
                    
        }            
        else if (pEvent->ItemType() == "EventParam")
        {
            CEventParameter* pEvent = (CEventParameter*) m_Events.GetAt(plvdi->item.iItem);
            switch (plvdi->item.iSubItem)
            {
            case 0:
                //plvdi->item.pszText = "";
                break;
            case 1:
                //plvdi->item.pszText = "";                   
                break;
            case 2:
                //plvdi->item.pszText = "";
                break;
            case 3:
                //plvdi->item.pszText = "";
                break;
            case 4:
                //plvdi->item.pszText = "";
                break;
            case 5:
                plvdi->item.pszText = pEvent->ParamValue();
                break;
            case 6:
                //plvdi->item.pszText = "";
                break;
            default:
                break;
            }
        }
    }
    en regardant cette fonction je pense avoir trouvé le problème !
    J'ai déjà remarqué et corrigé pas mal de bug dans le code sur ce genre de 'if' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (pEvent->ItemType() == "EventParam")
    En debug ça marche bien mais pas en release, il faut plutôt utiliser 'strcmp'.
    Je teste et je vous tiens au jus...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Petit problème avec ListCtrl
    Par gotcha007 dans le forum wxPython
    Réponses: 1
    Dernier message: 06/02/2011, 02h17
  2. Problème avec les MFC de windows
    Par tiagocerqueira dans le forum MFC
    Réponses: 3
    Dernier message: 02/02/2010, 11h30
  3. Réponses: 5
    Dernier message: 10/05/2005, 10h22
  4. [MFC] Problème avec un RichEdit et couleur
    Par Erakis dans le forum MFC
    Réponses: 1
    Dernier message: 24/03/2005, 14h12
  5. [MFC] problème avec les insertions dans CComboBox
    Par Joeleclems dans le forum MFC
    Réponses: 12
    Dernier message: 11/06/2004, 15h31

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