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

Type et fonction

8 réponses
Avatar
Marc
Bonjour à tous,

je reviens vers vous, pour une question que j'ai déjà posée mais sans doute
mal expliquée .

J'ai un module class dans lequel j'ai une fonction cette fonction sert à
écrire dans un fichier.
Ce module class me sert de librairie, en gros je veut pouvoir réutiliser
cette class dans d'autres programmes.

Je fabrique des types d'enregistrement et veux les passer a cette fonction,
j'ai compris qu'il fallait utiliser byref, mais j'ai toujours un message
d'erreur je n'arrive pas à interpréter le message.

Dans le module:

Type CP
CP As String * 5
Ville As String * 50
End Type

Public FicCp As CP

Dans la class:

Public Function AddRec( ByRef RecToto As Variant) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

Dans la form:

FicCp.CP="75000"
FicCP.Ville="Paris"

Rep=Class1.AddRec(FicCP)


Message d'erreur:
Erreur de compilation:

Seules les types définis par l'utilisateur et qui sont définis dans les
modules d'objets publics peuvent être convertis depuis un variant, ou passés
à des fonctions à liaison tardive

Je ne veux pas utiliser de solution du style:

Dans la class:

Public Function AddRec( Byval NumType As Integer) As Integer
Select NumType
Case 1
put #Handle,PosRec, FicCP
Case 2
etc etc ....
End Function

Par avance merci de vos précieux renseignements.

Marc

8 réponses

Avatar
Marc
Dans la doc de VB5 en page 365 il y a une note qui dit: Si vous voulez
transférer un type personnalisé vers un module de feuille ou de classe, la
procédure doit être privée.

J'ai beau faire pleins de tests , j'ai toujours le même message.

Personne n'a d'idée ?



Bonjour à tous,

je reviens vers vous, pour une question que j'ai déjà posée mais sans
doute mal expliquée .

J'ai un module class dans lequel j'ai une fonction cette fonction sert à
écrire dans un fichier.
Ce module class me sert de librairie, en gros je veut pouvoir réutiliser
cette class dans d'autres programmes.

Je fabrique des types d'enregistrement et veux les passer a cette
fonction, j'ai compris qu'il fallait utiliser byref, mais j'ai toujours un
message d'erreur je n'arrive pas à interpréter le message.

Dans le module:

Type CP
CP As String * 5
Ville As String * 50
End Type

Public FicCp As CP

Dans la class:

Public Function AddRec( ByRef RecToto As Variant) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

Dans la form:

FicCp.CP="75000"
FicCP.Ville="Paris"

Rep=Class1.AddRec(FicCP)


Message d'erreur:
Erreur de compilation:

Seules les types définis par l'utilisateur et qui sont définis dans les
modules d'objets publics peuvent être convertis depuis un variant, ou
passés à des fonctions à liaison tardive

Je ne veux pas utiliser de solution du style:

Dans la class:

Public Function AddRec( Byval NumType As Integer) As Integer
Select NumType
Case 1
put #Handle,PosRec, FicCP
Case 2
etc etc ....
End Function

Par avance merci de vos précieux renseignements.

Marc



Avatar
parci
Marc a écrit :
Bonjour à tous,

je reviens vers vous, pour une question que j'ai déjà posée mais sans doute
mal expliquée .

J'ai un module class dans lequel j'ai une fonction cette fonction sert à
écrire dans un fichier.
Ce module class me sert de librairie, en gros je veut pouvoir réutiliser
cette class dans d'autres programmes.

Je fabrique des types d'enregistrement et veux les passer a cette fonction,
j'ai compris qu'il fallait utiliser byref, mais j'ai toujours un message
d'erreur je n'arrive pas à interpréter le message.

Dans le module:

Type CP
CP As String * 5
Ville As String * 50
End Type

Public FicCp As CP

Dans la class:

Public Function AddRec( ByRef RecToto As Variant) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

Dans la form:

FicCp.CP="75000"
FicCP.Ville="Paris"

Rep=Class1.AddRec(FicCP)


Message d'erreur:
Erreur de compilation:

Seules les types définis par l'utilisateur et qui sont définis dans les
modules d'objets publics peuvent être convertis depuis un variant, ou passés
à des fonctions à liaison tardive



C'est interdit.

2 solutions possibles :
- convertir ton type en classe et la passer en paramètre de ta fonction
AddRec. Ca revient à définir une classe CP avec 2 propriétés en écriture
et à créer une instance de cette classe dans le form.

- passer un pointeur sur ton type en paramètre et retrouver les données
à partir du pointeur dans ta fonction.

La première solution est de loin à privilégier.
Avatar
Marc
Merci pour ta réponse.

as tu un petit exemple pour la première manip car là je nage un peu.

En revanche le pointeur pourrait faire l'affaire
- www.gelase.org
"parci" a écrit dans le message de news:
4b32097b$0$30352$
Marc a écrit :
Bonjour à tous,

je reviens vers vous, pour une question que j'ai déjà posée mais sans
doute mal expliquée .

J'ai un module class dans lequel j'ai une fonction cette fonction sert à
écrire dans un fichier.
Ce module class me sert de librairie, en gros je veut pouvoir réutiliser
cette class dans d'autres programmes.

Je fabrique des types d'enregistrement et veux les passer a cette
fonction, j'ai compris qu'il fallait utiliser byref, mais j'ai toujours
un message d'erreur je n'arrive pas à interpréter le message.

Dans le module:

Type CP
CP As String * 5
Ville As String * 50
End Type

Public FicCp As CP

Dans la class:

Public Function AddRec( ByRef RecToto As Variant) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

Dans la form:

FicCp.CP="75000"
FicCP.Ville="Paris"

Rep=Class1.AddRec(FicCP)


Message d'erreur:
Erreur de compilation:

Seules les types définis par l'utilisateur et qui sont définis dans les
modules d'objets publics peuvent être convertis depuis un variant, ou
passés à des fonctions à liaison tardive



C'est interdit.

2 solutions possibles :
- convertir ton type en classe et la passer en paramètre de ta fonction
AddRec. Ca revient à définir une classe CP avec 2 propriétés en écriture
et à créer une instance de cette classe dans le form.

- passer un pointeur sur ton type en paramètre et retrouver les données à
partir du pointeur dans ta fonction.

La première solution est de loin à privilégier.


Avatar
Marc
Après réflexion je me dis que dans un prog on peut faire plusieurs recordset
sur un même fichier, donc dans ce cas le pointeur serait peut être plus
adapté.

Je ne voudrais pas abuser, aurais tu 1 exemple concret pour les deux

- www.gelase.org
"parci" a écrit dans le message de news:
4b32097b$0$30352$
Marc a écrit :
Bonjour à tous,

je reviens vers vous, pour une question que j'ai déjà posée mais sans
doute mal expliquée .

J'ai un module class dans lequel j'ai une fonction cette fonction sert à
écrire dans un fichier.
Ce module class me sert de librairie, en gros je veut pouvoir réutiliser
cette class dans d'autres programmes.

Je fabrique des types d'enregistrement et veux les passer a cette
fonction, j'ai compris qu'il fallait utiliser byref, mais j'ai toujours
un message d'erreur je n'arrive pas à interpréter le message.

Dans le module:

Type CP
CP As String * 5
Ville As String * 50
End Type

Public FicCp As CP

Dans la class:

Public Function AddRec( ByRef RecToto As Variant) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

Dans la form:

FicCp.CP="75000"
FicCP.Ville="Paris"

Rep=Class1.AddRec(FicCP)


Message d'erreur:
Erreur de compilation:

Seules les types définis par l'utilisateur et qui sont définis dans les
modules d'objets publics peuvent être convertis depuis un variant, ou
passés à des fonctions à liaison tardive



C'est interdit.

2 solutions possibles :
- convertir ton type en classe et la passer en paramètre de ta fonction
AddRec. Ca revient à définir une classe CP avec 2 propriétés en écriture
et à créer une instance de cette classe dans le form.

- passer un pointeur sur ton type en paramètre et retrouver les données à
partir du pointeur dans ta fonction.

La première solution est de loin à privilégier.


Avatar
parci
Marc a écrit :
Après réflexion je me dis que dans un prog on peut faire plusieurs recordset
sur un même fichier, donc dans ce cas le pointeur serait peut être plus
adapté.



Non.

Je ne voudrais pas abuser, aurais tu 1 exemple concret pour les deux



classe c2 :

Private m_cp As String
Private m_ville As String

Public Property Let cp(newvalue As String)
m_cp = newvalue
End Property
Public Property Get cp() As String
cp = m_cp
End Property

Public Property Let Ville(newvalue As String)
m_ville = newvalue
End Property
Public Property Get Ville() As String
Ville = m_ville
End Property


classe c1 :

Private Type udtCp
cp As String * 5
Ville As String * 50
End Type

Public Function AddRec(c As c1) As Integer
Dim t As udtCp

With t
.cp = c.cp
.Ville = c.Ville
End With

Put #Handle, PosRec, t
End Function

form :

Private Sub Form_Load()

Dim c2 As New c2
Dim c1 As New c1

With c2
.cp = "75000"
.Ville = "Paris"
End With

c1.AddRec cp

End Sub
Avatar
Marc
Ok,

je te remercie beaucoup je vais faire le test dèja pour comprendre ce que
tu a fais et te tiens au courrant

Marc a écrit :
Après réflexion je me dis que dans un prog on peut faire plusieurs
recordset sur un même fichier, donc dans ce cas le pointeur serait peut
être plus adapté.



Non.

Je ne voudrais pas abuser, aurais tu 1 exemple concret pour les deux



classe c2 :

Private m_cp As String
Private m_ville As String

Public Property Let cp(newvalue As String)
m_cp = newvalue
End Property
Public Property Get cp() As String
cp = m_cp
End Property

Public Property Let Ville(newvalue As String)
m_ville = newvalue
End Property
Public Property Get Ville() As String
Ville = m_ville
End Property


classe c1 :

Private Type udtCp
cp As String * 5
Ville As String * 50
End Type

Public Function AddRec(c As c1) As Integer
Dim t As udtCp

With t
.cp = c.cp
.Ville = c.Ville
End With

Put #Handle, PosRec, t
End Function

form :

Private Sub Form_Load()

Dim c2 As New c2
Dim c1 As New c1

With c2
.cp = "75000"
.Ville = "Paris"
End With

c1.AddRec cp

End Sub


Avatar
Driss HANIB
Salut Marc

voici ma solution

Dans ta class tu mets

Friend Function AddRec( ByRef RecToto As CP) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

je ne sais pas pourquoi mais les type définis par l'utilisateur ne peuvent
être pris en compte que si on fait précéder sub ou function par le mot
friend...
De plus mets carrément ton type CP (ByRef RecToto As CP) dans tes
paramètres.

Driss

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

Ok,

je te remercie beaucoup je vais faire le test dèja pour comprendre ce que
tu a fais et te tiens au courrant

Marc a écrit :
Après réflexion je me dis que dans un prog on peut faire plusieurs
recordset sur un même fichier, donc dans ce cas le pointeur serait peut
être plus adapté.



Non.

Je ne voudrais pas abuser, aurais tu 1 exemple concret pour les deux



classe c2 :

Private m_cp As String
Private m_ville As String

Public Property Let cp(newvalue As String)
m_cp = newvalue
End Property
Public Property Get cp() As String
cp = m_cp
End Property

Public Property Let Ville(newvalue As String)
m_ville = newvalue
End Property
Public Property Get Ville() As String
Ville = m_ville
End Property


classe c1 :

Private Type udtCp
cp As String * 5
Ville As String * 50
End Type

Public Function AddRec(c As c1) As Integer
Dim t As udtCp

With t
.cp = c.cp
.Ville = c.Ville
End With

Put #Handle, PosRec, t
End Function

form :

Private Sub Form_Load()

Dim c2 As New c2
Dim c1 As New c1

With c2
.cp = "75000"
.Ville = "Paris"
End With

c1.AddRec cp

End Sub






Avatar
Marc
Merci driss,

Je test aussi et vous dis ce que cela donne.

Salut Marc

voici ma solution

Dans ta class tu mets

Friend Function AddRec( ByRef RecToto As CP) As Integer
Put #Handle,PosRec, RecToto
etc etc ...
End Function

je ne sais pas pourquoi mais les type définis par l'utilisateur ne peuvent
être pris en compte que si on fait précéder sub ou function par le mot
friend...
De plus mets carrément ton type CP (ByRef RecToto As CP) dans tes
paramètres.

Driss

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

Ok,

je te remercie beaucoup je vais faire le test dèja pour comprendre ce que
tu a fais et te tiens au courrant

Marc a écrit :
Après réflexion je me dis que dans un prog on peut faire plusieurs
recordset sur un même fichier, donc dans ce cas le pointeur serait peut
être plus adapté.



Non.

Je ne voudrais pas abuser, aurais tu 1 exemple concret pour les deux



classe c2 :

Private m_cp As String
Private m_ville As String

Public Property Let cp(newvalue As String)
m_cp = newvalue
End Property
Public Property Get cp() As String
cp = m_cp
End Property

Public Property Let Ville(newvalue As String)
m_ville = newvalue
End Property
Public Property Get Ville() As String
Ville = m_ville
End Property


classe c1 :

Private Type udtCp
cp As String * 5
Ville As String * 50
End Type

Public Function AddRec(c As c1) As Integer
Dim t As udtCp

With t
.cp = c.cp
.Ville = c.Ville
End With

Put #Handle, PosRec, t
End Function

form :

Private Sub Form_Load()

Dim c2 As New c2
Dim c1 As New c1

With c2
.cp = "75000"
.Ville = "Paris"
End With

c1.AddRec cp

End Sub