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


Anmelden zum Antworten