locked
Erreur lors de la création d un handle de fenêtre RRS feed

  • Question

  • Bonjour a tous,
    voila j'ai un problème depuis plusieurs mois que j'avais laissé de coté en me disant que je trouverai la solution plus tard. Mais bon voila je n'arrive toujours pas a le résoudre, et c'est tres important poru moi de trouver la solution. En fait j'ai un Panel1 constitué de 2 UserControl :
    Le 1er : UserControl constitué d'un label et d'un textBox
    Le 2eme : UserControl constitué d'un Label, une combobox et un bouton (avec une image).
    Quand je clique sur le Bouton dans le UserControl2 je crée un Panel1 (donc constitué des 2 UserControl) et ainsi de suite. Ceci me permet d'afficher des hiérarchies. Si je fais 13 fois l'opération je prends le message d'erreur "Erreur lors de la création d un handle de fenêtre".

    Voici comment reproduire le problème simplement. Avec cet exemple ca plante au niveau 45.
    1) créer une applicaiton WinForms, avec un Form1. Mettre :

    privatevoid Form1_Load(object sender, EventArgs e)
    {
                this.autoscroll = true;
                MonControl MonControl1 = new MonControl(1);
                this.Controls.Add(MonControl1);
    }
    
    Puis créer la classe suivante : 
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        class MonControl :Panel
        {
            public TextBox MaTextBox = new TextBox();
            private Button MonBouton = new Button();
            public MonControl(int nIdent)
            {
                this.MaTextBox.Dock = System.Windows.Forms.DockStyle.Top;
                this.MaTextBox.Location = new System.Drawing.Point(0, 0);
                this.MaTextBox.Size = new System.Drawing.Size(601, 20);
                this.MaTextBox.TabIndex = 0;
     
                this.MonBouton.Dock = System.Windows.Forms.DockStyle.Right;
                this.MonBouton.Location = new System.Drawing.Point(526, 20);
                this.MonBouton.Size = new System.Drawing.Size(75, 26);
                this.MonBouton.MaximumSize = new System.Drawing.Size(75, 26);
                this.MonBouton.TabIndex = 1;
                this.MonBouton.Text = "MonBouton";
                this.MonBouton.UseVisualStyleBackColor = true;
                this.MonBouton.Click += new EventHandler(MonBouton_Click);
     
                this.Controls.Add(this.MonBouton);
                this.Controls.Add(this.MaTextBox);
                this.Dock = System.Windows.Forms.DockStyle.Top;
                this.Location = new System.Drawing.Point(0, 0);
                this.Name = nIdent.ToString();
                this.Size = new System.Drawing.Size(601, 46);
            }
     
            void MonBouton_Click(object sender, EventArgs e)
            {
                this.PushButon();
            }
            publicvoid PushButon()
            {
                int nsave = this.Height;
                MonControl MonControl1 = new MonControl(Convert.ToInt32(this.Name) + 1);
                MonControl1.Dock = System.Windows.Forms.DockStyle.Bottom;
                MonControl1.MaximumSize = new Size(this.Width - 10, 20000000);
                this.Controls.Add(MonControl1);
                this.Height += MonControl1.Height;
                if(this.Parent.GetType() == typeof(MonControl))
                    (this.Parent as MonControl).AjusterHauteur(nsave);
                MonControl1.MaTextBox.Text = MonControl1.Name;
                MonControl1.MaTextBox.Focus();
                MonControl1.PushButon();
            }
            publicvoid AjusterHauteur(int nsave)
            {
                int nsave2 = this.Height;
                this.Height += this.Controls[this.Controls.Count - 1].Height - nsave;
                if(this.Parent.GetType() == typeof(MonControl))
                    (this.Parent as MonControl).AjusterHauteur(nsave2);
            }
        }
    }

     A lexecution, cliquer sur le bouton et le reste se fait tout seul jusqu'au plantage.
    Quelqu'un pourait m'aider?
    Merci bp
    Cédric
    dimanche 19 avril 2009 08:25

Réponses

  • Bonjour,
    En fait c'est bon j'ai ma réponse. Ca plante car en Winform on peut imbriquer maximum 50 fenêtres....sachant qu'un control est équivalent à une fenêtre. Merci en tout cas poru ton aide.
    Cédric

    jeudi 23 avril 2009 10:25

Toutes les réponses

  • Tu exploses la pile d'appel ... Ce que je ne comprends pas c'est quand comptes-tu arrêter le traitement ? La création d'un contrôle entraine la création d'un contrôle fils, qui lui-même, etc. Tout ça de manière synchrone: en d'autres termes, tu ne rends jamais la main au 1er évènement MonBouton_Click ?!

    Bref, si c'est quand même ce que tu cherches à faire, tu n'as qu'à multi-threader le 1er appel. Par contre, hors de question de créer un thread par contrôle ! Tu irais plus loin mais ça exploserait quand même !

    Xavier
    Xavier
    lundi 20 avril 2009 11:40
  • En fait c'est un exemple simple pou reproduire le problème. Dans mon programme le fonctionnement est différent. En fait j'affiche des informations :  par exemple un formulaire de personne. Sur le champ controlé Lieu de naissance l'utilisateur peut "ouvrir" (grâce a un bouton) le formulaire "Lieu", le renseigner  et accéder de la même  facon au terme générique (ce qui permet de créer des hiérarchies tres simplement).  Ceci permet d'éviter les superpositions de fenêtres. De plus l'effet de "profondeur" est tres interrssant. J'ai pris l'exemple de la hiérarchie mais ce proncipe est le même pour tout information pointant sur une table liée Et dans mon programme ça plante  au 11eme niveau ce qui me parait un peut trop limite. J'avoeu que je ne vois aps comment garder ce principe sans que ca plante...

    Cédric
    lundi 20 avril 2009 12:30
  • Ton système fonctionne sur le principe ... et je n'arrive pas à faire planter ton code si j'enlève l'appel récursif. Le seul problème, c'est que la taille se réduit petit à petit et qu'à la fin tu ne vois plus rien. je pense d'ailleurs que le problème vient de là: une largeur à 0 ...
    Xavier
    lundi 20 avril 2009 15:47
  • Le fait que la taille se réduise n'est pas  grave. je ne sais pas encore si je vais effectuvement faire reduire les sous controls de facon a mieux voir la profondeur . En fait dans mon programme ca plante au niveau 6. j'utilise énormément de UserControl. Si au lieu de créer des UserControls je crée des classes héritant de Panel ca plante au niveau 11. Est ce que le fait de placer des controls dans d'autres controls et ainsi de suite est viable comme facon de coder?
    Cédric
    lundi 20 avril 2009 15:55
  • J'ai fait un petit programme un peu plus parlant. Est qu'il y a moyen de te l'envoyer?
    Cédric
    lundi 20 avril 2009 16:57
  • pas de pb mais je n'aime pas trop mettre une adresse mail sur un forum ...

    Xavier
    jeudi 23 avril 2009 09:55
  • Bonjour,
    En fait c'est bon j'ai ma réponse. Ca plante car en Winform on peut imbriquer maximum 50 fenêtres....sachant qu'un control est équivalent à une fenêtre. Merci en tout cas poru ton aide.
    Cédric

    jeudi 23 avril 2009 10:25
  • pas de pb mais je n'aime pas trop mettre une adresse mail sur un forum ...

    Xavier
    Si tu veux éviter ce problème, j'utilise MeltMail.com, une adresse courriel qui transfert à ton adresse réel et qui est désactivé après peu de temps.
    Microsoft MVP C# :: mongeon.devrpm.ca
    jeudi 23 avril 2009 13:00