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 :

Heritage Form en cascade [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut Heritage Form en cascade
    Bonsoir,
    Désirant me simplifier la vie et rendre mon appli plus facilement modifiable, j'ai essayé l'héritage de Form comme expliqué à http://msdn.microsoft.com/fr-fr/libr.../1z3efhd2.aspx
    En suivant la manip (sauf le "Sélecteur d'héritage" qui a priori ne se trouve pas dans la version express), tout marche bien (après quand même qq essais!)
    J'ai voulu étendre le concept en rajoutant un niveau d'héritage (un Form de base reprenant la logique de tous mes Form, dont hérite plusieurs Form correspondant à plusieurs types de Form, dont hérite mes Form)
    Après pas mal d'heures d'essais, j'en arrive à la conclusion que ça marche (fonctionnellement) mais ce n'est pas gérable (le designer passe son temps à me refuser l'acces au Form crée, signalant toujours une erreur non bloquante au fonctionnement mais interdisant le design)
    Si je recrée le Form en question, ça marche jusqu'à ce qu'une modif dans le form de base remette tout en question
    Est ce possible / de bonne pratique de travailler ainsi en cascade ?
    Par avance merci
    Bertrand

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    oui

    nous on a 2 forms de base
    formbase avec du code générique, formNous inherits formbase avec du code en plus pour d'autres fonctions
    et sur toutes nos forms on vient remplacer inherits form par inherits formNous
    et on a aucun soucis
    les seuls soucis qu'on a eut au début c'était dû à une mauvaise incompréhension du fonctionnement de notre code en mode design, ou du mode design en lui même
    pendant un temps on se disait même "qu'est-ce qu'il est buggé ce vs" alors que c'était notre code (form de base et custom controls) qui était exécuté en mode design et qui plantait (et donc qui plantait vs par manque de try catch)

    donc tu peux nous dire les messages que tu as pour qu'on t'aide à comprendre où tu as fait des erreurs.
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir et merci,
    Ça me rassure un peu car ça me semblait une approche intéressante (niveau N pour logique et controls communs à tous les Form comme le BtnQuit, Niveau N-1 pour les controls communs à chaque type de Form : liste, détails, et N-2 comme « utilisateurs »)!
    J’ai fait tellement d’essais que je ne saurais les reconstituer car n’engendrant une erreur systématiquement et instantanément, mais uniquement après plusieurs manip, mais un de ceux qui m’a tout de suite frappé est celui là :
    Attention ça va être long :

    Formulaire de base « N » dans la bibliothéque « ModeleFormulaire » comme sur le lien pré-cité (contenant 2 btn)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Class FormBase
        Inherits System.Windows.Forms.Form
    Avec différentes fonctions dont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        Protected Sub AffichagePersoForm(TypeFormulaire As String)
            Select Case TypeFormulaire
                Case "Util"
                    Me.Icon = My.Resources.Perso
                    If PC.GestionCouleurFormulaire Then Me.BackColor = PC.CouleurPersonnage
                Case "Geo"
    ‘…
                Case Else
    ‘…"
            End Select
        End Sub
    Formulaire de baseConfig « N-1 » » dans la bibliothéque « ModeleFormulaire » (contenant un Groupbox + checkbok)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class FormBaseConfig
        Inherits ModeleFormulaire.FormBase
     
        Private Sub FormBaseConfig_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            '  call AffichagePersoForm("Util") : -> source de pb
        End Sub

    Formulaire d’Essai « N-2 » (dans le projet GUI) avec référence au précédent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Public Class FormEssai
        Inherits ModeleFormulaire.FormBaseConfig
     
     Private Sub FormEssai_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
     
        End Sub
    Je crée FormEssai,
    - les controls sont bien transférés (sauf des pbs de positionnement N et N-1 n’ayant pas le même size et qb pb avec un bouton, toujours le même, qui ne veut pas rester « en place »)
    - l’ensemble fonctionne bien (gestion de la fermeture du Form selon état de modif,..)
    je rajoute le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call AffichagePersoForm("Util")
    dans le load du form mère N-1 / régénération de la bibliothèque
    je relance l’appli : OK (la dernière fois ça avait bloqué là, mais cette fois ça passe)
    Explorateur de solution / Double click sur FormEssai : FormEssai[design] OK

    Je me dis que ça marche (pas de chance :-)
    J’ouvre les design de plusieurs Form
    Je relance l’appli :OK
    Double click sur FormEssai : Avertissement assez peu explicite (voir image-01)
    Je relance l’appli :OK
    Je suis sûr de n’avoir ajouté / modifié / supprimé aucune ligne de code : uniquement ouvert/fermé des volets de design de Form
    Je régénère la solution complète
    Avertissement un peu plus explicite (voir image-02)
    Mais l’appli marche encore, le FormEssai.designer n’indique aucune erreur, mais impossible de rouvrir le FormEssai[design]

    Suppression / recréation de FormEssai (fonction call laissée en N-1)
    FormEssai[design] -> erreur 3

    Je supprime le call.. dans N-1 / régénération
    Supppression / recréation de FormEssai -> FormEssai[design] :OK

    Je remets le call.. dans N-1 / régénération
    -> FormEssai[design] : Erreur (La référence d'objet n'est pas définie à une instance d'un objet. ) sans même avoir lancé quoique que ce soit !!
    mais l’appli tourne sans erreur (sauf l’impossibilité d’ouvrir le FormEssai[design] )

    dans N-1 je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub FormBaseConfig_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            '  call AffichagePersoForm("Util") : -> source de pb
        End Sub
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub FormBaseConfig_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        End Sub
     
        Protected Sub relais()
            Call AffichagePersoForm("Util")
        End Sub
    Dans N-2 j’appelle cette fonction relais qui appelle AffichagePersoForm("Util")située en N

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub FormEssai_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            Call relais()
        End Sub
    Et là ça marche pour de bon (enfin je crois !!)

    Je pense qu’il y a un pb avec la gestion des handles (plusieurs fois les Handles MyBase.Load des Form N-1 et N-2 ont « disparu » par magie !!)
    Je n’ai jamais planté vs, uniquement des pb de Form[design] à répétition et variés qui obligent parfois à supprimer/refaire

    Bref, je dois faire des erreurs / choses interdites, mais je n’ai trouvé nulle part les règles à suivre ..
    Par avance, merci
    Bertrand
    Images attachées Images attachées    

  4. #4
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    le designer passe son temps à me refuser l'acces au Form crée
    Pour pouvoir modifier dans la forme héritée des Controls de la form de base (par exemple, changer BackColor ou Position), on mettra la propriété Modifiers de ces controls à Friend ou Protected.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est bien ton code qui plante, donc ca doit etre réparable

    quand tu ouvres une form en mode design, le code de son parent d'héritage est exécuté, ainsi que son initializecomponent à elle

    déjà quand le designer t'affiches une erreur tu peux demander de voir la pile des appels, ca peut aider en général
    le mieux c'est le mettre des try catch dans tous tes membres sur tes n forms de base, avec dans le catch un msgbox ex.message et ex.stacktrace (contiendra la ligne qui passe en erreur)
    et après tu corriges les bugs
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonjour et merci pour ces réponses,
    Pour pouvoir modifier dans la forme héritée des Controls de la form de base (par exemple, changer BackColor ou Position), on mettra la propriété Modifiers de ces controls à Friend ou Protected.
    Après plusieurs essais, j'avais décidé de mettre tous les controls ajoutés à Protected, je suppose que la Form en elle même l'est automatiquement
    J'étais parti sur la Form N en taille par défaut (300;300) et la Form N-1 idem puis N-2 à la taille désirée : résultat en design mes controls hérités se retrouvent généralement en dehors du Form, je dois donc les rattraper et les repositionner

    quand tu ouvres une form en mode design, le code de son parent d'héritage est exécuté, ainsi que son initializecomponent à elle
    Je ne savais pas, cela explique pourquoi se créait "toute seule" l'erreur quand j'accédais au FormN-2 design : l'instruction call .. du FormN-1 load se lançait
    Par contre, je ne comprends toujours pas pourquoi cette même instruction lancée par une sub relais, ne causait pas de pb

    déjà quand le designer t'affiches une erreur tu peux demander de voir la pile des appels
    J'ai refait la manip et j'obtiens la pile en question (voir image)
    Par contre, je ne suis pas sûr de savoir l'exploiter : si la dernière ayant crée l'erreur est celle le plus haut, cela donnerait une erreur à la ligne 99
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              If PC.GestionCouleurFormulaire Then Me.BackColor = PC.CouleurUtilitaire
    le mieux c'est le mettre des try catch dans tous tes membres sur tes n forms de base, avec dans le catch un msgbox ex.message et ex.stacktrace (contiendra la ligne qui passe en erreur)
    Bonne idée, je vais essayer et compléterai ma réponse

    Merci encore
    Bertrand
    Images attachées Images attachées  

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    re,
    ça y est , j'ai trouvé !
    Tout vient du fait que je ne savais pas le
    quand tu ouvres une form en mode design, le code de son parent d'héritage est exécuté, ainsi que son initializecomponent à elle
    la ligne générant le pb fait appel à une variable provenant de ma classe Singleton qui est chargée par le load de mon Form Main
    en exécution : pas de pb car chargée !
    quand FormN-2.design : elle n'est pas chargée !
    L'aventure de l'héritage peut continuer :-)
    Merci encore à tous !
    Bertrand

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

Discussions similaires

  1. [2.x] [Form] Select Ajax en Cascade pour un champ
    Par KzrData dans le forum Symfony
    Réponses: 1
    Dernier message: 29/08/2012, 10h41
  2. Filtre en cascade avec Infopath Form Server
    Par Potemkine974 dans le forum InfoPath
    Réponses: 2
    Dernier message: 17/12/2010, 18h10
  3. [sous forms]copier un enregistrement en cascade
    Par escobar dans le forum Access
    Réponses: 2
    Dernier message: 12/07/2006, 11h07
  4. [C#] heritage entre form. excecution du code a la compil.
    Par jota5450 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/07/2006, 10h30

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