TOleContainer 是一个OLE容器,近日想用DELPHI嵌入EXCEL做报表,由于不想单独出现一个EXCEL窗口,自然想到用TOleContainer,但TOleContainer有一个缺陷,就是失去焦点后EXCEL窗口同时也变灰了,需要重新激活,“有问题,找GOOGLE”,总结了几个可以避免此问题的方法 :
1.将TOleContainer失去焦点前的界面保存下来,在TOleContainer失去焦点后,用一BITMAP覆盖在上面,以假乱真。
2.重新用ACTIVEX封装一遍TOleContainer,我没试验,不知道可行不可行。
3.就是在有TOleContainer同一窗体内不放置可以获得焦点的控件,这样TOleContainer就永远不会失去焦点,自然也就不会变灰,但只能对付一些简单的界面。
4.在TOleContainer 的ONEXIT事件里加入代码,重新激活TOleContainer的焦点,这个方法我没有试验,觉得有点土,而且在焦点失去后获得,肯定有一定的闪烁。
5.屏蔽TOleContainer的失去焦点消息,提供一个网上的代码,觉得这个方法还可以
重新继承一个
TOleContainerAc=class(TOleContainer)
private
FCannotDeactivate: Boolean;
procedure CMUIDeactivate(var Message: TMessage); message CM_UIDEACTIVATE;
published
property CannotDeactivate: Boolean read FCannotDeactivate write FCannotDeactivate;
end;
{ TOleContainerAc }
procedure TOleContainerAc.CMUIDeactivate(var Message: TMessage);
begin
if not CannotDeactivate then
inherited;
end;
这样,不需要失去焦点的时候只需设置 CannotDeactivate := True;
6.期待你的更好的解决方法 :)