Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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 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 erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...