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 :

Tester si une structure(type) n'est pas null


Sujet :

VB 6 et antérieur

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut Tester si une structure(type) n'est pas null
    Bonjour,

    J'ai un type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Public Type DonneeMontage
            nId As Integer
            nDo As Long
        End Type
    Comment puis je faire pour tester si ce n'est pas égale à null ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Load()
        Dim ListVehTram() As DonneeMontage
     
        If Not ListVehTram Is Nothing Then
     
        end if
    end sub

    Il me lance une erreur : Type incompatible.
    J'ai essayer quelques variantes, mais rien n'y fait.
    Auriez-vous une idée ?

  2. #2
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonjour draco951.

    L'erreur renvoyée est due au fait qu'une instance d'un type n'est pas un objet au sens de Vb6. De la sorte, Is Nothing ne s'applique pas à une instance de type. Vous pourriez peut-être utiliser la fonction IsNull de VBA. Mais je vous propose plutôt le petit test suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Load()
    Dim Toto As DonneeMontage
    With Toto
        MsgBox CStr(.nId)
        MsgBox CStr(.nDo)
    End With
    End Sub
    Question subsidiaire : pourquoi ne nommez-vous "DonnéeMontage" votre type ? Ce serait plus lisible !

    Cordialement.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    Bonjour Jean-Marie Grave,

    IsNull ne fonctionne malheureusement pas, j'ai le message d'erreur suivant :

    Erreur de compilation :

    Seuls les types définis par l'utilisateur et qui sont définis dans les modules d'objets publics peuvent être convertis depuis ou vers un variant, ou passés à des fonctions à liaison tardive
    Je ne sais pas si vous avez remarquer, mais j'ai déclaré un tableau de "DonneeMontage"
    Donc, je ne peux pas faire le msgbox.
    Il faut donc que je test s'il contient des éléments, mais quand je lance en débug, dans les espions, il me met que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListVehTram() = nothing
    Ce qui est logique puisque je n'ai pas redimensionné mon tableau.
    Je ne vois pas avec quoi je pourrais tester autre que le "nothing" ou "isnull"
    Et le "size" ou "count" ou "lenght" ne fonctionne pas non plus car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListVehTram() = nothing
    Auriez-vous une autre idée ?


    En ce qui concerne la question subsidiaire, je ne suis pas sur de l'avoir comprise.



    EDIT : j'ai tester avec un seul élément, les test fonctionne correctement, mais comment dois-je procéder pour un tableau ?

  4. #4
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonsoir draco951.

    Effectivement, je n'avais pas remarqué que vous aviez déclaré un tableau. Veuillez m'excuser. Il vous faut donc faire une boucle parcourant les termes de ce tableau, et pour chacun d'eux vérifier que les deux champs ne sont pas "null", par exemple par la fonction IsNull, en prenant garde à la syntaxe.
    D'autre part, pour la question subsidiaire, je voulais dire que DonnéeMontage, avec un accent aigu, est plus lisible que DonneeMontage.

    Bon courage.

  5. #5
    Membre éprouvé Avatar de DAUDET78
    Homme Profil pro
    retraité
    Inscrit en
    Janvier 2008
    Messages
    635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 81
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2008
    Messages : 635
    Points : 1 165
    Points
    1 165
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    je voulais dire que DonnéeMontage, avec un accent aigu, est plus lisible que DonneeMontage.
    C'est vrai . Mais on risque, avec des logiciels ponduent par des AngloSaxons, d'avoir des erreurs incompréhensibles de compilation .... donc , à éviter !

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    Citation Envoyé par Jean-Marie Grave Voir le message
    Bonsoir draco951.

    Effectivement, je n'avais pas remarqué que vous aviez déclaré un tableau. Veuillez m'excuser. Il vous faut donc faire une boucle parcourant les termes de ce tableau, et pour chacun d'eux vérifier que les deux champs ne sont pas "null", par exemple par la fonction IsNull, en prenant garde à la syntaxe.
    D'autre part, pour la question subsidiaire, je voulais dire que DonnéeMontage, avec un accent aigu, est plus lisible que DonneeMontage.

    Bon courage.

    Je ne peux même pas parcourir le tableau, "nId" et "NDo" n'existent pas, car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListVehTram() = nothing
    Ce qu'il faut que je test, c'est si "ListVehTram" est différent de nothing.

    Et je rejoint DAUDET78, les accents sur variable sont à éviter absolument !

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    J'ai trouvé une fonction qui fonctionne parfaitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Function IsDonneeMontageInitialized(ByRef arr() As DonneeMontage) As Boolean
     
      Dim rv As Long
     
      On Error Resume Next
     
      rv = UBound(arr)
      IsDonneeMontageInitialized = (Err.Number = 0)
     
    End Function
    qui provient de la : http://stackoverflow.com/questions/1...ialized-in-vb6

  8. #8
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    Bonjour,
    Quel rapport avec la question initiale ?

    Citation Envoyé par draco951 Voir le message
    Bonjour,

    J'ai un type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Public Type DonneeMontage
            nId As Integer
            nDo As Long
        End Type
    Comment puis je faire pour tester si ce n'est pas égale à null ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Load()
        Dim ListVehTram() As DonneeMontage
     
        If Not ListVehTram Is Nothing Then
     
        end if
    end sub
    Il me lance une erreur : Type incompatible.
    J'ai essayer quelques variantes, mais rien n'y fait.
    Auriez-vous une idée ?

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    La question initiale était :

    Comment faire pour tester un tableau de Type(structure), voir s'il était déjà allouer ou non.


  10. #10
    Rédacteur
    Avatar de DarkVader
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 130
    Points : 3 118
    Points
    3 118
    Par défaut
    C'était donc une question Jeopardy - voilà une bonne idée pour relancer l'activité du site lol

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    Citation Envoyé par DarkVader Voir le message
    C'était donc une question Jeopardy - voilà une bonne idée pour relancer l'activité du site lol
    Je ne comprend pas votre réaction.
    Ma requête n'était pas clair ?

    Au début, je demande comment faire pour tester une tableau d'un certain type, à la fin, je répond avec une fonction qui me permet de le savoir.

    Je trouve ca assé explicite, et je n'ai pas l'impression que les 2 personnes qui sont intervenu ne l'ai pas comprise.

    Serait-ce une réaction ayant pour but de me faire poster ?
    Pas mauvaise non plus l'idée pour relancer l'activité

  12. #12
    Expert éminent sénior
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 079
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 079
    Points : 16 968
    Points
    16 968
    Par défaut
    J'ai bien vue que la discussion est marqué
    Pour autant draco951, tu n'indiques pas la façon d'utiliser la formule.
    Citation Envoyé par draco951
    Je trouve ça assez explicite, et je n'ai pas l'impression que les 2 personnes qui sont intervenu ne l'ai pas comprise.
    Par contre, parmi les 156 affichages de ta discussion, un certains nombres attendaient sûrement de voire ou tu voulais en venir


    Bref, pour moi la formule renvoie Empty = valeur de variable initialisée
    Avec Not LaFormule et ce
    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
    Option Explicit
       Private Type DonneeMontage
            nId As Integer
            nDo As Long
        End Type
    Private Sub Form_Load()
    Dim ListVehTram() As DonneeMontage
    Dim Msg$
    'Empty = valeur de variable non initialisée
     
    Msg$ = "Avec ListVehTram non initialisée" & vbNewLine & "Empty = " & Not IsDonneeMontageInitialized(ListVehTram())
     
    ReDim ListVehTram(0)
    Msg$ = Msg$ & vbNewLine & vbNewLine _
            & "Avec ReDim ListVehTram(0) .nDo et .nId non initialisée" & vbNewLine & "Empty = " & Not IsDonneeMontageInitialized(ListVehTram())
     
    ListVehTram(0).nDo = vbNull: ListVehTram(0).nId = vbNull '1
    Msg$ = Msg$ & vbNewLine & vbNewLine _
            & "Avec ReDim ListVehTram(0) .nDo et .nId initialisée à vbNull" & vbNewLine & "Empty = " & Not IsDonneeMontageInitialized(ListVehTram())
     
    ListVehTram(0).nDo = 1: ListVehTram(0).nId = 2
    Msg$ = Msg$ & vbNewLine & vbNewLine _
            & "Avec ReDim ListVehTram(0) .nDo et .nId initialisée" & vbNewLine & "Empty = " & Not IsDonneeMontageInitialized(ListVehTram())
     
    Erase ListVehTram
    Msg$ = Msg$ & vbNewLine & vbNewLine _
            & "Avec Erase ListVehTram" & vbNewLine & "Empty = " & Not IsDonneeMontageInitialized(ListVehTram())
     
    Debug.Print Msg$
     
    End Sub
     
    Private Function IsDonneeMontageInitialized(ByRef arr() As DonneeMontage) As Boolean
     
      Dim rv As Long
     
      On Error Resume Next
     
      rv = UBound(arr)
      IsDonneeMontageInitialized = (Err.Number = 0)
     
    End Function
    Citation Envoyé par fenêtre d’exécution
    Avec ListVehTram non initialisée
    Empty = Vrai

    Avec ReDim ListVehTram(0) .nDo et .nId non initialisée
    Empty = Faux

    Avec ReDim ListVehTram(0) .nDo et .nId initialisée à vbNull
    Empty = Faux

    Avec ReDim ListVehTram(0) .nDo et .nId initialisée
    Empty = Faux

    Avec Erase ListVehTram
    Empty = Vrai
    Donc la formule IsDonneeMontageInitialized ne permet pas de vérifier si .nDo et .nId sont initialisés ou Null.

    Une fonction (exotique dans sa rédaction) existe ICI post 16 et 17, peut être celle-ci te sera utile aussi.
    pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  13. #13
    Membre actif
    Inscrit en
    Janvier 2011
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 112
    Points : 209
    Points
    209
    Par défaut
    _ Ia ora na.
    _ Utilisant VB depuis 1993 (VB3, après QBasic) et ayant commis quelque trois cents projets - tous (ou presque) avec des noms de variables et de procédures contenant des voyelles accentuées ou des ç - je n'ai rencontré, en cette vingtaine d'années, aucune erreur qui leur fût imputable.
    _ Que l'on choisisse d'éviter ces signes pour des raisons de portabilité, comme l'indiquait DarkVader, cela se conçoit aisément. Mais affirmer que
    Citation Envoyé par draco951 Voir le message
    les accents sur variable sont à éviter absolument !
    peut paraître un tantinet outrancier.
    _ Bonne fin de semaine à toutes et à tous.

  14. #14
    Membre habitué
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Points : 191
    Points
    191
    Par défaut
    Citation Envoyé par XylonAkau Voir le message
    _ Ia ora na.
    _ Utilisant VB depuis 1993 (VB3, après QBasic) et ayant commis quelque trois cents projets - tous (ou presque) avec des noms de variables et de procédures contenant des voyelles accentuées ou des ç - je n'ai rencontré, en cette vingtaine d'années, aucune erreur qui leur fût imputable.
    _ Que l'on choisisse d'éviter ces signes pour des raisons de portabilité, comme l'indiquait DarkVader, cela se conçoit aisément. Mais affirmer que
    peut paraître un tantinet outrancier.
    _ Bonne fin de semaine à toutes et à tous.
    Il faut savoir évoluer avec son temps :p
    Je plaisante

    Pendant mes études et sur tout les projets sur lesquels j'ai travaillé (je n'en ai surement pas autant que vous), on m'a toujours appris à éviter les accents sur variable. J'en ai encore discuté hier soir(je participe à des formations le soir) avec un professeur Bac+7 (ou 8 j'ai un doute maintenant) qui est manager chez goodyear qui se tiens très au courant des dernières technologie, qui me l'a vivement conseillé.


    @ProgElecT

    Il est vrai que j'aurais pu mettre une mise en application, mais je trouve que la fonction parle d'elle même.

    Par ailleur je ne pense pas avoir demandé de tester 'nDo' ou 'nId'
    Mais bien de tester mon TABLEAU DE TYPE
    Vous avez surement juste lu le commentaire de 'Jean-Marie Grave'
    Vous remarquerez donc que sur le tableau de type, cela fonctionne correctement, maintenant si vous avez une autre suggestion de mise en oeuvre, je suis preneur

    Je vous remerçie néanmoins tous d'avoir fourni ces informations.

  15. #15
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour Draco,

    Malgré le résolu et en m'inspirant de
    Cité par ProgElec
    Une fonction (exotique dans sa rédaction) existe ICI post 16 et 17, peut être celle-ci te sera utile aussi.
    et
    De Draco951
    Auriez-vous une autre idée ?
    Voici une autre façon de tester toute simple .

    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
     
    Option Explicit
    Private Type DonneeMontage
            nId As Integer
            nDo As Long
    End Type
    Private Sub Form_Load()
    Dim ListVehTram() As DonneeMontage
    'ReDim ListVehTram(0) 'pour essai avec un tableau de 1 élément
    'ReDim ListVehTram(50) 'pour essai avec un tableau de 50 éléments
     
    If IsDonneeMontageInitialized(Not ListVehTram, ListVehTram) = "" Then
          MsgBox ("non initialisé")
                                                    Else
          MsgBox ("Valeur du Tableau = " & IsDonneeMontageInitialized(Not ListVehTram, ListVehTram))
     End If
    End Sub
    Private Function IsDonneeMontageInitialized(ByRef quoi, arr() As DonneeMontage) As String
        If Not quoi Then IsDonneeMontageInitialized = UBound(arr)
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/03/2013, 12h19
  2. Réponses: 3
    Dernier message: 01/06/2006, 16h26
  3. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48
  4. lien dessus une images qui n'est pas en background
    Par tiyolx dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 04/03/2006, 18h40
  5. Tester si une procedure stockee s'est terminee avec succes
    Par graphicsxp dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 08/04/2005, 11h15

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