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

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-marc
Le #20625101
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_' ;
Driss HANIB
Le #20628781
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" 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_' ;






Gloops
Le #20661091
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





Jean-marc
Le #20661371
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_' ;
Gloops
Le #20661831
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.
Driss HANIB
Le #20665481
Merci à tous.

Driss

"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.
Publicité
Poster une réponse
Anonyme