none
Option Strict On rejette toute liaison tardive... oui mais COMMENT faire ??? RRS feed

  • Question

  • Bonjour amis programmeur,

    Dans mon projet, j'ai une fonction dédiée pour paramétrer l'accès aux différents contrôles des formulaires. Les contôlr du formulaire sont balayés, puis on appelle la fonction ci-dessous pour chacun d'eux:

            Private Sub FSGestionAccesCtl(ByVal ctl As Object)
    
    La fonction analyse le Tag du contrôle CStr(ctl.Tag) et en déduit comment paramétrer le contrôle comme décrit ci-dessous:

                Select Case bytAccess
    
                    '   0 = Invisible, Non saisissable
                    '   1 = Visible, Non saisissable
                    '   2 = Visible, Saisissable
                    '   3 = Visible, Obligatoire
    
                    Case 1
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Visible. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Visible = True
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Enabled. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Enabled = False
    
                    Case 2
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Visible. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Visible = True
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Enabled. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Enabled = True
    
                    Case 0
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Visible. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Visible = False
    
                    Case 3
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Visible. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Visible = True
                        'UPGRADE_WARNING: Impossible de résoudre la propriété par défaut de l'objet ctl.Enabled. Cliquez ici : 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
                        ctl.Enabled = True
    
                End Select
    


    Bien sur je ne sais pas à l'avance de quel contrôle il s'agit, donc on est en plein dans le "déconseillé" LateBinding!

    Le code fonctionne tant que OptionStrict Off.

    Avec OptionStrict On, j'ai 7 erreurs (une pour chaque ligne ctl.Enabled ou ctl.Visible) : "Option Strict On rejette toute liaison tardive."

    Savez-vous comment faire pour conserver le fonctionnement décrit ci-dessus, tout en codant rigoureusement avec OptionStrict  On ?

    Merci

    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    mercredi 7 octobre 2009 10:14

Réponses

Toutes les réponses

  • Fait un casting de ton Tag en bytAccess dans ton code. Ca compilera, mais rien n'empêchera ton appli de planter si le Tag est mal renseigné.
    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone
    mercredi 7 octobre 2009 10:36
  • Bonjour  Richard Clark,

    Désolé si je n'ai pas été assez précis.

    Mon casting Cstr(ctl.Tag) fonctionne: J'obtiens une chaine de caractère (As String) que j'utilise extraire le contenu de la variable bytAccess en fonction du contexte de l'application.

    Donc, pour résumer:
    ---> Cstr(ctl.Tag) est ok et me donne une String
    ---> Le renseignement de bytAccess est ok et me donne un Byte
    ---> Le Select Case bytAccess est ok

    CE QUI NE FONCTIONNE PAS, c'est quand on arrive aux ligne ctl.Visible et/ou ctl.Enabled
    Là, on a "Option Strict On rejette toute liaison tardive."

    Avez-vous une idée?
    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    mercredi 7 octobre 2009 11:44
  • Ben casting en Control non ? Parce que tu devrais aussi avoir un problème sur ctl.Tag.
    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone
    mercredi 7 octobre 2009 12:04
  • Tu ne peux pas passer Control au lieu de Object en paramètre de ta méthode ?
    Sinon tu peux aussi essayer avec DirectCast au lieu de caster avec Ctype
    • Marqué comme réponse Golard mercredi 7 octobre 2009 14:24
    mercredi 7 octobre 2009 12:12
    Modérateur
  • Tu ne peux pas passer Control au lieu de Object en paramètre de ta méthode ?
    Sinon tu peux aussi essayer avec DirectCast au lieu de caster avec Ctype

    EXACT !

    La deuxième réponse de Richard Clark m'avait mis la puce à l'oreille... Effectivement pourquoi ctl.Tag est accepté alors que ctl.Enabled ne l'est pas !!!

    La réponse c'est que ctl.Tag est traité dans une première fonction où ctl est bien défini en Control, alors que la deuxième fonction (FSGestionAccesCtl) qui gère ctl.Enabled et ctl.Visible reçoit le paramètre ctl casté en Object (hé oui mon code provient de Vb6)!

    J'ai donc défini le paramètre comme Control et tout fonctionne
    Private Sub FSGestionAccesCtl(ByVal ctl As Windows.Forms.Control)
    MERCI à tous les deux ! (nikho, je marque ton post comme réponse)

    PS1: En ce qui concerne le casting, j'utilise toujours Directcast et pas CType, car j'ai lu que c'était plus performant en terme de rapidité (savez-vous si c'est vrai?)

    PS2: Je poste dans les minutes qui suivent une question concernant la surcharge pour cette même fonction... Si vous la voyez, merci d'y jeter un oeil!

    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    • Modifié Golard mercredi 7 octobre 2009 14:10 Ajout remarque sur Directcast
    mercredi 7 octobre 2009 14:08
  • DirectCast n'effectue pas de vérification  à l'exécution. Faut donc être sur de son coup ;-)
    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone
    mercredi 7 octobre 2009 14:13
  • Quelles sont les conséquences exactes ???

    Imaginons un cast "impossible" d'un objet A en objet B...


    DirectCast(A,B)
    que se passe-t'il à l'exécution ? Plantage genre erreur fatale et sortie violente du programme ???  On passe quand même par l’évènement MyApplication.UnhandledException  ???

    CType(A,B) que se passe-t'il à l'exécution ? Même si l'erreur est "moins violente"... le programme doit quand même s'arréter non ?


    Je pourrais bien sur faire le test... mais si vous connaissez la réponse...


    Projet volumineux en cours de migration de Vb6 à VbNet2008 Visual Studio 2008 - VbNET/Vb6(COM)
    mercredi 7 octobre 2009 14:34