Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#1

Invalidate, Repaint, Refresh, Update, Paint... ?

  Alt 14. Sep 2009, 12:45
Aloah!

Ich verzweifel gerade am simplen Neuzeichnen meiner selbst gebauten Komponenten. Diese sind direkt von TGraphicControl abgeleitet, und tragen einen kleinen Timer mit sich herum der sie auf Wunsch blinken lässt. Jeder "Blink" muss dabei dann natürlich neu gezeichnet werden, was ich bisher einfach über ein Repaint gemacht hatte.
Delphi-Quellcode:
procedure TMyGraphObject.BlinkProc(Sender: TObject);
begin
  FIsLit := not FIsLit;
  Repaint;
end;
Und im Paint wird dann anhand von FIsLit in der einen oder anderen Farbe gezeichnet. Nix spannendes.

Nun habe ich ein Projekt, bei dem sehr viele dieser (und anderer) Komponenten auf einem Formular liegen - so ~200-400 Stück. (Es ist ein Prozessabbild, da muss so viel rein ). Die Krux ist nun, dass offenbar jedes Repaint jeder Komponente ein komplettes Neuzeichnen des gesamten Formulars auslöst, wodurch das ganze merkbar lahm wird, wenn da mal so 50 Kästchen blinken sollen. (Und damit meine ich RICHTIG lahm, die Blink-Frequenz ist auf 750ms, und die werden nichtmal mehr geschafft. Dabei sind es alles nur einfache Figuren, keine aufwendigen Farbverläufe o.ä.)
Invalidate, Refresh, und auch ein InvalidateRect mit einem Rect in Größe der Kompo führen ebenfalls alle zu o.g. Verhalten.
Update löst überhaupt kein Neuzeichnen aus.

Abhilfe, und zwar massiv, schafft hier zwar ein Tauschen von Repaint mit Paint, allerdings werden dann natürlich z.B. Labels (generell alle TGraphicControls - also Parent-Canvas nutzende) die auf diesen Komponenten liegen natürlich einfach übernagelt. DAS darf nun aber auch nicht passieren!

Wie kann ich es erreichen, dass wirklich NUR die Elemente mit neu gezeichnet werden, die auch wirklich von meinem gerade übermalt worden sind (anstelle des kompletten Fensters)?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat