Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Canvas flackern bei VCL Styles (https://www.delphipraxis.net/176705-canvas-flackern-bei-vcl-styles.html)

jfheins 22. Sep 2013 21:40

AW: Canvas flackern bei VCL Styles
 
Hast du mal probiert statt
Delphi-Quellcode:
PaintBox1.Refresh;
wirklich
Delphi-Quellcode:
PaintBox1.Invalidate;
zu benutzen?

Und eventuell könnte man noch versuchen, direkt BitBlt oder StretchBlt aufzurufen, statt Canvas.Draw. (Aber erst danach)

TTF 23. Sep 2013 16:02

AW: Canvas flackern bei VCL Styles
 
PaintBox1.Invalidate habe ich auch schon versucht.
Von BitBlt und StretchBlt habe ich ehrlich gesgt noch nie was gehört:oops::lol:

cltom 23. Sep 2013 16:16

AW: Canvas flackern bei VCL Styles
 
Das wär echt Weltklasse, wenn einer so ein Beispiel-Projekt machen könnte, das die Benutzung der zweiten Bitmap, das blitten und wie man das mit dem Timer steuert, veranschaulicht. Ich hab's leider auch noch nicht ganz kapiert. Wo wird invalidate aufgerufen, was wird im Timer gemacht, was im OnPaint der PaintBox, wo wird geblittet, wie?

Vielleicht hat einer ein Erbarmen, das wär spitze, danke im Voraus!

EWeiss 23. Sep 2013 18:36

AW: Canvas flackern bei VCL Styles
 
Zitat:

Zitat von cltom (Beitrag 1229643)
Das wär echt Weltklasse, wenn einer so ein Beispiel-Projekt machen könnte, das die Benutzung der zweiten Bitmap, das blitten und wie man das mit dem Timer steuert, veranschaulicht. Ich hab's leider auch noch nicht ganz kapiert. Wo wird invalidate aufgerufen, was wird im Timer gemacht, was im OnPaint der PaintBox, wo wird geblittet, wie?

Vielleicht hat einer ein Erbarmen, das wär spitze, danke im Voraus!

Ist ja kein problem.
Nur ich habe kein XE.. sorry ;)

Vielleicht bringt es was wenn du deinen eigenen DoubleBuffer erstellst?
Ka. Ob der in den Styles fehlerhaft ist.

gruss

Volker Z. 24. Sep 2013 00:15

AW: Canvas flackern bei VCL Styles
 
Hallo,

hast Du schon mal folgendes versucht (ich beschränke mich auf das Wesentliche, ansonsten Dein Code wie gehabt)
Delphi-Quellcode:
procedure TForm1.DrawSpectrum;
begin
  // clear background
  Buffer.Canvas.Brush.Color := TStyleManager.ActiveStyle.GetStyleColor (scWindow);
  Buffer.Canvas.FillRect(Rect(0, 0, Buffer.Width, Buffer.Height));

  // Rest wie gehabt
end;
Gruß

TTF 24. Sep 2013 20:26

AW: Canvas flackern bei VCL Styles
 
Habe ich getestet mit dem selben Ergebnis.:|

EWeiss 25. Sep 2013 15:52

AW: Canvas flackern bei VCL Styles
 
Zitat:

Zitat von TTF (Beitrag 1229804)
Habe ich getestet mit dem selben Ergebnis.:|

Check das!
Mein Kumpel war so freundlich mich an sein XE4 zu lassen
Als Hobby Schreiber ist mir das einfach zu teuer.

gruss

TTF 25. Sep 2013 20:19

AW: Canvas flackern bei VCL Styles
 
Hallo EWeiss
Herzlichsten Dank, dass du dir exra die Mühe gemacht hast. Es funktioniert top:thumb:.
Könntest du mir bitte noch sagen, wo meine Fehler lagen?
Danke und liebe Grüsse
TTF

EWeiss 25. Sep 2013 20:24

AW: Canvas flackern bei VCL Styles
 
Zitat:

Zitat von TTF (Beitrag 1229928)
Könntest du mir bitte noch sagen, wo meine Fehler lagen?

Es liegen mehrere probleme vor warum dein Quelltext auf der Basis nicht funktionieren kann.

Zitat:

PaintBox1Paint
Die Paintbbox zeichnet nicht von alleine sondern erst dann wenn man sie auffordert das zu tun.
In deinem Beispiel versuchst du das zu erreichen indem du immer wieder (sehr schlechte Angewohnheit)
über Invalidate/Refresh diese anzustoßen damit sie deine Draw Methode ausführt.
Das führt umweigerlich dazu das diese flackert was man auch nicht vermeiden kann bei der verwendeten Methode.
Innerhalb onPaint eine Draw Funktion ausführen zu lassen ist also keine gute Idee wenn das Paint event
von dem gleichen Controll ausgelößt und ausgeführt werden soll.

Invalidate veranlasst die PaintBox fortwährend neu zu zeichnen was zu unsauberen Effekten führt.

Um dein problem zu beheben werf die procedure PaintBox1Paint raus.
Und lasse diese selbst zeichnen in dem du im Timer die Draw function

Delphi-Quellcode:
PaintBox1.Canvas.Draw(0, 0, Buffer);


vor

Delphi-Quellcode:
DrawSpectrum;


einfügst!
Deshalb davor weil ansonsten deine Abtastlinie nicht mehr gezeichnet wird.

Und schmeiß das Invalidate raus.

Eigentlich war das aber schon mit kleinen Einschränkungen von Medium beantwortet worden.
Zitat:

Zitat von Medium (Beitrag 1229417)
Flackern + TPaintbox = Es wird sehr wahrscheinlich nicht im OnPaint der Paintbox gezeichnet. Richtig wäre es daher im Timer (der kann praktisch nicht zu schnell sein)
nur das das Bitmap neu zu zeichnen, und dann TPaintbox.Invalidate aufzurufen.
Im TPaintbox.OnPaint Ereignis sollte dann das Bitmap auf den Paintbox-Canvas geblittet werden.
Das wäre auch unabhängig von Styles der saubere Weg.

Zitat:

Zitat von Medium (Beitrag 1229417)
Es wird sehr wahrscheinlich nicht im OnPaint der Paintbox gezeichnet

Kann auch nicht wenn er im OnPaint mit PaintBox1..Draw versucht diese zum zeichnen zu bewegen. (bzw. sich selbst aufzurufen)
Das geht nur von außerhalb bsp. über invalidate aber mit sehr schlechten ausgang wie man sieht.

gruss

TTF 26. Sep 2013 14:51

AW: Canvas flackern bei VCL Styles
 
Hallo EWeiss
Ich danke dir vielmals für deine Unterstützung. Ich werde mir merken, wie ich künftig mit PaintBoxes zu zeichnen habe.8-)
Liebe Grüsse
TTF


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:55 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz