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 Wie kann ich ein Repaint unterbinden? (https://www.delphipraxis.net/85308-wie-kann-ich-ein-repaint-unterbinden.html)

Duddits 29. Jan 2007 06:17


Wie kann ich ein Repaint unterbinden?
 
Hallo,
ich erstelle zur Laufzeit eigene Panels, welche zusätzlich einen Gradienten und ein Label enthalten. Diesen Panels werden dann aus einer XML-Datei sämtliche Eigenschaften zugewiesen, also z.B. top,left,width.height,text, gradientenfarbe, etc.
Das Problem ist, dass der Vorgang ziemlich lange dauert (bei 70 Panels etwa 30sec). Ich denke, dass es an dem neuzeichnen der Panels liegt, was nach jeder neuen Änderung (z.B. Position) erfolgt. Jedes Panel wird also etwa 7mal neugezeichnet, was wohl viel Zeit in Anspruch nimmt.
Meine Frage ist nun, wie ich das neuzeichnen unterbinden kann, damit ich erst wenn alle Eigenschaften gestetzt sind, ein refresh machen kann. Ich hab es auch schon mit einem "Load-Frame" versucht, also das andere Frame in den Hintergrund und unsichtbar und ein anderes Frame mit Ladebalken davor. Bringt aber keinen Zeitgewinn.
Hat jemand einen Tipp?

Oops, ich benutzte Borland Developer Studio 2006.

Phoenix 29. Jan 2007 06:27

Re: Wie kann ich ein Repaint unterbinden?
 
Wenn Du uns jetzt noch sagst welche Delphi-Version Du hast wäre das Zuckersüß von Dir :love:

Nee, im Ernst: Das muss gehen. Im Prinzip macht Delphi auch nichts anderes, wenn es Forms erstellt.
Es werden die einzelnen Komponenten erzeugt, dann die Properties aus den einkompilierten DFM-Ressourcen (also diese Formbeschreibungssprache die Du siehst wenn Du beim Form Ansicht als Text-DFM auswählst), und hinterher erst neu gezeichnet.

Auch Delphi unterdrückt innerhalb der Komponenten das Neuzeichnen, solange die Controls alle upgedatet werden. Ich müsste jetzt allerdings selber in den VCL-Sourcen nachlesen, und dafür hab ich ehrlich gesagt gerade keine Zeit (heute erste Klausur von 5en in dieser und nächster Woche.. lernen geht vor ;-) ).

Ich glaube aber, die ganzen Controls haben sowas wie ein privates Property in Richtung 'Du wirst gerade erstellt / upgedatet... also Zeichne Dich erstmal nicht neu'. Im schlimmsten Fall (du hast grad kein Delphi mit VCL-Sourcen) mal ne Turbo Delphi organisieren und dort nachsuchen, da wirst Du mit an Sicherheit grenzender Wahrscheinlichkeit fündig.

Duddits 29. Jan 2007 06:55

Re: Wie kann ich ein Repaint unterbinden?
 
Vielen Dank für den Tipp, habs jetzt aber so hinbekommen.
Anstatt nur das Frame auf invisble zu setzen hab ich jetzt jedes einzelne Panel direkt beim create erstmal auf invisble gesetzt.
Und am Ende der Zuweisungen setze ich alle auf sichtbar. Ergebnis: 3 anstatt 30 sec :)

SirThornberry 29. Jan 2007 07:14

Re: Wie kann ich ein Repaint unterbinden?
 
Anstelle "Left", "Top", "Height" und "Width" einzeln zu setzen solltest du einfach SetBounds aufrufen. Ansonsten wird intern 4 mal SetBounds aufgerufen was der Performance nicht förderlich ist.

Robert Marquardt 29. Jan 2007 08:03

Re: Wie kann ich ein Repaint unterbinden?
 
Das klingt eher danach als ob dieses Gradientenpanel schlecht implementiert ist. Intern sollte bei Aenderungen von Properties nie Repaint oder Update sondern immer nur Invalidate aufgerufen werden. Dadurch gibt es nur ein Neuzeichnen wenn man mehrere Properties nacheinander aendert.

Muetze1 29. Jan 2007 08:48

Re: Wie kann ich ein Repaint unterbinden?
 
... und das auch nur, wenn nicht csLoading im ComponentState ist. Damit spart man sich auch dies nochmal kräftig

Sidorion 29. Jan 2007 09:39

Re: Wie kann ich ein Repaint unterbinden?
 
csLoading greift nur beim Erstellen aus der DFM, also nur innerhalb des Konstruktors. Du kannst aber den Parent als letzes zuweisen, dann kann das Panel garnicht gezeichnet werden.

Muetze1 29. Jan 2007 12:54

Re: Wie kann ich ein Repaint unterbinden?
 
Zitat:

Zitat von Sidorion
csLoading greift nur beim Erstellen aus der DFM

Stimmt.

Zitat:

Zitat von Sidorion
also nur innerhalb des Konstruktors.

Nein. Nach dem Constructor wird gestreamed und dabei ist csLoading gesetzt. Man kann damit alle Neuzeichenprozesse unterbinden, die sonst beim Setzen der Properties ausgelöst werden, wenn die DFM bzw. die EXE-Resourcen für das Formular gestreamed werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:03 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