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

C# Discussion :

créer un handle sur un form


Sujet :

C#

Vue hybride

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut créer un handle sur un form
    Bonjour,

    J'ai creer mon propre formulaire et j'ai une fonction qui appelle invoke. Le problème c'est que j'obtien l'erreur suivante : Impossible d'appeler Invoke ou BeginInvoke sur un contrôle tant que le handle de fenêtre n'a pas été créé.

    J'ai essayé de mettre la fonction CreateHandle(); dans le contructeur mais ca ne change rien.

    Quelqu'un a une idée ?

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    As-tu fait taForm.Show() ou taForm.ShowDialog() ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut
    Avec un peu de code ca sera mieux :

    Mon Formulaire :
    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
        internal class MyForm : Form
        {
            private System.ComponentModel.IContainer components = null;
     
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            private void InitializeComponent()
            {
                this.components = new System.ComponentModel.Container();
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Text = "MyForm";
            }
     
            private delegate void del4Close();
            internal void TryClose()
            {
                del4Close callBack = this.Close;
                Invoke(callBack);
            }
     
        }
    Mon main :
    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
        class Program
        {
     
            private static MyForm m_mf;
            static void Main(string[] args)
            {
                LaunchNewForm();
                Thread.Sleep((5000));
                m_mf.TryClose();
                Console.WriteLine("fin");
            }
            public static void LaunchNewForm()
            {
                Thread aThread = new Thread(launchMyForm);
                aThread.Start();
            }
     
            private static void launchMyForm()
            {
                m_mf = new MyForm();
                m_mf.Show();
                Application.Run();
            }
        }
    Donc mon programme lance un formulaire MyForm, attent 5 seconde et le ferme. Sans interaction de ma part, cela fonctionne correctement. Parcontre, si je ferme le formulaire pendant les 5 secondes d'attente du main, alors la j'obtien l'erreur citée précédement.

    RQ : je lance mon formulaire depuis un thread car je veux (notament) pouvoir en lancer plusieur par la suite.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    c'est etrange que meme l'appel à CreateHandle ne resolve pas le probleme.
    Ce code fonctionne normalement :

    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
        static class Program
        {
            /// <summary>
            /// The main entry point for the application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Form1 f = new Form1();
                ThreadPool.QueueUserWorkItem(
                    new WaitCallback(
                    delegate
                    {
                        Thread.Sleep(2000);
                        //Si je n'appelle pas CreateHandle() dans ctor de la form,
                        //ca plante ici sinon, ca passe tres bien.
                        f.Invoke(
                            new MethodInvoker(
                                delegate
                                {
                                    f.Text = "Truc";
                                }));
                    }));
                Application.Run();
            }
        }
    Pourrait-on avoir un bout de code compilable ?

    Edit (pas vu les reponses) :

    Si tu fermes ta form, elle est disposée, mais le thread ne se termine pas (difference entre appeler Application.Run(void) et .Run(Form)).

    Bref, pour eviter le plantage si la form est fermée, il faut controler le statut de la form avant d'appeler TryClose :

    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
        class Program
        {
     
            private static Form1 m_mf;
            static void Main(string[] args)
            {
                LaunchNewForm();
                Thread.Sleep((5000));
                if (!m_mf.IsDisposed)
                    m_mf.TryClose();
                Console.WriteLine("fin");
            }
            public static void LaunchNewForm()
            {
                Thread aThread = new Thread(launchMyForm);
                aThread.Start();
            }
     
            private static void launchMyForm()
            {
                m_mf = new Form1();
                Application.Run(m_mf);
            }
        }
    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
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            internal void TryClose()
            {
                this.Invoke(new MethodInvoker(
                        delegate
                        {
                            this.Close();
                        }));
            }
        }

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut
    Voici tout le code :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    using System;
    using System.Threading;
    using System.Windows.Forms;
     
    namespace forms
    {
        class Program
        {
     
            private static MyForm m_mf;
     
            //point d'entrée
            static void Main(string[] args)
            {
                LaunchNewForm();
                Thread.Sleep((5000));
                m_mf.TryClose();
                Console.WriteLine("fin");
            }
            public static void LaunchNewForm()
            {
                Thread aThread = new Thread(launchMyForm);
                aThread.Start();
            }
     
            private static void launchMyForm()
            {
                m_mf = new MyForm();
                m_mf.Show();
                Application.Run();
            }
        }
     
        internal class MyForm : Form
        {
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            /// Nettoyage des ressources utilisées.
            /// </summary>
            /// <param name="disposing">true si les ressources managées doivent être supprimées ; sinon, false.</param>
            protected override void Dispose(bool disposing)
            {
                if (disposing && (components != null))
                {
                    components.Dispose();
                }
                base.Dispose(disposing);
            }
     
            public MyForm()
            {
                InitializeComponent();
                CreateHandle();
            }
     
            private void InitializeComponent()
            {
                this.components = new System.ComponentModel.Container();
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.Text = "MyForm";
            }
     
            private delegate void del4Close();
            internal void TryClose()
            {
                del4Close callBack = this.Close;
                Invoke(callBack);
            }
     
        }
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut
    Ca marche niquel, merci Julio. Une petite question en plus : si mon formulaier est diposed, est ce que je peut toujours avoir acces à lui, tjrs avoir acces a ses données interne.

    Par exemple si dans mon forulaire il y a une textBox, une fois que le formulaire a été fermé, est ce que je peux avoir la dernière valeur contenue dans la textBox ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Dans l'absolu, oui, tu peux encore travailler sur un objet disposé (il n'est pas detruit, juste "nettoyé"), mais il ne faut pas. Dans le cas present, si tu essaies d'acceder à des controls disposés, tu risques d'avoir des soucis, vu que ces controls ont leur ressources natives qui ont été detruites.

    Donc non, tu ne dois pas acceder à un objet disposé, si tu dois y acceder par la suite (dans le cas d'une form par exemple), ne la ferme pas par .Close() (qui appelle Dispose(), pour une Form non-modale), mais plutot par .Hide (ou .Visible = false). Une fois que tu as reellement fini de travailler avec, tu la disposes.

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 69
    Par défaut
    Ok merci pr les réponses

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

Discussions similaires

  1. [Débutant] vb.net - Créer un contrôle sur une autre form
    Par Nerpson dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/09/2014, 16h36
  2. [XL-2007] Créer des liens sur les formes et verrouiller des formes
    Par kopax dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/08/2011, 11h23
  3. Réponses: 4
    Dernier message: 03/07/2007, 11h21
  4. Créer des objets sur la pile ?
    Par Cornell dans le forum Langage
    Réponses: 8
    Dernier message: 03/03/2003, 11h47
  5. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48

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