![]() |
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. |
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. |
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 :) |
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.
|
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.
|
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
|
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.
|
Re: Wie kann ich ein Repaint unterbinden?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:35 Uhr. |
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