在VCL中,调用窗体的TForm.Show时,窗口被自动激活到前台,从而令前面的窗口失去了焦点。有的时候,这并不是我们需要的效果,我们可能只是显示一个比较复杂的提示窗口,这个窗口默认并不需要获取焦点,而VCL并没有提供这样一个函数。
今天在群里话询问时,以前一直没有想明白怎么搞定TForm的Visible属性,不得闲给出了一个很简单解决办法,直接@属性的地址强制赋值即可。好吧,剩下的事情就简单化了,下面的函数用于实现这一效果:
procedure ShowNoActive(AForm: TForm); begin ShowWindow(AForm.Handle, SW_SHOWNA); PBoolean(@AForm.Visible)^ := True; AForm.Perform(CM_VISIBLECHANGED, 1, 0); end;
要显示一个初始为非激活状态的窗口时,只需要调用一句 ShowNoActive(AForm) 即可,而隐藏它直接调用原来的Hide或Visible赋值为False即可。这再一次证明了属性是一个语法糖的传言。