Recherche dans listview [Résolu]

Signaler
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Salut a tous,

J'ai un petit soucis de perf pour tester l'existance d'un SubItem dans une listview.
En fait j'ai une fonction AddLvItem a qui j'envoie le text de l'item et le text du subItem a ajouter,
celle-ci verifie que le subItem n'existe pas deja et l'ajoute dans la listview.

Voici mon code:

void

AddLvItem(char *chItemTxt, char *chSubItem)
{
LVITEM lvItem;
int i=0;
LRESULT lviCount=0;
char RetChar[5];

RtlFillMemory(&lvItem, sizeof(LVITEMA), 0);
RtlFillMemory(RetChar, 5, 0);

lviCount=SendMessageA(hLv, LVM_GETITEMCOUNT, 0, 0);

lvItem.mask = LVIF_TEXT;

if (lviCount==-1) goto ADD;

lvItem.iSubItem = 1;
lvItem.cchTextMax = 5;
lvItem.pszText = RetChar;

for (i=0; i<(int)lviCount; i++)
{
lvItem.iItem = i;
SendMessageA(hLv, LVM_GETITEMTEXT, i, (LPARAM) &lvItem);
if (RtlCompareMemory(chSubItem, RetChar, 4)==4) return;
}

ADD:

lvItem.pszText = chItemTxt;
lvItem.iItem = lviCount;
lvItem.iSubItem = 0;

SendMessageA(hLv, LVM_INSERTITEMA, lviCount, (LPARAM) &lvItem);

lvItem.iSubItem = 1;
lvItem.cchTextMax=5;
lvItem.pszText = chSubItem;

SendMessageA(hLv, LVM_SETITEMTEXT, lviCount, (LPARAM) &lvItem);

}

J'imagine que je dois mal m'y prendre mais je vois pas comment faire autrement ?
Ou peut etre n'est ce pas la methode mais le code en lui meme ?

Merci d'avance pour votre aide
++

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...

7 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
RtlFillMemory(&lvItem, sizeof(LVITEMA), 0);
RtlFillMemory(RetChar, 5, 0);
C'est hors boucle mais quand même je ne vois pas pourquoi faire des appels externes pour si peu.

RtlFillMemory > memset est inliné par compilo.
Si sans CRT:
DWORD *pdw;
pdw = (DWORD*) &lvItem;
count = sizeof(LVITEM) / 4;
do {
  *pdw++ = 0;
} while(--count);

char RetChar[8]; // multiple de 4 pour alignement des données
*((DWORD*) RetChar) = 0;
*((DWORD*) (RetChar + 4)) = 0; // mis à 0 en 2 cycles maxi sans boucle

Beaucoup plus crucial car dans la boucle:
if(RtlCompareMemory(chSubItem, RetChar, 4)==4) return;
deviendra:
if( *((DWORD*) RetChar) == *((DWORD*) chSubItem) ) return;

ciao...
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
Regarde LVM_GETNEXTITEM

ciao...
BruNews, MVP VC++
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

Salut BruNews,

Ok je vais essayer, merci pour ta réponse ;)

Bonne année!

++

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

re,

eh en fait apres avoir regardé je vois pas trop comment l'utiliser...
Il ne permet pas de recuperer un index depuis une chaine, donc a moins de l'appeler jusqu'a ce qu'il retourne -1 et faire chaque fois un GETITEMTEXT je vois pas trop :(

Si non y a aussi le message LVM_FINDITEM mais apparement ne fonctionne que pour les "items" et pas pour les "subitems :(

++

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
Messages postés
625
Date d'inscription
vendredi 23 avril 2004
Statut
Membre
Dernière intervention
25 novembre 2010

re,

Eh oui c'est clair que les appels a memset ne sont pas tres justifié mais c'etait dans par simplicité un premier temps.
Sinon bien que je suis sure que tes modifs me font gagner pas mal de cycles, mon probleme de perfs reste le meme...

Il vaut mieux que je stok les valeurs dans un tableau et lister ce tableau au lieu de la listview pour savoir si le subitem existe deja...

Encore merci pour tes reponses et tes quelques lignes de codes dans les quels j'en apprends un peu plus chaque fois!

Quand on pose une question on est con 5 minutes,
Quand on ne la pose pas on le reste toute sa vie...
Messages postés
22
Date d'inscription
mardi 3 mars 2009
Statut
Membre
Dernière intervention
3 mars 2009
2
Si vous avez vraiment beaucoup d'item, utiliser une listview virtuelle et stockez vous même les textes (et effectuez ainsi les comparaisons "privée").

Une callback vous "demandera" le texte quand la listview en aura besoin
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
21
Exemple ownerdraw ici:
VILLES ET CODES POSTAUX (WIN32)
http://www.cppfrance.com/code.aspx?id=11151

ciao...
BruNews, MVP VC++