Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Recherche dans listview [ Windows / GUI ] (draluorg)

lundi 31 décembre 2007 à 17:06:43 | Recherche dans listview

draluorg

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...


lundi 31 décembre 2007 à 17:16:02 | Re : Recherche dans listview

BruNews

Administrateur CodeS-SourceS
Regarde LVM_GETNEXTITEM

ciao...
BruNews, MVP VC++

lundi 31 décembre 2007 à 17:21:07 | Re : Recherche dans listview

draluorg

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...

lundi 31 décembre 2007 à 17:35:11 | Re : Recherche dans listview

draluorg

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...

lundi 31 décembre 2007 à 18:31:01 | Re : Recherche dans listview

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
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++

mardi 1 janvier 2008 à 15:26:59 | Re : Recherche dans listview

draluorg

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...

mardi 19 février 2008 à 21:07:14 | Re : Recherche dans listview

gvollant

Membre Club Administrateur CodeS-SourceS
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

mardi 19 février 2008 à 21:34:02 | Re : Recherche dans listview

BruNews

Administrateur CodeS-SourceS
Exemple ownerdraw ici:
VILLES ET CODES POSTAUX (WIN32)
http://www.cppfrance.com/code.aspx?id=11151

ciao...
BruNews, MVP VC++



Cette discussion est classé dans : listview, lvitem, sendmessagea, lvicount, retchar


Répondre à ce message

Sujets en rapport avec ce message

Modification d'un item dans un listview [ par abdoulax ] Bon voilà une question tou bête pourtant ça fé un pti moment que je galaire dessus. En fait j'ai remplie mon listview avec des items, associé à une i listview petit probleme [ par babylone2019 ] Bonjour,voila j'ai creer cette fonction pour inserer du texte dans ma list view, mais bon il me retourne -1 des la fonction ListView_InsertItem();Mais ListView qui ne s'affiche pas [ par minet03 ] Coucou, alors le problème est simple. Je créer un ListView avec 2 colonnes donc voici le code : http://www.nomorepasting.com/paste.php?pasteID=44284 L ListView scrollable [ par minet03 ] Coucou J'ai fais un ListView dans une fenêtre, lorsque que la fenêtre change de taille, le ListView change de taille aussi pour qu'il fasse tout le te comment creer des cellules dans une list view [ par vincetreg ] Bonjour tout le monde, j'ai un probleme très difficile à résoudre... Je souhaiterai creer des cellules dans une listview. En effet, à chaque création WindowProc pour ListView [ par minet03 ] Coucou, j'ai créer un ListView dans une fenêtre en tant que WS_CHILD, et je définit une nouvelle WNDPROC pour ce ListView avec SetWindowLong. Ensuite Selection dans listview - API Windows [ par banane_rose ] salut. voilà , je trouve pas comment séléctionner un élément dans une listview , ni comment savoir si y'a des items séléctionnés et combien .<font co items listview [ par gagah1 ] Salut, Est-t-il possible d'afficher en differentes couleurs les items et les subitems de ListView style REPORT? Sélection d'une ligne d'un ListView [ par flyingfish ] Bonjour,Dans un contrôle Microsoft ListView Control, version 6.0, si je clique sur une ligne, aucun problème, elle se sélectionne.Si ensuite je veux d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.