C++ Objekt verschwindet nach einiger Zeit



  • Hallo Community

    Ich benutze C++ Builder 2007 von Borland
    und habe ein Objekt erstellt, das von TImage abgeleitet ist.

    Diese Objekt benutze ich ebenfalls in einem Objekt das von einer TScrollBox abgeleitet ist.
    Ich erstelle also in dem Objekt TScrollBox 8 Objekte von dem TImage.

    Die TImage-Objekte dienen zur grafischen Übersicht von Werten.
    Nun tritt aber manchmal, nach einiger Zeit, der Effekt auf, das eines oder mehrere der 8 TImage-Objekte verschwinden.
    In dem Objekt selbst wird die Zeichenroutine noch durchlaufen, jedoch erscheint die grafische Darstellung nicht mehr.
    erst nach dem schließen und wieder öffnen des TScrollBox-Objekts ist das verschwunde wieder sichtbar.

    //------------------------------------------------------------------------------
    /* TBalkenBitmap */
    __fastcall TBalkenBitmap::TBalkenBitmap(): Graphics::TBitmap(){}
    //------------------------------------------------------------------------------
    void __fastcall TBalkenBitmap::MakeLike(Graphics::TBitmap* ATemplate)
    {
    Width = ATemplate->Width;
    Height = ATemplate->Height;
    Canvas->Brush->Color = TColor(clWindowFrame);
    Canvas->Brush->Style = bsSolid;
    Canvas->FillRect(Rect(0, 0, Width, Height));
    }
    //------------------------------------------------------------------------------
    
    //------------------------------------------------------------------------------
    
    void __fastcall TBalken::Zeichnen()
    {
    int FillSize;
    int W, H;
    
    std::auto_ptr<TBalkenBitmap> OverlayImage(new TBalkenBitmap());
    
    TRect PaintRect;
    
    PaintRect = ClientRect;
    
    PaintBackground(this->Picture->Bitmap);
    
    InflateRect(&PaintRect, -1, -1);
    
    OverlayImage->MakeLike(this->Picture->Bitmap);
    PaintBackground(OverlayImage.get());
    
    W = PaintRect.Right - PaintRect.Left + 1;
    H = PaintRect.Bottom - PaintRect.Top + 1;
    
    Canvas->Brush->Color = FHinterGrundFarbe;
    Canvas->FillRect(PaintRect);
    Canvas->Pen->Color = clBlack;
    Canvas->Pen->Width = 1;
    Canvas->Brush->Color = FBalkenFarbe;
    
    FillSize = SolveForX(PercentDone, H);
    if (FillSize >= H)
    FillSize = H - 1;
    
    NegativenMinPruefen();
    
    if (FNegativAnz)
    {
    Canvas->FillRect(Rect(PaintRect.Left,H - FillSize,W, H/2));
    FNegativAnz = false;
    }
    else
    Canvas->FillRect(Rect(PaintRect.Left,H - FillSize,W, H));
    
    Canvas->CopyMode = cmSrcInvert;
    Canvas->Draw(0, 0, OverlayImage.get());
    Canvas->CopyMode = cmSrcCopy;
    PaintAsText(this->Picture->Bitmap, PaintRect);
    Canvas->CopyMode = cmSrcCopy;
    Canvas->Draw(0, 0, this->Picture->Bitmap);
    
    }
    //------------------------------------------------------------------------------
    
    //------------------------------------------------------------------------------
    void __fastcall TBalken::PaintAsText(Graphics::TBitmap* AnImage, const TRect& PaintRect)
    {
    AnsiString S , E;
    int X, Y;
    std::auto_ptr<TBalkenBitmap> OverRect(new TBalkenBitmap);
    
    OverRect->MakeLike(AnImage);
    PaintBackground(OverRect.get());
    
    if (FProzentAnz == true)
    {
    S = AnsiString((int)PercentDone);
    E += "%";
    }
    else
    {
    S = FCurValue;
    E = FEinheit;
    }
    
    OverRect->Canvas->Brush->Style = bsClear;
    OverRect->Canvas->Font = Font;
    OverRect->Canvas->Font->Color = clWhite;
    
    if (E.Length())
    {
    X = (PaintRect.Right - PaintRect.Left + 1 - OverRect->Canvas->TextWidth(S)) / 2;
    Y = (((PaintRect.Bottom - PaintRect.Top + 1) /2) - OverRect->Canvas->TextHeight(S));
    OverRect->Canvas->TextRect(PaintRect, X, Y, S);
    X = (PaintRect.Right - PaintRect.Left + 1 - OverRect->Canvas->TextWidth(E)) / 2;
    Y = ((PaintRect.Bottom - PaintRect.Top + 1) / 2) ;
    OverRect->Canvas->TextRect(PaintRect, X, Y, E);
    }
    else
    {
    X = (PaintRect.Right - PaintRect.Left + 1 - OverRect->Canvas->TextWidth(S)) / 2;
    Y = (PaintRect.Bottom - PaintRect.Top + 1 - OverRect->Canvas->TextHeight(S)) / 2;
    OverRect->Canvas->TextRect(PaintRect, X, Y, S);
    }
    AnImage->Canvas->CopyMode = cmSrcInvert;
    AnImage->Canvas->Draw(0, 0, OverRect.get());
    }
    //------------------------------------------------------------------------------
    void __fastcall TBalken::PaintBackground(Graphics::TBitmap* AnImage)
    {
    TRect ARect;
    AnImage->Canvas->CopyMode = cmBlackness;
    ARect = Rect(0, 0, Width, Height);
    AnImage->Canvas->CopyRect(ARect, AnImage->Canvas, ARect);
    AnImage->Canvas->CopyMode = cmSrcCopy;
    }
    //------------------------------------------------------------------------------
    

    Hat jemand ne Idee?

    Habe auch schon die Methode Repaint selbst erstellt und in dieser dann Zeichen()
    aufgerufen aber es tritt trotzdem nach einiger Zeit der Fehler auf

    mfg
    alex



  • Nimm doch statt der TScrollbox eine TPaintBox und überschreibe dort die Methode Paint.



  • Nur sehr sehr sehr sehr sehr ungern

    Hat nicht jemand noch nen anderen Lösungsvorschlag parat?



  • Du machst bei jedem Zeichnen:

    ... new TBalkenBitmap ...

    werden das mit der Zeit nicht zu viele?
    Wer löscht die irgendwann mal?



  • könntest recht haben, am Ende ein der zeichenfunktion ein delete TBalkenBitmap machen??!

    Aber das scheint nicht das Problem zu sein.
    Das Objekt ist ansich noch da, aber nicht sichtbar.
    Wenn ich Neu Zeichne sieht man ab und an da wo das Objekt war wies aufflackert.
    Irgendwie wirds unsichtbar gemacht, nur warum und wie kann ichs verhindern ? 🙂

    Danke
    ALx



  • Wann/ wie oft wird denn "Zeichnen" gerufen?

    Sollen immer 8 Objekte behalten werden?
    Dann würde ich die in einem Member- Array (grösse 😎 halten/ verwalten.

    Oder ist die Anzahl variabel nötig?

    Gruss
    Frank



  • Variabel ist immer gut 🙂
    Zeichen wird bei jeder Wertänderung aufgerufen, sowie bei Veränderung der Einstellungen wie Hintergrundfarbe, Balkenfarbe oder Anzeige...

    In meinem Projekt ist es schon nötig das gerade die 8 Säulen sichtbar sind.
    Komischerweiße passiert das verschwinden mal schnell mal langsam.
    bei einem Rechner fast gar nicht oder gar nicht
    und beim anderen sehr oft und da kann es auch sein das die Schrift, die ich in mein Objekt schreibe mit PaintAsText
    vorher auch mal verschwindet?!

    An was liegts?
    Kann es sein das ne andere Methode in Hauptprogramm irgendwie über eines meiner Objekte drüberschreibt/malt?

    Alex



  • Dann erzeuge doch am Anfang 8 Objekte!
    Speicher deren Adressen in einem Array!
    Beim Zeichnen malst Du nur noch in das jeweilige Objekt (über Arry einfach ansprechbar)

    Bei jedem Zeichnen was neues erzeugen sollte eigentlich falsch sein.
    (Am Ende immer löschen sollte auch nix bringen - dann ist das Ding nie zu sehen)

    Gruss
    Frank


Anmelden zum Antworten