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
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
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
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
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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden