000
01.09.2008, 08:46 Uhr
~GastBenutzer123
Gast
|
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 |