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 :

Utilisation de ma collection


Sujet :

VB 6 et antérieur

  1. #1
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut Utilisation de ma collection
    Bonjour,

    J'ai une petite question
    Voilà, je reviens avec mes soucis VB et CATIA.

    J'ai en fait une classe "collection" qui me sert de dictionnaire.
    A chaque nom d'entrée je trouve dans mon dictionnaire le nom qui lui correspond en sortie. Pour comprendre, voici ma classe :

    Classe Modules -
    |
    |_FileDictionary
    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
     
    Private szOldFileName As String
    Private szNewFileName As String
     
    Public Property Get oldFileName()
        oldFileName = szOldFileName
    End Property
     
    Public Property Get NewFileName()
        NewFileName = szNewFileName
    End Property
     
    Public Property Let oldFileName(strFileName)
           szOldFileName = strFileName
    End Property
     
    Public Property Let NewFileName(strFileName)
           szNewFileName = strFileName
    End Property
     
    Function fReadCsvFile(CsvFilePath As String) As Collection
        Dim MyDictionaryFiles As New Collection
     
        Open CsvFilePath For Input As #1 'ProductPathIN & "recup.csv"
     
          Dim myDictFile As FileDictionary
     
          While Not EOF(1)
            Line Input #1, L
            Datas = Split(L, ";")
            Set myDictFile = New FileDictionary
            myDictFile.oldFileName = Datas(0)
            myDictFile.NewFileName = Datas(1)
            MyDictionaryFiles.Add myDictFile
          Wend
     Close #1
         Set fReadCsvFile = MyDictionaryFiles
    End Function
     
    Function FindNewFileName(ByVal MyDictionary As Collection, ByVal oldFileName As String) As String
        Dim strNewFileName As String
        Dim myFileDict As FileDictionary
     
        strNewFileName = oldFileName
     
        For Each myFileDict In MyDictionary
            If UCase(myFileDict.oldFileName) = UCase(oldFileName) Then
               strNewFileName = myFileDict.NewFileName
               Exit For
            End If
        Next
        FindNewFileName = strNewFileName
    End Function


    A partir de mon bouton "start", j'appelle une fonction qui traite mes fichiers .CATProduct (ouvrir/modifier/enregistrer) sous CATIA.
    Code de mon "form"
    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
     
    Option Explicit
    Private strPathCsv As String
    Private strPathJob As String
    Public strPathJobIN As String
    Public strPathJobOUT As String
    Public strPathTemp As String
    Public strPathTempIN As String
    Public strPathTempOUT As String
    Public strInterTmp As String
    Public reppart As String
    Public repproduct As String
    Public repdraw As String
    Public repall As String
     
    '....
     
    'CATProduct ---------------------------------------------------
        'Dim repproduct As String
        'obtient le premier fichier ou répertoire qui est dans "c:\temp\IN\Tmp"
        repproduct = Dir(strInterTmp & "*.CATProduct", vbDirectory)
        'boucle tant que le répertoire n'a pas été entièrement parcouru
            Dim myDictionaryFile As New Collection
            Dim fileDict As New FileDictionary
     
            Set myDictionaryFile = fileDict.fReadCsvFile(strPathTempIN + "recup.csv")
            'Debug.Print (myCol.Count)
     
            Do While (repproduct <> "")
                'teste si c'est un fichier ou un répertoire
                If (GetAttr(strInterTmp & repproduct) And vbDirectory) = vbDirectory Then
                    'MsgBox "Répertoire " & rep
     
                Else
                    'MsgBox "Fichier " & repproduct
                    'Call fProduct
                    Call fProduct(strInterTmp, repproduct, strPathTempOUT, strPathTempIN, myDictionaryFile)
     
                End If
                'passe à l'élément suivant
                repproduct = Dir
            Loop
    '...
    et ma fonction pour les Products est :
    Modules -
    |
    |_FunctProduct
    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
     
    Function fProduct(InterProductPathIN As String, ProductFile As String, ProductPathOUT As String, ProductPathIN As String, myDictionaryFile As Collection)
    'Dim intCountItem As Integer
    'Dim CourantObject As String
     
    CATIA.DisplayFileAlerts = False
     
     
    'Renomme les fichiers PRODUCT, replace les PART et sauvegarde ceux-ci dans le répertoire temporaire OUT
     
    Language = "VBSCRIPT"
     
    Set documents1 = CATIA.Documents
     
    Dim productDocument1 As ProductDocument
     
    Set productDocument1 = documents1.Open(InterProductPathIN + ProductFile)
     
    Dim product1 As product
    Set product1 = productDocument1.product
     
    'Récupération productDocument de CATIA (permet d'afficher directement les propriété et méthodes d'un Product CATIA.)
     
    Dim products1 As Products
    Set products1 = product1.Products
    '---------------------------------------------------------------------------
     
    Dim myProduct As product
    Dim dictFile As New FileDictionary
    Dim strNewName As String
     
    For Each myProduct In products1
        'Debug.Print (myProduct.PartNumber + " -> " + dictFile.FindNewFileName(myDictionaryFile, myProduct.PartNumber + ".CATProduct"))
        strNewName = dictFile.FindNewFileName(myDictionaryFile, myProduct.PartNumber + ".CATProduct")
        'Set productDocument2 = strNewName
        Set product2 = products1.Item(dictFile.NewFileName)
        Set Nothing1 = products1.ReplaceComponent(product2, strNewName, True)
     
    Next
     
    '-------------- Replace component -------------------------------------
    '
    'Sub CATMain()
    '
    'Set productDocument1 = CATIA.ActiveDocument
    '
    'Set product1 = productDocument1.product
    '
    'Set products1 = product1.Products
    '
    'Set product2 = products1.Item("M5711008820100.1")
    '
    'Set Nothing1 = products1.ReplaceComponent(product2, "C:\createxdubernet\IN\M5711008820100.CATPart", True)
    '
    'End Sub
     
    ' ------------------------------------------------------------------------
    '' count elements in active CATProduct
    ''    intCountItem = products1.Item.Count
    '
    '    'renommer les Part dans le product courant
    '    Dim L As String
    '    Dim i As Long
    '    Dim Datas() As String
    '    'anciens nom de fichiers
    '    Dim iny() As String
    '    'nouveaux nom de fichiers
    '    Dim outy() As String
    '    i = 0
    '
    '    Dim j As Integer
    '    For j = 1 To intCountItem
    '     'récupération du nom de l'objet courant (PART ou Product)
    '    Set CourantObject = productDocument1.Product.Item(j)
    '    Set product2 = products1.Item(j)
    '
    '
    '
    '
    '
    '    Next j
    '
    '        Close #1
    'ErrorFile:
     
     
    'Set Nothing1 = products1.ReplaceComponent(product2, ProductPathOUT & "P9991002000000-STD01.CATPart", True)
     
    'product2.Name = "M9991002000000-STD01.1"
    '-------------------------------------------------------------------------------------
    Set productDocument1 = CATIA.ActiveDocument
    productDocument1.SaveAs ProductPathOUT & ProductFile
    productDocument1.Close
     
    End Function
    Au moment de faire une replace component, je n'arrive pas à passer le nom de mon nouveau fichier à l'appel de la méthode "ReplaceComponent".

    Quelqu'un peut-il m'aider?

    Dans ma fenêtre debug, si j'utilise cette ligne,
    Debug.Print (myProduct.PartNumber + " -> " + dictFile.FindNewFileName(myDictionaryFile, myProduct.PartNumber + ".CATProduct"))
    J’ai bien pour chaque élément dans mon "product" son équivalence trouvée dans le dictionnaire.

    Merci pour votre aide.

    Cordialement,
    Paloma

  2. #2
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Au moment de faire une replace component, je n'arrive pas à passer le nom de mon nouveau fichier à l'appel de la méthode "ReplaceComponent".
    Qu'est ce que tu veux dire par la ?

  3. #3
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut CATIA et ses ficelles
    Désolé je ne suis pas assez clair.

    En fait CATIA peut ouvrir plusieurs type de fichiers :

    des .CATPArt (pièces 3D)
    des .CATProduct (assemblages de ces pièces + d'autre .CATproduct qui sont des sous-assemblages qui eux même contiennent des pièces ...)
    et des CATDrawing les plans de ces pièces et/ou de ces assemblages.

    un product représente un assemblage par sa visualisation en 3D mais aussi en arbre.

    exemple de fichier ouvert : Toto.CATProduct

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NoeudPrincipal : toto
                                 |
                                 |_titi.1(titi.CATPart)
                                 |
                                 |_tutu.1(tutu.CATProduct)
                                 |            |
                                 |            |_bib.1(CATPart)
    etc
    la méthode replacecomponent est appelé quand on selectionne un composant exp. titi.1, puis on le remplace par un autre fichier avec replacecomponent
    products1.ReplaceComponent(product2, "nouveau fichier", True).

    donc j'arrive à sélectionner chaque composant, a récupérer leur nom avec PartNumber mais il n'y a pas l'extension du fichier bref je rajoute .CATProduct pour tester et je trouve dans le "dico" le nom par lequel je dois le remplacé.

    mais la je n'arrive pas à faire le replacecomponent ...

    dur dur ...
    enfin je vais y arriver, je vais y arriver

    @ bientôt.
    et merci car toute aide est souvent utile ...

  4. #4
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    ce que je veux savoir c'est ce qui se passe lorsque tu appelles la méthode : genre un message d'erreur ? Ou le script se déroule bien mais ce que tu veux faire ne se réalise pas ?

  5. #5
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut oups désolé ....
    Bon d'accord j'ai rien compris ;-)

    En fait j'ai une erreur et le programme s'arrête sur Set product2 = products1.Item (dictFile.NewFileName)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '...
    For Each myProduct In products1
        'Debug.Print (myProduct.PartNumber + " -> " + dictFile.FindNewFileName(myDictionaryFile, myProduct.PartNumber + ".CATProduct"))
        strNewName = dictFile.FindNewFileName(myDictionaryFile, myProduct.PartNumber + ".CATProduct")
        'Set productDocument2 = strNewName
        Set product2 = products1.Item(dictFile.NewFileName)    
        Set Nothing1 = products1.ReplaceComponent(product2, strNewName, True)
        
    Next
    Et le message d'erreur est pour la petite somme de 0.501 Centimes d'€uro :

    Run-time error '-2147467259 (80004005)' :
    Method 'Item' of object 'Products'Failed
    |End| |Debug| |Help|

    si besoin, pour info, j'ai un fichier V5automation.chm à télécharger sur un site :
    http://patrick.dubernet.free.fr

    @ plus
    Cordialement,
    Paloma

  6. #6
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Peut tu mettres une msgbox pour connaître la valeur de J'ai eu ce genre d'erreur lorsque j'essayé d'acceder à un élément non existant dans un dictionnaire.

  7. #7
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut oui bien sur avec ça je n'irais pas loin ... MDR
    En fait il me renvoit absolument rien !
    "Message box vide avec un beau bouton"
    Bon, je le savais déja car quand je passe la souris dessus, j'ai un beau ""
    mais je n'arrive pas à trouver pourquoi?
    j'ai du me viander ....

    @ plus
    bien à vous
    Paloma

  8. #8
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Dans ton code tu déclare dictfile comme une filedictionnary mais à aucun moment tu instancis un objet de type filedictionnary or si je prend myDictFile tu le declares et tu l'instancies.
    Le problème ne pourrais pas venir de la.
    Je ne pense pas qu'en VB déclarer une variable en tant qu'objet d'un type précis provoques une auto instanciation de l'objet.

  9. #9
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut Instance de Classe
    Mais cette ligne dans mon code ne me permet pas d'instancié ma classe?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Dim dictFile As New FileDictionary
    je ne vois pas bien ce que tu veux dire?
    comment ça marche en VB?

  10. #10
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    je pense qu'elle ne l'instancie pas.
    Pour moi tu devrais faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim dictFile As New FileDictionary
    Set dictFile = New FileDictionary
    Comme tu l'as fait la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim myDictFile As FileDictionary
    Set myDictFile = New FileDictionary

  11. #11
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut c'est pire :-(
    en fait, il bloque avant maintenant :

    dans le code de mon bouton "start"

    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
    'CATProduct -------------------------------------------------------------------------------------------
        'Dim repproduct As String
        'obtient le premier fichier ou répertoire qui est dans "c:\temp\IN\Tmp"
        repproduct = Dir(strInterTmp & "*.CATProduct", vbDirectory)
        'boucle tant que le répertoire n'a pas été entièrement parcouru
            Dim myDictionaryFile As New Collection
            Dim fileDict As New FileDictionary
            
            Set myDictionaryFile = fileDict.fReadCsvFile(strPathTempIN + "recup.csv")
            'Debug.Print (myCol.Count)
            
            Do While (repproduct <> "")
                'teste si c'est un fichier ou un répertoire
                If (GetAttr(strInterTmp & repproduct) And vbDirectory) = vbDirectory Then
                    'MsgBox "Répertoire " & rep
    
                Else
    '....
    myDictionnaryfile = <Object variable or with block not set>

    hummm...
    je nage bonjour les petits poissons lol

    harf!

    il me faudrat bientôt la camisole ... héhé

    bon je regarde encore et merci pour ton aide
    @ +++

  12. #12
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    C'est normal fileDict n'est toujours pas instancié mais juste déclaré.
    En plus de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim fileDict As New FileDictionary
    il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set fileDict = New FileDictionary

  13. #13
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    as tu ecris tout le code ? Ou as tu pris des exemples sur le net ou dans une faq ? Parce que si c'est le cas, regarde les de nouveaux, si leur code fonctionne ces faqs doivent proposer les bonnes méthodes de déclarations.
    Ha au fait, c'est en nageant que l'on apprend à nager.

  14. #14
    Membre régulier Avatar de Paloma
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 228
    Points : 79
    Points
    79
    Par défaut héhé °°°°°°
    ___________° °° °
    __________°°°°
    ___________°°
    Effectivement °

    non en fait le code est du tout moi, c'est peu être ça le problème %-}

    Merci quand même je verais demain ou ce soir en rentrant à la maison.

    Paloma

Discussions similaires

  1. Utiliser l'objet collection
    Par viavba dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/01/2009, 11h09
  2. Réponses: 27
    Dernier message: 25/10/2006, 12h10
  3. [C#] Conseil sur l'utilisation de collection
    Par shinchan dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/03/2006, 11h02
  4. vaut il mieux utiliser ArrayList ou implémenter collection?
    Par irnbru dans le forum Framework .NET
    Réponses: 17
    Dernier message: 05/11/2005, 12h51
  5. [VB.NET] Utiliser les collections de contrôles (Textbox)
    Par dinbougre dans le forum Windows Forms
    Réponses: 3
    Dernier message: 09/01/2005, 18h57

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