ManuAntibes
Messages postés491Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention18 novembre 2021
-
12 août 2016 à 00:21
ManuAntibes
Messages postés491Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention18 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
Whismeril
Messages postés18619Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention27 septembre 2023629 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)
ManuAntibes
Messages postés491Date d'inscriptionmardi 24 octobre 2000StatutMembreDernière intervention18 novembre 20215 12 août 2016 à 21:43
ok merci pour les explications.
c'est bon cela marche.
12 août 2016 à 21:43
c'est bon cela marche.