Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1571 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [resolu] CListCtrl.SortItems(...)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[resolu] CListCtrl.SortItems(...)

n°355413
polo021
Posté le 08-04-2003 à 09:29:16  profilanswer
 

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
mood
Publicité
Posté le 08-04-2003 à 09:29:16  profilanswer
 

n°355435
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 09:51:12  profilanswer
 

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

n°355440
polo021
Posté le 08-04-2003 à 09:54:26  profilanswer
 

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
n°355441
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 08-04-2003 à 09:54:36  profilanswer
 

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)
n°355442
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 09:54:48  profilanswer
 

Euh ds msdn ils mettent un strcmp quand mm :o

n°355443
polo021
Posté le 08-04-2003 à 09:56:16  profilanswer
 

VisualC++ a écrit :

Euh ds msdn ils mettent un strcmp quand mm :o


oui je viens d'editer mon message

n°355445
polo021
Posté le 08-04-2003 à 09:56:53  profilanswer
 

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

n°355448
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 09:58:50  profilanswer
 

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
n°355450
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 08-04-2003 à 10:00:21  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°355455
polo021
Posté le 08-04-2003 à 10:01:59  profilanswer
 

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  :(

mood
Publicité
Posté le 08-04-2003 à 10:01:59  profilanswer
 

n°355469
polo021
Posté le 08-04-2003 à 10:15:10  profilanswer
 

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
n°355504
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 10:51:22  profilanswer
 

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 ?

n°355507
polo021
Posté le 08-04-2003 à 10:55:34  profilanswer
 

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]

n°355508
polo021
Posté le 08-04-2003 à 10:57:40  profilanswer
 

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
n°355510
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 10:59:34  profilanswer
 

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.

n°355513
polo021
Posté le 08-04-2003 à 11:03:22  profilanswer
 

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.

n°355521
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 11:11:43  profilanswer
 

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
n°355539
polo021
Posté le 08-04-2003 à 11:28:10  profilanswer
 

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
n°355542
VisualC++
J'va y penser ...
Posté le 08-04-2003 à 11:31:38  profilanswer
 

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
n°355557
polo021
Posté le 08-04-2003 à 11:43:56  profilanswer
 

:jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [resolu] CListCtrl.SortItems(...)

 

Sujets relatifs
[C] tableaux de pointeurs [Resolu][JAVA] jouer des .wav [Résolu !]
[REGEXP][RESOLU] Expression régulière pour un nom NetBIOS d'ordinateurRESOLU : lister le repertoire parent
[PHP] Pb avec droit apres upload d'un fichier [RESOLU][RESOLU] [Access] Tri avec un bouton dans un formulaire.
Resolu[c]comment ecrire un entier en parametre de write[Resolu (Merci MagicBuzz)] Problème pour lire un flux de byte en C#
Question mysql pour un débutant... RESOLU grace a Mr yvele MerciFormater un texte en php ? RESOLU ca marche avec le \n
Plus de sujets relatifs à : [resolu] CListCtrl.SortItems(...)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR