While(j != nbre_tot_colonnes)

romanikou -  
mamiemando Messages postés 34243 Date d'inscription   Statut Modérateur Dernière intervention   -
bonjour tout le monde,
voilà (au cas où vous ne le sauriez pas encore!!) je fais une APIwin32 sous VisualC++ et je travaille avec ADO avec pRs qui pointe sur un RecordSet.
Voilà je récupère les différents enregistrements d'une table de ma base de données que j'insère dans une listview.Pour tous les enregistrements de ma table je fais un "while(!pRs->EndOfFile)", et je voudrais faire de même pour toutes les colonnes (évitant ainsi d'éviter de répéter continuellement
"if(var.vt != VT_NULL) {..........}" pour chaque SubItem.
Donc je compte le nombre de colonnes et je fais une boucle "tant que j différent du nombre total de colonne" (ceci est en fait pour simplifier le code étant donné que j'ai plus de 30 colonnes), mais ca ne marche pas (abnormal program termination), je ne vois pas le problème!!
(vous verrez également que je regroupe les colonnes par 2 étant donné que pour le 1er champ je dois faire un INSERTITEM puis les autres un SETITEM.
j'espère avoir été assez clair.
Déjà merci

_variant_t Count = pRs->GetFields()->GetCount(); 
Count.ChangeType(VT_I4);
short NbrField = Count.intVal;

while(!pRs->EndOfFile)
{
    while(j != NbrField)
    {
///////////////////////////////////////////////////////////////////////////////////////////
        // On renseigne lvItem
        lvItem.mask = LVIF_TEXT;
        lvItem.iItem = i;

        long NumCol = j;
        _variant_t VarNumCol (NumCol, VT_I4 ); 
        var = pRs->Fields->GetItem(VarNumCol )->Value; 
        bst = var; 
        if(var.vt != VT_NULL) 
        {
            lstrcpy(szBuffer, bst);    
            lvItem.iSubItem = j;
            lvItem.pszText = szBuffer;
            SendMessage(hList1, LVM_INSERTITEM, 0, (LPARAM)&lvItem);
        }

        long NumCol1 = j+1;
        _variant_t VarNumCol1 (NumCol1, VT_I4 ); 
        var = pRs->Fields->GetItem(VarNumCol1 )->Value; 
        bst = var; 
        if(var.vt != VT_NULL) 
        {
            lstrcpy(szBuffer, bst);    
            lvItem.iSubItem = j+1;
            lvItem.pszText = szBuffer;
            SendMessage(hList1, LVM_SETITEM, 0, (LPARAM)&lvItem);
        }
        j++;
    }
    i++;
    pRs->MoveNext();
}

4 réponses

teebo Messages postés 33570 Date d'inscription   Statut Modérateur Dernière intervention   1 793
 
Salut,
J'ai pas lu le code mais essaye avec nbrcol-1 :o) ou mieux < nbrcol
0
mamiemando Messages postés 34243 Date d'inscription   Statut Modérateur Dernière intervention   7 899
 
C'est bizarre j'ai l'impression que ton j est pas initialisé. Si c'est bien ça c'est normal que ça plante (ton j vaut une valeur aléatoire, et forcément tu tentes d'accéder à une zone mémoire invalide, d'où le plantage !). Essaie de remplacer ton :

while (j!=nbFields){
...
j++;
}

par :

for(j=0;j<nbFields;j++){
...
}
0
romanikou
 
en fait si j'ai initialisé j de cette façon "UINT j=0;" mais ca n'apparait dans le bout de code que j'ai mis.
je vais essayer comme tu m'as dis, mais il me semble avoir déjà essayer.
En tout cas merci beaucoup d'avoir répondu et si j'ai la solution je vous fais signe!!
0
romanikou
 
en fait comme je t'avais dis, j'avais bien essayé le for et ca ne marchait pas.
En jouant entre le for et le while, j'ai fini par oublié d'en retirer un sur les 2, ce qui fait que je les ai utilisé l'un aprés l'autre dans mon code, et vlà pas qu'ca marche!!
QUELLE JOIE!!
Mais mon souci, maintenant est que je ne sais pas pourquoi, à vrai dire cà me semble pas trés catholique.
Par hazard voit tu pourquoi ca marche?
allé ciao rom
0
oui oui
 
ha ha ha
c pourtant avec beaucoup d'intéret que j'ai essayé de vous suivre mais là franchement je comprend pas...
c une nouvelle langue ? c fou, pourkoi toujours tt vouloir changer...
elles vous plaisent pas les langues parlées de nos jours, alors vs en inventé d'otres...
bon j'arrête
si vous pouviez m'expliquer succintement en koi consiste ces différents codes incompréhensibles , je vous en serai reconnaissante
bon j'vais aller me prendre un aspirine , après tout ça ...
0
mamiemando Messages postés 34243 Date d'inscription   Statut Modérateur Dernière intervention   7 899
 
Je pense que tu as du faire des trucs louches au niveau des accolades... Normalement le for suffit (et la boulce foireuse n'est jamais évaluée au moment où elle est sensée planter).
0