Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Paintbox in Paintbox (https://www.delphipraxis.net/178943-paintbox-paintbox.html)

Gutelo 5. Feb 2014 02:05

Paintbox in Paintbox
 
Hallo,

ich habe zwei Komponenten die ich von TPaintbox abgeleitet habe. Im wesentlichen sind es graphische panels die gezeichnete Optionsknoepfe enthalten. Nun moechte ich das eine kleinere Panel (Komponente B) graphisch ueber das groessere Panel (Komponente A) legen.

Solange ich keinen der Optionsknoepfe druecke zeichnet er B ueber A. Wenn ein Knopf auf A gedrueckt wird bekommt die Komponete A aber den Fokus und Komponente B wird von A verdeckt.

Wie loese ich dieses Problem mit dem Fokus. Komponente B ist bereits ueber eine Property mit Komponente A verknuepft.

Gutelo

baumina 5. Feb 2014 06:41

AW: Paintbox in Paintbox
 
Wenn deine "Optionsknöpfe" TButtons sind, könntest du stattdessen TSpeedButtons nehmen, diese werden nicht fokussiert.

Oder Du fokussierst mit SetFocus nach dem Drücken wieder eine Komponente auf dem anderen Panel an.

Oder du versuchst ein BringToFront des anderen Panels.

Oder du vermeidest das übereinander zeichnen komplett und machst eine Komponente draus.

bcvs 5. Feb 2014 06:45

AW: Paintbox in Paintbox
 
Und was ist, wenn du B nicht direkt auf A legst, sondern noch ein normales TPanel dazwischen schiebst?

Nur so eine Idee, nicht ausprobiert.

DeddyH 5. Feb 2014 07:32

AW: Paintbox in Paintbox
 
Oder wie schon angedeutet aus den 2 Komponenten 1 machen, evtl. von TGraphicControl oder in diesem Fall vielleicht besser von TCustomControl abgeleitet. Dann wird alles an derselben Stelle im Code gezeichnet, das ist zwar etwas mehr Rechnerei, aber man hat alles beisammen.

Medium 5. Feb 2014 08:41

AW: Paintbox in Paintbox
 
Ich vermute ganz stark, dass das Problem hier eigentlich nur das Neuzeichnen ist, A rückt nicht wirklich höher in der Z-Order. Um das einigermaßen effizient zu lösen habe ich mal im Paint einer Komponente alle Komponenten des Parents durchsucht die höher in der Z-Order sind (weiter hinten in TWinControl.Components[]), geprüft ab sie meine Komponente verdecken würden (trivial über Top/Left/Bottom/Right), und wenn ja den Bereich der gefundenen Komponente vom Parent invalidiert (aber dran denken das eigene Paint während dessen über ein Flag o.ä. nicht erneut in diese Suche gehen zu lassen! Gibt schöne Endlosschleifen.)

Am Rande: TPaintbox ist nicht wirklich als Basis für eigene Komponenten gedacht. Für Dinge, denen man kein Windows-Handle verpassen muss, ist hier fast immer TGraphicControl eine gute Ausgangsklasse.

Gutelo 5. Feb 2014 09:33

AW: Paintbox in Paintbox
 
Medium,

gute Idee, werde mal ausprobieren ein entsprechendes repaint der Komponente B durchzufuehren.

Die Optionsknoepfe sind selbst gezeichnet. Es ist eine reine Paintbox ohne weitere Komponenten.

Welche Vorteile hat TGraphicControl gegenueber TPaintBox, bzw warum ist es bedenklich eine TPaintBox zu verwenden?

Gutelo

Edit: Hmm, wenn ich im OnPaint der Komponente A ein repaint der Komponente B einfuege lande ich ebenfalls in einer Endlosschleife und Komponente B flackert staendig.

Edit 2: Mit einem KompB.paint klappt es wunderbar. Den Unterschied zwischen Paint und Repaint habe ich noch nie verstanden...


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