Bonjour tout le monde,
Peut-être ai-je loupé un point au sujet des boîtes de dialogue de sélection de fichier.
Je souhaite que le contenu d'un répertoire soit affiché dans la boîte de dialogue, et qu'un fichier visé apparaisse sélectionné, par une couleur de fond différente des autres fichiers.
J'ai bien pris soin d'initialiser le répertoire :
ofd.InitialDirectory = Application.UserAppDataPath;
J'ai pris note qu'indiquer le chemin en chaîne de caractères ne conviendrait pas, et qu'en revanche les répertoires de l'application peuvent convenir.
Ensuite je m'attends à ce que FileName, initialisé avant ShowDialog(), permette de sélectionner un fichier, mais que je lui passe Name ou FullName, ça n'a pas l'air de lui faire d'effet. Le chemin indiqué apparaît en bas de la boîte de dialogue dans la zone de texte, mais dans la liste de fichiers le fichier n'est pas sélectionné.
Je m'en suis sorti par le multi-threading, j'attends l'ouverture de la boîte de dialogue, puis par SendKeys.SendWait j'envoie le nombre de tabulations qu'il faut pour arriver sur la liste de fichiers, puis le nom du fichier.
Ça marche impeccable dans Windows 11 23H2 (10.0.22631.4460), mais il ne faudrait pas que ça pique Microsoft d'ajouter ou retirer un contrôle dans la boîte de dialogue, ou de modifier la réaction au clavier, car alors dans le premier cas le nom de fichier est envoyé ailleurs que dans la liste, dans le deuxième ça donne un résultat imprévisible.
Je peux alors retoucher le programme, mais on dirait que ça n'est pas une façon très propre de programmer.
Si ça inspire quelqu'un ...
***
Une autre difficulté apparaît au bout d'un certain nombre d'exécutions.
L'ordre des fichiers dans la liste est aléatoire. Et du coup le nom de fichier envoyé par simulation de touches n'est pas interprété de la même manière selon l'ordre (les essais ont vu apparaître deux valeurs en alternance).
Il ne m'apparaît pas que GetOpenFileNames ait une propriété fixant l'ordre de tri ?
***
Sinon, en simulant un clic de souris sur l'entête de la première colonne, ça "tombe en marche" beaucoup plus souvent.
Pour ça, soit on évite de modifier les largeurs des colonnes, soit on parcourt les contrôles (fenêtres enfants de la boîte de dialogue) pour une fois sur une ListBox évaluer les largeurs de ses colonnes, ce qui est quand même plus de sport. Et encore j'ai travaillé à définition graphique d'écran constante.
Partager