begin process at 2012 02 11 13:43:47
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

Recherche dans listview


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Recherche dans listview

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ée 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_FindItem() -> passage de LVITEM à LVFINDINFO .lParam [ par dyroj ] Bonjour, je voudrai utiliser la fonction ListView_FindItem() dans une autre colonne que la 1ère . voila mon code qui ne fonctionne pas : //struct LV Scintillement ListView [ par PriMe2302 ] Bonjour, J'ai les items d'une ListView qui sont mis à jour par des threads. Comment faire pour éviter les scintillements de la ListView? Merci. listview [ par danyce ] kelk'un saurait il se servir d un listview avec visual c++j aimerai connaitre les lignes de code pour le remplir, ca serai cool!merci d avance... Au secours ListView !!! :o((( [ par Frederyck ] FrederyckSalut,Alors en fait j'ai créer une appli en VC++ 6.0 avec MFC, avec ma vue basée sur une LIstView, et j'aimerai faire deux choses:tout d'abor Click et ListView [ par glipper ] Bonjour,J'aimerais détecter le click sur un Item d'une List View.J'ai essayé ceci :if ((LOWORD(wParam) == IDC_LIST1) && (HIWORD(wParam) == LBN_SELCHAN recuperer texte d'une ListView [ par glipper ] Lol bonjour, (et vi encore moi, désolé :)Maintenant, j'essaie de récuperer le nom de l'item selectionné dans ma ListView. J'ai récuperé le numero de l Icones et ListView [ par glipper ] Bonjour,Je voudrais savoir s'il est possible d'attribuer des icones differentes aux differents Items d'une ListView ?Parceque la commande SendMessage( listview et TreeView :: bmp 256 coueleur [ par JackosKing ] Pourquoi il n'est pas possible d'afficher des bmp de plus de 256 couleur en tant qu'icone dans une treeview et listview? peut on contourner cette cont


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,388 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales