IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment passer en paramètre un formulaire dans l'appel d'une routine


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut Comment passer en paramètre un formulaire dans l'appel d'une routine
    Bonjour à vous
    J'ai deux formulaires Form1 et Form2 contenant la même Sub qui est assez longue.
    Je voudrais n'en utiliser qu'une déclarée Public dans le module principal.
    Pour essayer, j'ai créé une application avec deux Forms et un Module
    Form1 a un bouton "btOui", Form2 a un textbox "tx1"
    Dans le module j'ai la Sub suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Public Sub Affiche(ByVal F As Form, ByVal T As String)
            F.tx1.text = T
        End Sub
    Que j'appèle depuis Form1 par la Sub suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub btOui_Click(sender As Object, e As EventArgs) Handles btOui.Click
            Affiche(Form2, "Oui")
        End Sub
    Celà ne fonctionne pas, j'ai un message d'erreur me disant que "tx1 n'est pas un membre de Form"
    Ce qui est faux !!!!

    Quelqu'un a-t-il un avis sur ce problème

    Merci de votre réponse

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Non, ce n'est pas faux et c'est normal : Form2 hérite de Form. Form est la classe de base, elle ne contient pas tx1. C'est Form2 qui contient tx1
    Vous pouvez passer directement la textbox plutôt que la Form. Maintenant je pense que c'était un cas d'école pour faire des tests et que votre problème est plus complexe que ça, non ?

  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Claude_Azoulai Voir le message
    Ce qui est faux !!!!

    Quelqu'un a-t-il un avis sur ce problème
    Généralement Visual Studio ne se trompe pas

    Ton Form1 n'est pas une Form, à proprement parler. C'est une classe héritant de Form. Voilà pourquoi il ne trouve pas de "tx1" dans Form.

    Tu peux, pour corriger ton problème, utiliser une autre classe.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Public Sub Affiche(ByVal F As Form, ByVal T As String)
            If (TypeOf F Is Form2) Then
                CType(F, Form2).tx1.Text = T
            End If
        End Sub
    Pas la meilleure solution, je l'accorde
    "Hope for the best, but prepare for the worst."

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Bonjour
    Tous d’abord je voudrais répondre à ZenZiTone.

    Approchant de mes 83 ans et autodidacte j’ai pu réaliser beaucoup d’applications sans utiliser consciemment les classes, et dans ma petite tête cartésienne je ne vois pas pourquoi « T as String » contient une chaîne, et que « F as Form » ne contient pas un formulaire.
    Maintenant, après avoir dit cela, j’attendais de toi une aide pour me dire comment procéder.

    A casiii
    Je te remercie de ton aide qui a le mérite de proposer quelque chose et je vais essayer ta méthode, pour ma part, j’avais pensé à ne passer qu’un chiffre (1 ou 2) en fonction duquel je choisirai la ligne de code adéquat.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par Claude_Azoulai Voir le message
    Approchant de mes 83 ans et autodidacte j’ai pu réaliser beaucoup d’applications sans utiliser consciemment les classes, et dans ma petite tête cartésienne je ne vois pas pourquoi « T as String » contient une chaîne, et que « F as Form » ne contient pas un formulaire.
    L'héritage
    Pour résumer (version dégueulasse, je l'admet) :
    Imagine une mère (classe mère Form) et sa fille (classe fille Form1).
    La mère possède une maison et donne un double des clés à sa fille : La fille a donc accès à la maison (mot-clé "protected"). Elle seule peut accéder à la maison alors qu'une personne extérieure ne peut pas.
    La mère possède une maison sans serrure (mot-clé "public") : Tout le monde peut accéder à la maison, même les inconnus
    La mère possède une voiture dont elle seule a le clé (mot-clé "private") : Seule la mère peut l'utiliser.
    La fille possède une voiture (TextBox tx1) dont elle seule a la clé : Seule la fille peut l'utiliser. <= on est dans ce cas
    "Hope for the best, but prepare for the worst."

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    je ne vois pas pourquoi « T as String » contient une chaîne, et que « F as Form » ne contient pas un formulaire.
    "F as Form" ne contient pas un formulaire, c'est un formulaire . Pour répondre à votre interrogation (légitime), il s'agit de la notion d'héritage. La classe Form2 est une classe héritée de Form à laquelle vous ajoutez une TextBox. Donc la TextBox est bien présente dans Form2 mais pas dans Form. Form est en quelque sorte une fenêtre vide, Form2 est cette même fenêtre vide avec un TextBox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If (TypeOf F Is Form2) Then
      CType(F, Form2).tx1.Text = T
    End If
    Dans une variable de type Form, on peut stocker une instance d'une form dérivée (une Form2 par exemple). Ici, on teste donc si F de type Form contient bien une Form2 et dans ce cas, on effectue un transtypage vers ce type pour accéder au TextBox. Ce n'est pas très élégant et il serait préférable de passer directement la TextBox à la méthode (ou de faire carrément autrement mais c'est un autre débat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public Sub Affiche(ByVal myTextBox As TextBox, ByVal T As String)
     myTextBox.Text = T
    End Sub
    Cela a pour avantages d'une part, d'éviter à votre méthode centralisée de "connaitre" l'ensemble des Forms du projet utilisant cette méthode, d'autre part de nommer toutes vos textbox Tx1 et enfin si deux textbox du même formulaire ont besoin de cette méthode, ça ne pourra pas fonctionner.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci à casiii et à cbastien

    Je vais pouvoir m'en sortir grâce à vous.

    Le (petit) problème est que dans cette routine que je voudrai mettre dans le module, il y a de nombreuses lignes de code où je devrai faire le test.

    Dans VB6 ou antérieur, l'instruction "Set" permettait de faire correspondre une nouvelle variable à une variable existante, mais apparemment cette instruction est obsolète dans VB.Net.
    J'ai pensé à utiliser "New Form" mais je manque de connaissance pour l'utiliser correctement.

    Voici ce que j'ai essayé de faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Sub Affiche1(ByVal N As Integer, ByVal T As String)
            If N = 1 Then
                Dim Forme As New Form = Form1
            ElseIf N = 2
                Dim Forme As New Form = Form2
            End If
        End Sub
    Mais à la compilation, j'ai un message d'erreur sous le signe "=" dans 'Form = Form1' et
    'Form = Form2' qui est "Fin d'instruction attendue".

    Si l'idée vous semble valable, pourriez vous m'aider dans la formulation s'il vous plaît

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Dur dur... Je pense que tu n'as pas les connaissances de base nécessaires sur l'héritage pour bien avancer.

    Concrètement, il faut que tu arrêtes d'utiliser le type "Form" et te concentrer sur Form1 ou Form2, même si tu seras toujours forcé de faire un cast en Form1 ou Form2.
    "Hope for the best, but prepare for the worst."

  10. #10
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par casiii Voir le message
    Dur dur... Je pense que tu n'as pas les connaissances de base nécessaires sur l'héritage pour bien avancer.

    Concrètement, il faut que tu arrêtes d'utiliser le type "Form" et te concentrer sur Form1 ou Form2, même si tu seras toujours forcé de faire un cast en Form1 ou Form2.
    Je rejoins ton intervention et j'aime la manière dont tu as imagés l'héritage.

    @claude_Azoulai :
    Ce qui a été proposé par ZenZiTone n'était certes pas à la hauteur de vos attentes mais les termes étaient pourtant présents (héritage, classe) et le débat orienté correctement !
    Pourquoi demander des solutions si vous ne décidez pas un moment ou à un autre de prendre le taureau par les cornes.
    Ce qui vous bloque c'est la méconnaissance de la POO et du langage, il faut commencer par là !

    http://plasserre.developpez.com/cours/vb-net/

    Bonne lecture. Et revenez nous voir lorsque vous aurez fait l'effort d'assimiler les concepts svp...

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    j'aime la manière dont tu as imagés l'héritage.
    Quand tu passes tes journées à expliquer à des non informaticiens à quel point c'est facile, tu inventes des moyens efficaces en utilisant des termes non techniques pour que les gens comprennent

    Ce métier est trop facile ! (ok je sors ! )
    "Hope for the best, but prepare for the worst."

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    355
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 355
    Points : 118
    Points
    118
    Par défaut
    Merci à vous tous

    J' avais déjà l'ancienne version de Philippe Lasser, mais ne connaissais pas celle là.
    Je voudrais dire toute l'admiration que j'ai pour cet auteur, son précédent ouvrage m'a déjà aidé à mainte reprises.
    Je suis ravis car je vais pouvoir approfondir un peu plus mes modestes connaissances.
    J'ai trouvé la version PDF de cet ouvrage que je me suis empressé de télécharger
    J'ai apprécié votre aide et tiens à vous le dire

    Claude Azoulai

  13. #13
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Merci à vous tous

    J' avais déjà l'ancienne version de Philippe Lasser, mais ne connaissais pas celle là.
    Je voudrais dire toute l'admiration que j'ai pour cet auteur, son précédent ouvrage m'a déjà aidé à mainte reprises.
    Je suis ravis car je vais pouvoir approfondir un peu plus mes modestes connaissances.
    J'ai trouvé la version PDF de cet ouvrage que je me suis empressé de télécharger
    J'ai apprécié votre aide et tiens à vous le dire

    Claude Azoulai
    Ayant débuté avec d'autres langages de programmation (scripts d'administration essentiellement), il est clair que les cours de P.Lasserre m'ont beaucoup servi pour l'apprentissage du vb.Net et ainsi franchir le pas vers la POO.
    Je suis également très admiratif de ce qu'il a et apporte encore aujourd'hui à cette communauté.

    Bonne continuation Claude_Azoulai.

Discussions similaires

  1. Comment passer des paramètres dans une requête XPATH
    Par SyLvErStOrM dans le forum BIRT
    Réponses: 18
    Dernier message: 29/04/2011, 11h08
  2. [ZF 1.9] Zend Paginator, comment passer des paramètre dans l'url ?
    Par mrjay42 dans le forum Autres composants
    Réponses: 6
    Dernier message: 02/12/2009, 15h49
  3. Réponses: 0
    Dernier message: 03/10/2007, 18h54
  4. Réponses: 5
    Dernier message: 03/07/2007, 10h31
  5. Réponses: 2
    Dernier message: 11/10/2006, 13h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo