~ Edito ~
12/03/2006 @ 13:39
Depuis la dernière mise à jour (qui remonte à... oulala plusieurs mois), un petit ménage de printemps s'impose. Ca tombe bien, c'est presque la période. Au menu, et progressivement sur les jours à venir, rafraîchissement de plusieurs fonctions et procédures, nouvelles APIs et nouveaux programmes. ~ Rechercher ~
~ Annuaire VB ~
~ Partenaires ~
|
Classe : clsArgs Les applications VB acceptent des arguments sur la ligne de commande. Seulement, contrairement à une application en C, c'est à vous de gérer après le traitement de cette ligne. Compter le nombre d'argument, vérifier si un argument existe, récupérer sa valeur, ... tout cela peut être assez fastidieux. C'est pourquoi, j'ai mis au point une classe que j'utilise maintenant dans la plupart de mes applications. Elle permet de traiter simplement la gestion des arguments de la ligne de commande. Son utilisation est simple. Suivant les cas, il faut déclarer un objet local ou global (Dim cArgs As New clsArgs). A partir de là on manipule les propriétés et méthodes de l'objet. cArgs.Commande affiche la ligne de commande reçut par l'application, mais peut également recevoir une nouvelle ligne d'argument, Je n'ai pas mis en place de méthode d'énumération des arguments (je n'en ai pas l'utilité), je vous laisse le soin de la modification si cela vous parait nécéssaire. Le caractère désignant un argument est défini en constante (CAR_ARGUMENT), par défaut, c'est "/". Quelques exemples d'utilisation... Avec ligne d'arguments : /fC:\Program Files\Test\Test.exe /e /a /i3 (équivalent à /fC:\Program Files\Test\Test.exe/e/a/i3 - sans espaces entre les arguments, le résultat est le même puisque l'espace n'est pas pris en compte comme séparateur d'argument). cArgs.CompteArgs retourne 4, Pour conclure, le code parle de lui-même et reste assez logique. Les commentaires devraient vous aider à comprendre le déroulement des fonctions. Vous pouvez récupérer le code (fichier compressé), ou bien le consulter en direct ci-dessous. ' Chaque argument est déclaré par un "/" suivi d'une lettre' désignant sa fonction. Si un "/" se trouve à l'intérieur de guillemets, ' il n'est pas pris en compte, on considère cela comme un chemin de fichier. ' Les espaces ne sont pas pris en compte comme séparateurs d'arguments, ' c'est à dire que /a/b/c équivaut bien à 3 paramètres. Option Explicit ' Définit le délimiteur de chaîne (ici le guillemet) ' Permet de traiter /x="toto /a /b /c" /y comme 2 arguments seulement /x et /y Private Const DELIMITE_CHAINE = """" ' Caractère de définition d'option Private Const CAR_ARGUMENT = "/" ' Pas de distinctions entre majuscule et minuscule pour les arguments Private Const DIFF_MAJ_MIN = False ' Ligne de commande Private mst_Commande As String ' Nombre d'arguments sur la ligne de commande Private mlg_Args As Long Public Function ValeurOption(stOption As String) As String Dim lgFor As Long, lgForIn As Long, lgLen As Long, lgCmd As Long Dim blTmp As Boolean Dim stTmp As String ' Vérifie si le caractère de définition d'argument est donné, si on le met If Left$(stOption, 1) <> CAR_ARGUMENT Then stOption = CAR_ARGUMENT & stOption stTmp = vbNullString ' Recherche si l'option existe sur la ligne de commande If ExisteOption(stOption) Then blTmp = False lgLen = Len(stOption) ' Positionne le pointeur courant au départ de l'option For lgFor = 1 To Len(mst_Commande) - lgLen If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp If Not blTmp Then If DIFF_MAJ_MIN Then If Mid$(mst_Commande, lgFor, lgLen) = stOption Then Exit For Else If UCase$(Mid$(mst_Commande, lgFor, lgLen)) = UCase$(stOption) Then Exit For End If End If Next lgFor lgCmd = Len(mst_Commande) blTmp = False lgFor = lgFor + lgLen ' Récupère la valeur associée à l'option choisie Do While lgFor <= Len(mst_Commande) ' Permet de récupérer les chemins de fichiers entre guillemets If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp If Not blTmp Then ' Sort dès que l'option suivante est rencontrée If (Mid$(mst_Commande, lgFor, 1) = "/") Then Exit Do End If stTmp = stTmp & Mid$(mst_Commande, lgFor, 1) lgFor = lgFor + 1 Loop stTmp = Trim$(stTmp) ' Suppression du guillemet au début et à la fin (seulement s'il y en a un au début) If Left$(stTmp, 1) = DELIMITE_CHAINE Then stTmp = Mid$(stTmp, 2, Len(stTmp) - 2) End If ValeurOption = stTmp End Function Public Function ExisteOption(stOption As String) As Boolean Dim lgFor As Long, lgLen As Long Dim blTmp As Boolean, blExiste As Boolean ' Vérifie si le caractère de définition d'argument est donné, si on le met If Left$(stOption, 1) <> CAR_ARGUMENT Then stOption = CAR_ARGUMENT & stOption lgLen = Len(stOption) blTmp = False If DIFF_MAJ_MIN Then blExiste = (mst_Commande = stOption) Else blExiste = (UCase$(mst_Commande) = UCase$(stOption)) End If For lgFor = 1 To Len(mst_Commande) - lgLen ' Saute les guillemets qui peuvent encadrer un nom de fichier long contenant des espaces If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp If Not blTmp Then ' Gestion des majuscules/minuscules sur les arguments If DIFF_MAJ_MIN Then If Mid$(mst_Commande, lgFor, lgLen) = stOption Then blExiste = True Exit For End If Else If UCase$(Mid$(mst_Commande, lgFor, lgLen)) = UCase$(stOption) Then blExiste = True Exit For End If End If End If Next lgFor ExisteOption = blExiste End Function Public Function CompteArgs() As Long ' Permet de compter le nombre d'arguments sur la ligne de commande Dim lgFor As Long, lgLen As Long Dim blTmp As Boolean ' Regarde si on a déjà fait le travail ... If mlg_Args < 0 Then ' ... sinon, on traite la ligne de commande. blTmp = False mlg_Args = 0 For lgFor = 1 To Len(mst_Commande) ' Saute les guillemets qui peuvent encadrer un nom de fichier long contenant des espaces If (Mid$(mst_Commande, lgFor, 1) = DELIMITE_CHAINE) Then blTmp = Not blTmp If Not blTmp Then ' Si on ne se trouve pas à l'intérieur de guillement, on incrémente le nombre d'argument If Mid$(mst_Commande, lgFor, 1) = CAR_ARGUMENT Then mlg_Args = mlg_Args + 1 End If Next lgFor End If CompteArgs = mlg_Args End Function Public Property Let Commande(ByVal vData As String) ' Réaffecte la valeur de la ligne de commande mst_Commande = vData ' Réinitialise le nombre d'argument mlg_Args = -1 End Property Public Property Get Commande() As String ' Retourne la ligne de commande Commande = mst_Commande End Property Private Sub Class_Initialize() ' Récupération de la ligne de commande envoyée à l'application mst_Commande = Command() ' Initialisation du nombre d'argument mlg_Args = -1 End Sub |