Option Strict on [Résolu]

ManuAntibes 454 Messages postés mardi 24 octobre 2000Date d'inscription 12 août 2016 Dernière intervention - 12 août 2016 à 00:21 - Dernière réponse : ManuAntibes 454 Messages postés mardi 24 octobre 2000Date d'inscription 12 août 2016 Dernière intervention
- 12 août 2016 à 21:43
Bonjour,
J'ai un message d'erreur avec option Strict :
voici le message:
La résolution de surcharge a échoué, car aucun 'New' accessible ne peut être appelé avec ces arguments:
'PublicSub New(dw As Integer)' : Impossible de convertir une valeur de type 'System.Drawing.Point' en 'Integer'.
'PublicSub New(sz As System.Drawing.Size)': Option Strict On intedit les conversions implicites de 'System.Drawing.Point' en 'System.Drawing.Size'.

sur cette ligne : p = New Point(CType(converter.ConvertFrom(tt), Point))
voici mon code :
  For Each _DataRow As DataRowView In Me.DataT_VFBindingSource
                    _PictureBox = New PictureBox
                    _PictureBox.Tag = _DataRow(0)
                    Dim tt As String = CType(_DataRow(4), String) 'tt ={X=233,Y=90}
                    Dim p As Point
                    tt = tt.Replace(",", ";")
                    tt = tt.Replace("{X=", Nothing)
                    tt = tt.Replace("Y=", Nothing)
                    tt = tt.Replace("}", Nothing)

                    Dim converter As System.ComponentModel.TypeConverter
                    converter = System.ComponentModel.TypeDescriptor.GetConverter(GetType(Point))
                    p = New Point(CType(converter.ConvertFrom(tt), Point))
                    _PictureBox.Location = p


Merci
Afficher la suite 

2 réponses

Répondre au sujet
Whismeril 11409 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 21 avril 2018 Dernière intervention - 12 août 2016 à 08:25
0
Utile
1
Bonjour

la réponse est clairement décrite dans le message d'erreur.

PictureBox.Location est du type Size et pas du type Point.

Et un Point ne peut pas être converti implicitement, c'est à dire mettre l'un dans l'autre sans se poser de question (si c'était complètement la même chose, pourquoi faire 2 types différents? Surtout dans le même nom de domaine).

Pour te donner un exemple, en .Net les entiers peuvent être décrits par 16, 32 ou 64 bits. 64 bits étant long à écrire, je vais te montrer avec 4, 8 et 16 bits:

En 16 bit 1 c'est 0000000000000001, si tu le forces en 8 c'est 00000001 et en 4 c'est 0001 dans ce cas si on fait une conversion ne pose aucun problème.
Par contre 0000001000100001 en bits devient 00100001 et en 4 bits 0001, cette fois la conversion entraine une perte d'information.

VB est très permissif c'est se qui le rend accessible aux amateurs (dans le bon sens du terme), mais aussi sont plus gros défaut, car une telle perte d'information aura des conséquences négatives sur le programme et sera difficile à deboguer pour le développeur qui n'a pas connaissance de ces subtilités.

Avec Option Strict, on interdit les conversions implicites destructrices (mettre du int16 dans un int64 ne posera jamais aucun problème). Ça t'incite à te poser la question, est ce que cette conversion est justifiée, me sera-t-elle utile ou problématique?

Dans ton cas la solution est simple, il suffit de créer une instance de Size.
Controle.Location = New Size(Longueur, Hauteur)

ManuAntibes 454 Messages postés mardi 24 octobre 2000Date d'inscription 12 août 2016 Dernière intervention - 12 août 2016 à 21:43
ok merci pour les explications.
c'est bon cela marche.
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.