begin process at 2012 05 28 12:54:48
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

API

 > 

[API win32] Listbox capricieuse


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

[API win32] Listbox capricieuse

lundi 13 mars 2006 à 15:05:13 | [API win32] Listbox capricieuse

JoebarGlut

Bonjour,
Voila j'ai un souçis avec une listebox, j'espere que quelqu'un pourra m'aider. Moi je n'ai plus d'idées et pourtant y'a rien de plus simple... quelque chose dois m'echapper.
Voila mon but :
J'ai un bouton AJOUTER, SUPPRIMER, UP et DOWN.
Je remplis ma listebox avec des objets Cmp3.
Le programme compile, il ne plante pas, je peux ajouter des mp3, je peux les supprimer. Jusque la tout va bien.
Mais lorsque je veux intervertir deux objets, je fais appel a la fonction UP pour intervertir vers le haut et DOWN vers le bas.
En debugant mes fonctions : mes objets s'intervertssent correctement.
Mais quand je fais appel à update(), ma listebox est censée se détruire et reafficher chaques objets Cmp3.
Lorsque je debug update, tout est normal.
ALORS POURQUOI L'AFFICHAGE NE SE FAIS PAS ? (alors que cette fonction fonctionne avec ajouter et supprimer)
Autre remarque :
Lorsque je fais un UP(), puis un suppr() du mp3 que je viens de monter, il me supprime le bon objet, mais pas le bon affichage puisque ma listebox n'a pas fait de UP().
J'espere que j'etais assez clair, y'a rien de compliqué et la je suis bloqué sur cette bizarerie incomprehensible :(
Voici un peu de code :

if(UPDATE) // mise a jour de la playliste (WINDOWS LOOP)
{

Cplaylist->update() ;
UPDATE = 0 ;
}

//(SWITCH BOUTON)*************************************

case IDC_BUTTON9 : // AJOUTER
Cplaylist->add(Cplaylist->Mp3_Name);
UPDATE = 1 ;
return TRUE ;

/*******************************************************/
case IDC_BUTTON3 : //SUPPRIMER

if(Cplaylist->suppr() <= 0)
MessageBox(Dlg,"Vous devez selectionner un Mp3 a supprimer !",NULL,MB_OK);
else
UPDATE = 1 ;
return TRUE ;

/********************************************************/
case IDC_BUTTON1 : //UP
Cplaylist->up();
UPDATE = 1 ;
return TRUE ;

/********************************************************/
case IDC_BUTTON4 : //DOWN
Cplaylist->down() ;
UPDATE = 1 ;
return TRUE ;

// (PLAYLIST.CPP)******************************************/

int playliste::add(char * nom_mp3)
{
*(Cmp3+nb_mp3) = new mp3 ;
(*(Cmp3+nb_mp3))->set_name(nom_mp3) ; //c public mais spa grv lol
this->nb_mp3++ ;
return (nb_mp3-1) ;
}

/**********************************************************/
int playliste::suppr()
{
// Récupère l'indexe de l'item sélectionner
int SelIndex = SendMessage(hList, LB_GETCURSEL, 0, 0);
if(SelIndex != LB_ERR) // si kkchose est selectionne
{    
char del[MAX_PATH] ;
sprintf(del,"%s\\Playlist\\%s",(*(Cmp3+SelIndex))->Chemin,(*(Cmp3+SelIndex))->nom);
DeleteFile(del) ;
int i = 0;
while((SelIndex+i) != (nb_mp3 - 1))
{
memcpy((*(Cmp3+SelIndex+i))->nom, (*(Cmp3+(SelIndex+i+1)))->nom,
MAX_PATH);

memcpy((*(Cmp3+SelIndex+i))->Chemin, (*(Cmp3+(SelIndex+i+1)))->Chemin, MAX_PATH);
(*(Cmp3+SelIndex+i))->LenStart = (*(Cmp3+(SelIndex+i+1)))->LenStart ;
i++;
}    
delete *(Cmp3+nb_mp3-1) ;
nb_mp3--;
return 1 ;
}
else
return -1 ;
}

/***********************************************************************/
void playliste::up()
{
char tmpnom[MAX_PATH] ;
char tmppath[MAX_PATH] ;
int tmplen ;
int SelIndex = SendMessage(hList, LB_GETCURSEL, 0, 0);
if(SelIndex != LB_ERR) // si kkchose est selectionne
{
if(SelIndex != 0)
{
memcpy(tmpnom, (*(Cmp3+(SelIndex)))->nom, MAX_PATH);
memcpy(tmppath, (*(Cmp3+(SelIndex)))->Chemin, MAX_PATH);
tmplen = (*(Cmp3+(SelIndex)))->LenStart ;
            
memcpy((*(Cmp3+SelIndex))->nom, (*(Cmp3+(SelIndex-1)))->nom, MAX_PATH);
memcpy((*(Cmp3+SelIndex))->Chemin, (*(Cmp3+(SelIndex-1)))->Chemin, MAX_PATH);
(*(Cmp3+SelIndex))->LenStart = (*(Cmp3+(SelIndex-1)))->LenStart ;

memcpy((*(Cmp3+(SelIndex-1)))->nom,tmpnom, MAX_PATH);
memcpy((*(Cmp3+(SelIndex-1)))->Chemin,tmppath, MAX_PATH);
(*(Cmp3+(SelIndex-1)))->LenStart = tmplen ;
}
}
}

/****************************************************************************/
void playliste::down()
{
char tmpnom[MAX_PATH] ;
char tmppath[MAX_PATH] ;
int tmplen ;
int SelIndex = SendMessage(hList, LB_GETCURSEL, 0, 0);
if(SelIndex != LB_ERR) // si kkchose est selectionne
{
if(SelIndex != (nb_mp3-1))
{
memcpy(tmpnom, (*(Cmp3+(SelIndex)))->nom, MAX_PATH);
memcpy(tmppath, (*(Cmp3+(SelIndex)))->Chemin, MAX_PATH);
tmplen = (*(Cmp3+(SelIndex)))->LenStart ;
            
memcpy((*(Cmp3+SelIndex))->nom, (*(Cmp3+(SelIndex+1)))->nom, MAX_PATH);
memcpy((*(Cmp3+SelIndex))->Chemin, (*(Cmp3+(SelIndex+1)))->Chemin, MAX_PATH);
(*(Cmp3+SelIndex))->LenStart = (*(Cmp3+(SelIndex+1)))->LenStart ;

memcpy((*(Cmp3+(SelIndex+1)))->nom,tmpnom, MAX_PATH);
memcpy((*(Cmp3+(SelIndex+1)))->Chemin,tmppath, MAX_PATH);
(*(Cmp3+(SelIndex+1)))->LenStart = tmplen ;
}
}
}

/********************************************************************************
/********************************************************************************
lundi 13 mars 2006 à 15:10:55 | Re : [API win32] Listbox capricieuse

JoebarGlut

oups j'ai oublié la fonction qui m'embete (seulement pour up et down) :

void playliste::update()
{
   
    SendMessage(hList, LB_RESETCONTENT, NULL, NULL);
    for(int i=0 ; i!=nb_mp3 ; i++)
    {
        if(SendMessage(hList, LB_ADDSTRING, NULL, (LPARAM) (*(Cmp3+i))->nom) == LB_ERR)
            exit(-1); // erreur a traiter
        HDC hdc = GetDC(NULL);
        GetTextExtentPoint32(hdc,(*(Cmp3+i))->nom, strlen((*(Cmp3+i))->nom),(LPSIZE)&size);
        if(size > MaxLen)
        {
            MaxLen = size ;
            SendMessage(hList, LB_SETHORIZONTALEXTENT, size, 0);
        }
    }
}

lundi 13 mars 2006 à 15:13:34 | Re : [API win32] Listbox capricieuse

JoebarGlut

burk

void playliste::update()
{
SendMessage(hList, LB_RESETCONTENT, NULL, NULL);
for(int i=0 ; i!=nb_mp3 ; i++)
{
if(SendMessage(hList, LB_ADDSTRING, NULL, (LPARAM) (*(Cmp3+i))->nom) == LB_ERR)
exit(-1); // erreur a traiter
HDC hdc = GetDC(NULL);
GetTextExtentPoint32(hdc,(*(Cmp3+i))->nom, strlen((*(Cmp3+i))->nom),(LPSIZE)&size);
if(size > MaxLen)
{
MaxLen = size ;
SendMessage(hList, LB_SETHORIZONTALEXTENT, size, 0);
}
}
}
lundi 13 mars 2006 à 16:51:40 | Re : [API win32] Listbox capricieuse

JoebarGlut

J'ai du nouveau.
apparament quand lors de l'update la chaine de caractere s'agrandie, j'envois le message suivant qui semble me faire buguer.
SendMessage(hList, LB_SETHORIZONTALEXTENT, size, 0);

A ce moment la, meme si i != nb_mp3, je sors quand meme du for !
Trop fort, lol jamais vu ca.
Il sors du for et il va directement à la ligne au dessus du for ici :
SendMessage(hList, LB_RESETCONTENT, NULL, NULL);
Ca voudrais dire qu'il relance la fonction update ?!
...tres bizare !

Peut etre une reference a une fonction update() dans la fonction sendmessage mais m'etonnerais... ou alors c dans les threads windows ke ca merdouille :(
lundi 13 mars 2006 à 17:16:00 | Re : [API win32] Listbox capricieuse

JoebarGlut

Bon j'ai resolu ce dernier bug bizare en fesant le SETHORIZONTALEXTENT en dehors de la fonction update, mais mon probleme ne venais pas de ca...
mon break pas à pas fait tout ce que je veux, mes variables contiennent tout ce que je veux. Pas d'erreur renvoyées par les SendMessage... je suis au bord du suicide, j'aurais du poster dans Au secours
C'est la premiere fois que je bloque autant sur un truc qui devrais etre pourtant simple et qui l'etait jusqu'au codage de up() et donw() :S
Si je resouds pas ca, je ne touche plus a cette api et je m'en cree une entierement en glut lol. (s'il fo reinventer la roue...grrr)
lundi 13 mars 2006 à 18:28:03 | Re : [API win32] Listbox capricieuse

aardman

Membre Club
Réponse acceptée !
Salut,
Dans ta fonction update, la variable size doit etre une structure SIZE (voir msdn sur le dernier param GetTextExtentPoint32). Donc vu que size n'est pas un int les trucs du genre "size > maxLen" et "maxLen = size" sont faux.
Au passage, petit memory leak puisque tu oublies de liberer le hDC que tu crée avec GetDC.

Sinon consernant la technique, je pense que supprimer tout les items et les rajouter dans le bon ordre c'est un peu lourd.
Pour faire tes fonctions up et down, il suffit juste d'enlever et de rajouter l'item au bon endroit non ?
lundi 13 mars 2006 à 19:31:31 | Re : [API win32] Listbox capricieuse

JoebarGlut

salut
Pour le size j'aurais bien aimé utiliser la struct SIZE mais mon compilo ne connais pas le type SIZE alors j'ai mis int et j'ai vu que ca marchais et les valeurs semblent correctes.
C'est dans quel point H ?
Ensuite pour GetDC, j'ai rajouté ReleaseDC(NULL, hdc); , c'est bien comme ca ? (premiere fois que je passe NULL a GetDC)
Sinon pour la technique en fait je m'occupe d'abord de ma liste d'objet mp3 et ensuite je gere son affichage donc le plus rapide pour moi ct un deletecontent puis une simple recopie de mon tableau d'objets mp3 mais je ferais comme tu dis si vraiment je n'arrive pas a resoudre ce probleme. Ce qui m'irisse c'est surtout que ca marche nikel pour ajout et suppr et ca m'embete d'utiliser une autre technique tant que je n'aurais pas compris pourquoi il me fais ça ce grrrrrrrrrrrrrrrrrrrrredin !
mardi 14 mars 2006 à 01:11:04 | Re : [API win32] Listbox capricieuse

JoebarGlut

Bon en fait j'ai utilisé ta technique et ca fonctionne nikel :)
J'aurais bien aimé savoir pour l'autre mais tans pis, je m'en vais avec une lacune qui viendra m'achever un autre jour...
merci pour l'aide ;)


Cette discussion est classée dans : path, max, mp3, selindex, cmp3


Répondre à ce message

Sujets en rapport avec ce message

probleme avec Liste Files [ par anonyme_man_in_this_world ] salut ! !je voudrais ecrire une fonction essayant de lister les fichiers et les sous-dossiers d'un dossier mais ça ne marche pas toujours ,voila le co GlobalAlloc [ par yepla75 ] Bonjour,Quelle est la différence (en gros) entre GlobalAlloc et malloc ?Faut-il libérer la mémoire ?La syntaxe que je vois souvent est : char *c = Glo "Traduction C -> ASM [ par Neo_Fr ] Bonsoir, Est-ce que quelqu'un saurait me "traduire" ces quelques lignes en assembleur: HANDLE hFile; DWORD bw; char CurDir[MAX_PATH]; GetCurrentDirec ecrire le texte de ma variable dans GetModuleFileName [ par sokotanic ] salut j'ai un probleme char temp[MAX_PATH]; temp = "mon text"; len = GetModuleFileName(NULL,temp,MAX_PATH); la compilation marche pas et j'ai eu ses Convertir WMA , MP3 au format WAVE [ par sivaller ] Bonjour,Je cherche un code source convertissant des fichiers WMA, mp3 au format WAVE.Rien trouver sur ce site.Merci bcpvous pouvez me contacter à NOSP probleme 8 dames fonction sans prise [ par mehdislim59 ] bonjour je suis nouvo et je debute en programmation et je voudrais savoir comme resoudre mon petit probleme sur les 8 reines je suis mon enoncé qui me 8 reines [ par mehdislim59 ] bonjour je suis nouvo et je debute en programmation et je voudrais savoir comme resoudre mon petit probleme sur les 8 reines je suis mon enoncé qui me desactiver l'echo sur une liaison RS232 [ par yooyoo78450 ] Bonjour, j'aurais voulu savoir comment désactiver l'echo sur une liaison série en port com, voila un bout de mon programme où sont decrites les optio


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 0,374 sec (3)

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