Veröffentlicht 29. August 200816 j Hallo Community Ich habe folgendes Problem: Ich habe ein Objekt erstellt, dass von einem TImage abgeleitet ist. Es soll so eine Art Balkenanzeige darstellen, mit festlegen von Min und MaxWert und aktuellem Progress. Nun hab ich 8 solcher Objekte auf meiner Form und ab und an passiert es, dass ein Objekt aufeinmal verschwindet und da wo es gestanden hat eine Lücke klafft... Das kanne muss im Zeichnen passieren, hab da auch schon angehalten aber er läuft normal durch, dennoch keine anzeige. Tritt auch nur manchmal auf.Sehr komisch. Manchmal bleibt das Objekt da , aber der Text im Objekt erscheint nicht mehr. 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; } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ /* TBalkenBitmap */ __fastcall BalkenBitmap::BalkenBitmap(): Graphics::TBitmap(){} //------------------------------------------------------------------------------ void __fastcall BalkenBitmap::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)); } //------------------------------------------------------------------------------ Danke Alex
29. August 200816 j Hallo, ohne jetzt mich komplett in den Code eingelesen zu haben, kann es sein, dass Du auch die Methode "repaint" passend implementieren musst? Denn (und das ist wirklich lange her) musste ich bei einem TImage auch die repaint Methode passend implementieren, die bei der Fensterveränderung usw aufgerufen wird HTH Phil
29. August 200816 j Autor Nein die habe ich nicht extra implementiert. Wie müsste ich se dann implementieren? dann der Funktion Repaint das Zeichnen zuweisen=? lg lalx
1. September 200816 j Autor Also auch die neu Implementierung hat nicht gefruchtet ab und an verschwindet immernoch eines der 8 Objekte. Im Objekt selbst läuft er aber in die Zeichenroutine hinein nur erscheint keine Ausgabe. ?! Mfg Alex
1. September 200816 j Autor Hab noch ein Objekt erstellt, auch bei diesem Objekt tritt dieses Phänomen auf. Nach einiger Zeit verschwindet es. Also keine Anzeige, jedoch ist das Objekt noch da. aber nicht sichtbar?!! Wie kann ich das verhindern?Warum passierts überhaupt? lg Alx
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.