Hey, an einen Hook im Screen hatte ich auch schon gedacht. (change des ActiveControl/ActiveForm)
Leider hat TList kein OnChange, sondern nur ein virtuellen Notify.
Ein einfaches überschreiben der
VMT würde alle TList hooken, aber immernoch enorm weniger, als ein ApplicationEvents.OnMessage.
Aber wenn, dann hätte ich wohl den TVirtualMethodInterceptor bemüht. (der kopiert ja die ClassInfo und hookt dort dann nur für diese Instanz)
An TScreen.FForms bzw. FCustomForms
wäre ich über einen bösen Cast mit kopierter Klasse bin ich über die
RTTI rangekommen.
Beim Hook des Notify war ich mir noch unsicher.
Delphi-Quellcode:
var R := TRttiContext.Create.GetType(
Vcl.Forms.TScreen);
var L := R.GetField('
FForms').GetValue(Screen).AsObject
as TList;
R := TRttiContext.Create.GetType(TList);
R.GetMethod('
Notify').VirtualIndex
Da hier in der OTA/NTA nichts möglich ist
und auch die
VCL direkt nichts bietet,
suche ich halt einfach nur einen "schönen" Weg, möglichst mit nativen Mitteln des Delphi (
VCL/
GDI),
um rauszubekommen, wann diese TForm hidden wird.
Mir fällt grad ein, anstatt an die Screen->TList könnte ich auch direkt die
VMT der TAppBuilder (DoHide)
(auch wenn Delphi bei vielen eigenen Klassen die erweiterte
RTTI deaktiviert hat ... die
VMT der ClassInfo bleibt)