AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Invalidate, Repaint, Refresh, Update, Paint... ?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Medium · begonnen am 14. Sep 2009 · letzter Beitrag vom 16. Sep 2009
Antwort Antwort
Medium

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

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

  Alt 14. Sep 2009, 13:58
Ich hab bislang keine eingebaute Lösung dafür gefunden (weder in Delphi noch der WinAPI), und habe mir nun mit einem kleinen "Hack" geholfen. Für den Fall dass es mal jemand brauchen kann:

Delphi-Quellcode:
procedure TMyGraphObject.RepaintOverlapping;
var
  i, selfIndex: Integer;
  Bottom, Right: Integer;
  PBottom, PRight: Integer;
begin
  Bottom := Top+Height;
  Right := Left+Width;
  selfIndex := High(Integer);
  for i := 0 to Parent.ControlCount-1 do
  begin
    PBottom := Parent.Controls[i].Top+Parent.Controls[i].Height;
    PRight := Parent.Controls[i].Left+Parent.Controls[i].Width;
    if ((Bottom >= Parent.Controls[i].Top) and (Top <= PBottom) and
      (Right >= Parent.Controls[i].Left) and (Left <= PRight)) then
    begin
      if (Parent.Controls[i] = self) then selfIndex := i;
      if (i>selfIndex) and (Parent.Controls[i].Visible) then
        TMyGraphObject(Parent.Controls[i]).Paint;
    end;
  end;
end;
Das rufe ich nun nach jedem Paint innerhalb meiner Komponente auf. Es jodelt durch alle Komponenten des Parents, und veranlasst ein Neuzeichnen überlappender Controls wenn diese sichtbar sichtbar sind, und in der Z-Order über dem eigenen liegen.
Der "Hack" hierbei besteht in dem harten Cast auf TMyGraphObject. Da Paint protected ist, und ein Repaint das selbe Problem hervorruft wie oben beschrieben, nötige ich zum Aufruf von Paint. Das klappt weil Paint virtuell ist, und eigentlich sollte diese Methode wohl jede visuelle Komponente implementieren. Wenn es mal eine nicht tut knallt es natürlich, aber was nutzt eine Kompo ohne Darstellung - und sei es nur das Designtime-Icon

Das klappt natürlich nicht mehr, wenn eine "dritte Schicht" dazu kommt und die "zweite Schicht" eine fremde Kompo ist, die dies so nicht implementiert hat. Kommt in meinem Fall jedoch nicht vor, daher bleibt das mal offen. Auch mit teildurchsichtigen Controls wird es Probleme geben, so diese sich nicht hart über Regions begrenzen (im Falle von WinControls - GraphicControls wie TLabel mit Transparent = true sind da z.B. unproblematisch).

Schönen Gruß,
Medium

Edit: Hmm, okay. So ganz rund ist das echt nicht, da damit u.U. trotzdem die Darstellung nicht mehr der Z-Order entspricht. Das zu Lösen würde entweder eine Endlosschleife oder doch wieder einen verhältnismäßig aufwendigen Prozess nach sich ziehen, in dem zunächst erst alle potenziell betroffenen Controls gesammelt werden müssten, und dann anhand ihrer Z-Order neugezeichnet. Fies ist, dass man sich durch entsprechende Überlappungsketten ganz schöne Rattenschwänze an Graphen einhandeln kann
Für meine Anwendung ist das nicht weiter schlimm, aber SO allgemeingültig ist o.g. Workaround dann wohl leider nicht.
"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
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 09:01 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