AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ich ein Repaint unterbinden?

Ein Thema von Duddits · begonnen am 29. Jan 2007 · letzter Beitrag vom 29. Jan 2007
Antwort Antwort
Duddits

Registriert seit: 26. Jan 2007
2 Beiträge
 
#1

Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 06:17
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.
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#2

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 06:27
Wenn Du uns jetzt noch sagst welche Delphi-Version Du hast wäre das Zuckersüß von Dir

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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Duddits

Registriert seit: 26. Jan 2007
2 Beiträge
 
#3

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 06:55
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 07:14
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#5

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 08:03
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 08:48
... und das auch nur, wenn nicht csLoading im ComponentState ist. Damit spart man sich auch dies nochmal kräftig
  Mit Zitat antworten Zitat
Sidorion

Registriert seit: 23. Jun 2005
403 Beiträge
 
#7

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 09:39
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.
Manchmal sehen Dinge, die wie Dinge aussehen wollen mehr wie Dinge aus, als Dinge
<Esmerelda Wetterwachs>
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Wie kann ich ein Repaint unterbinden?

  Alt 29. Jan 2007, 12:54
Zitat von Sidorion:
csLoading greift nur beim Erstellen aus der DFM
Stimmt.

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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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