Mirror

How to disable a TTimer while browsing a menu (Views: 7)


Problem/Question/Abstract:

I have an application that auto-minimizes itself after 4 seconds, when maximized (using TTimer). The main form has a menu. I want the Timer to be disabled while the user browses the menu items. Is that possible?

Answer:

Solve 1:

Add this line to your form declaration:

protected

procedure WMMenuSelect(var msg: TWMMenuSelect); message WM_MenuSelect;

and then add this procedure:

procedure TForm1.WMMenuSelect(var msg: TWMMenuSelect);
begin
  tmrAutoClose.Enabled := (msg.MenuFlag = $FFFF);
end;


Solve 2:

Yes. The form will get one special message when the menu is first opened (WM_ENTERMENULOOP) and a second when the menu is finally closed (WM_EXITMENULOOP). Add handlers for these and disable/ enable the timer in them.

{ ... }
private

procedure WMEnterMenuLoop(var msg: TMessage);
  message WM_ENTERMENULOOP;
procedure WMExitMenuLoop(var msg: TMessage);
  message WM_EXITMENULOOP;
{ ... }

procedure TForm1.WMEnterMenuLoop(var msg: TMessage);
begin
  IdleTimer.Enabled := false;
  inherited;
end;

procedure TForm1.WMExitMenuLoop(var msg: TMessage);
begin
  IdleTimer.Enabled := true;
  inherited;
end;

<< Back to main page