Firing Action’s OnUpdate event in ActiveX
Tried to use an Action’s OnUpdate event in a Delphi ActiveX (or ActiveForm) component?
You probably found it did not work! This is due to the fact that Delphi fires the OnUpdate event whenever the application Message Queue becomes empty. However an ActiveX component (or ActiveForm application) runs in a DLL - so it normally does not exercise the message queue.
However the code below will work for ActiveX components containing TForms (eg. ActiveForms). In this example, the object field «FMyDllForms» is a list of TForm’s currently active in the DLL. With a bit of work, you can probably figure out how to make it work with components in ActiveX controls.
Hook into the Foreground Idle hook when the ActiveX Server initialises
Hook := SetWindowsHookEx(WH_FOREGROUNDIDLE, TFNHookProc(@HandleForegroundIdleHook), 0, GetCurrentThreadID);
Handle Hook call backs - do UpdateActions
function HandleForegroundIdleHook(Code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT; stdcall; begin if Code = HC_ACTION then begin for I := 0 to FMyDllForms.Count-1 do begin FMyDllForms[I].UpdateActions; // ensure this has public visibility // in descendant form end; end; Result := CallNextHookEx(Hook, Code, wparam, lparam); end;
Dont forget to ‘unhook’ when the ActiveX server shuts down