Speicher wieder freigeben



  • 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