[resolu] CListCtrl.SortItems(...)

CListCtrl.SortItems(...) [resolu] - C++ - Programmation

Marsh Posté le 08-04-2003 à 09:29:16    

J'essaye de trier une ListCtrl dans laquelle j'ai :
x  30000
y  40000
x  20000
 
pour la trier d'apres la deuxieme colonne je fais :  

Code :
  1. CListCtrl * plist = (CListCtrl *) GetDlgItem(IDC_LIST1);
  2. plist->SortItems(MyCompareProc, (LPARAM) plist);


 

Code :
  1. int CALLBACK CDlgClass1::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  2. {
  3. CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
  4. CString    strItem1 = pListCtrl->GetItemText(lParam1, 1);// tri sur la 2eme colonne?
  5. CString    strItem2 = pListCtrl->GetItemText(lParam2, 1);
  6. if ( strItem1 <= strItem2 )
  7.      {
  8.           return (-1) ;
  9.      }
  10.    
  11.      else
  12.      {
  13.           return (1) ;
  14.      }
  15. }


 
et ma liste n'est pas triee.
Mais si je mets  

Code :
  1. if ( strItem1 <= strItem2 )
  2.      {
  3.           return (1) ;
  4.      }
  5.    
  6.      else
  7.      {
  8.           return (-1) ;
  9.      }


il m'inverse la liste  
=> x 20000
   y 40000
   x 30000
 
Quelqu'un voit ou se situe le probleme?
 
http://msdn.microsoft.com/library/ [...] titems.asp


Message édité par polo021 le 08-04-2003 à 11:44:58
Reply

Marsh Posté le 08-04-2003 à 09:29:16   

Reply

Marsh Posté le 08-04-2003 à 09:51:12    

T arrives a faire une comparaison de deux CString avec un <= ou >= toi :ange:

Reply

Marsh Posté le 08-04-2003 à 09:54:26    

VisualC++ a écrit :

T arrives a faire une comparaison de deux CString avec un <= ou >= toi :ange:


 
c'est ce que j'avais vu sur un site. Et je leur ais fait confiance mais je vais regarder a ca et je reviens si j'ai toujours un probleme.  :whistle:


Message édité par polo021 le 08-04-2003 à 09:55:05
Reply

Marsh Posté le 08-04-2003 à 09:54:36    

VisualC++ a écrit :

T arrives a faire une comparaison de deux CString avec un <= ou >= toi :ange:


+1
c'est quoi ce bins ?  :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-04-2003 à 09:54:48    

Euh ds msdn ils mettent un strcmp quand mm :o

Reply

Marsh Posté le 08-04-2003 à 09:56:16    

VisualC++ a écrit :

Euh ds msdn ils mettent un strcmp quand mm :o


oui je viens d'editer mon message

Reply

Marsh Posté le 08-04-2003 à 09:56:53    

il me semblait bien qu'ils avaient quand meme merde dans l'MSDN
 
 error C2664: 'strcmp' : cannot convert parameter 1 from 'class CString' to 'const char *'
 
 :o

Reply

Marsh Posté le 08-04-2003 à 09:58:50    

Oui mais tu as le droit d'utiliser le compare membre de la classe CString quand mm :)
 
Edit : Ce qui donnerait

Code :
  1. CString ...
  2. CString ...
  3. return strItem2.CompareNoCase(strItem1);


Message édité par VisualC++ le 08-04-2003 à 10:00:30
Reply

Marsh Posté le 08-04-2003 à 10:00:21    

Les opérateurs ne devraient pas exister en POO :pfff:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-04-2003 à 10:01:59    

Harkonnen a écrit :

Les opérateurs ne devraient pas exister en POO :pfff:


 
ouais. je me suis fait induire en erreur par un site et je suis tombe dans le panneau  :(

Reply

Marsh Posté le 08-04-2003 à 10:01:59   

Reply

Marsh Posté le 08-04-2003 à 10:15:10    

Code :
  1. int CALLBACK CDlgClasse1::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  2. {
  3. CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
  4. CString    strItem1 = pListCtrl->GetItemText(lParam1, 1);
  5. CString    strItem2 = pListCtrl->GetItemText(lParam2, 1);
  6. return strItem1.CompareNoCase(strItem2);
  7. }


 
ca ne trie pas  :cry:
 
EDIT : peu importe que j'ai  
strItem2.CompareNoCase(strItem1);  
ou
strItem1.CompareNoCase(strItem2);


Message édité par polo021 le 08-04-2003 à 10:34:55
Reply

Marsh Posté le 08-04-2003 à 10:51:22    

Je viens de tester rapide avec le mm exemple que toi et ca marche.
 
Par contre je me demande un truc, tu as bien vu que la fonction de comparaison les 2 premiers parametres c est le DWORD associe a chaque item qu'il se voit passer en param et pas un index ou autre ?

Reply

Marsh Posté le 08-04-2003 à 10:55:34    

bah je sais pourquoi ca va pas.

Code :
  1. int CALLBACK CDlgClasse1::MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
  2. {
  3. CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
  4. CString    strItem1 = pListCtrl->GetItemText(lParam1, 1);
  5. CString    strItem2 = pListCtrl->GetItemText(lParam2, 1);
  6. AfxMessageBox(CString("icicompare" ));
  7. AfxMessageBox(strItem1);
  8. AfxMessageBox(strItem2);
  9. return strItem1.CompareNoCase(strItem2);
  10. }


je vous rappele que ma listctrl est :
x 30000
y 40000
x 20000
 
voici la sortie pendant le "tri" :
icicompare
30000
30000
icicompare
30000
30000
 
Si il compare deux fois la premiere ligne avec elle meme, c'est normal que ca ne trie pas!
 
Est ce que quelqu'un a deja reussi a faire fonctionner la fonction SortItems????
Parce que c'est pour le moins bizarre  [:violito]

Reply

Marsh Posté le 08-04-2003 à 10:57:40    

VisualC++ a écrit :

Je viens de tester rapide avec le mm exemple que toi et ca marche.
 
Par contre je me demande un truc, tu as bien vu que la fonction de comparaison les 2 premiers parametres c est le DWORD associe a chaque item qu'il se voit passer en param et pas un index ou autre ?


 
tu peux la refaire?


Message édité par polo021 le 08-04-2003 à 10:57:56
Reply

Marsh Posté le 08-04-2003 à 10:59:34    

Code :
  1. MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)


 
lParam1 et lParam2 sont les ItemData associe aux 2 elements a trier, et en aucune facon le numero de l'item.

Reply

Marsh Posté le 08-04-2003 à 11:03:22    

VisualC++ a écrit :

Code :
  1. MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)


 
lParam1 et lParam2 sont les ItemData associe aux 2 elements a trier, et en aucune facon le numero de l'item.


 
 
Comment tu t'en servirais toi alors de ces deux parametres?
L'MSDN ne me dit rien pour ca.

Reply

Marsh Posté le 08-04-2003 à 11:11:43    

Ben a toi de le remplir l'itemdata, et si y a marque ds la MSDN

Citation :


The lParam1 and lParam2 parameters specify the item data for the two items being compared. The lParamSort parameter is the same as the dwData value.


 
Quand j'ai vu

Code :
  1. pListCtrl->GetItemText(lParam1, 1);

dans ton code, je supposais que tu avais fait des SetItemData a l'init afin que le dword soit egale a l'indice de ton item.
 
Ben simplement pour l'utilisation

Code :
  1. m_List.InsertItem(0, _T("y" ));
  2. m_List.SetItemText(0, 1, _T("40000" ));
  3. m_List.InsertItem(1, _T("z" ));
  4. m_List.SetItemText(1, 1, _T("30000" ));
  5. m_List.InsertItem(2, _T("x" ));
  6. m_List.SetItemText(2, 1, _T("20000" ));
  7. fnvSetItemData();
  8. m_List.SortItems(m_fnCompare, (LPARAM)&m_List);
  9. ......
  10. void taclass::m_fnvSetItemData()
  11. {
  12. int iNum = m_List.GetItemCount();
  13. for (int i=0; i<iNum; i++)
  14.  m_List.SetItemData(i, i);
  15. }
  16. int m_fnCompare(LPARAM lpar1, LPARAM lpar2, LPARAM lpardata)
  17. {
  18. CListCtrl* pList = (CListCtrl*)lpardata;
  19. CString csItem1 = pList->GetItemText(lpar1, 1);
  20. CString csItem2 = pList->GetItemText(lpar2, 1);
  21. return csItem1.Compare(csItem2);
  22. // ou suivant l'ordre
  23. return csItem2.Compare(csItem2);
  24. }


 
et tu fais SetItemData() avant chaque Sort pour remettre les ItemData correctement
 
C tout


Message édité par VisualC++ le 08-04-2003 à 11:13:07
Reply

Marsh Posté le 08-04-2003 à 11:28:10    

Ca fonctionne avec le SetItemData
 
Je ne savais absolument pas qu'il fallait faire ca!
 
Un grand merci a toi  :hello:
 
 
EDIT : Est ce que je pourrais ajouter un parametre a la fonction de comparaison qui me servirait a indiquer sur quelle colonne on trie?


Message édité par polo021 le 08-04-2003 à 11:29:20
Reply

Marsh Posté le 08-04-2003 à 11:31:38    

Non tu peux pas elel est definie comme cela.
 
Si tu veux faire un truc plus sioux, faut passer :
- soit par une fonction de tri faite a la main
- soit dans le SetItemData() tu lui colle ttes les options afin de set le DWORD en fonction du param a trier.
 
Edit: j'entend par faite a la main de ne pas utiliser le SortItem.
 


Message édité par VisualC++ le 08-04-2003 à 11:32:09
Reply

Marsh Posté le 08-04-2003 à 11:43:56    

:jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed