Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TPanel OnActivate (https://www.delphipraxis.net/170843-tpanel-onactivate.html)

ConnorMcLeod 5. Okt 2012 11:10

TPanel OnActivate
 
Hallo Kollegen,
ich habe ein TPanel abgeleitet, das ein paar andere Kompos beheimatet und noch ein paar Dinge im Hintergrund macht.
Jedesmal, wenn die Form, auf der dieses Panel sitzt, aktiviert wird, soll es aufs Neue einige Daten einlesen und sich refreshen. Aber nicht von aussen angestossen, sondern das Panel soll selbst die Fähigkeit haben, zu reagieren.
Leider habe ich keine Variante gefunden, wie das Panel mitkriegt, wann die Form aktiviert wird. So etwas wie ein CM_ACTIVATE-MessageHandler.
Weiss jemand Rat?

himitsu 5. Okt 2012 11:17

AW: TPanel OnActivate
 
Da dem Panel nunmal von der VCL nicht mitgeteilt wird, daß die Form (etwas Externes/Unabhängiges) aktiviert wird, wird es da nichts geben, außer es selber von außen zu benachrichtigen.


Ja, man könnte sich eventuell hinterrücks in den MassageHandler der Form reinhacken,
oder sich global an alle Messages hängen (TApplicationEvents) und dort auf die Aktivierungsnachricht für die Parent-Form reagieren.

lbccaleb 5. Okt 2012 18:10

AW: TPanel OnActivate
 
Würde es nicht gehen, wenn du einfach die aktivierung der Form durch die Message "CM_ACTIVATE" an dein Panel weiterleitest?

Bummi 5. Okt 2012 18:45

AW: TPanel OnActivate
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ein gewagter Versuch und sicher nicht für die Redistribution geeignet, springt auch noch bei Deaktivieren an, aber vielleicht bringt es Dich noch auf andere Ideen.
EDIT:
Fehlt nur die Überprüfung auf wParam<>0

ConnorMcLeod 6. Okt 2012 20:53

AW: TPanel OnActivate
 
Danke Euch allen für die Ideen und Bummi für die Mühe! Diesen Ansatz habe ich mir auch ein paar Sekunden lang überlegt...das Problem dabei ist, dass ich erstens nicht weiss, welche Form mein Parent sein wird und zweitens diese Form mit hoher Wahrscheinlichkeit eine eigens geschriebene WndProc hat - diese müsste ich dann auch ausführen und wer weiss, was dann alles schieflaufen kann. Und was mache ich bei zwei Panels auf einer Form...

EDIT: Mein derzeit favorisierter Gedanke ist, eine Ableitung von TForm zu machen mit einem public property: TObjectList, in die sich das Panel einträgt plus einem Pointer auf die Prozedur, die ausgeführt werden soll. In der überschriebenen WndProc der Form wird die Liste abgearbeitet; nachgeschaut, ob die Objects noch gültig sind und wenn ja, die entsprechende Prozedur ausgeführt.

Jumpy 8. Okt 2012 08:35

AW: TPanel OnActivate
 
Aber da das doch im Prinzip auch "von aussen angestossen ist" könnte man auch durch alle Panels auf der Form iterieren, sehen ob sie von Typ "Selbstaktualisierendes Panel" sind und dann eine public "Aktualisiere mich"-Methode des Panels anstossen. Da macht das mit Objectlist und ein- und austragen doch nur komplizierter für letztlich den selben Vorgang.

stahli 8. Okt 2012 11:42

AW: TPanel OnActivate
 
Ich habe meinen Controls einen Controller verpasst, der den Weg zu den benötigten Daten kennt.
Immer wenn ein Control gezeichnet wird (WM_Paint) holt dieses sich über seinen Controller die aktuellen Daten. (Das Databinding läuft automatisiert über ein Framework im Hintergrund.)
Wenn andererseits die Datenschicht Änderungen vornimmt werden alle Controller (die sich beim Erzeugen in eine globale Liste eintragen) darüber informiert und veranlassen für ihren Owner ein Invalidate. Sofern bzw. sobald das Control sichtbar ist holt es sich also neue Daten ab.

Vielleicht hilft Dir das als Ansatz? Wenn es aber nur um ein Panel und ein paar Controls darin geht, ist es sicher einfacher, das (auf die klassiche Weise) von Hand anzustoßen.


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