| Autor |
Beitrag |
tobi_2k6
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 20.05.13 17:20
Hallo!
Wir programmieren ein Programm, welches Verbrauchsdaten in ein Kennfeld von Microsoft Excel einliest.
Nun haben wir folgendes Problem: Wir möchten gerne die x,y- Achsen unseres Koordinatensystems beschriften
aber es kommt immer ein GDI+ Fehler .. verstehe nicht was hier falsch ist. Hier mal der Teil des Codes der Probleme
macht:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Font f = new Font("Verdana", 0.07f); Brush u = new SolidBrush(Color.Black); String aux = "0/0";
StringFormat hdi = new StringFormat();
hdi.Alignment = StringAlignment.Far; hdi.LineAlignment = StringAlignment.Center; z.DrawString(aux, f, u, new Point(0, 0), hdi);
hdi.Alignment = StringAlignment.Center; hdi.LineAlignment = StringAlignment.Near; for (x = 1000; x <= scaleX * 500; x += 500) z.DrawString(x.ToString(), f, u, new PointF(x, 0.03f), hdi); |
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 20.05.13 17:37
Du solltest den Fehler auch benennen und nicht nur sagen das einer Auftritt.
z ist ein Graphics Object und du bist in einem Draw Event?
|
|
tobi_2k6 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 20.05.13 17:41
Wie meinst du das ? Es öffnet sich nur ein
Fenster wenn das Programm schon läuft in dem steht:
Fehler beim Zeichnen in die Bitmap:
Allgemeiner Fehler in GDI+.
und ja ich zeichne in eine Bitmap
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 20.05.13 17:51
Läßt sich das Problem nicht beim debuggen nachstellen so das du einen StackTrace bekommst damit du uns zumindest sagen kannst bei welcher Methode das genau auftritt?
|
|
tobi_2k6 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 20.05.13 17:54
| Zitat: | "Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Users\Tobi\Documents\Projekt_3_Verbrauchskennfeld(3)\Projekt_3_Verbrauchskennfeld\Projekt_3_Verbrauchskennfeld\bin\Debug\Projekt_3_Verbrauchskennfeld.vshost.exe" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Deployment\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Deployment.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll" wurde geladen, das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
Der Thread 'vshost.NotifyLoad' (0x8b34) hat mit Code 0 (0x0) geendet.
Der Thread '<Kein Name>' (0x8a4c) hat mit Code 0 (0x0) geendet.
Der Thread 'vshost.LoadReference' (0x8fe0) hat mit Code 0 (0x0) geendet.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Users\Tobi\Documents\Projekt_3_Verbrauchskennfeld(3)\Projekt_3_Verbrauchskennfeld\Projekt_3_Verbrauchskennfeld\bin\Debug\Projekt_3_Verbrauchskennfeld.exe" geladen, Symbole geladen.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\14.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\assembly\GAC_MSIL\office\14.0.0.0__71e9bce111e9429c\office.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "Anonymously Hosted DynamicMethods Assembly" geladen
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing.resources\v4.0_4.0.0.0_de_b03f5f7f11d50a3a\System.Drawing.resources.dll" geladen
Eine Ausnahme (erste Chance) des Typs "System.Runtime.InteropServices.ExternalException" ist in System.Drawing.dll aufgetreten.
"Projekt_3_Verbrauchskennfeld.vshost.exe" (Verwaltet (v4.0.30319)): "C:\Windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen
Der Thread 'vshost.RunParkingWindow' (0x8574) hat mit Code 0 (0x0) geendet.
Der Thread '<Kein Name>' (0x9064) hat mit Code 0 (0x0) geendet.
Das Programm "[34852] Projekt_3_Verbrauchskennfeld.vshost.exe: Verwaltet (v4.0.30319)" wurde mit Code 0 (0x0) beendet.
|
das steht im debugging fenster kannst du damit etwas anfangen?
Moderiert von Th69: Quote-Tags hinzugefügt
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 20.05.13 18:03
Nein. Da ist das Programm ja schon beendet und du bist am Problem vorbeigeschossen.
Stell mal Visual Studio so ein das es bei Exceptions immer sofort hält. Den Dialog findest du im Menu unter Debug/Exceptions. Dort mal bei den CLR Exception den Thrown haken setzen. Danach sollte (hoffentlich) die IDE dort halten wo das Problem auftritt von da aus läßt sich der Fehlergrund vielleicht weiter eingrenzen.
Edit : Ansonsten änder mal den Font auf was Windows typisches wie Tahoma und mach den Font größer. Bin bei der Font Klasse nicht ganz auf dem laufenden was der von dir verwendete Konstruktor da als Größeneinheit schluckt. 0.07 erscheint mir aber in jedem Größensystem irgendwie sehr klein.
|
|
tobi_2k6 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 20.05.13 18:10
so ich bin das ganze jz mal nach der reihe durchgegangen:
C#-Quelltext 1:
| z.DrawString(aux, f, u, new Point(0, 0), hdi); |
bei dieser Zeile springt das Prog zur Fehlermeldung.
Moderiert von Th69: C#-Tags hinzugefügt
|
|
tobi_2k6 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 20.05.13 18:19
So jz hab ich die Schrift geändert und dicker gestellt jetzt kommt der Fehler nicht mehr
aber es wird nichts gezeichnet
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 20.05.13 18:22
Dann zeig und den umgebenden Code insbesondere den woher z genau kommt.
|
|
tobi_2k6 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 20.05.13 18:27
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: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200:
| namespace Projekt_3_Verbrauchskennfeld { public partial class Form1 : Form { public Form1() { InitializeComponent(); bmp = new Bitmap(pic.ClientSize.Width, pic.ClientSize.Height); z = Graphics.FromImage(bmp); }
int[] drehzahl; double[] drehmoment; double[] verbrauch; double minX; double maxX; double minY; double maxY; int scaleX; int scaleY;
bool loaded = false;
Bitmap bmp; Graphics z;
private void LoadData() { try { ofd.Filter = "Exceldatei|*.xlsx"; ofd.InitialDirectory = Application.StartupPath;
MessageBox.Show("Excel-Datei bitte wie folgt formatieren:\n1. Spalte: Verbrauch\n2. Spalte: Drehmoment\n3. Spalte: Drehzahl\n\n1. Zeile: Bezeichnung\n2. Zeile: Einheiten\nab 3. Zeile: Werte");
if (ofd.ShowDialog() == DialogResult.OK) { Excel.Application xlApp; Excel.Workbook xlWorkBook; Excel.Worksheet xlWorkSheet; object misValue = System.Reflection.Missing.Value;
xlApp = new Excel.Application(); xlWorkBook = xlApp.Workbooks.Open(ofd.FileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); Excel.Range lastRow; lastRow = xlWorkSheet.get_Range("A1").get_End(Excel.XlDirection.xlDown);
drehzahl = new int[lastRow.Row - 2]; drehmoment = new double[lastRow.Row - 2]; verbrauch = new double[lastRow.Row - 2];
for (int i = 3; i <= lastRow.Row; i++) { verbrauch[i - 3] = xlWorkSheet.get_Range("A" + i.ToString(), "A" + i.ToString()).Value2; drehmoment[i - 3] = xlWorkSheet.get_Range("B" + i.ToString(), "B" + i.ToString()).Value2; drehzahl[i - 3] = Convert.ToInt32(xlWorkSheet.get_Range("C" + i.ToString(), "C" + i.ToString()).Value2); }
xlWorkBook.Close(true, misValue, misValue); xlApp.Quit();
releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp);
MessageBox.Show("Daten wurden erfolgreich geladen!"); loaded = true;
pic.Invalidate();
} } catch (Exception ex) { MessageBox.Show("Fehler beim Laden der Daten:\n\n" + ex.Message); } }
private void InBitmapZeichnen() { try { scaleX = drehzahl.Max() / 500 + 1; scaleY = (int)drehmoment.Max() / 10 + 1;
minX = -500; maxX = scaleX * 500 + 500; minY = -30; maxY = scaleY * 10 + 30;
double breite = maxX - minX; double hoehe = maxY - minY;
float mxscale = bmp.Width / (float)breite; float myscale = bmp.Height / (float)hoehe;
z.Clear(pic.BackColor); z.SmoothingMode = SmoothingMode.AntiAlias;
Matrix myMatrix = new Matrix();
myMatrix.Scale(bmp.Width / (float)breite, bmp.Height / (float)hoehe); myMatrix.Translate((float)-minX, (float)-minY, MatrixOrder.Prepend); z.Transform = myMatrix;
Pen pKoordx = new Pen(Color.Black, 1f / mxscale); Pen pKoordy = new Pen(Color.Black, 1f / myscale); z.DrawLine(pKoordy, 0, scaleY * 10, scaleX * 500, scaleY * 10); z.DrawLine(pKoordx, 0, 0, 0, scaleY * 10);
Pen pKoord1y = new Pen(Color.Gray, (float)(0.5 / mxscale)); Pen pKoord1x = new Pen(Color.Gray, (float)(0.5 / myscale)); int x; for (x = 500; x <= scaleX * 500; x += 500) z.DrawLine(pKoord1x, x, 0, x, scaleY * 10);
for (x = 0; x < scaleY * 10; x += 10) z.DrawLine(pKoord1y, 0, x, scaleX * 500, x);
SolidBrush b = new SolidBrush(Color.Red); int dfLenght = drehzahl.Length; for (int i = 0; i < dfLenght; i++) { z.FillEllipse(b, (float)drehzahl[i] - 3 / mxscale, scaleY * 10 - ((float)drehmoment[i] + 3 / myscale), 6 / mxscale, 6 / myscale); }
Font f = new Font("Tahoma", 0.7f); Brush u = new SolidBrush(Color.Black); String aux = "0/0";
StringFormat hdi = new StringFormat();
hdi.Alignment = StringAlignment.Far; hdi.LineAlignment = StringAlignment.Center; z.DrawString(aux, f, u, new Point(0, 0), hdi);
hdi.Alignment = StringAlignment.Center; hdi.LineAlignment = StringAlignment.Near; for (x = 200; x <= scaleX * 300; x += 300) z.DrawString(x.ToString(), f, u, new PointF(x, 0.7f), hdi); } |
Moderiert von Th69: C#-Tags hinzugefügt
|
|
Th69
      

Beiträge: 4807
Erhaltene Danke: 1061
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 21.05.13 09:28
Hallo tobi_2k6,
von wo rufst du denn die Methode InBitmapZeichnen() auf?
Du solltest statt der vielen Membervariablen besser lokale Variablen benutzen (sofern sinnvoll), dann kann man deinen Code auch besser verstehen (und statt z solltest du die Variable dann besser graphics nennen).
Außerdem mußt du die GDI-Objekte ( Pen, Brush, etc.) auch wieder disposen, d.h. benutze dafür am besten die using-Anweisung:
C#-Quelltext 1: 2: 3: 4:
| using (Pen p = new Pen(...)) {
} |
Hierbei wird (auch im Falle einer Exception) automatisch Dispose am Ende des Blocks aufgerufen.
Zuviele (aktive) GDI-Objekte können nämlich einen "Not enough Handle"-Fehler erzeugen.
|
|
|