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

Un "Form" dans une Classe: patager une propriété? (design pattern?)

4 réponses
Avatar
PetitTrot
Bonjour,

Avec VB 6

Soit que je veux sélectionner une valeur d'une liste sur un Form
(formulaire)
Alors mon programme affiche mon formulaire,
- je fais ma sélection
- la sélection est stockée dans variable globale
- je quitte le formulaire
- mon programme peut utiliser la variable globale

Ce qui m'embête ici c'est la variable globale.
Alors j'ai fait une classe dans laquelle j'ai mis mon formulaire.
Je peux donc gérer mon formulaire à partir de la classe: initialiser,
afficher, cacher etc.
Mon idée c'est de mettre la valeur de ma sélection dans une propriété de
ma classe.
Ainsi mon programme peux utiliser la propriété de la classe.
Mais curieusement, j'ai été obligé d'utiliser une variable globale. (?)
Est-ce qu'il y a moyen que ma classe et mon formulaire partage une
variable au niveau de la classe?
(i.e. sans avoir une variable globale)

Y a-t-il un design patern intelligent pour ça en VB 6?
De façon générale: avoir un classe, afficher une ou des propriétés de
cette classe sur un formulaire
et modifier les propriétés via ce
formulaire... sans utiliser de variables globales?

Ok. Je retourne voir mon exemple... voir si je n'ai pas fait erreur qque
part et me débarrasser de cette variable globale.

Merci

4 réponses

Avatar
Christian Hugoud
Je ne fais pas de cette façon. En résumé et si j'ai bien compris, tu as un
formulaire qui fait un travail lambda, et tu voudrais bien récupérer ce
travail, sans passer par une Globale.

Comment je m'y prends :

J'ai un formulaire (f)
Dans ce formulaire, j'ai une fonctionne Use (à l'intérieur du formulaire) à
laquelle je peux passer des paramètres, et qui renvoie une valeur. Le cas
échéant, je passe les paramètres ByRef, moyennant quoi je peux récupérer
plusieurs valeurs en les changeant dans ma fonction Use.

Cette fonction Use fait plusieurs choses :

- elle fait des trucs suivant les paramètres qu'on lui passe (ou rien du
tout).
- éventuellement elle force le load de f
- puis elle montre f en modal : me.show vbmodal
- à ce moment là elle s'arrête, pour l'instant...
- il y a sur f un bouton qui contient le code me.hide
- lorsque l'utilisateur clique sur ce bouton, la fonction use redémarre là
où elle était arrêtée.
- ce qui lui donne l'occasion de travailler un peu de diverses manières et
éventuellement de modifier des paramètres ByRef et/ou de s'affecter une
valeur de retour.

L'utilisation est simplissime : retour = f.use (param1, param2...)
Ne pas oublier depuis la fonction d'appel de faire : unload f, puis set f =
nothing

C'est assez agricole et ça marche terriblement bien.

Hope this helps.

Christian



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

Bonjour,

Avec VB 6

Soit que je veux sélectionner une valeur d'une liste sur un Form
(formulaire)
Alors mon programme affiche mon formulaire,
- je fais ma sélection
- la sélection est stockée dans variable globale
- je quitte le formulaire
- mon programme peut utiliser la variable globale

Ce qui m'embête ici c'est la variable globale.
Alors j'ai fait une classe dans laquelle j'ai mis mon formulaire.
Je peux donc gérer mon formulaire à partir de la classe: initialiser,
afficher, cacher etc.
Mon idée c'est de mettre la valeur de ma sélection dans une propriété
de
ma classe.
Ainsi mon programme peux utiliser la propriété de la classe.
Mais curieusement, j'ai été obligé d'utiliser une variable globale. (?)
Est-ce qu'il y a moyen que ma classe et mon formulaire partage une
variable au niveau de la classe?
(i.e. sans avoir une variable globale)

Y a-t-il un design patern intelligent pour ça en VB 6?
De façon générale: avoir un classe, afficher une ou des propriétés de
cette classe sur un formulaire
et modifier les propriétés via ce
formulaire... sans utiliser de variables globales?

Ok. Je retourne voir mon exemple... voir si je n'ai pas fait erreur qque
part et me débarrasser de cette variable globale.

Merci






Avatar
Jacques93
Bonjour PetitTrot,
PetitTrot a écrit :
Bonjour,

Avec VB 6

Soit que je veux sélectionner une valeur d'une liste sur un Form
(formulaire)
Alors mon programme affiche mon formulaire,
- je fais ma sélection
- la sélection est stockée dans variable globale
- je quitte le formulaire
- mon programme peut utiliser la variable globale

Ce qui m'embête ici c'est la variable globale.
Alors j'ai fait une classe dans laquelle j'ai mis mon formulaire.
Je peux donc gérer mon formulaire à partir de la classe: initialiser,
afficher, cacher etc.
Mon idée c'est de mettre la valeur de ma sélection dans une propriété de
ma classe.
Ainsi mon programme peux utiliser la propriété de la classe.
Mais curieusement, j'ai été obligé d'utiliser une variable globale. (?)
Est-ce qu'il y a moyen que ma classe et mon formulaire partage une
variable au niveau de la classe?
(i.e. sans avoir une variable globale)

Y a-t-il un design patern intelligent pour ça en VB 6?
De façon générale: avoir un classe, afficher une ou des propriétés de
cette classe sur un formulaire
et modifier les propriétés via ce
formulaire... sans utiliser de variables globales?

Ok. Je retourne voir mon exemple... voir si je n'ai pas fait erreur qque
part et me débarrasser de cette variable globale.

Merci




Si j'ai bien compris, pourquoi ne pas utiliser Property Let et Property
Get directement dans la feuille ?

Dans Form1 :

Private Sub Command1_Click()
Form2.Prop1 = "Bonjour"
Form2.Show vbModal
MsgBox Form2.Prop1
End Sub

Dans Form2 :

Option Explicit

Private sProp1 As String

Public Property Let Prop1(ByVal newValue As String)
sProp1 = newValue
End Property

Public Property Get Prop1() As String
Prop1 = sProp1
End Property

Private Sub Command1_Click()
Prop1 = "Bonsoir"
Me.Hide
End Sub

Private Sub Form_Load()
MsgBox Prop1
End Sub


--
Cordialement,

Jacques.
Avatar
PetitTrot
Oui. Je vois. Et je vois aussi qu'il y avait une erreur dans mon exemple ;-)
Sur ce je suis aller me changer les idées.

D'une certaine façon, ce que vous faites est comme j'ai vu en plusieurs
endroit (sur le web)
La différence, c'est que la méthode s'appelle "init" (plutôt "Use")

En gros, les gens bricole sur le fait que en mode Modal on interragit
avec le formulaire. Ensuite, tout de suite on "hide" le formulaire et
récupère
les données qui nous intéresse... pour terminer avec un Unload et un Set f Nothing

Je suis aller voir le concept de "State" dans l'univers design pattern.
Là c'est un peu plus olé-olé ;-)
C'est vraiment quand on pense objet qu'on fait des trucs pareil.
D'ailleurs je prévois utiliser ce concept.
i.e. je fais du refactoring sur du code, et je vois que 3 formulaires
peuvent
se ramenrer à un seul

Merci

"Christian Hugoud" wrote in message
news:%
Je ne fais pas de cette façon. En résumé et si j'ai bien compris, tu as un
formulaire qui fait un travail lambda, et tu voudrais bien récupérer ce
travail, sans passer par une Globale.

Comment je m'y prends :

J'ai un formulaire (f)
Dans ce formulaire, j'ai une fonctionne Use (à l'intérieur du formulaire)


à
laquelle je peux passer des paramètres, et qui renvoie une valeur. Le cas
échéant, je passe les paramètres ByRef, moyennant quoi je peux récupérer
plusieurs valeurs en les changeant dans ma fonction Use.

Cette fonction Use fait plusieurs choses :

- elle fait des trucs suivant les paramètres qu'on lui passe (ou rien du
tout).
- éventuellement elle force le load de f
- puis elle montre f en modal : me.show vbmodal
- à ce moment là elle s'arrête, pour l'instant...
- il y a sur f un bouton qui contient le code me.hide
- lorsque l'utilisateur clique sur ce bouton, la fonction use redémarre là
où elle était arrêtée.
- ce qui lui donne l'occasion de travailler un peu de diverses manières et
éventuellement de modifier des paramètres ByRef et/ou de s'affecter une
valeur de retour.

L'utilisation est simplissime : retour = f.use (param1, param2...)
Ne pas oublier depuis la fonction d'appel de faire : unload f, puis set f


> nothing

C'est assez agricole et ça marche terriblement bien.

Hope this helps.

Christian



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

> Bonjour,
>
> Avec VB 6
>
> Soit que je veux sélectionner une valeur d'une liste sur un Form
> (formulaire)
> Alors mon programme affiche mon formulaire,
> - je fais ma sélection
> - la sélection est stockée dans variable globale
> - je quitte le formulaire
> - mon programme peut utiliser la variable globale
>
> Ce qui m'embête ici c'est la variable globale.
> Alors j'ai fait une classe dans laquelle j'ai mis mon formulaire.
> Je peux donc gérer mon formulaire à partir de la classe: initialiser,
> afficher, cacher etc.
> Mon idée c'est de mettre la valeur de ma sélection dans une propriété
> de
> ma classe.
> Ainsi mon programme peux utiliser la propriété de la classe.
> Mais curieusement, j'ai été obligé d'utiliser une variable globale.


(?)
> Est-ce qu'il y a moyen que ma classe et mon formulaire partage une
> variable au niveau de la classe?
> (i.e. sans avoir une variable globale)
>
> Y a-t-il un design patern intelligent pour ça en VB 6?
> De façon générale: avoir un classe, afficher une ou des propriétés de
> cette classe sur un formulaire
> et modifier les propriétés via ce
> formulaire... sans utiliser de variables globales?
>
> Ok. Je retourne voir mon exemple... voir si je n'ai pas fait erreur


qque
> part et me débarrasser de cette variable globale.
>
> Merci
>
>
>
>




Avatar
PetitTrot
"Jacques93" wrote in message
news:
Bonjour PetitTrot,
PetitTrot a écrit :
> Bonjour,
>
> Avec VB 6
>
> Soit que je veux sélectionner une valeur d'une liste sur un Form
> (formulaire)
> Alors mon programme affiche mon formulaire,
> - je fais ma sélection
> - la sélection est stockée dans variable globale
> - je quitte le formulaire
> - mon programme peut utiliser la variable globale
>
> Ce qui m'embête ici c'est la variable globale.
> Alors j'ai fait une classe dans laquelle j'ai mis mon formulaire.
> Je peux donc gérer mon formulaire à partir de la classe:


initialiser,
> afficher, cacher etc.
> Mon idée c'est de mettre la valeur de ma sélection dans une


propriété de
> ma classe.
> Ainsi mon programme peux utiliser la propriété de la classe.
> Mais curieusement, j'ai été obligé d'utiliser une variable globale.


(?)
> Est-ce qu'il y a moyen que ma classe et mon formulaire partage une
> variable au niveau de la classe?
> (i.e. sans avoir une variable globale)
>
> Y a-t-il un design patern intelligent pour ça en VB 6?
> De façon générale: avoir un classe, afficher une ou des propriétés de
> cette classe sur un formulaire
> et modifier les propriétés via ce
> formulaire... sans utiliser de variables globales?
>
> Ok. Je retourne voir mon exemple... voir si je n'ai pas fait erreur


qque
> part et me débarrasser de cette variable globale.
>
> Merci
>

Si j'ai bien compris, pourquoi ne pas utiliser Property Let et Property
Get directement dans la feuille ?

Dans Form1 :

Private Sub Command1_Click()
Form2.Prop1 = "Bonjour"
Form2.Show vbModal
MsgBox Form2.Prop1
End Sub

Dans Form2 :

Option Explicit

Private sProp1 As String

Public Property Let Prop1(ByVal newValue As String)
sProp1 = newValue
End Property

Public Property Get Prop1() As String
Prop1 = sProp1
End Property

Private Sub Command1_Click()
Prop1 = "Bonsoir"
Me.Hide
End Sub

Private Sub Form_Load()
MsgBox Prop1
End Sub


--
Cordialement,

Jacques.



Effectivement Jacques.
Quand on travaille comme du monde, on fait ça et ça marche.
Moins j'ai fait une erreur puis j'ai compliquer le tout.
Donc dans un cas simple, on fait comme ça.

Et si on regarde les design pattern, on peut voir la notion de State.
Ça peut être utile si on se retrouve avec une situation plus complexe.
En gros, si je comprends bien, un formulaire répond à plusieurs états
possibles - par exemple un état "non éditable", un état "une partie
éditable"
ou un autre état. Tout ça avec le même formulaire. Reste à mettre en
application cette belle affaire du monde qui pense full objet.

Merci pour ton commentaire