Как поймать момент, когда внешний редактор TOLEContainer был закрыт? - PullRequest
1 голос
/ 21 мая 2010

Borland Developer Studio 2006, Delphi:

У меня есть объект TOLEContainer с AllowInPlace = False. Когда внешний редактор закрыт и изменил мой объект OLE, я должен что-то сделать с этим объектом OLE внутри TOLeContainer.

Проблема в том, что я не могу уловить момент, когда внешний редактор закрыт. Событие OnDeactivate не работает.

Возможно, мне следует изменить исходный код TOLEContainer, добавив это событие самостоятельно, но я не знаю, где для него лучшее место.

Можете ли вы посоветовать какой-нибудь метод?

Ответы [ 2 ]

2 голосов
/ 22 мая 2010

Простой пример, который не требует модификации источников 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;
1 голос
/ 21 мая 2010

Объект OLE вызывает OnShowWindow метод интерфейса IOleClientSite (реализован TOleContainer). Параметр fShow указывает, открывается ли окно объекта или нет.

...