Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. ###raw>post.musername###
    Rédacteur
    [VBS]Dialogue "Sélectionner un fichier" toutes versions de Windows avec filtres et choix du répertoire initial
    bonjour,

    selon le principe que "deux c'est déjà trop", j'ai écris une fonction en une ligne qui permet la sélection d'un fichier
    dans une boite de dialogue.
    c'est une version étendue de ma précédente fonction qui permet désormais de choisir facilement le répertoire
    de départ du dialogue, les éventuels filtres ainsi que le titre du dialogue.
    compatible toutes versions et notamment vista, seven et 8

    pas de composant additionnel, pas d'horreurs comme l'utilisation de clés de registre ou de fichiers temporaires
    c'est du straight microsoft
    qui a dit ? : pour une fois !!

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    '************************************************************************************** 
    ' GetFileDlg() And GetFileDlgBar() by omen999 - may 2014 - http://omen999.developpez.com
    ' Universal Browse for files function  
    ' compatibility : all versions windows and IE - supports start folder, filters and title
    ' note : the global size of the parameters cannot exceed 191 chars for GetFileDlg and 227 chars for GetFileDlgBar
    ' for people who want to tell their life's story within browse dialogs, this limit can be removed but it would take two more lines of code so.. no way
    '*******************************************************************************************
    Function GetFileDlg(sIniDir,sFilter,sTitle)
    	GetFileDlg=CreateObject("WScript.Shell").Exec("mshta.exe ""about:<object id=d classid=clsid:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object><script>moveTo(0,-9999);function window.onload(){var p=/[^\0]*/;new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(p.exec(d.object.openfiledlg('" & sIniDir & "',null,'" & sFilter & "','" & sTitle & "')));close();}</script><hta:application showintaskbar=no />""").StdOut.ReadAll
    End Function
     
    Function GetFileDlgBar(sIniDir,sFilter,sTitle)
    	GetFileDlgBar=CreateObject("WScript.Shell").Exec("mshta.exe ""about:<object id=d classid=clsid:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object><script>moveTo(0,-9999);function window.onload(){var p=/[^\0]*/;new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(p.exec(d.object.openfiledlg('" & sIniDir & "',null,'" & sFilter & "','" & sTitle & "')));close();}</script>""").StdOut.ReadAll
    End Function
     
    ' sample test
    sIniDir = "C:\Windows\Fonts\*"
    sFilter = "All files (*.*)|*.*|Microsoft Word (*.doc;*.docx)|*.doc;*.docx|Adobe pdf (*.pdf)|*.pdf|"
    sTitle = "GetFileDlg by omen999 2014 - omen999.developpez.com"
     
    ' (sIniDir + sFilter + sTitle) size doesn't exceed 191 chars (227 for GetFileDlgBar)
    ' MsgBox Len(Replace(sIniDir,"\","\\")) + Len(sFilter) + Len(sTitle)
     
    ' sIniDir must be conformed to the javascript syntax
    rep = GetFileDlg(Replace(sIniDir,"\","\\"),sFilter,sTitle)
    MsgBox rep & vbcrlf & Len(rep)
      1  0

  2. #2
    Rédacteur

    les principes sont fait pour être violés...
    bon, en fait j'avais besoin d'un filtre à rallonge

    donc je publie la version étendue GetFileDlgEx sans limitation de taille pour les paramètres d'entrée
    qui tient en trois lignes au lieu d'une.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Function GetFileDlgEx(sIniDir,sFilter,sTitle) '"no limit" Browse dialog : the global size of the parameters isn't limited anymore
    	Set oDlg = CreateObject("WScript.Shell").Exec("mshta.exe ""about:<object id=d classid=clsid:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object><script>moveTo(0,-9999);eval(new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(0).Read("&Len(sIniDir)+Len(sFilter)+Len(sTitle)+41&"));function window.onload(){var p=/[^\0]*/;new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).Write(p.exec(d.object.openfiledlg(iniDir,null,filter,title)));close();}</script><hta:application showintaskbar=no />""")
    	oDlg.StdIn.Write "var iniDir='" & sIniDir & "';var filter='" & sFilter & "';var title='" & sTitle & "';"
    	GetFileDlgEx = oDlg.StdOut.ReadAll
    End Function


    ps : c'est cette version qui figure dans la
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  3. #3
    Rédacteur

    un message récent m'a rappelé que j'avais omis d'apporter
    quelques précisions sur la syntaxe de cette fonction notamment
    pour une définition correcte des filtres

    le paramètre sIniDir définit à la fois le répertoire d'ouverture ET
    le 1er item actif du filtre (d'où la nécessité de placer cet item en tête de liste dans sFilter)
    c'est la raison pour laquelle mon exemple définit un sIniDir se terminant par un astérisque
    puisque le 1er item de sFilter est "All Files"

    il y a toutefois, une petite subtilité de syntaxe :
    pour être reconnue, l'extension doit aussi être précédée d'un astérisque...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. ###raw>post.musername###
    Modérateur
    Bonjour omen999

    On peut éviter à l'utilisateur la saisie du caractère * à la fin de sIniDir en mettant ce caractère comme suit, juste au début de la fonction :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
      If Right(sIniDir,1) = "\" Then sIniDir = Left(sIniDir,Len(sIniDir)-1)
      If Right(sIniDir,3) <> "\\*" Then sIniDir = sIniDir + "\\*"

    De cette façon, si on écrit sIniDir = "C:\Windows" avec ou sans séparateur de répertoire à la fin, le code est bien exécuté.
      0  0