Problème avec openfiledialog

MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - 27 août 2017 à 10:38 - Dernière réponse : Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention
- 28 août 2017 à 19:00
Bonjour,
Après plus de trente ans de pratique de plusieurs dizaines de langages, je viens de passer au C# (il est grand temps !)

Malgré quelques errements dans la jungle des classes du framework.net, j'arrive maintenant à produire du code qui fonctionne.

J'ai cependant affaire à une erreur dont je n'ai trouvé aucune réponse sur le net, et dont je n'arrive pas à comprendre la cause.

J'utilise plusieurs fois dans mon application une instance d'OpenFileDialog de la façon suivante :

OpenFileDialog OpenFile = new OpenFileDialog();
OpenFile.CheckFileExists = true;
OpenFile.InitialDirectory = sPath;
OpenFile.Filter = msFileFilter;
OpenFile.Title = ksPrompt;
OpenFile.Multiselect = true;
try
{
r = OpenFile.ShowDialog();
}
catch (Exception ex)
{
EH.TraiteErreur(ex);
}
if (r == DialogResult.Cancel)
{
OpenFile.Dispose();
return;
}
.....
Openfile.Dispose();

sPath est le dernier chemin utilisé, par exemple C:\users\MGD\Documents lorsque aucun autre n'est mémorisé.

Or, au PREMIER appel de la classe (et encore, pas à chaque fois), j'ai le message d'erreur suivant : "Il n'y a pas de disque dans le lecteur. Insérez un disque dans le lecteur \Device\Harddisk2\DR2" (voir l'image de la boite de dialogue ci-dessous).
http://static.ccm2.net/codes-sources.commentcamarche.net/pictures/UhXiOqRGEfDJSuqqE9UURtTHaQhuuxai5nYJYNKwqBS4rundJPVt8NYSRGkdlRd3-erreur-openfiledialog.png

Je précise que l'erreur n'est pas traitée par le catch, mais provient directement du système (en fait, vraisemblablement pas le framework). Un point d'arrêt dans le catch n'est jamais atteint, et la procédure TraiteErreur n'est pas appelée.

Le chemin indiqué ressemble à un chemin Linux, or je suis sous Windows 7.
Dans le gestionnaire de disque, le disque 2 correspond à un lecteur de cartes, qui n'en contient pas.

Quel que soit le bouton sur lequel on clique (Annuler/Recommencer/Continuer), la boite se ferme et l'application se poursuit sans autre problème (heureusement), et la boite de dialogue s'ouvre normalement. Mais ce n'est quand même pas très propre pour une application que l'on souhaite diffuser.

Pourquoi la boite de dialogue va chercher à ouvrir ce disque à la première ouverture, et pas sur les suivantes ??

sPath est mémorisé et placé dans un fichier ini. Il change donc régulièrement. Cependant, quelque soit sa valeur, l'erreur se produit à la première création d'instance de la session, lors de l'appel de Show(). La boite est utilisée par plusieurs routines différentes (avec une nouvelle instance à chaque fois), mais seul le premier appel de la session provoque l'erreur.

Pendant le développement, j'ai effectivement utilisé ce lecteur pour faire des essais. Cependant, la propriété InitialDirectory ne contient plus trace de ce lecteur, et le fait d'utiliser une instance neuve à chaque fois devrait donner une boite n'ayant pas de "mémoire".

Quelqu'un a une idée ??
Merci de vos conseils
Afficher la suite 

8 réponses

Répondre au sujet
vb95 1503 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 27 août 2017 à 19:00
0
Utile
Bonsoir

Tu dis : Or, au PREMIER appel de la classe (et encore, pas à chaque fois), j'ai le message d'erreur suivant : "Il n'y a pas de disque dans le lecteur. Insérez un disque dans le lecteur \Device\Harddisk2\DR2".

cela signifie que tu fais un OpenfileDialog sur un lecteur physique soit non partitionné soit sans support .
Il faut vérifier si le répertoire sPath existe avant de chercher à ouvrir des fichiers !

Commenter la réponse de vb95
MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - Modifié par MGD Software le 27/08/2017 à 19:23
0
Utile
2
Je pense que tu n'as pas tout bien lu, et cette réponse est quelque peu vexante.

J'ai bien précisé que la propriété InitialDirectory pointait sur un répertoire existant sur D: (donc n'ayant rien à voir avec le lecteur indiqué dans le message). La propriété FileName est laissée vide, puisqu'on n'a pas de de nom de fichier (c'est justement ce qu'on demande).

Il est évident que la première chose que j'ai faite, c'est de mettre un point d'arrêt sur l'appel de la boite et vérifié la valeur de sPath, qui pointe bien vers un répertoire existant.

Après plus de trente ans de programmation, je ne pense pas être encore victime de ce genre de négligence.

C'est comme si, à un garagiste chevronné en train de chercher une panne d'allumage, tu demandais s'il y a de l'essence dans le réservoir...

La réponse que je souhaite, c'est la raison pour laquelle la boite cherche à tout prix à ouvrir un lecteur inexistant alors que je lui en indique un autre, et que de toute façon elle ouvre ce dernier correctement après que j'aie répondu au message d'erreur.

Je précise que cette erreur ne se produit que sur le poste de développement, et pas sur les autres. Ce n'est donc pas très grave, car les essais de déploiement que j'ai effectués montrent que l'erreur ne se produit pas sur les postes où l'application est installée. Mais je n'aime bien comprendre les choses qui me paraissent incompréhensibles.

Moi, j'aime fusionner la théorie et la pratique, contrairement à ton slogan...
vb95 1503 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 27 août 2017 à 20:28
Désolé si je te parais vexant ! Mais je ne vois pas en quoi !
Mais je maintiens ma réponse et c'est toi qui es vexant à mon avis .

Moi je mettrais un point d'arrêt sur l'instruction
OpenFile.Filter = msFileFilter; 
et je regarderais ce que vaut sPath à la ligne au-dessus au premier passage !!
MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - 28 août 2017 à 11:00
Avant de donner des conseils, il faut tout lire...
Notamment le 3ème alinéa de ce post, qui est exactement ce que tu préconises...
Commenter la réponse de MGD Software
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 27 août 2017 à 23:48
0
Utile
Bonsoir

Je me suis permis de déplacer ta question dans le forum C#, puisqu'il ne s'agit pas de C++ (forum que tu avais choisi).

Il est possible de mettre des images directement dans le message sans passer par un hébergement tiers, ça rend la lecture plus claire.

En regardant cette fameuse image, on voit que le message d'erreur vient du programme Média Suffle.exe, je pars du principe que tu n'as pas appelé ton projet ainsi.
D'après mes recherches, ce programme est un lecteur aléatoire de mp3. Je pause donc cette hypothèse, ce programme est installé sur ta machine, c'est le lecteur de mp3 par défaut, le chemin configuré pour les musiques est celui de l'erreur, et à un moment ou un autre ton projet tente de lire un mp3 sans préciser quel logiciel doit être utilisé, c'est donc celui par défaut qui est lancé.
Commenter la réponse de Whismeril
MGD Software 76 Messages postés vendredi 1 septembre 2006Date d'inscription 20 avril 2018 Dernière intervention - 28 août 2017 à 10:54
0
Utile
Merci pour le déplacement du sujet, je me suis effectivement planté de forum.

En ce qui concerne l'image, j'ai simplement cliqué sur le bouton de la barre d'outils de la zone de rédaction ("Insérer une image"), ce qui a donné le résultat affiché. Je ne sais pas comment intégrer une image autrement.

Enfin, ce programme n'est pas le lecteur de MP3 par défaut, ce n'est même pas un lecteur de media du tout. Il ne sert qu'à copier de façon aléatoire une liste de fichiers sur un support amovible, en limitant le volume transféré à une valeur voulue.

Ce programme n'est pas INSTALLÉ, mais tourne en mode debug sous Visual Studio. Il n'y a donc aucune association de fichier qui s'y réfère.

D'ailleurs, en l'ayant téléchargé et installé sur une machine virtuelle depuis le site de déploiement, je n'ai pas l'erreur alors que l'installation génère une association de fichiers avec l'extension *.msl (Media Shuffle List).

Désolé, mais ton argument ne tient pas. D'ailleurs, si c'était ça, le problème se produirait à chaque ouverture de la boite de dialogue. Or cela ne se produit qu'au premier appel. Le plus curieux, c'est que c'est une instance neuve à chaque fois. Ce n'est donc même pas un mauvais paramétrage de la boite, sinon cela se produirait à chaque fois. Il y a vraisemblablement un paramètre système qui mémorise ce fichu lecteur, mais je ne vois pas lequel.

Il faut dire que c'est un peu compliqué, car le lecteur en question est un lecteur de carte mémoire non mappé, mais monté dans un sous-répertoire du disque D. C'est pourquoi le message indique "\Device\Harddisk2\DR2" et non "G:" ou "Z:".

Lorsqu'une carte est présente, il n'y a pas d'erreur et le programme fonctionne très bien avec cette carte comme cible. Mais lorsqu'il n'y a pas de carte, le problème se produit quel que soit un autre lecteur mémorisé à la session précédente, ou même en effaçant le chemin mémorisé dans le fichier ini.

Le déploiement étant en cours, un fichier d'aide (encore provisoire) est disponible à l'adresse http://mgd.software.free.fr/downloads/Freewares/Media_Shuffle/help/index.htm . Cela donnera une idée de la fonctionnalité de l'appli. Son téléchargement (version beta) est disponible dans le répertoire parent.
Commenter la réponse de MGD Software
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - Modifié par Whismeril le 28/08/2017 à 17:17
0
Utile
1
Ce n'était pas un argument, mais une hypothèse.
Et cette hypothèse partait de l'idée que tu n'est pas en train de développer un logiciel dont le nom est déjà utilisé par un autre...

A ma connaissance, aucun composant du framework n'affiche ce genre de message, donc ça viendrait forcement de ton projet, et pas de ce bout de code puisqu'il n'y a pas de MessageBox.

Mets un point d'arrêt, à chaque messagebox de ton code qui propose les boutons annuler recommencer continuer pour voir ce qui se passe.

Le format ini a été abandonné, visual studio propose un fichier de config au format xml que tu peux remplir via les propriétés du projet. Voir un tuto ici

Pour l'image je vais faire remonter qu'il y a un bug.


Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Whismeril 11407 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 20 avril 2018 Dernière intervention - 28 août 2017 à 19:00
Pour l'image qui ne s'affiche pas cela pourrait venir d'un bloqueur de pub (si tu en as un).
Voir les liens de KX.
Tu peux le désactiver sur le site, car une fois connecté en tant que membre, il n'y a pas de pub.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.