Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Flackern bei TCustomControl (https://www.delphipraxis.net/155249-flackern-bei-tcustomcontrol.html)

andyS91 14. Okt 2010 14:59

Flackern bei TCustomControl
 
Hallo,
ich habe eine Funktions Plotter Klasse geschrieben, die autoamtisch ein Kooridnatensystem zeichnet und Dinge wie verschieben der Grafik und zoomen übernimmt. Abgeleitet ist die Klasse von TCustomControl.
Das Problem: Die Grafik flackert, wenn man mit der Maus darüber fährt oder ähnliches.
Das Formular auf Doublebuffered := True zu setzten brachte nichts deshalb hab ich einmal ausprobiert die Klasse von TImage statt von TCustomControl abzuleiten (TImage zeichnet sich ja bekanntlich von selbst neu) und siehe da das flackern verschwand - allerdings habe ich gehört das man eigene Grafikklassen nicht von TImage sondern immer nur von TCustomControl oder TGraphicControl ableiten soll.
Nun zu meinen Fragen:
1. Warum sollte man von TCustomControl statt von TImage ableiten und
2. Was macht TImage um das flackern zu vermeiden?
Danke für eure Hilfe,
Andy

stahli 14. Okt 2010 18:15

AW: Flackern bei TCustomControl
 
Hallo Andy und herzlich willkommen :)

Ich kann das jetzt noch nicht beantworten aber vielleicht hilft es, wenn Du mal Deine Delphi-Version nennst und etwas Quelltext zeigst.
Schreibst Du auf den Canvas des TImage?

bernau 14. Okt 2010 21:21

AW: Flackern bei TCustomControl
 
Ein Bitmap ist mal eben schnell gezeichnet. Dein Funktionsplott braucht eine gewisse Zeit, weil du zwischendurch Berechnungen durchführst. Vor dem Zeichen wird der Hintergrund neu gezeichnet und der vorherige Plot ggf. entfernt, um danach den Plot wieder neu zu zeichnen. Das Problem hatte ich auch mal. Ich habe mir damit geholfen, daß ich ein TBitmap instanziert habe, in dieses Bitmap hineingezeichnet habe, und danach daß fertige Bitmap auf den original canvas kopiert habe.

Hansa 14. Okt 2010 23:52

AW: Flackern bei TCustomControl
 
Zitat:

Zitat von andyS91 (Beitrag 1055799)
..allerdings habe ich gehört das man eigene Grafikklassen nicht von TImage sondern immer nur von TCustomControl..

Wer hat denn das behauptet ? :shock: Nebeneffekte tauchen immer mal auf. Aber : die Custom-Dinger, bei denen muss SEHR viel selber gemacht werden. Am besten versucht man immer, die von der am besten/nächsten liegenden in Delphi vordefinierten Klasse abzuleiten. Und dann noch TCustomControl ? Viel tiefer gehts fast nicht mehr. Da muss so ziemlich ALLES neu gemacht werden. TImage ist jedenfalls vollständig und das Selbermachen (also Rad neu erfinden) entfällt mehr oder weniger.

Ich habe z.B. diverse Sachen. Spezielles TEdit, TDateTimePicker, TPanel und ich werde den Teufel tun, z.B. das eigene TEdit nicht von TEdit sondern von TCustomEdit abzuleiten. Guck dir das mal an (beim TEdit/TCustomEdit schön zu sehen). Das TEdit ist ziemlich "normal". Beim TCustomEdit werden offensichtlich etliche WinAPI Aufrufe eingeführt. Da steht z.B. viel mit "message". Bei mir im eigenen Source wird das kein einziges mal verwendet. Warum soll man die denn selber programmieren ? Ganz zu schweigen von der Zukunft. Mac/Linux etc. Compiler soll kommen. D.h. : WinAPI ist eventuell ungeeignet. Und jetzt ? Die Frage geht IMHO einzig und alleine an den, der Dir das gesagt hat. Frage den am besten mal, wo er seine OOP Kenntnisse her hat. :mrgreen:

DeddyH 15. Okt 2010 08:27

AW: Flackern bei TCustomControl
 
Zitat:

Zitat von Hansa (Beitrag 1055880)
Guck dir das mal an (beim TEdit/TCustomEdit schön zu sehen). Das TEdit ist ziemlich "normal". Beim TCustomEdit werden offensichtlich etliche WinAPI Aufrufe eingeführt. Da steht z.B. viel mit "message". Bei mir im eigenen Source wird das kein einziges mal verwendet. Warum soll man die denn selber programmieren ?

*Boah nee eyh*. Der Grund, weshalb man von TCustomXXX ableitet, ist im Grunde folgender: in den meisten Fällen ist es so, dass TCustomXXX bereits (zumindest weitestgehend) fertig implementiert ist, die Properties aber nicht veröffentlicht wurden, sondern im Protected-Abschnitt deklariert sind. Das Sichtbarmachen geschieht dann in den Ableitungen, man kann also genau festlegen, was öffentlich sein soll und was nicht, und zwar in jeder Ableitung anders. In Delphi kann man Sichtbarkeiten zwar erhöhen, aber nicht verringern, so dass man u.U. Properties veröffentlicht hat, die man gar nicht will, wenn man nicht von TCustomXXX ableitet.

roga 15. Okt 2010 11:20

AW: Flackern bei TCustomControl
 
Was man letzendlich für die Komponente verwendet, kommt meist auf den Einsatzfall an. Die besten Erfahrungen konnte ich bisher mit dem TCustomControl machen, hier sollte direkt im Create der Komponente DoubleBuffered auf True gesetzt und wie @bernau bereits erwähnte, für die Zeichenoperationen ein temporäres Bitmap genutzt werden. Verbesserungen bringen auch die Funktionen BitBlt, StretchBlt etc.

roga

andyS91 19. Okt 2010 22:18

AW: Flackern bei TCustomControl
 
Entschuldigung, dass ich mich erst jetzt wieder melde - hatte viel mit der Schule zu tun. Vielen Dank für eure Vorschläge. Das Zeichnen in ein TBitmap, dass dann auf einmal in das Canvas kopiert wird hat super geklappt. Warum Doublebuffered := True nichts gebracht hat versteh ich allerdings immer noch nicht so ganz. Eigentlich hätte das doch genau das machen müssen, oder? Wie auch immer - da es jetzt klappt bin ich fürs Erste zufrieden :)
Vielen Dank nochmal
MfG Andy


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 Uhr.

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