【问题标题】:How to catch a moment when the external editor of TOLEContainer has been closed?如何捕捉 TOLEContainer 的外部编辑器已关闭的瞬间?
【发布时间】:2010-05-22 10:49:24
【问题描述】:

Borland Developer Studio 2006,德尔福:

我有一个 AllowInPlace=False 的 TOLEContainer 对象。当外部编辑器关闭并更改了我的 OLE 对象时,我必须在 TOLeContainer 中处理这个 OLE 对象。

问题是外部编辑器关闭时我无法捕捉到片刻。 OnDeactivate 事件不起作用。

可能我应该自己更改添加此事件的TOLEContainer的源代码,但我不知道最好的地方是它。

你能建议一些方法吗?

【问题讨论】:

    标签: delphi editor external ole


    【解决方案1】:

    一个不需要修改VCL源的简单例子;

    uses
      .., activex;
    
    type
      TForm1 = class(TForm, IAdviseSink)
        ..
        Button1: TButton;
        OleContainer1: TOleContainer;
        procedure Button1Click(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        Connection: Longint;
        procedure CloseConnection;
        procedure OnDataChange(const formatetc: TFormatEtc; const stgmed: TStgMedium);
          stdcall;
        procedure OnViewChange(dwAspect: Longint; lindex: Longint);
          stdcall;
        procedure OnRename(const mk: IMoniker); stdcall;
        procedure OnSave; stdcall;
        procedure OnClose; stdcall;
      public
      end;
    
    implementation
    
    procedure TForm1.OnDataChange(const formatetc: TFormatEtc;
      const stgmed: TStgMedium);
    begin
    end;
    
    procedure TForm1.OnRename(const mk: IMoniker);
    begin
    end;
    
    procedure TForm1.OnSave;
    begin
    end;
    
    procedure TForm1.OnViewChange(dwAspect, lindex: Integer);
    begin
    end;
    
    procedure TForm1.OnClose;
    begin
      ShowMessage('not editing anymore!');
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if OleContainer1.InsertObjectDialog then begin
        CloseConnection;
        OleContainer1.OleObjectInterface.Advise(IAdviseSink(Self), Connection);
      end;
    end;
    
    procedure TForm1.CloseConnection;
    begin
      if Connection <> 0 then
        if OleContainer1.OleObjectInterface.Unadvise(Connection) = S_OK then
          Connection := 0;
    end;
    
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      CloseConnection;
    end;
    

    【讨论】:

      【解决方案2】:

      OLE 对象调用IOleClientSite 接口的OnShowWindow 方法(由TOleContainer 实现)。 fShow 参数表示对象的窗口是打开还是关闭。

      【讨论】:

        猜你喜欢
        • 2020-03-04
        • 2017-01-23
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-07
        相关资源
        最近更新 更多