Beim zweiten Aufruf ArgumentException? (gelöst)
-
Hallo,
ich schreibe gerade eine Klasse, die variable Informationen in einer Box im Fenster anzeigen soll.
Dazu übergebe ich ein Graphics-Objekt an die KLasse und zeichne ein Rechteck und schreibe dann mit DrawString die Infos rein.
Das funktioniert auhc alles wunderbar. Nun möchte ich aber die Informationen ändern und neu zeichnen.
zum Zeichnen nutze ich eine Draw() Methode:
private int Draw() { int retid = 0; if (_graph == null) return (1); System.Drawing.Pen stift = new System.Drawing.Pen(_brush); _graph.DrawRectangle(stift, _x, _y, _breite, _hoehe); System.Drawing.Font headerfont = new System.Drawing.Font(_font.FontFamily.ToString(),_font.Size +2,System.Drawing.FontStyle.Bold); System.Drawing.Font titelfont = new System.Drawing.Font(_font.FontFamily.ToString(), _font.Size, System.Drawing.FontStyle.Bold); int yy = _y; _graph.DrawString(_header, headerfont, _brush, _x + 10, yy+=10); yy += 15; _graph.DrawString(_line1, titelfont, _brush, _x + 10, yy += 20); _graph.DrawString(_line1content, _font, _brush, _x + 150, yy); _graph.DrawString(_line2, titelfont, _brush, _x + 10, yy += 20); _graph.DrawString(_line2content, _font, _brush, _x + 150, yy); _graph.DrawString(_line3, titelfont, _brush, _x + 10, yy += 20); _graph.DrawString(_line3content, _font, _brush, _x + 150, yy); _graph.DrawString(_line4, titelfont, _brush, _x + 10, yy += 20); _graph.DrawString(_line4content, _font, _brush, _x + 150, yy); return (retid); }
Zum neu zeichenn wollte ich eine Refresh Methode schreiben und darin erst mit Dispose() das Graphikobjekt zurücksetzen und dann die MEthode Draw() nochmal aufrufen.
Leider kommt dann immer in der Zeile:
System.Drawing.Pen stift = new System.Drawing.Pen(_brush);
Die Meldung:
Eine nicht behandelte Ausnahme des Typs "System.ArgumentException" ist in System.Drawing.dll aufgetreten.
Zusätzliche Informationen: Ungültiger Parameter.
Hat jemand ne Idee woran das liegen könnte?
Beste Grüße
solick
-
Also ich würde nicht das Graphicsobjekt Disposen, sondern eher den Pen disposen, den würd ich eh in einen using-block kapsenln.
-
Also ich will ja nur die Schriften dort verändern, sonst eigentlich nichts.
Was meinst Du mit using-Block?
PS: Deine Signatur ist super, hab mich gerade kaputtgelacht
Nachtrag:
Hab jetzt mal IDisposable eingebunden in die Klasse und einen Destruktor eingebaut, der Dispose aufruft.
Nur obwohl ich _graph.Dispose() aufrufe wird die Graphik nicht gelöscht. Hab mich damit bisher wenig beschäftigt, wie bekommt man eine gezeichnete Graphik wieder weg, wenn nicht mit Dispose?
-
ok, man sollte auch einfach verstehen, wie das mit dem PaintEvent funktioniert.
Hab nun die Klasse im Konstruktor initialisiert, die Draw() MEthode rufe ich im Paintevent auf und an der richtigen STelle änder ich einfach die Werte für die Texte..
dann this.Invalidate() aufrufen und...So klappt es wunderbar.
Grüße solick
-
Nachtrag für die Frage zu dem using-Block
Alle Klasse die IDisposable implementieren wie der Pen sollten in einem using-Block initialisiert werden, zum beispiel so:
using(Pen p = new Pen()) { //mach irgendwelchen kranken scheiß }
Warum sollte man das machen?
Ganz einfach deshalb, weil es Exceptionsicher ist, Exceptionsicher meint in dem Fall das im Falle einer Exception die Dispose Methode des Objekts trotzdem aufgerufen wird.Außerdem wird nach verlassen des Blocks sichergestellt das auch Dispose aufgerufen wird.Es entspricht ungefähr diesem System:
Pen p; try { p= new Pen(); } catch(Exception e) { //bearbeite die Exception } finally { p.Dispose(); }
-
Vielen Dank für den Nachtrag zum using-Block
Beste Grüße
Solick
-
Nochmal ne Nachfrage dazu. Die zu befüllenden Daten in meinem Kästchen ermittle ich, inden ich in einem Listview die Projekte aufliste und bei Doppelklick die ID des Projektes weiterreiche. Das funktioniert wunderbar. Wenn ich aber die Liste via Button ausblende (status visible auf false setze) dann wird der gezeichnete Text fetter. Hat jemand ne Idee woran das liegen kann?
Grüße Solick*Nachtrag*
Ich konnte es etwas eingrenzen. Es passiert, wenn ich mit der Maus über Buttons gehe, die aktiviert sind. Bei denen, die nicht aktiviert sind passiert nichts. Kann mir das jemand erklären? stehe da vor einem Rätsel...