用OleContainer装载一个excel文件后, 用户就不能打开其它excel文件了。
如果用户已经打开一个excel文件,再用OleContainer装载一个excel文件,那原来打开的excel文件也没办法进行编辑。如果是word文件,就都没这种问题,真受不了微软
有谁知道解决办法?
如果用户已经打开一个excel文件,再用OleContainer装载一个excel文件,那原来打开的excel文件也没办法进行编辑。如果是word文件,就都没这种问题,真受不了微软
有谁知道解决办法?
解决方案 »
- 关于子菜单项的ShortCut的问题
- 有个EXE文件怎么反编译成源码啊?
- 下了一套 BusinessSkinForm, 但对它自带的皮肤风格不是很满意。那位更漂亮一些的皮肤文件?
- TRxRichEdit的超链接,英文没有问题,中文出错
- Express控件组中,TcxLabel控件在哪个组中,需要安装哪个控件?
- Delphi 5 ,Win2000下开发,数据库SqlServer 2000,在98\2000下正常,XP下启动报错!
- 得到窗体句柄后,如何遍历它上面的控件?
- 分栏打印的问题???
- 關於SQL語句的使用問題!!
- 请问这个函数SHFileOperation是如何使用的?请附范例。谢谢
- delphi 里面有没有 DBCheckBox 成组控件呢?
- BusinessSkinForm\SkinAdapter使用问题(DELPHI)
TOleManager = class(TList)//caoxi add
private
FOldAppActivate: TNotifyEvent;
FOldAppDeactivate: TNotifyEvent;
procedure OnAppActivate(Sender: TObject);
procedure OnAppDeactivate(Sender: TObject);
public
class function AddContainer(AContainer: TOleContainer): Integer;
class function RemoveContainer(AContainer: TOleContainer): Integer;
end;
OleCtnrs.pas实现中加上
var
OleManager: TOleManager;// add{ TOleManager }procedure TOleManager.OnAppActivate(Sender: TObject);
var
i: Integer;
AOleContainer: TOleContainer;
begin
if Assigned(FOldAppActivate) then
FOldAppActivate(Sender);
for i := 0 to Count - 1 do
begin
AOleContainer := TOleContainer(Items[i]);
if (AOleContainer.FOleInPlaceActiveObject <> nil)
and (GetParentForm(AOleContainer).ActiveOleControl = AOleContainer) then
AOleContainer.FOleInPlaceActiveObject.OnDocWindowActivate(True);
end;
end;procedure TOleManager.OnAppDeactivate(Sender: TObject);
var
i: Integer;
AOleContainer: TOleContainer;
begin
if Assigned(FOldAppDeactivate) then
FOldAppDeactivate(Sender);
for i := 0 to Count - 1 do
begin
AOleContainer := TOleContainer(Items[i]);
if (AOleContainer.FOleInPlaceActiveObject <> nil)
and (GetParentForm(AOleContainer).ActiveOleControl = AOleContainer) then
begin
//如果当前激活窗体的属于该应用程序则不处理
if (AOleContainer.FFrameForm.Form.Handle <> 0)
and (GetParent(GetActiveWindow) = AOleContainer.FFrameForm.Form.Handle) then Continue;
AOleContainer.FOleInPlaceActiveObject.OnDocWindowActivate(False);
AOleContainer.FFrameForm.SetMenu(0, 0, 0);
AOleContainer.FFrameForm.ClearBorderSpace;
end;
end;
end;class function TOleManager.AddContainer(
AContainer: TOleContainer): Integer;
begin
if OleManager = nil then
begin
OleManager := TOleManager.Create;
OleManager.FOldAppActivate := Application.OnActivate;
OleManager.FOldAppDeactivate := Application.OnDeactivate;
Application.OnActivate := OleManager.OnAppActivate;
Application.OnDeactivate := OleManager.OnAppDeactivate;
end;
Result := OleManager.Add(AContainer);
end;class function TOleManager.RemoveContainer(
AContainer: TOleContainer): Integer;
begin
Result := OleManager.Remove(AContainer);
if OleManager.Count = 0 then
begin
Application.OnActivate := OleManager.FOldAppActivate;
Application.OnDeactivate := OleManager.FOldAppDeactivate;
FreeAndNil(OleManager);
end;
end;
OleCtnrs.pas实现中TOleContainer的构造函数和析构函数修改为下
constructor TOleContainer.Create(AOwner: TComponent);
const
ContainerStyle = [csClickEvents, csSetCaption, csOpaque, csDoubleClicks];
begin
inherited Create(AOwner);
FRefCount := 1;
if NewStyleControls then
ControlStyle := ContainerStyle else
ControlStyle := ContainerStyle + [csFramed];
Width := 121;
Height := 121;
TabStop := True;
ParentColor := False;
FShowToolbar := False;
FAllowInPlace := True;
FAllowActiveDoc := True;
FAutoActivate := aaDoubleClick;
FAutoVerbMenu := True;
FBorderStyle := bsSingle;
FCopyOnSave := True;
FDrawAspect := DVASPECT_CONTENT;
TOleManager.AddContainer(Self);//add
end;destructor TOleContainer.Destroy;
begin
TOleManager.RemoveContainer(Self);//add
DestroyObject;
inherited Destroy;
end;
改完之后试试看看可不可以?