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?
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)
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
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
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
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.
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
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?
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