用OleContainer装载一个excel文件后, 用户就不能打开其它excel文件了。
如果用户已经打开一个excel文件,再用OleContainer装载一个excel文件,那原来打开的excel文件也没办法进行编辑。如果是word文件,就都没这种问题,真受不了微软
有谁知道解决办法?

解决方案 »

  1.   

    用WORD当然不见了,WORD可以同一窗口中打开多个WORD文档,而EXCEL每打开一个就新建了一个窗口,不一样的。
      

  2.   

    OleCtnrs.pas声明中加上
    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;
    改完之后试试看看可不可以?