Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

"inégalité" de types prédéfinis

6 réponses
Avatar
driss hanib
Bonjour à tous


j'ai créé des types préfinis du style
Enum RTF_Booléen
B_ND=0
B_Oui=1
B_Non=2
end enum

Type T_Police
NumPolice as long
TaillePolice as long
EstGras as RTF_Booléen
EstItalique as RTF_Booléen
End type

Type mon_Type
Chaine as string
Liste as RTF_Booléen
FormatPolice as T_Police
end type

Si je crée deux variables de type mon_Type :
Dim Var1 as mon_Type
Dim Var2 as mon_Type

je veux écrire une condition du type :

if Var1 <> Var2 then

j'obtiens une erreur de type "Type Incompatible" lors de la compilation
avant éxécution.
Est-ce normal ?
Autrement je vais tester chaque "sous variable" du type. mais j'aurais voulu
faire globalement ..

Driss

6 réponses

Avatar
Jean-marc
driss hanib wrote:
Bonjour à tous




Hello Driss,

<snip>

Si je crée deux variables de type mon_Type :
Dim Var1 as mon_Type
Dim Var2 as mon_Type

je veux écrire une condition du type :

if Var1 <> Var2 then

j'obtiens une erreur de type "Type Incompatible" lors de la
compilation avant éxécution.
Est-ce normal ?



Hélas oui. VB ne supporte pas la comparaison des types définis
par l'utilisateur (UDT).

Autrement je vais tester chaque "sous variable" du type. mais
j'aurais voulu faire globalement ..



Quand tes UDT ne contiennent pas de chaines, une astuce existe,
à base de CopyMemory. C'est décrit ici :
http://www.vb-helper.com/howto_compare_udt.html

Mais ce n'est pas applicable pour toi.

En revanche, tu peux tester membre à membre, dans une fonction.

Dans un Module, tu mets ceci :

Option Explicit

Enum RTF_Booléen
B_ND = 0
B_Oui = 1
B_Non = 2
End Enum

Type T_Police
NumPolice As Long
TaillePolice As Long
EstGras As RTF_Booléen
EstItalique As RTF_Booléen
End Type

Type mon_Type
Chaine As String
Liste As RTF_Booléen
FormatPolice As T_Police
End Type

Public Function MyTypesEqual(p As mon_Type, q As mon_Type) As Boolean
Dim p_tp As T_Police
Dim q_tp As T_Police

MyTypesEqual = False
If p.Chaine <> q.Chaine Then
Exit Function
End If

If p.Liste <> q.Liste Then
Exit Function
End If

p_tp = p.FormatPolice
q_tp = q.FormatPolice

If p_tp.EstGras <> q_tp.EstGras Then
Exit Function
End If

If p_tp.EstItalique <> q_tp.EstItalique Then
Exit Function
End If

If p_tp.NumPolice <> q_tp.NumPolice Then
Exit Function
End If

If p_tp.TaillePolice <> q_tp.TaillePolice Then
Exit Function
End If

MyTypesEqual = True

End Function


Puis dans ton code, du genre :

Dim Var1 As mon_Type
Dim Var2 As mon_Type

If MyTypesEqual(Var1, Var2) Then
MsgBox "var1 et var2 sont egaux"
Else
MsgBox "var1 et var2 sont diffrents"
End If


Du coup ton code reste lisible, la comparaison se faisant de
façon unique dans la fonction.

Bonne soirée !

Cordialement,


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Driss HANIB
Bonjour Jean Marc

Etant sur d'une réponse négative, je me suis attelé aux fonctions de
comparaison, du même type que ce que tu as écrit.
Je vais néanmoins regarder ton lien.

Merci pour tes précisions

Driss

"Jean-marc" a écrit dans le message de news:
4b0c4a7d$0$2849$
driss hanib wrote:
Bonjour à tous




Hello Driss,

<snip>

Si je crée deux variables de type mon_Type :
Dim Var1 as mon_Type
Dim Var2 as mon_Type

je veux écrire une condition du type :

if Var1 <> Var2 then

j'obtiens une erreur de type "Type Incompatible" lors de la
compilation avant éxécution.
Est-ce normal ?



Hélas oui. VB ne supporte pas la comparaison des types définis
par l'utilisateur (UDT).

Autrement je vais tester chaque "sous variable" du type. mais
j'aurais voulu faire globalement ..



Quand tes UDT ne contiennent pas de chaines, une astuce existe,
à base de CopyMemory. C'est décrit ici :
http://www.vb-helper.com/howto_compare_udt.html

Mais ce n'est pas applicable pour toi.

En revanche, tu peux tester membre à membre, dans une fonction.

Dans un Module, tu mets ceci :

Option Explicit

Enum RTF_Booléen
B_ND = 0
B_Oui = 1
B_Non = 2
End Enum

Type T_Police
NumPolice As Long
TaillePolice As Long
EstGras As RTF_Booléen
EstItalique As RTF_Booléen
End Type

Type mon_Type
Chaine As String
Liste As RTF_Booléen
FormatPolice As T_Police
End Type

Public Function MyTypesEqual(p As mon_Type, q As mon_Type) As Boolean
Dim p_tp As T_Police
Dim q_tp As T_Police

MyTypesEqual = False
If p.Chaine <> q.Chaine Then
Exit Function
End If

If p.Liste <> q.Liste Then
Exit Function
End If

p_tp = p.FormatPolice
q_tp = q.FormatPolice

If p_tp.EstGras <> q_tp.EstGras Then
Exit Function
End If

If p_tp.EstItalique <> q_tp.EstItalique Then
Exit Function
End If

If p_tp.NumPolice <> q_tp.NumPolice Then
Exit Function
End If

If p_tp.TaillePolice <> q_tp.TaillePolice Then
Exit Function
End If

MyTypesEqual = True

End Function


Puis dans ton code, du genre :

Dim Var1 As mon_Type
Dim Var2 As mon_Type

If MyTypesEqual(Var1, Var2) Then
MsgBox "var1 et var2 sont egaux"
Else
MsgBox "var1 et var2 sont diffrents"
End If


Du coup ton code reste lisible, la comparaison se faisant de
façon unique dans la fonction.

Bonne soirée !

Cordialement,


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Gloops
Bonjour,

Une recherche qui peut s'avérer fructueuse dans msdn, si je ne m'abuse :
"surcharge d'opérateurs".

En bref : c'est une notion qui a été créée dans .Net pile poil po ur
répondre à cette question.

Enfin j'attends de voir ce que va dire Jean-Marc, il a l'air d'un autre
avis.
__________________________________________
driss hanib a écrit, le 24/11/2009 20:21 :
Bonjour à tous


j'ai créé des types préfinis du style
Enum RTF_Booléen
B_ND=0
B_Oui=1
B_Non=2
end enum

Type T_Police
NumPolice as long
TaillePolice as long
EstGras as RTF_Booléen
EstItalique as RTF_Booléen
End type

Type mon_Type
Chaine as string
Liste as RTF_Booléen
FormatPolice as T_Police
end type

Si je crée deux variables de type mon_Type :
Dim Var1 as mon_Type
Dim Var2 as mon_Type

je veux écrire une condition du type :

if Var1 <> Var2 then

j'obtiens une erreur de type "Type Incompatible" lors de la compilation
avant éxécution.
Est-ce normal ?
Autrement je vais tester chaque "sous variable" du type. mais j'aurais voulu
faire globalement ..

Driss





Avatar
Jean-marc
Gloops wrote:
Bonjour,



Hello,

Une recherche qui peut s'avérer fructueuse dans msdn, si je ne
m'abuse : "surcharge d'opérateurs".



Une "notion" intéressante en effet.

En bref : c'est une notion qui a été créée dans .Net pile poil pour
répondre à cette question.



C'est une fonctionnalité qui existe depuis longtemps, en C++ par exemple.
Et elle a en effet été implémentée dans .net, donc dans VB.Net et C#.

Enfin j'attends de voir ce que va dire Jean-Marc, il a l'air d'un
autre avis.



Pas du tout :-) Simplement, cette fonctionnalité n'existe pas en VB6
et en peut donc pas être utile à Driss.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Gloops
Jean-marc a écrit, le 30/11/2009 07:54 :
Pas du tout :-) Simplement, cette fonctionnalité n'existe pas en VB6
et en peut donc pas être utile à Driss.

Cordialement,




Aaargh, c'est vrai que je me suis planté, sur ce coup-là : je me suis
trompé de newsgroup (garder un œil sur VB c'est bien joli, mais aprè s il
ne faut pas mélanger). Je me disais aussi, si Jean-Marc n'en parle pas,
c'est qu'il y a un os quelque part.
Avatar
Driss HANIB
Merci à tous.

Driss

"Gloops" a écrit dans le message de news:

Jean-marc a écrit, le 30/11/2009 07:54 :
Pas du tout :-) Simplement, cette fonctionnalité n'existe pas en VB6
et en peut donc pas être utile à Driss.

Cordialement,




Aaargh, c'est vrai que je me suis planté, sur ce coup-là : je me suis
trompé de newsgroup (garder un œil sur VB c'est bien joli, mais après il
ne faut pas mélanger). Je me disais aussi, si Jean-Marc n'en parle pas,
c'est qu'il y a un os quelque part.