Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021
-
Modifié le 22 avril 2019 à 23:05
Whismeril
Messages postés18404Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 mai 2023
-
23 avril 2019 à 18:57
Bonjour,
Je rencontre un petit souci sur l'appel à une méthode dans une propriété.
Un petit exemple pour illustrer :
Public Class CtrlCarteTrucMuch: Inherits ProtocolACK
Public Structure StrVoie
Public Property Param1 As Double
Private _Param2 as double
Public Property Param2 as Double
Get
return _Param2
End Get
Set (value As Double)
_Param2 = SendCmd("1A" & value.ToString) ' <=== Ca coince ici
End Set
End Property
End Structure
Public Voie(4) As StrVoie
' La suite du code…
' …
' …
End Class
La méthode SendCmd est définie dans la classe ProtocolACK.
Elle est accessible dans les différentes méthodes de la classe CtrlCarte (puisqu'elle est héritée).
Mais elle ne l'est pas dans le Set de ma propriété Param2 (définie dans la structure StrVoie).
Whismeril
Messages postés18404Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 mai 2023623 23 avril 2019 à 17:25
Il ne peut pas y avoir de notion d'héritage puisque ce n'est pas un objet.
C'est exact, à ma décharge à 6h du mat j'ai rédigé un peu rapidement.
Tu as plusieurs options:
tu peux donner en paramètre (dans le constructeur, un setteur ou une propriété) l'instance de ta classe CtrlCarteTrucMuch à chaque voie. Quand la voie doit envoyer un message elle fait
maCarte.SendCmd(cmd, valeur)
si SendCmd est public
tu peux créer un événement dans les voies signalant que le message est prêt, la carte s'y abonne et envoie le message quand il faut
tu peux rendre SendCmd Shared (mais je ne te le conseille pas)
et sans doute encore d'autres façons
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 23 avril 2019 à 18:42
Merci Whismeril,
La 1ere solution me parait en effet plus appropriée.
C'est tellement évident que j'ai honte de ne pas y avoir pensé.
Whismeril
Messages postés18404Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 mai 2023623 23 avril 2019 à 18:57
De rien et pas la peine de t’en vouloir, quand on est le nez dans le guidon on passe parfois à côté d’un truc
Whismeril
Messages postés18404Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 mai 2023623 23 avril 2019 à 05:19
Bonjour,
c'est marrant ça, il y a un peu plus d'un an, on t'a expliqué, qu'une structure, c'est pas une bonne idée en .Net, parce que .Net est optimisé pour l'objet.
Et aujourd'hui, tu reviens avec un truc qui marche pas avec une structure mais qui marche avec un objet...
Whismeril
Messages postés18404Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 mai 2023623 23 avril 2019 à 06:59
Y'a plusieurs choses qui ne vont pas dans ton code, voilà les 2 principales.
Par définition, une structure (ça vient du C), ne contient que des champs de données, pas de propriété ni méthodes (et c'est pas parce que VB t'en laisse la possibilité qu'il faut le faire).
Mais surtout, ta structure n'hérite pas de la classe ProtocolACK, donc elle n'a pas accès à ses méthodes.
Nardo26
Messages postés37Date d'inscriptionsamedi 13 janvier 2018StatutMembreDernière intervention 1 mars 2021 23 avril 2019 à 14:11
Ma structure est DANS ma classe de définition de carte.
Il ne peut pas y avoir de notion d'héritage puisque ce n'est pas un objet.
Je croyais que du fait de pouvoir déclarer des properties dans cette structure, on avait, de ce fait un accès aux méthodes de la classe propriétaire de la structure.
Mais, ok je comprend qu'il n'est pas logique d'avoir du code dans une structure.
Cela dit, je ne vois pas sous quel plan aborder mon pb :
Ma carte dispose de 4 voies de pilotage moteur. Elle est accessible via un port COM (donc ce port COM est commun aux 4 voies). Je transmet des ordres via cette liaison série pour paramétrer mes différentes voies.
Actuellement, je m'en sort en passant par des méthodes du genre :
Public Sub Vitesse(ByVal numAxe as Integer, ByVal valeur As Double)
dim result As Double
dim cmd As String
' code pour contruire la commande Cmd en fct de numAxe
' ...
result = SendCmd(cmd, valeur)
End Sub
Mais cela reste "lourd" à mes yeux car la notion de voie est totalement absente.
Si je part sur une orientation objet : Comment, dans ce cas, déclarer un tableau d'objet "voie" qui me permette quand même d'accéder aux méthodes de ma classe CtrlCarteTrucMuch (notamment la méthode SendCmd qui se sert de la Com) sans être obligé de faire un héritage de celle-ci ?
23 avril 2019 à 18:42
La 1ere solution me parait en effet plus appropriée.
C'est tellement évident que j'ai honte de ne pas y avoir pensé.
23 avril 2019 à 18:57