Laden...

Dynamische Controls werden verworfen

Erstellt von jHammer vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.547 Views
J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 14 Jahren
Dynamische Controls werden verworfen

Hallo,

ich habe in einem Projekt dynamisch Objekte (Forms, Controls) erstellt. Die Controls sind auch auf dem Form zu sehen und funktionieren.

public partial class Form1 : Form
    {
        public Form eingabe = new Form();
        public Button farbe = new Button();
        public Button kreis_ok = new Button();
        public Button recht_ok = new Button();
        public Button linie_ok = new Button();
        public Label label1 = new Label();
        public Label label2 = new Label();
        public Label label3 = new Label();
        public Label label4 = new Label();
        public TextBox text1 = new TextBox();
        public TextBox text2 = new TextBox();
        public TextBox text3 = new TextBox();
        public TextBox text4 = new TextBox();
        public Pen mypen = new Pen(System.Drawing.Color.AliceBlue);
              
        
        public Form1()
        {
            InitializeComponent();
        }
        
        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void kreis_Click(object sender, EventArgs e)
        {
            
            eingabe.Show();
            //Controls Text
            kreis_ok.Text= "OK";
            eingabe.Text = "Eingabe";
            label1.Text = "Kreismittelpunkt x:";
            label2.Text = "Kreismittelpunkt y:";
            label3.Text = "Kreisradius:";
            kreis_ok.Click+=handler;
            //Controls-Positionierung
            kreis_ok.Top=230;
            kreis_ok.Left=20;
            label1.Top = 10;
            label2.Top = 40;
            label3.Top = 70;
            label1.Left = 20;
            label2.Left = 20;
            label3.Left = 20;
            label4.Left = 20;
            text1.Top = 10;
            text2.Top = 40;
            text3.Top = 70;
            text1.Left = 150;
            text2.Left = 150;
            text3.Left = 150;
            //Controls hinzufügen
            eingabe.Controls.Add(kreis_ok);
            eingabe.Controls.Add(label1);
            eingabe.Controls.Add(label2);
            eingabe.Controls.Add(label3);
            eingabe.Controls.Add(text1);
            eingabe.Controls.Add(text2);
            eingabe.Controls.Add(text3);           
        }
        private void Rechteck_Click(object sender, EventArgs e)
        {
            eingabe.Show();
            //Controls Text
            recht_ok.Text = "Ok";
            eingabe.Text = "Eingabe";
            label1.Text = "Startpunkt x:";
            label2.Text = "Startpunkt y:";
            label3.Text = "Endpunkt x:";
            label4.Text = "Endpunkt y:";
            recht_ok.Click += handler;
            //Controls-Positionierung
            recht_ok.Top = 230;
            recht_ok.Left = 20;
            label1.Top = 10;
            label2.Top = 40;
            label3.Top = 70;
            label4.Top = 100;
            label1.Left = 20;
            label2.Left = 20;
            label3.Left = 20;
            label4.Left = 20;
            text1.Top = 10;
            text2.Top = 40;
            text3.Top = 70;
            text4.Top = 100;
            text1.Left = 150;
            text2.Left = 150;
            text3.Left = 150;
            text4.Left = 150;
            //Controls hinzufügen
            eingabe.Controls.Add(recht_ok);
            eingabe.Controls.Add(label1);
            eingabe.Controls.Add(label2);
            eingabe.Controls.Add(label3);
            eingabe.Controls.Add(label4);
            eingabe.Controls.Add(text1);
            eingabe.Controls.Add(text2);
            eingabe.Controls.Add(text3);
            eingabe.Controls.Add(text4);
            
        }

        private void Linie_Click(object sender, EventArgs e)
        {
            eingabe.Show();
            //Controls Text
            linie_ok.Text = "Ok";
            eingabe.Text = "Eingabe";
            label1.Text = "Startpunkt x:";
            label2.Text = "Startpimlt y:";
            label3.Text = "Endpunkt x:";
            label4.Text = "Endpunkt y:";
            linie_ok.Click += handler;
            //Controls-Positionierung
            linie_ok.Top = 230;
            linie_ok.Left = 20;
            label1.Top = 10;
            label2.Top = 40;
            label1.Left = 20;
            label2.Left = 20;
            text1.Top = 10;
            text2.Top = 40;
            text1.Left = 150;
            text2.Left = 150;
            //Controls hinzufügen
            eingabe.Controls.Add(linie_ok);
            eingabe.Controls.Add(label1);
            eingabe.Controls.Add(label2);
            eingabe.Controls.Add(text1);
            eingabe.Controls.Add(text2);            
        }
        public void handler(object sender, EventArgs e)
        {
            if (sender == recht_ok)
            {

                int rechteck_x = Convert.ToInt32(text1.Text);
                int rechteck_y = Convert.ToInt32(text2.Text);
                int endpunkt_x = Convert.ToInt32(text3.Text);
                int endpunkt_y = Convert.ToInt32(text4.Text);
                int höhe = endpunkt_x - rechteck_x;
                int breite = endpunkt_y - rechteck_y;
                System.Drawing.Graphics graph = this.CreateGraphics();
                graph.DrawRectangle(mypen, new Rectangle(rechteck_x, rechteck_y, breite, höhe));
                eingabe.Hide();
            }
            if (sender == kreis_ok)
            {
                int rechteck_x = Convert.ToInt32(text1.Text);
                int rechteck_y = Convert.ToInt32(text2.Text);
                int radius = Convert.ToInt32(text3.Text);
                System.Drawing.Graphics graph = CreateGraphics();
                graph.DrawEllipse(mypen, new Rectangle(rechteck_x, rechteck_y, radius, radius));
                eingabe.Hide();
            }
       }
}

Wenn ich dieses dynamische Fenster über das "Kreuz" schließe und es nochmal aufrufen will, gibt er mir einen Fehler aus (Auf das verworfene Objekt kann nicht zugegriffen werden.).
Wie kann ich dieses Objekt jetzt wieder erstellen?

Gelöschter Account
vor 14 Jahren

wo ist denn jetzt die frage?

ps: lass das create graphics raus... das ist nciht nur hässlich sondern auch nicht notwendig. gezeichnet wird nur in den paint-methoden und nirgendwo anders.

was dir weiterhelfen dürfte:
[FAQ] Control-Programmierung, (Border, Position, Size, Ownerdraw, Paint)
[Tutorial] Gezeichnete Objekte mit der Maus verschieben
[Tutorial] Zeichnen in Windows-Programmen (Paint/OnPaint, PictureBox)

J
3.331 Beiträge seit 2006
vor 14 Jahren

Wenn ich dieses dynamische Fenster über das "Kreuz" schließe und es nochmal aufrufen will, gibt er mir einen Fehler aus (Auf das verworfene Objekt kann nicht zugegriffen werden.).
Wie kann ich dieses Objekt jetzt wieder erstellen?

Das ist ein Grundproblem von zur Laufzeit erzeugten Formularen: Durch das Schließen wird es dem GC übergeben, aber du hast keinen Einfluss darauf, wann es tatsächlich gelöscht wird. So kommen die Anforderungen durcheinander.

Das Problem wurde bereits mehrfach behandelt. Bitte benutze die Forumssuche und poste die besten Treffer hier; ich gebe aber zu, dass es schwierig ist, geeignete Suchbegriffe zu finden (mit "form erneut" gab es über 4000 Treffer, wahrscheinlich ist "form" zu allgemein).

Gruß Jürgen

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo juetho,

Durch das Schließen wird es dem GC übergeben,

durch das Schließen wird Dispose ausgelöst. Der GC hat mit den Controls an der Stelle (noch) nichts zu tun.

Hallo jHammer,

disposed ist disposed. Wenn du das nicht willst, musst du das Schließen verhindern. Oder du musst die Controls im neuen Fester neu erstellen.

herbivore

J
3.331 Beiträge seit 2006
vor 14 Jahren

durch das Schließen wird Dispose ausgelöst. Der GC hat mit den Controls an der Stelle (noch) nichts zu tun.

Natürlich hast du recht. Nicht der GC sorgt für die "Verwirrung", sondern die Dispose-Anforderung. Jürgen

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 14 Jahren

Hallo zusammen,

so ich weiß mittlerweile wie ich das Dispose in der Hauptform abfange, aber wie mach ich das in dem dynamisch erzeugten Form?
Hab mittlerweile auch alles mögliche an Threads durchwühlt, aber immer noch nichts gefunden.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo jHammer,

so ich weiß mittlerweile wie ich das Dispose in der Hauptform abfange, aber wie mach ich das in dem dynamisch erzeugten Form?

genauso. 😃

herbivore

J
jHammer Themenstarter:in
14 Beiträge seit 2008
vor 14 Jahren

Hallo,

hier mal mein Code-Snippet für das Abfangen des Dispose:

protected override void Dispose(bool disposing)
 {
   if(disposing && (components != null)
        {
             components.Dispose();
         }
    else
     base.Dispose(disposing);
}

Ist das so richtig und wenn ja, wie wende ich das auch das dynamische Form an?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo jHammer,

äh, du willst doch das Dispose verhindern oder nicht? Ich verstehe dein Problem immer noch nicht. Wenn du das Diapose des Hauptform verhinderst (und du sagst ja, das hättest du geschafft), dann werden doch dessen Controls ebenfalls nicht disposed. Ganz egal ob diese Controls per Designer-Code oder per User-Code erzeugt wurden.

Dispose für das Form musst du gar nicht überschreiben, es sei denn du benutzt außer den Controls noch enthaltene Objekte, die disposed werden müssen (z.B. Fonts oder Pens).

herbivore