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

erreur passage d'argument

3 réponses
Avatar
Zeg
Pouvez vous m'indiquer la difference entre : un module de classe et un
module d'objet public ?

Cause et solution de cette erreur :

Vous avez tenté d'utiliser un type public défini par l'utilisateur comme
paramètre ou comme type renvoyé pour une procédure publique d>un module de
classe, ou comme champ d>un type public défini par l>utilisateur. Seuls les
types publics définis par l>utilisateur dans un module d>objet public
peuvent être utilisés de cette façon

Merci

3 réponses

Avatar
ng
Salut,

Les modules publics permettent de définir des variables ou procédures
globales à tout le projet par exemple. Alors que les modules de classes (par
exemple les forms sont des modules de classes) sont des objets à créer
généralement à l'aide de l'opérateur New :
Dim cClasse As MaClasse
Set cClasse = New MaClasse

'//...

Set cClasse = Nothing

Il nous faudrait plus de précisions pour t'aider, où as-tu déclaré ton type
? ou essayes-tu de l'utiliser ? Retour fonction ? variable ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/
http://apisvb.europe.webmatrixhosting.net/

Zeg a écrit :

Pouvez vous m'indiquer la difference entre : un module de classe et un
module d'objet public ?

Cause et solution de cette erreur :

Vous avez tenté d'utiliser un type public défini par l'utilisateur
comme paramètre ou comme type renvoyé pour une procédure publique
d>un module de classe, ou comme champ d>un type public défini par
l>utilisateur. Seuls les types publics définis par l>utilisateur dans
un module d>objet public peuvent être utilisés de cette façon

Merci


Avatar
Zoury
> Pouvez vous m'indiquer la difference entre : un module de classe et un
module d'objet public ?



Module de classe :

Es-tu familier avec la programmation orienté objet? Un module de classe ou
classe est un modèle objet, un type de donnée. La classe ne fournit que le
modèle de l'objet, c'est-à-dire qu'elle définit comment cet objet
fonctionne, quel sont ses propriétés, ses fonctions et ses méthodes. Pour
utilisé une classe tu dois instancié un objet de cette classe. Tu travailles
déjà avec des instances de classes sans t'en rendre compte : Form, TextBox,
Collection, etc. Le module de classe te permet d'en définir une qui n'existe
pas.

Ex de classe (non testé) :
'***
' CPersonne
Option Explicit

Private m_sNom As String
Private m_sPrenom As String
Private m_dtNaissance As Date

Public Property Get Nom() As String
Nom = m_sNom
End Public
Public Property Let Nom(Byref sNom As String) As String
m_sNom = sNom
End Public

Public Property Get Prenom() As String
Prenom = m_sPrenom
End Public
Public Property Let Prenom(Byref sPrenom As String) As String
m_sPrenom = sPrenom
End Public

Public Property Get DateNaissance() As Date
DateNaissance = m_dtNaissance
End Public
Public Property Let DateNaissance(Byref dtNaissance As Date) As Date
m_dtNaissance = dtNaissance
End Public

Public Function Clone() As CPersonne

Dim p As CPersonne
Set p = New CPersonne

p.Nom = m_sNom
p.Prenom = m_sPrenom
p.DateNaissance = m_dtNaissance

Set Clone = p

End Function
'***

Ex d'utilisation (pas plus testé):
'***
' Module1
Option Explicit

Private Sub Main()

Dim p As CPersonne
Dim p2 As CPersonne

Set p = New CPersonne

p.Nom = "Lefebvre"
p.Prenom = "Yanick"
p.DateNaissance = DateSerial(1980, 9, 6)

Set p2 = p.Clone

Debug.Print p2.Nom
Debug.Print p2.Prenom
Debug.Print p2.DateNaissance

End Sub
'***


Module d'objet public :

Les modules (tout cours) permette de regrouper des méthodes, fonctions ou
variables ensemble quelles soient publiques ou privées.




Cause et solution de cette erreur :

Vous avez tenté d'utiliser un type public défini par l'utilisateur comme
paramètre ou comme type renvoyé pour une procédure publique d>un module de
classe, ou comme champ d>un type public défini par l>utilisateur. Seuls


les
types publics définis par l>utilisateur dans un module d>objet public
peuvent être utilisés de cette façon



J'imagine que tu as tenté quelque chose de la sorte :

' dans un projet de type ActiveX Exe
'***
' Class1
Option Explicit

Public Type Point
x As Long
y As Long
End Type

Private m_ptLocation As Point

Public Property Get Location() As Point
Location = m_ptLocation
End Property
'***

où Point est un UDT (User Define Type) déclaré publiquement dans ta classe.
Le problème ici c'est que la classe Class1 est une classe privée au projet.
Or tu ne peux pas renvoyé de UDT à partir d'une classe privée car ces Types
ne sont pas surportés par automation (en gros les autres programmes ne
comprenne pas de quoi tu leur parles lorsque tu utilises ces types)... Si tu
avais la même classe (elle doit être publique) dans un projet ActiveX Dll,
cela compilerait.

Alors voici quelques solutions à ton problème :

1. À moins que ton UDT soit utilisé par des APIs ou pour écrire dans des
fichiers, tu peux facilement le remplacer par une classe.
2. Tu peux te faire une librairie d'objet dans un Dll à part (projet ActiveX
DLL), cela nécessite toutefois la distribution de la Dll en question avec le
projet.
3. Tu peux renvoyé un pointeur vers ton UDT et utiliser CopyMemory pour
aller chercher l'information à partir de ce pointeur.. (API mode) ;O)

j'opterais pour la première solution, si c'est possible dans ton cas.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/
Avatar
Zeg
J'ai une fonction dans un .cls d'un projet Dll/ActiveX :
Public Function RechercheDichoGen(Inf As Integer, Sup As Integer, Contenant
As Variant, Element As Variant, Compare As String, LireContenu As String,
Objet As Object) As Integer

Do While Inf <= Sup

Dim milieu As Integer
milieu = Int((Inf + Sup) / 2)

If CallByName(Objet, Compare, VbMethod, Element, _
CallByName(Objet, LireContenu, VbMethod, Contenant,
milieu)) Then

Sup = milieu - 1
Else

Inf = milieu + 1
End If
Loop

MsgBox Inf
Rem Resultat
RechercheDichoGen = Inf

End Function

et je fais un appel à cette fonction dans un autre .cls d'un autre projet
Dll/ActiveX

Public Type CanalFichier
Nom As String
Numero As Integer
End Type

Public TabAllocCanal(99) As CanalFichier
Dim LeFichier As CanalFichier

RechercheDichoGen(LBound(TabAllocCanal), FTAC - 1, TabAllocCanal,
LeFichier, "LowerOrEqual", "LireTab", Me)



L'idée est d'appliquer l'algo de recherche dichotomique sur tout type de
contenu et de contenant.
Et plus particulièrement sur le tableau déclaré précédement contenant des
éléments de type CanalFichier
mais aussi sur des lignes dans un fichier binaire.

ça fait un moment que j'essaye de m'approcher de lidée de généricité mais
...
Merci d'avance

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

> Pouvez vous m'indiquer la difference entre : un module de classe et un
> module d'objet public ?

Module de classe :

Es-tu familier avec la programmation orienté objet? Un module de classe ou
classe est un modèle objet, un type de donnée. La classe ne fournit que le
modèle de l'objet, c'est-à-dire qu'elle définit comment cet objet
fonctionne, quel sont ses propriétés, ses fonctions et ses méthodes. Pour
utilisé une classe tu dois instancié un objet de cette classe. Tu


travailles
déjà avec des instances de classes sans t'en rendre compte : Form,


TextBox,
Collection, etc. Le module de classe te permet d'en définir une qui


n'existe
pas.

Ex de classe (non testé) :
'***
' CPersonne
Option Explicit

Private m_sNom As String
Private m_sPrenom As String
Private m_dtNaissance As Date

Public Property Get Nom() As String
Nom = m_sNom
End Public
Public Property Let Nom(Byref sNom As String) As String
m_sNom = sNom
End Public

Public Property Get Prenom() As String
Prenom = m_sPrenom
End Public
Public Property Let Prenom(Byref sPrenom As String) As String
m_sPrenom = sPrenom
End Public

Public Property Get DateNaissance() As Date
DateNaissance = m_dtNaissance
End Public
Public Property Let DateNaissance(Byref dtNaissance As Date) As Date
m_dtNaissance = dtNaissance
End Public

Public Function Clone() As CPersonne

Dim p As CPersonne
Set p = New CPersonne

p.Nom = m_sNom
p.Prenom = m_sPrenom
p.DateNaissance = m_dtNaissance

Set Clone = p

End Function
'***

Ex d'utilisation (pas plus testé):
'***
' Module1
Option Explicit

Private Sub Main()

Dim p As CPersonne
Dim p2 As CPersonne

Set p = New CPersonne

p.Nom = "Lefebvre"
p.Prenom = "Yanick"
p.DateNaissance = DateSerial(1980, 9, 6)

Set p2 = p.Clone

Debug.Print p2.Nom
Debug.Print p2.Prenom
Debug.Print p2.DateNaissance

End Sub
'***


Module d'objet public :

Les modules (tout cours) permette de regrouper des méthodes, fonctions ou
variables ensemble quelles soient publiques ou privées.




> Cause et solution de cette erreur :
>
> Vous avez tenté d'utiliser un type public défini par l'utilisateur comme
> paramètre ou comme type renvoyé pour une procédure publique d>un module


de
> classe, ou comme champ d>un type public défini par l>utilisateur. Seuls
les
> types publics définis par l>utilisateur dans un module d>objet public
> peuvent être utilisés de cette façon

J'imagine que tu as tenté quelque chose de la sorte :

' dans un projet de type ActiveX Exe
'***
' Class1
Option Explicit

Public Type Point
x As Long
y As Long
End Type

Private m_ptLocation As Point

Public Property Get Location() As Point
Location = m_ptLocation
End Property
'***

où Point est un UDT (User Define Type) déclaré publiquement dans ta


classe.
Le problème ici c'est que la classe Class1 est une classe privée au


projet.
Or tu ne peux pas renvoyé de UDT à partir d'une classe privée car ces


Types
ne sont pas surportés par automation (en gros les autres programmes ne
comprenne pas de quoi tu leur parles lorsque tu utilises ces types)... Si


tu
avais la même classe (elle doit être publique) dans un projet ActiveX Dll,
cela compilerait.

Alors voici quelques solutions à ton problème :

1. À moins que ton UDT soit utilisé par des APIs ou pour écrire dans des
fichiers, tu peux facilement le remplacer par une classe.
2. Tu peux te faire une librairie d'objet dans un Dll à part (projet


ActiveX
DLL), cela nécessite toutefois la distribution de la Dll en question avec


le
projet.
3. Tu peux renvoyé un pointeur vers ton UDT et utiliser CopyMemory pour
aller chercher l'information à partir de ce pointeur.. (API mode) ;O)

j'opterais pour la première solution, si c'est possible dans ton cas.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/