aLeXanDer.. Geschrieben 29. August 2008 Geschrieben 29. August 2008 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 Zitieren
flashpixx Geschrieben 29. August 2008 Geschrieben 29. August 2008 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 Zitieren
aLeXanDer.. Geschrieben 29. August 2008 Autor Geschrieben 29. August 2008 Nein die habe ich nicht extra implementiert. Wie müsste ich se dann implementieren? dann der Funktion Repaint das Zeichnen zuweisen=? lg lalx Zitieren
aLeXanDer.. Geschrieben 1. September 2008 Autor Geschrieben 1. September 2008 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 Zitieren
aLeXanDer.. Geschrieben 1. September 2008 Autor Geschrieben 1. September 2008 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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.