PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C#: Probleme beim PieChart zeichnen


Elemental
2004-07-27, 08:38:14
Hallo,
ich arbeite gerade an einer Klasse, die PieCharts malt.
Die Klasse kann ein bitmap des Charts und ein bitmap der Legende erzeugen:


//fill datasource with some test data
PieChartDataSource dataSource = new PieChartDataSource();
dataSource.Add(new PieSliceData("Running", 1841200, Color.Green));
dataSource.Add(new PieSliceData("Waiting", 290000, Color.Blue));
dataSource.Add(new PieSliceData("Blocked", 181000, Color.Yellow));
dataSource.Add(new PieSliceData("Interruption", 62000, Color.Orange));
dataSource.Add(new PieSliceData("Fault", 45000, Color.Red));

PieChart chart = new PieChart(dataSource);
Bitmap chartBmp = chart.DrawChart(new Size(800,600));
chartBmp.Save(@"d:\chart.bmp");

Bitmap legendBmp = chart.DrawLegend();
legendBmp.Save(@"d:\legend.bmp");



Momentan versuche ich mich daran, dass die Legende im gleichen bitmap wie das Chart gezeichnet wird.


Jetzt zu meinem Problem:
I kann jetzt ein bitmap vom chart mit Legende erzeugen:

PieChart chart = new PieChart(dataSource);
chart.DrawLegendInChart = true;
chart.LegendPosition = Position.top;
Bitmap chartBmp = chart.DrawChart(new Size(800,600));
chartBmp.Save(@"d:\chart.bmp");


und ich kann auch ein eigenes bitmap mit der seperaten Legende erzeugen:

Bitmap legendBmp = chart.DrawLegend();
legendBmp.Save(@"d:\legend.bmp");



Beide Code-Schnipsel funktionieren für sich problemlos. Aber wenn ich beide ausführen lasse

PieChart chart = new PieChart(dataSource);
chart.DrawLegendInChart = true;
chart.LegendPosition = Position.top;
Bitmap chartBmp = chart.DrawChart(new Size(800,600));
chartBmp.Save(@"d:\chart.bmp");

Bitmap legendBmp = chart.DrawLegend();
legendBmp.Save(@"d:\legend.bmp");


dann krieg ich eine Exception in der DrawLegend() Methode.

Dieser Aufruf

graphics.DrawString(strText, m_FontLegend, blackBrush, iStartX, iStartY);


schmeisst die Exception:
TargetSite.DeclaringType: System.Drawing.Graphics
TargetSite.Name: CheckErrorStatus
Message: Invalid parameter used


Aber wie kann es sein, dass der code funktioniert, wenn ich vorher kein chart mit legende zeichnen lasse, sondern nur die Legende?

Bin für jede Hilfe dankbar!

Gruss
Bernd

Elemental
2004-07-29, 21:41:38
*schieb*

Hier mal mein Posting aus einem anderen Forum, mit link zu Testprogramm:


Hi all,
as already described in an other thread, I am currently working on drawing PieCharts like this:
http://mitglied.lycos.de/axbycz/charts/chart.jpg

I have a little testapp that writes a bitmap of a PieChart to harddisk, when I press a button.
This works fine for the first time, but if I press the button a second time, I get a System.ArgumentException:

exception.Message is "Invalid parameter used."
HResult -2147024809
COMPlusExceptionCode -532459699


Here's my little application:
[u rl]http://mitglied.lycos.de/axbycz/charts/Charting.zip[/url]

Would be great if someone could have a look at it. I'm think I'm going insane, because I can't find, what the problem is :(


Please help!

Danke
Bernd

Demirug
2004-07-29, 21:53:49
Lass mal erst die Legende und dann den Chart zeichen.

Elemental
2004-07-30, 12:16:07
Hab ich schon probiert. Hilft aber nicht.

Ich hann auch nicht zweimal das chart zeichnen lassen. Beim zweiten mal gibts immer die gleiche exception.

Bei codeproject.com meinte einer, dass die resourcen (Bitmap, Graphics) evtl. nicht sauber aufgeräumt werden, aber ich seh nicht, wo da das Problem sein soll...

Demirug
2004-07-30, 14:03:23
An wenn soll ich die Rechnung schicken? (nicht ernst gemeint)

Der Fehler liegt dort:


//don't forget to dispose the text brush
BlackBrush.Dispose();


In dem Moment hast du den Systemweiten BlackBrush disposed und bei der nächsten benutzung funktioniert er dann natürlich nicht mehr.

Elemental
2004-07-30, 22:37:58
Man, stimmt. Das is ja garkein brush den ich selber anlege...
Das is mir jetzt aber schon fast peinlich.

Damit bist du mein Held der Woche! Danke! :)


edit:
Ein gutes hatte die Sache aber: Bei meiner Netz-weiten Suche nach der Problemlösung bin ich auf das hier gestossen:
http://www.scitech.se/memprofiler/
Das sieht doch mal nach nem richtig hilfreichen tool für Problemfälle aus.