Option Strict on

Résolu
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 - 12 août 2016 à 00:21
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 - 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
A voir également:

1 réponse

Whismeril Messages postés 19022 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 17 avril 2024 656
12 août 2016 à 08:25
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)

0
ManuAntibes Messages postés 491 Date d'inscription mardi 24 octobre 2000 Statut Membre Dernière intervention 18 novembre 2021 5
12 août 2016 à 21:43
ok merci pour les explications.
c'est bon cela marche.
0
Rejoignez-nous