IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

VB 6 et antérieur Discussion :

Action groupée pour une sélection de fichiers


Sujet :

VB 6 et antérieur

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut Action groupée pour une sélection de fichiers
    J'ai voulu créer un ptit programme permettant d'enlever un mot, dans le nom d'une liste de fichiers sélectionnés.

    Exemple:
    si dans un répertoire j'ai une liste de fichier comprenant le mot "vers.", je souhaite pouvoir le retirer en sélectionnant ces fichiers puis en faisant un clic droit et en choisissant une commande personnalisée, par exemple
    "enlever des mots"

    J'ai créé une clé dans la BDR Windows [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell
    puis une autre
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\TraiteNomsFichiers
    de valeur
    "Enlever des mots"
    et enfin au sein de cette clé une autre clé "command" de valeur: "C:\WINDOWS\traite.exe --1--%1"

    j'ai réalisé un programme traite.exe compilé dans "C:\WINDOWS" récupérant les arguments de la ligne de commande.
    Le permier argument: --1 détermine l'action à réaliser (ici enlever un mots dans une liste de fichiers, le programme est destiné à permettre d'autres opérations)
    Le deuxième argument envoie l'adresse du fichier sélectionné ce qui permet d'agir sur son nom dans le programme (je modifie le fichier avec Scripting.FileSystemObject).

    Le problème est que l'appli développée ainsi exécute la procédure pour chaque fichier. Ainsi si 10 fichiers sont sélectionnés, le programme va me demander 10 fois quel est le mot à enlever.

    C'est une erreur conceptuelle que j'ai commise. De plus une action dans le clic droit semble s'exécuter individuellement pour chaque fichier sélectionné.
    Est il possible de modifier ce comportement? peut être en ajoutant une nouvelle clé dans HKCR ordonnant d'exécuter une seule fois l'action pour l'ensemble des fichiers?
    Et comment récupérer dans un tableau l'ensemble des adresses des fichiers sélectionnés? %1 ne donne que l'adresse d'un fichier?

    Sinon comment procèderiez vous?

    Je sais qu'il existe des programmes pour le faire, mais leur principe en vb serait une userform avec un contrôle explorer, ce que je voudrais éviter.

    Merci d'éclairer ma lanterne.

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    Recherche sur le forum .. je pense que la solution si trouve... (je sais plus ou ..)

    pour le principe il faut que ton programme gère une liste de fichier à traiter, et lors de son lancement il contrôle si une autre instance du programme n'est pas déjà en route et si oui il envoi un message à l'instance existante pour ajouter le fichier sélectionner a la liste de fichier a traiter et se ferme laissant a la première instance du programme le soin d'effectuer le traitement.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    Si j'ai compris je dois utiliser l'api windows pour comparer les hkwnd des différents processus nommés "TraiteFichiers.exe" , ou les compter,
    ainsi si il existe plusieurs processus celui-ci se ferme en transmettant ses paramètres, sinon il renomme en fonction des paramètres dont il dispose?

    Est ce que ça ne va pas causer des problèmes lors des ralentissements de la machine? On ne sait pas a priori dans quel ordre les instructions des différents programmes lancés presque en même temps seront classés dans le registre et donc dans quel ordre le processeur va les exécuter.

    De plus pour transmettre les paramètres, il n'est pas possible de modifier les commutateurs passés au processus déjà lancés, ainsi il faudrait utiliser une variable d'environnements pour stocker la liste des fichiers à renommer. C'est bien ça?

    PS: je viens de voir que vous dites que la solution est sur le forum, je vais fouiller, merci

  4. #4
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    j'ai trouvé ici un fil où l'auteur se pose la même question que moi

    http://www.developpez.net/forums/d84...-selectionnes/


    il utilise une propriété previnstance de l'objet App (connaissait pas). Cependant le fil se termne sans solution. De plus si j'ai compris son appli est ouverte en permanence, si bien qu'il ne rencontrera pas de problème de chronologie. Il passe tout à la première instance qui n'a pas besoin d'être fermée à la fin (contrairement à l'appli que je veux faire, à la fin il ne doit rester qu'une insance qui exécute l'action groupée puis se ferme, avec le risque qu'elle se ferme avant le déclenchment d'une nouvelle instance).


    Je continue mes recherches.

  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    OK pour prevInstance, mais regarde la :

    Comment n'autoriser qu'une seule instance de mon application ?

    la première méthode te permet en plus de récupérer le handle de la première instance et donc tu dois pouvoir l'utiliser pour envoyer un message à cette première instance..

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    merci Bbil pour le lien.
    Pour l'instant j'ai opté pour une autre méthode.
    Une seule instance se lance et se maintient: la première. les autres se ferment.
    La seule instance active récupére les fichiers sélectionnés de la fenêtre active. La fenêtre active est obtenue par son handle donné par l'api:
    GetForegroundWindow()
    Ensuite dans le code j'utilise Shell.application qui a une méthode windows renvoyant toutes les fenêtres d'explorateur (internet et explorer). Cette collection est constituée d'objets qui ont pour propriété le handle de leur fenêtre respective. Ainsi en le comparant au résultat donné par GetForegroundWindow on retouve la fenêtre d'où l'utilisateur a fait un clic droit dans un objet structuré avec une méthode selecteditems.
    Le reste suit.

    je mets au propre un exemple et je le post.

    Merci de ton aide.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    Le programme gère 2 fonctionnalités obtenues via le clic droit de l'explorateur.
    -La première fonctionnalité permet d'enlever un mot dans les noms dans une liste de fichiers sélectionnés. une boîte de dialogue vous demande le mot à retirer du nom des fichiers et elle le fera.

    -la deuxième fonctionnalité ajoute une extension à une liste de fichiers sélectionnés là aussi via une boîte de dialogue (écrire seulement les caractères de l'extension et pas le ".")

    Les 2 traitements ne sont pas parfaits, il y a de nombreux cas limites non traités.

    Le code a des parties superflues (par exemple le traitement de la ligne de commande par split), je travaille sur le squelette d'une appli plus longue. Je n'ai pas tout viré pour l'exemple.

    Le code:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    'le programme prend 1 commutateur
    '            - le type d'opération (un entier entre 1 et 2)
     
     
    Const OP_ENLEVER = 1
    Const OP_AJOUTER_EXTENSION = 2
    'déclaration de l'API
    Declare Function GetForegroundWindow Lib "user32.dll" () As Long  'cette fonction va btenir le handle de l'explorer en cours
     
     
     
     
    Sub Main()
    'si l'appli est déjà lance on la ferme
    If App.PrevInstance Then End
     
     
     
     
    'création des objets
    On Error Resume Next
     
    'pour la bilbiothèque scripting
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
     
    'pour l'objet shell
    Dim SHAp, Wins, SFV, IE, SI, FI, IFinal
    Set SHAp = CreateObject("Shell.Application")
     
     
     
    If Err.Number <> 0 Then
        MsgBox "Manque de ressources " & Chr(10) & "ou" & Chr(10) & "problème d'installation de la bibliothèque Scripting."
        End
    End If
    Err.Clear
     
     
    'récupération de la ligne de commande
    Dim arg  As Variant, str$
    str = Command()
    'sortie si celle-ci est vide
    If str = "" Then End
    'on récupère les différents commutateurs
    arg = Split(Command(), "--")
     
     
     
    'on va d'abord obtenir l'objet window de shell correspondant au handle de la fenêtre active
    Dim hand As Long
     
    hand = GetForegroundWindow() 'handle de la fenêtre sur laquelle l'utilisateur travaille
    'on va parcourir la collection windows de shell et lire les différents handle pour identifier l'obet window
    'qui nous intéresse
    Set Wins = SHAp.Windows ' Shell.Windows
    For Each IE In Wins
        If IE.hWnd = hand Then
            Exit For
        End If
    Next IE
     
    Set Wins = Nothing
     
     
     
     
    'obtention de la collection des fichiers sélectionnés
    Dim col As New Collection
     
    'à partir de IE on obtient les fichiers sélectionnés
    Set SFV = IE.Document ' ShellFolderView
    Set SI = SFV.SelectedItems ' SelectedItems collection
     
    For Each FI In SI ' FolderItem
        col.Add fso.getfile(FI.Path) 'on ajoute chaque fichier sélectionné à notre collection
    Next FI
     
    Set SI = Nothing
    Set SFV = Nothing
     
     
     
     
    'choix de l'action à mener
    Dim fil As Object
    Select Case arg(1)
        Case OP_ENLEVER
            '"enlever des mots"
            'procédure de retrait de mots
     
            'obtention du terme à retirer
            Dim Mots$
            Mots = InputBox("Quels mots souhaitez vous retirer?")
     
            'arrêt de la procédure si l'utilisateur clique sur annuler de la boîte de dialogue inputbox
            If Mots = "" Then End
     
            'on remplace les noms des fichiers
            For Each fil In col ' FolderItem
                fil.Name = Replace(fil.Name, Mots, " ", , , vbTextCompare)
            Next fil
        Case OP_AJOUTER_EXTENSION
            '"Ajouter une extension"
            'ajoute une extension aux fichiers
     
            'obtention de l'extension à ajouter
            Dim ext$
            ext = InputBox("Quels extension souhaitez vous ajouter?")
     
            'arrêt de la procédure si l'utilisateur clique sur annuler de la boîte de dialogue inputbox
            If ext = "" Then End
     
            'on ajoute l'extension
            For Each fil In col ' FolderItem
                'et on remplace
                fil.Name = fil.Name & "." & ext
            Next fil
    End Select
     
    End Sub
    Le programme devra être compilé dans c:\WINDOWS sous le nom "TraiteFichier.exe".

    Le fichier Reg qui va avec:

    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
    Windows Registry Editor Version 5.00
     
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell]
     
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\AjouterExtension]
    @="Ajouter une extension"
     
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\AjouterExtension\command]
    @="c:\\WINDOWS\\TraiteFichier.exe --2"
     
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\Enlever]
    @="Enlever des mots"
     
    [HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\Enlever\command]
    @="c:\\WINDOWS\\TraiteFichier.exe --1"


    Merci à bbil pour son aide. Je pense que je vais utiliser ta méthode quand j'implementerai un formulaire pour ce programme.
    En espérant que ça puisse en débloquer d'autres.

  8. #8
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    OK ..


    vu que j'ai écris quelque chose utilisant le principe énoncé plus haut je rajoute tous de même le lien vers le code résultant ...


    Action groupée sur une sélection de fichier

Discussions similaires

  1. action play/pause pour une copie de fichiers via socket
    Par dumoulex dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 13/05/2011, 15h05
  2. Action groupée sur une sélection de fichier
    Par SfJ5Rpw8 dans le forum Vos téléchargements VB6
    Réponses: 0
    Dernier message: 03/12/2010, 22h22
  3. Réponses: 4
    Dernier message: 05/05/2007, 13h28
  4. Réponses: 3
    Dernier message: 02/05/2007, 09h20
  5. Besoin d'un conseil pour une sélection Access/fichier
    Par Oluha dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/03/2005, 20h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo