Problème : Parcourir dossier avec une ListBox

[Résolu]
Signaler
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005
-
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005
-
Tout d'abord bonne année 2005 à tous!!!

/*avec devc++ sans librairie autre que windows.h et autre librairies standards*/

voila j'ai un petit probleme, j'aimerai a partir d'une ListBox parcourir un disque dur et faire comme si ct un explorer.
C'est a dire en cliquant sur un dossier le lister dans la meme ListBox et continuer sur un autre sous dossier... etc..
Les Disques dur etant lister dans une COMBOBOX.

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
string chemin;
switch (message)
{
case WM_COMMAND :
switch(LOWORD(wParam))
{
case ID_COMBOBOX :
{ if ((LOWORD(wParam) ID_COMBOBOX) && (HIWORD(wParam) LBN_SELCHANGE))
chemin = ListBii();
break;
}
case ID_LISTBOX :
{
chemin=ListBee(chemin);
break;
}
}
default:
return DefWindowProc (hwnd, message, wParam, lParam);
}

return 0;
}

*Ma fonction string ListBee(string chemin), liste le dossier chemin:

ex:ListBee("c:\\windows ")... etc no problem (sous dos)

*Ma fonction string ListBii(), liste un disque dur, ou autre lecteur logique, dans une COMBOBOX.

ex: je selectionne dans ma COMBOBOX c:\, listing dans ma LISTBOX. etc..no problem

*Le probleme c'est que le string chemin n'est pas modifié.... surement a cause du
"LRESULT CALLBACK WindowProcedure"

donc je ne pas parcourir les sous dossier et meme les dossiers des lesteurs autres que c:\
Le probleme ne viens pas de mes deux fonctions qui marchent sans problemes sous dos..

qq'un peut il m'aider??

Est il possible de mettre d'autres switchs dans mes switchs?

En gros mon probleme est que ma variable string chemin est apparement reinitialisée a chaque fois après un CASE:...break dans la boucle "LRESULT CALLBACK WindowProcedure".

J'ai bien sur j'ai trouvé des programmes sur le site qui marchent et font ce que je veux faire mais le code source est trop compliqué et utilise des librairies supplémentaires ou compilant avec visual c++ ou autres...et ce n'est pas ce que je veux.

Merci de votre aide!

9 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Dans ma précédente réponse j'ai fait une erreur. Pour conserver la valeur de chemin entre les appels c'est :

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static string chemin;

...
}

si listing vaut INVALID_HANDLE_VALUE c'est que le chemin fourni n'est pas valide (je suppose que tu as du avoir le pb car la ligne de test est en commentaire). Vérifie s'il ne faut pas rajouter un \ à la fin du chemin :
temp=chemin+"\\*.*";
listing = FindFirstFile(temp.c_str(), &wData);
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

/*petite correction*/

case ID_LISTBOX :
{if ((LOWORD(wParam) ID_COMBOBOX) && (HIWORD(wParam) LBN_SELCHANGE))
chemin=ListBee(chemin);
break;
}
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

/*petite correction DSL 2fois*/

case ID_LISTBOX :
{if ((LOWORD(wParam) ID_LISTBOX) && (HIWORD(wParam) LBN_SELCHANGE))
chemin=ListBee(chemin);
break;
}
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
"En gros mon probleme est que ma variable string chemin est apparement reinitialisée a chaque fois après un CASE:...break dans la boucle "LRESULT CALLBACK WindowProcedure"."

=> c'est normal vu que c'est une variable locale, elle perd donc son contenu à la fin du switch (return ...) et reprend une nouvelle à chaque appel à WndProc, il faut la mettre ststic ou en variable globale.
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

oki d'accord mais je fais comment pour la mettre en variable globale?


je la met où dans les parametres de LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam).

Si je la met dans le winmain, dans ma procedre elle est pas declarée donc il faut la mettre en parametre, mais je sais pas où et comment faire, je comprends pas trop la fonction LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam).

qq un pourrait il m'expliquer merci
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Une variable globale est simplement une variable définie en dehors de la fonction.

string chemin;

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
...
}

pour limiter la portée de la variable à la fonction et avoir le même effet qu'une variabme globale :

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
string chemin;

...
}
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

Merci mais ca je le sais....

Le probleme c'est que si je la declare en dehors de la procédure il ne la reconnais pas....
donc ca me fais une variable non declarée et mon but est de modifié chemin a chaque fois que je clique sur un élément de ma ListBox.
Mais j'ai trouver une solution à mon probleme en faisant des GetWindowText et des SetWindowText, je stocke le chemin avec SetWindowText dans un edit et je le recupere avec GetWindowText.

voici un autre probleme:
avec toute les librairies en api win;
void ListB(char *chemin)
{
string temp;
DIR *rep;
struct dirent *ep;
struct stat infos;
rep = opendir (chemin);
if (rep != NULL)
{
SendMessage(lsthWnd, LB_RESETCONTENT , 0, 0);
while (ep = readdir (rep))
{
stat(ep->d_name, &infos);
if(S_ISREG(infos.st_mode))
{
temp=ep->d_name;
SendMessage(lsthWnd, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)temp.c_str());
}
}
closedir (rep);
}
UpdateWindow(lsthWnd);
SetFocus(lsthWnd);
}

cette fonction me liste le dossier à l'adresse du chemin.

je voudrais utiliser : WIN32_FIND_DATA
#include <windows.h>
je sais pas si'il manque des include...

void ListB(string chemin)
{
string temp;
WIN32_FIND_DATA wData;
HANDLE listing;
SendMessage(lsthWnd, LB_RESETCONTENT , 0, 0);
// on rajoute *.* à la fin de l'adresse pour FindFirstFile()
temp=chemin+"*.*"; listing FindFirstFile(chemin.c_str(), &wData); ou listing FindFirstFile(temp.c_str(), &wData)
/*if(listing != INVALID_HANDLE_VALUE)*/
{
do
{
{
SendMessage(lsthWnd, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)wData.cFileName);
}
}
while (FindNextFile(listing, &wData));
FindClose(listing);


}
UpdateWindow(lsthWnd);
SetFocus(lsthWnd);

}
Cette fonction ne marche pas il m'affiche une fleche dans ma listbox ..qq'un pourrait me dire ou est l'erreur
Merci!!!!!!!!!!!!
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

MERCI beaucoup pour le static. Je trouvais pas l'erreur :p:p

euh par contre pour ma ListBee, ca marche toujours pas, je comprends pas....

Merci encore
Messages postés
22
Date d'inscription
jeudi 2 décembre 2004
Statut
Membre
Dernière intervention
15 novembre 2005

void ListB(string chemin)
{
string temp;
WIN32_FIND_DATA wData;
HANDLE listing;
SendMessage(lsthWnd, LB_RESETCONTENT , 0, 0);
// on rajoute *.* à la fin de l'adresse pour FindFirstFile()
temp=chemin+"\\*.*";
listing = FindFirstFile(temp.c_str(), &wData);
//if(listing != INVALID_HANDLE_VALUE)
{
do
{
if( wData.cFileName[0] != '.')
{
if ( wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
SendMessage(lsthWnd, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)wData.cFileName);
}
}
}
while (FindNextFile(listing, &wData));
}
FindClose(listing);
UpdateWindow(lsthWnd);
SetFocus(lsthWnd);
}

pour ceux que ca peux aider!!:p:p

->liste les dossiers du chemin donné, dans une listbox;
en remplacant cette ligne:
if ( wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
->liste que les fichiers.
et si on veut tout lister bah...c logique, on vire le if :p:p