Speicher wieder freigeben
-
Hi,
Ich hab ein Programm mit 3 Registerkarten geschrieben in denen immer bei ausruf ein Diagramm gezeichnet wird. Wenn ich die Reiter etwa 30 mal "druchklicke" dann zeichnet die Software immer weniger von dem Diagramm. Ich habe mal gelesen dass bei Neuaufruf des Reiters ( und somit der Registerkarte ) die Karte neu in den Speicher geschrieben wird ohne das sich der alte eintrag überschreibt und somit der Speicher voll wird.
Wie kann ich den Speicher beim Umschalten auf eine andere Reg-Karte löschen?
Ich hoffe ich hab das einigermassen verständlich geschrieben.
Vielen Dank!!!
MFG BAST
-
Ich habe mal gelesen dass bei Neuaufruf des Reiters ( und somit der Registerkarte ) die Karte neu in den Speicher geschrieben wird ohne das sich der alte eintrag überschreibt
Falls es ein Buch ist, schmeiss es weg
P.S. Such den Fehler in Deiner Diagrammzeichenroutine!
-
HMM,
is einfach nur stures zeichnen von Linien, Text und Rechtecken ( 25 Stück in ner Schleife) mit Parametern.
Es stand glaub ich in der Hilfe von VC oder hier im Forum.. weiss nich mehr.
Aber wie gebe ich den Speicher wieder frei???
MFG BAST
-
is einfach nur stures zeichnen von Linien, Text und Rechtecken
Du wirst nicht glauben, wieviele Leute das denken und wie häufig der Fehler trotzdem auftritt.
Allerdings kann Dir ohne Quellcode niemand helfen!
-
OK! - Der Quellcode is ne gute Idee!!
Ist nicht gerade Professionell gemacht aber relativ Eindeutig
void CSeite1::OnPaint() { CPaintDC dc(this); // device context for painting //eigener code anfang long teiler, max1, min1, minmax1; switch(fall1) { case 1:{teiler = 1; max1=2760; min1=1380; minmax1=1380;break;} //500 case 2:{teiler = 1; max1=5520; min1=2760; minmax1=2760;break;} //250 case 3:{teiler = 2; max1=11000; min1=5520; minmax1=5480;break;} //125 case 4:{teiler = 4; max1=22100; min1=11000; minmax1=11100;break;} //60 case 5:{teiler = 8; max1=44200; min1=22100; minmax1=22100;break;} //30 } ///////////////////////// ////////zeichnen///////// ///////////////////////// //CClientDC dc(this); //grundierung CRect MyRectangle(2,2,615,240); dc.Rectangle(&MyRectangle); //schwarzer stift CPen BlackPen(PS_SOLID,1,RGB(0,0,0)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BlackPen ); //Messungwerte im Toleranzbereich?? // Textausgabe Mittelwert und median der 1. Messung if (M1x_tol == 15) dc.TextOut(10,225,"min. 1 Wert über max. Toleranzgrenze!!"); if (M1n_tol ==10) dc.TextOut(300,225,"min. 1 Wert unter min. Toleranzgrenze!!"); else{dc.TextOut(0,0,"");} //horizontal Linie X-Achse dc.MoveTo( 10, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); //Pfeil //horizontal X-Achse dc.MoveTo(607, ((160*(max1-MedianS1))/minmax1+39)+3); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(607, ((160*(max1-MedianS1))/minmax1+39)-3); //vertikal Linie Y-Achse dc.MoveTo(15,7); dc.LineTo(15,238); //Pfeil //vertikal Y-Achse dc.MoveTo(12,12); dc.LineTo(15,7); dc.LineTo(18,12); //Toleranzenlinie (strich strich) //strich strich init CPen BlackDashPen(PS_DASH,1,RGB(0,0,0)); pOriginalPen = dc.SelectObject( &BlackDashPen ); //drüber dc.MoveTo( 15,39); dc.LineTo(612,39); //drunter dc.MoveTo( 15,199); dc.LineTo(612,199); //160 pixel Toleranzbereich //differenzen vom Median ->Ausgabe Grafik for (i=0;i<25;i++) { CPen BluePen(PS_INSIDEFRAME,10,RGB(0,0,255)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BluePen ); if (MedianS1<=MwertS1[i]) //oberer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1), //höhe der X-Achse - (Mwert-Med) 25+(i+1)*23, ((160*(max1-MedianS1))/minmax1)+39 //"höhe" der X-Achse ); dc.Rectangle(&MyRectangle); } else //unterer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), ((160*(max1-MedianS1))/minmax1)+39, //"höhe" der X-Achse 25+(i+1)*23, (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1) //höhe der X-Achse - (Mwert-Med)); ); dc.Rectangle(&MyRectangle); } } //originalstift zurück dc.SelectObject(pOriginalPen); m_MittelS1 = MittelwertS1; m_MedianS1 = MedianS1; UpdateData(FALSE);
Thx A lot!!!!
MFG Bast
-
Ach ja :
das ist jetzt eine der 3 Registerkarten, die anderen beiden sehen genau so aus.
Die Reg-Karten werden mit den Befehlen Selchangtab und changetab (oder so) umgeschalten.
danke nochmal!
Bast
-
Na da haben wir doch schon den Fehler:
CPen BlackPen(PS_SOLID,1,RGB(0,0,0)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BlackPen); // richtig //strich strich init CPen BlackDashPen(PS_DASH,1,RGB(0,0,0)); pOriginalPen = dc.SelectObject( &BlackDashPen ); // falsch, pOriginalPen MUSS den Wert behalten, den er in Zeile 3 bekam !!!
-
AHA,
also muss da noch die übergabe rein ??
CPen* pOriginalPen;
oder wie meinst du das?
bast
-
Lass einfach bei jedem dc.SelectObject ausser dem 1. das
'pOriginalPen = '
weg.
-
Na dann versuch ichs mal !
Vielen Dank!!
MFGBAST
-
Hi nochmal..
ich hab es so geändert.Das Proggi funzt. Aber es tritt das gleiche Problem wieder auf.
void CSeite1::OnPaint() { CPaintDC dc(this); // device context for painting //eigener code anfang long teiler, max1, min1, minmax1; switch(fall1) { case 1:{teiler = 1; max1=2760; min1=1380; minmax1=1380;break;} //500 case 2:{teiler = 1; max1=5520; min1=2760; minmax1=2760;break;} //250 case 3:{teiler = 2; max1=11000; min1=5520; minmax1=5480;break;} //125 case 4:{teiler = 4; max1=22100; min1=11000; minmax1=11100;break;} //60 case 5:{teiler = 8; max1=44200; min1=22100; minmax1=22100;break;} //30 } ///////////////////////// ////////zeichnen///////// ///////////////////////// //CClientDC dc(this); //grundierung CRect MyRectangle(2,2,615,240); dc.Rectangle(&MyRectangle); //schwarzer stift CPen BlackPen(PS_SOLID,1,RGB(0,0,0)); CPen* pOriginalPen; pOriginalPen = dc.SelectObject( &BlackPen ); //Messungwerte im Toleranzbereich?? // Textausgabe Mittelwert und median der 1. Messung if (M1x_tol == 15) dc.TextOut(10,225,"min. 1 Wert über max. Toleranzgrenze!!"); if (M1n_tol ==10) dc.TextOut(300,225,"min. 1 Wert unter min. Toleranzgrenze!!"); else{dc.TextOut(0,0,"");} //horizontal Linie X-Achse dc.MoveTo( 10, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); //Pfeil //horizontal X-Achse dc.MoveTo(607, ((160*(max1-MedianS1))/minmax1+39)+3); dc.LineTo(612, ((160*(max1-MedianS1))/minmax1+39)); dc.LineTo(607, ((160*(max1-MedianS1))/minmax1+39)-3); //vertikal Linie Y-Achse dc.MoveTo(15,7); dc.LineTo(15,238); //Pfeil //vertikal Y-Achse dc.MoveTo(12,12); dc.LineTo(15,7); dc.LineTo(18,12); //Toleranzenlinie (strich strich) //strich strich init CPen BlackDashPen(PS_DASH,1,RGB(0,0,0)); dc.SelectObject( &BlackDashPen ); //drüber dc.MoveTo( 15,39); dc.LineTo(612,39); //drunter dc.MoveTo( 15,199); dc.LineTo(612,199); //160 pixel Toleranzbereich //differenzen vom Median ->Ausgabe Grafik for (i=0;i<25;i++) { CPen BluePen(PS_INSIDEFRAME,10,RGB(0,0,255)); dc.SelectObject( &BluePen ); if (MedianS1<=MwertS1[i]) //oberer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1), //höhe der X-Achse - (Mwert-Med) 25+(i+1)*23, ((160*(max1-MedianS1))/minmax1)+39 //"höhe" der X-Achse ); dc.Rectangle(&MyRectangle); } else //unterer Zeichenbereich { CRect MyRectangle( 25+((i*23)+4), ((160*(max1-MedianS1))/minmax1)+39, //"höhe" der X-Achse 25+(i+1)*23, (((160*(max1-MedianS1))/minmax1)+39) - (((MwertS1[i] - MedianS1)*160)/minmax1) //höhe der X-Achse - (Mwert-Med)); ); dc.Rectangle(&MyRectangle); } } //originalstift zurück dc.SelectObject(pOriginalPen); m_MittelS1 = MittelwertS1; m_MedianS1 = MedianS1; UpdateData(FALSE);
Hat jemand noch ne Idee?? Ich tippe auf nen Speicherüberlauf. (??)
MFG Bast
-
Ok, das nächste Problem in Deinem Code:
for (i=0;i<25;i++) { CPen BluePen(PS_INSIDEFRAME,10,RGB(0,0,255)); dc.SelectObject( &BluePen ); }
Was passiert?
1. Schleifendurchlauf:
-Stift wird erstellt
-Stift wird in DC selektiert
- Destruktor des Stifts wird aufgerufen, Stift wird allerdings NICHT gelöscht, weil er noch selektiert ist.
2. Schleifendurchlauf:
-neuer Stift wird erstellt
...Problem erkannt?
-
Aha,
wäre sozusagen besser wenn ich den stift vor die scleife nehme- damit er nich immer neu erstellt werden muss...
?
Danke sagt bast