Announcement

Collapse
No announcement yet.

Repaint vs. Refresh

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Repaint vs. Refresh

    Hallo,

    kann mir bitte jemand sagen, was der Unterschied zwischen repaint und refresh ist.
    Ich habe das Gefühl es passiert dasselbe, aber es wird doch ein Unterschied zwischen diesen beiden Methoden geben.<br><br>Danke schon mal für eine Antwort<Br>Tyrael

  • #2
    <pre>

    <code><font size=2 face="Courier New"><b>procedure </b>TControl.Refresh;
    <b>begin
    </b>Repaint;
    <b>end</b>;
    <br>
    <b>procedure </b>TControl.Repaint;
    <b>var
    </b>DC: HDC;
    <b>begin
    if </b>(Visible <b>or </b>(csDesigning <b>in </b>ComponentState) <b>and
    not </b>(csNoDesignVisible <b>in </b>ControlStyle)) <b>and </b>(Parent &lt;&gt; <b>nil</b>) <b>and
    </b>Parent.HandleAllocated <b>then
    if </b>csOpaque <b>in </b>ControlStyle <b>then
    begin
    </b>DC := GetDC(Parent.Handle);
    <b>try
    </b>IntersectClipRect(DC, Left, Top, Left + Width, Top + Height);
    Parent.PaintControls(DC, Self);
    <b>finally
    </b>ReleaseDC(Parent.Handle, DC);
    <b>end</b>;
    <b>end else
    begin
    </b>Invalidate;
    Update;
    <b>end</b>;
    <b>end</b>;
    </font>
    </code></pre>

    Wie man sieht, auf unterster Ebene gibt es in D5 keinen Unterschied.<br>

    Allerdings kann man .Repaint überschreiben, da virtual. Vielleicht wäre es besser gewesen .Refresh als virtual zu deklarieren, da man erwartet das .Refresh auch interne Staties, wie z.b. Datenbanken, auffrischen kann. .Repaint wiederum suggeriert das das Control nur neu gezeichnet wird.

    Gruß Hage

    Comment


    • #3
      Danke für deine Antwort Hagen.

      Ich habe auch hier auch noch ne Definition gefunden.<br>
      Refresh: löscht jedes Bild auf dem Bildschirm und zeichnet alle Steuerelemente neu;<br>
      Repaint: zeichnet jedes Bild auf dem Bildschirm neu, ohne Vorhandenes zu
      löschen.<br>
      Gruß Tyrae

      Comment


      • #4
        Laut obigem Originalsource kann das für TControl nicht stimmen. Da .Refresh nicht virtual deklariert wurde, aber dagegen .Repaint, kann dieses Verhalten in abgeleiteten Klasse nicht so ohne weiteres geändert werden. Einzigste Alternative ist das .Refresh statisch überladen wird, dann gilt das geänderte Verhalten aber nur für diese eine Klasse.<br>
        Wie gesagt für TControl's ist .Refresh und .Repaint exakt identisch.<br>

        Intern wird .Invalidate; aufgerufen und dies setzt eine wm_EraseBkGnd + wm_Paint Message ab. Somit wird sehr wohl durch .Repaint und .Refresh der Hintergrund des Controls gelöscht. Allerdings wird durch den sofortigen Aufruf von .Update; das Control veranlasst die wm_Paint Message abzuarbeiten, d.h. es wird sofort neu gezeichnet.<br>

        Bei sehr häufigem, wiederholtem Aufruf von .Repaint kann es dadurch erst recht zum Flickern kommen.<br>

        Am performantesten sollte daher der alleinige Aufruf von .Invalidate sein. Wird z.b. sehr kurz hintereinander mehrmals .Invalidate aufgerufen so wird das Control, wenn CPU-Leerzeit vorhanden ist, nur einmal tatsächlich neu gezeichnet und x'mal der Hintergrund durch wm_EraseBkGnd gelöscht. wm_EraseBkGnd ist im allgemeinen um vielfaches schneller als das eigentliche Zeichnen des Controls.<br>

        Gruß Hage

        Comment


        • #5
          Super ausführliche Antwort .
          Ich habe jetzt erst mal gebraucht, um das was du schreibst nachzuvollziehen.

          Aber nun dämmerts .

          Danke dir nochmal Hagen

          Comment

          Working...
          X