Recherche dans listview

Résolu
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010 - 31 déc. 2007 à 17:06
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 19 févr. 2008 à 21:34
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 déc. 2007 à 18:31
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++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 déc. 2007 à 17:16
Regarde LVM_GETNEXTITEM

ciao...
BruNews, MVP VC++
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
31 déc. 2007 à 17:21
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...
0
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
31 déc. 2007 à 17:35
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
draluorg Messages postés 625 Date d'inscription vendredi 23 avril 2004 Statut Membre Dernière intervention 25 novembre 2010
1 janv. 2008 à 15:26
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...
0
gvollant Messages postés 22 Date d'inscription mardi 3 mars 2009 Statut Membre Dernière intervention 3 mars 2009 13
19 févr. 2008 à 21:07
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
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 févr. 2008 à 21:34
Exemple ownerdraw ici:
VILLES ET CODES POSTAUX (WIN32)
http://www.cppfrance.com/code.aspx?id=11151

ciao...
BruNews, MVP VC++
0
Rejoignez-nous