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 :

Hide dans fenetre secondaire


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut Hide dans fenetre secondaire
    Bonjour,

    Dans mon appli, je garde en mémoire différentes fenêtres que je montre (showdiag) et que je masque (hide).

    En mode debogage dans visual studio, lorsque je clique sur le bouton Hide (me.hide), cela masque non seulement la fenêtre enfant mais cela masque aussi la fenêtre principale qui se réduit dans la barre des tâches.

    Je l'ai aussi constaté après un déploiement, mais ponctuellement.

    Est-ce un bug ? Une erreur de ma part ?

  2. #2
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Un des problèmes je crois est que tu utilises ShowDialog.

    Ce showdialog affiche ta nouvelle fenêtre, mais en plus "normalement" elle empêche le retour sur la fenêtre appelante tant que celle-ci ne s'est pas refermé... Il y a un ordre de couche en quelque sorte.

    Un simple Show devrait suffire.

    sinon tu peux essayé de mettre la propriété TopMost a la fenêtre que tu veux afficher... elle sera au dessus de toute les autres.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Effectivement, avec Show j'évite le problème.

    Cependant, ca m'ennuie beaucoup que l'utilisateur puisse avoir accès à la fenêtre parente et à la fenêtre fille en même temps. Topmost ne règle pas ce souci.

    Hide et showdialog ne seraient-ils pas vraiment compatible ?

  4. #4
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Pour tout te dire.... La "Bonne Méthode" serait de créer ta fenêtre au moment ou tu en as besoin.

    Faire un ShowDialog, et fermer la fenêtre.

    Si ta fenêtre contient des infos que tu souhaites conserver.... tu peux utiliser une structure, ou mieux une classe. Si tu as besoin de conseil à ce propos, n'hésite pas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Et oui, c'est bien pour conserver mes variables que je garde mes fenêtres en second plan. Je sens qu'il va effectivement falloir que je change de méthode.
    Trop de soucis en tout genre avec ce hide.

    Donc :

    - à l'ouverture, je lis les paramètres stockés dans une classe ou structure,
    - à la fermeture j'écris dedans.

    Si c'est bien ça, c'est simple sur le principe mais c'est un peu lourd pour la maintenance du code non ?

  6. #6
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Non, au contraire.

    Au début de ton programme, tu créer ton objet avec ta classe, tu l'instances avec les valeurs que tu veux.

    Après, deux solutions:

    -> (changement immédiat donc sans sauvegarde explicite ni annulation) Quand tu veux afficher ta fenêtre.... Et bien tu vas chercher les valeurs dans ton objet. Si l'utilisateur change quelque chose dans cette fameuse fenêtre, en même temps tu changes la valeur dans ta classe. Pas besoin de sauvegarde a la fermeture.

    -> Sinon, (si tu veux que l'enregistrement se confirme ou puisse s'annuler). A ce moment, a l'ouverture de ta fenêtre tu créer un objet2 avec la même classe. tu fais un objet2=objet. Et a la fin, si l'utilisateur veut sauvegarder tu fais objet=objet2. Si l'utilisateur annule... il suffit de fermer la fenêtre et c'est réglé.

    Dans les deux cas, ça prends pas beaucoup de ligne !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Merci pour tes précisions.
    Par contre, je réponds plus tard : il faut que je pige et que je teste.
    A bientôt.

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Si je peux te dire une chose, si tu veux utiliser Show() plutot que show dialog, mais que ton user n'ai pas acces a ta fenetre precedente, il suffit de mettre cette fenetre enJu

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Et bien je ne suis pas sûr d'avoir bien compris les méthodes de mactwist69.

    Solution 1 :
    -> (changement immédiat donc sans sauvegarde explicite ni annulation) Quand tu veux afficher ta fenêtre.... Et bien tu vas chercher les valeurs dans ton objet. Si l'utilisateur change quelque chose dans cette fameuse fenêtre, en même temps tu changes la valeur dans ta classe. Pas besoin de sauvegarde a la fermeture.
    Cela veut-il dire que je modifie ma classe en fonction d'une instance de cette classe ?

    Solution 2 :
    -> Sinon, (si tu veux que l'enregistrement se confirme ou puisse s'annuler). A ce moment, a l'ouverture de ta fenêtre tu créer un objet2 avec la même classe. tu fais un objet2=objet. Et a la fin, si l'utilisateur veut sauvegarder tu fais objet=objet2. Si l'utilisateur annule... il suffit de fermer la fenêtre et c'est réglé.
    Concernant cette solution, on définit une sorte de copie de notre fenêtre en fait. Mais où est déclaré cette copie ?
    Si je la déclare dans la fenêtre parent, je n'y ai pas accès dans la fenêtre enfant : je ne peux pas rappatrier mes données.
    Si je la déclare dans la fenêtre enfant, je la détruis à la femeture de cette fenêtre : j'ai tout perdu.
    Dans un module ?

    Concernant Julien : Ca devrait effectivement fonctionner. Je vais voir.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Par défaut
    Bonjour,

    la solution de macTwist me parait pas mal.
    Solution 2 :
    Citation:
    -> Sinon, (si tu veux que l'enregistrement se confirme ou puisse s'annuler). A ce moment, a l'ouverture de ta fenêtre tu créer un objet2 avec la même classe. tu fais un objet2=objet. Et a la fin, si l'utilisateur veut sauvegarder tu fais objet=objet2. Si l'utilisateur annule... il suffit de fermer la fenêtre et c'est réglé.
    Concernant cette solution, on définit une sorte de copie de notre fenêtre en fait. Mais où est déclaré cette copie ?
    Si je la déclare dans la fenêtre parent, je n'y ai pas accès dans la fenêtre enfant : je ne peux pas rappatrier mes données.
    Si je la déclare dans la fenêtre enfant, je la détruis à la femeture de cette fenêtre : j'ai tout perdu.
    Dans un module ?
    Ta sauvegarde est dans la classe parent.
    Tu la passes en paramètres de la création de ta fenêtre dialogue.
    Tu modifies ton objet dans ta fenêtre.
    A la fermeture, tu envoies un event avec ton objet.

    Ton parent doit avoir une méthode qui récupère l'event.

    Classe parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private sub MethodeAppelDialog
        Dim TonDiag As New TaFenetre(ObjetDonnees)
        AddHandler TonDiag .DiagFinEvent, Address Of MiseAJourDonnees
        TonDiag.showDialog() 
    end sub
     
    Private Sub MiseAJourDonnees(byval ObjetModifDonnees as TonType)
        ObjetDonnees = ObjetModifDonnees 
    End Sub
    Classe de ton dialogue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private donnees as TonType
    Public Event DiagFinEvent(byval ObjetModifDonnees as TonType)
     
    Private sub New(byval ObjetDonnees as TonType)
         InitializeComponent()
     
         donnees  = ObjetDonnees 
    end sub
     
    Private sub Me_FormClosing Handles Me.FormClosing
         RaiseEvent DiagFinEvent(donnees)
    End Sub
    NB : Ce n'est peut-être pas le code exact, mais cela peut te donner une idée de la solution.

  11. #11
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    C'est ça, la solution de cougarg est exacte... Cela dis, tu le présente de manière un peu compliqué (en rajoutant les addhandler etc), il ne faudrait pas décourager notre amis !!

    Et tu n'as pas introduit le fait de pouvoir annuler... Je te mets donc une version simplifié:

    Ta Classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class Voiture
     
           Public immatriculation as String
           Public model as String
     
           Public Sub New(byval immat as string, byval unmodel as string)
     
            immatriculation = immat 
            model = unmodel 
     
          End Sub
     
    End Class

    Ta fenêtre principale:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Public Class Form_Main
     
         Private MaVoiture As Voiture
     
     
        Public Sub New()
     
              InitializeComponent() 'Se mets tout seul quand tu ecris: Public Sub New
     
           Ma Voiture = New Voiture("","")
     
     
       End Sub
     
     
         Public Sub Affiche_ma_voiture
     
            Dim MaFenetre as New MaFenetre_affiche_voiture (MaVoiture)
     
           MaFenetre.showdialog()
     
            if MaFenetre.DialogResult = OK
     
                  MaVoiture = MaFenetre.MaVoiture
            else
     
                 'Bah on fait rien
     
          End If
     
             MaFenetre.Dipose
     
         End Sub
     
    End Class
    Ta fenetre qui "modifie" ta voiture:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    Public Class MaFenetre_affiche_voiture
     
         Public MaVoiture As Voiture
     
     
        Public Sub New(byval UneVoiture as Voiture)
     
              InitializeComponent() 'Se mets tout seul quand tu ecris: Public Sub New
     
           MaVoiture = New Voiture(UneVoiture.immatriculation, UneVoiture.model)
     
     
       End Sub
     
     
         Public Sub MonBoutonOk_Click(...)
            'Si tu veux sauvegarder
            me.dialogresult=ok
     
         End Sub
     
     
         Public Sub MonBoutonAnnuler_Click(...)
              'si tu veux annuler
            me.dialogresult=cancel
     
         End Sub
     
     
           'Et tes evenement de mise a jour de ton objet:
     
            Public Sub TextBox_Immatriculatio_Text_Changed(...)
     
                Me.MaVoiture.immatriculation = Me.TextBox_Immatriculation.Text
     
           End Sub
     
     
            Public Sub TextBox_Model_Text_Changed(...)
     
                Me.MaVoiture.Model = Me.TextBox_Model.Text
     
     
           End Sub
     
     
    End Class

  12. #12
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Sinon, La première solution serait:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Public Class Voiture
     
           Public immatriculation as String
           Public model as String
     
           Public Sub New(byval immat as string, byval unmodel as string)
     
            immatriculation = immat 
            model = unmodel 
     
          End Sub
     
    End Class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Public Class Form_Main
     
         Private MaVoiture As Voiture
     
     
        Public Sub New()
     
              InitializeComponent() 'Se mets tout seul quand tu ecris: Public Sub New
     
           Ma Voiture = New Voiture("","")
     
     
       End Sub
     
     
         Public Sub Affiche_ma_voiture
     
            Dim MaFenetre as New MaFenetre_affiche_voiture (MaVoiture)
     
           MaFenetre.showdialog()
     
            End Sub
     
     
           Public Sub Mets_a_jour_ma_voiture(byval immat as string, byval model as strin)
     
               MaVoiture.Immatriculation = immat
               MaVoiture.Model = model
     
     
         End Sub
     
    End Class

    et ta fenetre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Public Class MaFenetre_affiche_voiture
     
     
        Public Sub New(byval UneVoiture as Voiture)
     
              InitializeComponent() 'Se mets tout seul quand tu ecris: Public Sub New
     
           Me.textbox_Immat = UneVoiture.immatriculation
           Me.textbox_model = UneVoiture.model
     
     
       End Sub
     
     
         Public Sub MonBoutonOk_Click(...)
            'Si tu veux quitter
            me.dispose()
     
         End Sub
     
     
     
     
           'Et tes evenement de mise a jour de ton objet:
     
            Public Sub TextBox_Immatriculatio_Text_Changed(...)
     
              Form_Main.Mets_a_jour_ma_voiture(Me.TextBox_Immatriculation.Text, Me.TextBox_Model.Text)
     
           End Sub
     
     
            Public Sub TextBox_Model_Text_Changed(...)
     
                Form_Main.Mets_a_jour_ma_voiture(Me.TextBox_Immatriculation.Text, Me.TextBox_Model.Text)
     
     
           End Sub
     
     
    End Class


    Bon, c'est code sont loin d'être complet et nickel... C'est vraiment pour simplifié le principe.... Parce que j'imagine que tu gères pas tout encore...

    Vois si tu comprends l'idée... Mais si tu peux, essaie de voir le code de Courgag.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Merci pour vos contributions, c'est très intéressant.

    Sans vouloir vexer cougarg, je vais commencer par la solution de mactwist69.
    Je commence donc avec ce qui me semble le plus à ma portée.

    J'ai quelques questions et remarques :

    Solution 2 :

    Là, je ne pige pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
             Dim MaFenetre as New MaFenetre_affiche_voiture (MaVoiture)
             MaFenetre.showdialog()
     
             if MaFenetre.DialogResult = OK
                  MaVoiture = MaFenetre.MaVoiture
             End If
    Si on travaille bien sans Hide mais avec close ou dispose, quand Mafenetre est fermée je pensais qu'on ne pouvait plus l'utiliser.
    Utilises-tu le fait que lorsqu'un formulaire est fermé, il n'est pas encore détruit ?
    C'est justement ce que je voulais éviter avec le Hide.

    Sinon, une question bête :

    Pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class Form_Main
     
        Private MaVoiture As Voiture
     
        Public Sub New()
           InitializeComponent()  
           Ma Voiture = New Voiture("","")
       End Sub
     
        '...
    Et non pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Class Form_Main
     
        Private MaVoiture As New Voiture("","")
     
        '...
    Solution 1 :

    Je comprends assez bien cette solution. Je me demandais simplement : si je ferme la fenêtre principale (form_main) et que je la recrée ensuite, j'ai perdu ses valeurs par défauts ?!
    Comme je modifie la classe, j'aurai toujours form_main avec les dernières variables saisies dans form_enfant ?

    Pour le vérifier j'ai testé avec fen_meregrand / fen_mere / fen_enfant mais là le passage des variables ne fonctionne plus du tout de fen_enfant à fen_mere. Bizarre.

    Je ne désespère pas et continue à regarder ça.

  14. #14
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Salut pour ta question par rapport a l'instanciation. Il est fortement deconseiller de faire une new (donc instancier) un object de ta classe a la declaration des variables. Le mieux est de ;ettre tes variables a leurs valeurs par defaut dans le New. Dans tout les cas cette fonction est appellee donc pas de soucis

  15. #15
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    Citation Envoyé par yann_DZ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
             Dim MaFenetre as New MaFenetre_affiche_voiture (MaVoiture)
             MaFenetre.showdialog()
     
             if MaFenetre.DialogResult = OK
                  MaVoiture = MaFenetre.MaVoiture
             End If
    Si on travaille bien sans Hide mais avec close ou dispose, quand Mafenetre est fermée je pensais qu'on ne pouvait plus l'utiliser.
    -> En fait, comme on fait de la Programmation objet, MaFenetre_affiche_voiture est une classe. En l'occurrence une classe qui contient un formulaire. Pour afficher ta fenêtre il faut donc créer un obet et l'instancié avec la classe. C'est ce que tu fais quand tu utilises un New. Donc a partir de ce principe... Tu peux créer ta fenêtre autant de fois que tu veux. Et c'est la le principe. Par exemple, dans ta fenetre principale tu as une liste d'élément, si tu souhaites que quand l'utilisateur sélectionne un élément l'affiche dans ta fenetre, et bien tu te créer un objet. Et tu la referme avec un dispose quand l'utilisateur a finis.

    Et pour garder en mémoire les infos qui était afficher dans ta fenetre, tu utilises une autre classe (MaVoiture) Qui elle, est créer dans ta fenêtre principale (et comme par principe ta fenetre principale ne se ferme que quand ton logiciel est arreter...) alors tu gardes en mémoires les infos tout le temps)

    Citation Envoyé par yann_DZ Voir le message
    Utilises-tu le fait que lorsqu'un formulaire est fermé, il n'est pas encore détruit ? C'est justement ce que je voulais éviter avec le Hide.
    -> tu te trompe a ton grand bonheur, Quand tu déclare une variable local avec un Dim. Si quelques lignes après du fais un close() ou un dispose(), la mémoire est liberré, tu ce qu'il y avait dedans est effacé... D'où notre besoin d'utiliser une classe (MaVoiture) pour faire l'intermédiaire.



    Citation Envoyé par yann_DZ Voir le message
    Pourquoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Public Class Form_Main
     
        Private MaVoiture As Voiture
     
        Public Sub New()
           InitializeComponent()  
           Ma Voiture = New Voiture("","")
       End Sub
     
        '...
    Et non pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Class Form_Main
     
        Private MaVoiture As New Voiture("","")
     
        '...
    garciajulien a raison, moi j'avoue avoir appris a programmé comme ça. Je déclare mes variables global en propriétés. J'instancie dans le New(). Je pense également que c'est le "best practice".





    Citation Envoyé par yann_DZ Voir le message
    Solution 1 :

    Je comprends assez bien cette solution. Je me demandais simplement : si je ferme la fenêtre principale (form_main) et que je la recrée ensuite, j'ai perdu ses valeurs par défauts ?!
    ->Ben en principe, quand tu créer un logiciel... Elle démarre sur ta fenêtre principale... et si tu ferme ce formulaire ben ton logiciel s'arrête. Donc forcement a ce moment, tout ce qu'il y a dans tes propriétés et classe se vide. (comme quand tu fais un close() d'une variable local)


    Citation Envoyé par yann_DZ Voir le message
    Comme je modifie la classe, j'aurai toujours form_main avec les dernières variables saisies dans form_enfant ?

    Pour le vérifier j'ai testé avec fen_meregrand / fen_mere / fen_enfant mais là le passage des variables ne fonctionne plus du tout de fen_enfant à fen_mere. Bizarre.
    -> c'est pas ta classe que tu modifies c'est l'objet. je te reprend ton exemple:

    Tu as Fenetre_grand_mere : c'est ta fenêtre principale, ton logiciel démarre dessus, et contient une liste de voiture.. tu as une fenêtre mère, avec un formulaire, qui affiche toutes tes infos voiture.

    Dans ta fenetre principale tu declare un obet de Type (= classe) voiture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public MaVoiture as Voiture
    -> tu declare justement ta variable en Public pour pouvoir l'utiliser a partir de n'importe quem autre fenetre.

    Bon dans le New de ta fenetre GRand_mere (donc qui se déclenche au premier lancement de ton logiciel), tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaVoiture = New Voiture
    La ça créer ton objet MaVoiture en mémoire, c'a y'est tu peux l'utiliser.
    Pour l'appeler d'une autre fenêtre comme la fenêtre mère.:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fenetre_grand_mere.MaVoiture.immatriculation = 10
    Cette ligne de code peut être appeler partout.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Voici une réponse bien étoffée. Il y a de quoi faire.
    Mais, sans vouloir vexer mactwist69, je m'étonne sur le contenu de ce qui est écrit.

    1- Instanciation dans le sub new.
    (Je dis vous car cela concerne julien et mactwist69.)

    Vous me dites que c'est la meilleure des méthodes et n'étant pas informaticien de formation, je suis vraiment prêt à vous croire.
    Cependant, je ne compte plus le nombre de livres, de sources et de discussions sur ce site ou je vois des instanciations n'importe où (surtout en dehors du sub new !).

    Personnellement, je fais beaucoup de math. Je suis bien incapable de compter le nombre d'objets mathématiques qui sont crées dynamiquement dans les processus itératifs mes applications !

    Je pense que je dois vraiment mal comprendre ce que vous indiquez.

    2- Solution 2.

    Je sais très bien ce qu'est une classe (à mon humble niveau bien sûr) et je comprends parfaitement l'utilité de créer une copie de Ma voiture dans ma fenêtre principale car une fois la fenêtre enfant fermée, bye bye les données.
    C'était la cause initiale de cette discussion car jusqu'à présent, aulieu de fermer le fenêtre enfant, je la cachais, récupérais les données puis la fermais enfin.
    Je reviens sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim MaFenetre as New MaFenetre_affiche_voiture (MaVoiture)
             MaFenetre.showdialog()
     
             if MaFenetre.DialogResult = OK
                  MaVoiture = MaFenetre.MaVoiture
             End If
    J'insiste peut-être lourdement mais si Mafenetre est fermée avec close, je ne peux pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
             if MaFenetre.DialogResult = OK
                  MaVoiture = MaFenetre.MaVoiture
             End If
    car MaFenêtre n'existe plus !!!!!!!!!!

    Je crois qu'il arrive que cela fonctionne tout de même car si la fenêtre est fermée, elle n'est pas forcemment détruite avec le machin truc ésotérique qui s'appelle le garbagecollector.

    Dans l'idée de la solution2, je propose ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    Public Class Form_parent
     
        Dim fen_enfant_perm As New Form_enfant 'une copie permanente de la fenetre enfant
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim fen_enfant_temp As New Form_enfant
            fen_enfant_temp = fen_enfant_perm
     
            fen_enfant_temp.ShowDialog()
            'voila, ici fen_enfant_temp n'existe plus
     
            'maisje peux récupérer les données dans son alter égo.
            'j'utilise dialogresult si je veux
            Me.TextBox1.Text = fen_enfant_perm.TextBox1.Text
     
        End Sub
    End Class
    Voilà, je serai bien content d'avoir quelques commentaires.

    3- Solution 1.

    Ok, j'ai compris l'astuce et mon erreur d'interprétation.

    Par contre, je ne vois pas trop l'intérêt : c'est tout comme si je déclarais mes variables dans un module afin qu'elles soient accessible partout !


    Voila, j'en ai fini pour ce soir.

    Merci encore et bonne soirée à tous.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Hier soir, j'ai fini ma soirée en me disant qu'un truc ne tournait pas rond dans mon dernier message.
    A propos de l'instanciation dans le Sub New, vous parliez d'objets spécifiques : ceux qui ont des portées globales ...
    Mea culpa.

    Cependant, si c'est la meilleure méthode, quelqu'un peut-il en expliquer juste un peu la raison ?

  18. #18
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Et oui, c'est bien pour conserver mes variables que je garde mes fenêtres en second plan. Je sens qu'il va effectivement falloir que je change de méthode.
    Pour éviter les problèmes sur le Hide de la Form2, on pourra en conception créer dans Form2 un panel Form2.GlobalPanel (Dock=Fill) qui contient tout les controls de la forme.

    Avant le premier ShowDialog() de la Form2 : Créer la Form2.

    A la fin des ShowModal() avant de fermer/supprimer la forme, on fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SaveGlobalPanel=Form2.GlobalPanel ;
       SaveGlobalPanel.parent=null ;
    Quand on veut refaire un ShowDialog() de la Form2, on crée dynamiquement une forme vide et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SaveGlobalPanel.Parent=NewForm

  19. #19
    Membre Expert Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Par défaut
    C'est pas mal ta technique pour garder la fenêtre en mémoire.

    Sinon, J'insite Yann_DZ, je te montre les évènements dans l'ordre:

    Fenetre_mere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim MaFenetre as New Fenetre
    MaFenetre.showdialog
    Fenetre Fille:

    Fenetre_mere:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If MaFenetre.dialogresult=ok
         MaFenetre.objet = me.objet
     
         Mafenetre.dispose
    EndIf
    Quand tu reviens un dialogresult, Ca ne ferme pas ta fenetre,

    donc pas la memoire, donc tu peux encore copié ton objet

    Et c'est pour ca que APRES tu fais MaFenetre.dispose !

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Par défaut
    Bonsoir, désolé pour le contre-temps.

    D'accord, ok, ok, ok ... j'ai pigé.
    Avec un peu de retard comme d'habitude.

    En fait je n'utilise jamais les dialogresult.
    Mactwist69 vient de m'en démontrer l'intérêt.
    Je n'oublierai pas !

    Je marque comme résolu.
    Merci à tous les intervenants.
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ouvrir une fenetre secondaire depuis 1 bouton
    Par TheBlackReverand dans le forum MFC
    Réponses: 7
    Dernier message: 16/03/2006, 22h02
  2. Pb IE Décalage dans fenetre avec ScrollTo ou ScrollBy
    Par philou8 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/03/2006, 14h09
  3. [wxPython] positionnement des panel dans fenetre
    Par hysah dans le forum wxPython
    Réponses: 5
    Dernier message: 04/01/2006, 13h39
  4. [SDL] Integration fenetre SDL dans fenetre C# ?
    Par salammbo dans le forum OpenGL
    Réponses: 3
    Dernier message: 07/02/2005, 09h47
  5. [TP]Liaison série avec TP7 dans fenêtre DOS W2000
    Par Alain81 dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 14/06/2003, 00h43

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