Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

  • 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

  • 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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.