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

transfert de paramètres à une fonction

5 réponses
Avatar
HWO
Bonsoir,

Dans une application sous vb6, je dois transferer =E0 une
fonction un tableau de "data" constitu=E9 de type de donn=E9es
personnalis=E9 (strucutre type.... end type).
Ces types de donn=E9es personnalis=E9s sont d=E9clar=E9s comme
public dans un module de l'application. Le param=E9tre de la
fonction qui doit recevoir ces donn=E9es est d=E9clar=E9 avec le
mot cl=E9 "paramArray".

A la compilation je tombe toujours sur le message d'erreur
suivant :
"Seul les types d=E9finis par l'utilisateur et qui sont
d=E9finis dans les modules d'objets publics peuvent =EAtre
convertis depuis ou vers un variant, ou pass=E9s =E0 des
fonctions =E0 liaison tardive"

Ca veut dire quoi tout =E7a, et surtout que fait-il faire
pour s'en sortir?

Par avance merci de votre aide pr=E9cieuse.

5 réponses

Avatar
Patrice Henrio
ParamArray signifie que la fonction peut recevoir un nombre varié de
paramètres, ce qui ne semble pas être le cas ici.

Dans ton cas :
soit
type MonType
<ici les champs de ton type>
End type

Function (X as MonType) as integer ; par exemple
<ici le corps de la focntion>
End Function

Je pense que je pourrai mieux t'aider si tu me donnais le code de ta
fonction.


"HWO" a écrit dans le message de news:
207f01c49f4f$05039490$
Bonsoir,

Dans une application sous vb6, je dois transferer à une
fonction un tableau de "data" constitué de type de données
personnalisé (strucutre type.... end type).
Ces types de données personnalisés sont déclarés comme
public dans un module de l'application. Le paramétre de la
fonction qui doit recevoir ces données est déclaré avec le
mot clé "paramArray".

A la compilation je tombe toujours sur le message d'erreur
suivant :
"Seul les types définis par l'utilisateur et qui sont
définis dans les modules d'objets publics peuvent être
convertis depuis ou vers un variant, ou passés à des
fonctions à liaison tardive"

Ca veut dire quoi tout ça, et surtout que fait-il faire
pour s'en sortir?

Par avance merci de votre aide précieuse.
Avatar
christophe-pasde
Bonjour,

J'ai moi aussi buté assez longtemps sur ce problème.

A la compilation je tombe toujours sur le message d'erreur
suivant :
"Seul les types définis par l'utilisateur et qui sont
définis dans les modules d'objets publics peuvent être
convertis depuis ou vers un variant, ou passés à des
fonctions à liaison tardive"



il s'agit en fait d'un problème d'interprétation du message d'erreur:
"modules d'objets publics" signifie module de classe et non pas module
publique.

Paramarray signifie que l'on va déclarer un tableau de variant, or les
type défini par l'utilisateur (Type ... END TYPE) dans un module
publique ne sont pas des variants.

si tu as une structure du type:

Type Mystruct
Field1 as string
Fieldn as double
End Type

Il te faut plutôt définir une classe

'CMyStruc
option explicit

private mfield1 as string
private mfieldn as double

Public property Get Field1() as string
field1=mfield1
end property

Public property let Field1(VnewValue as string)
mfield1=vnewvalue
end property

idem pour les autres membres du type end

Ensuite dans le code tu instancies un objet de type Cmystruc dans le
code comme suit:
dim ObjStruc as Cmystruc
set objstruc = new Cmystruc

objstruc.field1="TOTO"
objstruc.fieldn= 123

call Myproc(objstruc) ' si Myproc est définie Public sub Myproc(Obj as
Cmystruc)
et ne pas oublier de détruire l'objet à la fin:
set objstruc=nothing

A noter que si tu abordes le pb à l'aide des classes il convient plutôt
que de passer un tableau de variant utiliser les interfaces multiples:

Tu définis une classe générique qui comprend les caractéristiques
communes aux différents objets que tu veux traiter, ensuite du défini
des classes dérivée qui correspondent à chacune de tes structures les
propriétés communes en moins.
Ensuite tu peux au choix passer à ta fonction:
un tableau d'objet de la classe générique
une collection d'objet générique.

A noter que dans les deux cas la partie du message d'erreur "ou passés
à des fonctions à liaison tardive" ne s'applique plus, car du fait de
l'utilisation d'un objet comme objstruc VB peut effectuer une liaison
précoce.

Christophe
Avatar
Hervé
En fait il s'agit d'un activeX intégré à une application (.exe) qui doit
tracer des choses. Les choses en question sont des données struturées
personnalisées.

public type segment
debut as systemTime
fin as syteTime
...
...
end type

public type ligne
nom as string
epaisseur as integer
mode as integer
etat() as segment 'Déclaré juste
avant.
end type

Ces types de data sont connues de l'activeX et de l'exe container.
L'application (.exe) lit un fichier texte et met en forme les informations
dans un tableau avant de le passer à l'activeX pour qu'il puisse tout
tracer.

Dans l'activeX il y a une méthode appelée traceData décalrée comme suit :
Public sub traceData(data as variant)
'Code de la fonction

End sub


Dans l'exe j'ai déclarer un tableau de la manière suivante.
Public ligneATrace() as ligne
'Lecture fichier d'acquisition et alimentation de la structure
ligneATrace()
...
...

'Appel de la méthode de l'activeX
Call activeX.traceData(ligneATrace()) '==> C'est cette ligne qui
me génére le message d'erreur ennoncé.

voilà, j'espére que ces renseignemetns sont assez précis .


"Patrice Henrio" a écrit dans le message de
news:
ParamArray signifie que la fonction peut recevoir un nombre varié de
paramètres, ce qui ne semble pas être le cas ici.

Dans ton cas :
soit
type MonType
<ici les champs de ton type>
End type

Function (X as MonType) as integer ; par exemple
<ici le corps de la focntion>
End Function

Je pense que je pourrai mieux t'aider si tu me donnais le code de ta
fonction.


"HWO" a écrit dans le message de


news:
207f01c49f4f$05039490$
Bonsoir,

Dans une application sous vb6, je dois transferer à une
fonction un tableau de "data" constitué de type de données
personnalisé (strucutre type.... end type).
Ces types de données personnalisés sont déclarés comme
public dans un module de l'application. Le paramétre de la
fonction qui doit recevoir ces données est déclaré avec le
mot clé "paramArray".

A la compilation je tombe toujours sur le message d'erreur
suivant :
"Seul les types définis par l'utilisateur et qui sont
définis dans les modules d'objets publics peuvent être
convertis depuis ou vers un variant, ou passés à des
fonctions à liaison tardive"

Ca veut dire quoi tout ça, et surtout que fait-il faire
pour s'en sortir?

Par avance merci de votre aide précieuse.




Avatar
HWO
J'ai réussi à m'en sortir en créant une dll ActiveX dans laquelle j'ai
déclaré en public les type personnalisés utilisés. Une réference à cette dll
est faite dans l'exe et ça à l'air de fonctionner (plus d'erreur de
comilation).
Par contre je n'ai aucun recul concernatnt les performances (les + et le -)
des deux méthodes, à savoir, cette dll ou passer par des classes comme tu le
l'as expliqué (très clairement d'ailleurs).

Hervé.

"christophe-pasde<> @wanadoo.fr>" <"christophe-pasde<> a écrit dans le
message de news:cioh1c$9s6$
Bonjour,

J'ai moi aussi buté assez longtemps sur ce problème.

> A la compilation je tombe toujours sur le message d'erreur
> suivant :
> "Seul les types définis par l'utilisateur et qui sont
> définis dans les modules d'objets publics peuvent être
> convertis depuis ou vers un variant, ou passés à des
> fonctions à liaison tardive"

il s'agit en fait d'un problème d'interprétation du message d'erreur:
"modules d'objets publics" signifie module de classe et non pas module
publique.

Paramarray signifie que l'on va déclarer un tableau de variant, or les
type défini par l'utilisateur (Type ... END TYPE) dans un module
publique ne sont pas des variants.

si tu as une structure du type:

Type Mystruct
Field1 as string
Fieldn as double
End Type

Il te faut plutôt définir une classe

'CMyStruc
option explicit

private mfield1 as string
private mfieldn as double

Public property Get Field1() as string
field1=mfield1
end property

Public property let Field1(VnewValue as string)
mfield1=vnewvalue
end property

idem pour les autres membres du type end

Ensuite dans le code tu instancies un objet de type Cmystruc dans le
code comme suit:
dim ObjStruc as Cmystruc
set objstruc = new Cmystruc

objstruc.field1="TOTO"
objstruc.fieldn= 123

call Myproc(objstruc) ' si Myproc est définie Public sub Myproc(Obj as
Cmystruc)
et ne pas oublier de détruire l'objet à la fin:
set objstruc=nothing

A noter que si tu abordes le pb à l'aide des classes il convient plutôt
que de passer un tableau de variant utiliser les interfaces multiples:

Tu définis une classe générique qui comprend les caractéristiques
communes aux différents objets que tu veux traiter, ensuite du défini
des classes dérivée qui correspondent à chacune de tes structures les
propriétés communes en moins.
Ensuite tu peux au choix passer à ta fonction:
un tableau d'objet de la classe générique
une collection d'objet générique.

A noter que dans les deux cas la partie du message d'erreur "ou passés
à des fonctions à liaison tardive" ne s'applique plus, car du fait de
l'utilisation d'un objet comme objstruc VB peut effectuer une liaison
précoce.

Christophe







Avatar
Patrice Henrio
Donc en réalité rien à voir avec une fonction.

Désolé pour le reste je suis ignare.

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

En fait il s'agit d'un activeX intégré à une application (.exe) qui doit
tracer des choses. Les choses en question sont des données struturées
personnalisées.

public type segment
debut as systemTime
fin as syteTime
...
...
end type

public type ligne
nom as string
epaisseur as integer
mode as integer
etat() as segment 'Déclaré juste
avant.
end type

Ces types de data sont connues de l'activeX et de l'exe container.
L'application (.exe) lit un fichier texte et met en forme les informations
dans un tableau avant de le passer à l'activeX pour qu'il puisse tout
tracer.

Dans l'activeX il y a une méthode appelée traceData décalrée comme suit :
Public sub traceData(data as variant)
'Code de la fonction

End sub


Dans l'exe j'ai déclarer un tableau de la manière suivante.
Public ligneATrace() as ligne
'Lecture fichier d'acquisition et alimentation de la structure
ligneATrace()
...
...

'Appel de la méthode de l'activeX
Call activeX.traceData(ligneATrace()) '==> C'est cette ligne qui
me génére le message d'erreur ennoncé.

voilà, j'espére que ces renseignemetns sont assez précis .


"Patrice Henrio" a écrit dans le message de
news:
ParamArray signifie que la fonction peut recevoir un nombre varié de
paramètres, ce qui ne semble pas être le cas ici.

Dans ton cas :
soit
type MonType
<ici les champs de ton type>
End type

Function (X as MonType) as integer ; par exemple
<ici le corps de la focntion>
End Function

Je pense que je pourrai mieux t'aider si tu me donnais le code de ta
fonction.


"HWO" a écrit dans le message de


news:
207f01c49f4f$05039490$
Bonsoir,

Dans une application sous vb6, je dois transferer à une
fonction un tableau de "data" constitué de type de données
personnalisé (strucutre type.... end type).
Ces types de données personnalisés sont déclarés comme
public dans un module de l'application. Le paramétre de la
fonction qui doit recevoir ces données est déclaré avec le
mot clé "paramArray".

A la compilation je tombe toujours sur le message d'erreur
suivant :
"Seul les types définis par l'utilisateur et qui sont
définis dans les modules d'objets publics peuvent être
convertis depuis ou vers un variant, ou passés à des
fonctions à liaison tardive"

Ca veut dire quoi tout ça, et surtout que fait-il faire
pour s'en sortir?

Par avance merci de votre aide précieuse.