Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Обработка события Quit в Delphi для автоматического закрытия Microsoft Word

Delphi , Технологии , OLE

Обработка события Quit в Delphi для Microsoft Word

Вопрос пользователя заключается в том, как обработать событие Quit от Microsoft Word в коде на Delphi. Пользователь стремится реализовать аналогичный функционал, как описано в вопросе на Stack Overflow, но в контексте использования Delphi.

Проблема

Пользователь столкнулся с проблемой, что не может корректно обработать событие закрытия Word в своем приложении, написанном на Delphi. В коде используется поздняя привязка COM, что делает процесс создания события затруднительным.

Решение

Для решения проблемы необходимо использовать раннюю привязку COM, которая упрощает создание обработчика событий. В коде пользователя используется поздняя привязка (CreateOleObject('Word.Application.12')), что не поддерживает создание обработчика события OnQuit. Вместо этого следует использовать компонент TWordApplication, который предоставляется в Delphi для ранней привязки к Word.

Пример кода

uses
  Word2000;

procedure TForm1.FormCreate(Sender: TObject)
var
  WordApp: TWordApplication;
begin
  WordApp := TWordApplication.Create(Self);
  WordApp.Visible := True;
  WordApp.OnQuit := WordAppQuit;
end;

procedure TForm1.WordAppQuit(Sender: TObject)
begin
  ShowMessage('Word application quit');
end;

В реальном приложении WordApp должен быть полем класса, а не локальной переменной.

Подробное решение

Для реализации обработчика событий в ранней привязке COM, необходимо создать отдельный модуль UEventsSink, который будет содержать класс TEventSink для работы с событиями Word. В этом классе реализуется интерфейс, который поддерживает событие Quit.

Пример модуля UEventsSink

unit UEventsSink;

interface

uses
  ActiveX, windows, ComObj, SysUtils;

type
  IApplicationEvents = interface(IDispatch)
  ['{000209F7-0000-0000-C000-000000000046}']
    procedure Quit; safecall;
  end;

  TApplicationEventsQuitEvent = procedure(Sender: TObject) of object;

  TEventSink = class(TObject, IUnknown, IDispatch)
  private
    FCookie: Integer;
    FSinkIID: TGUID;
    FQuit: TApplicationEventsQuitEvent;
    // реализация интерфейсов IUnknown и IDispatch
  protected
    FCP: IConnectionPoint;
    FSource: IUnknown;
    procedure DoQuit; stdcall;
  public
    constructor Create;
    procedure Connect(pSource: IUnknown);
    procedure Disconnect;
    property Quit: TApplicationEventsQuitEvent read FQuit write FQuit;
  end;

implementation

// реализация методов интерфейсов IUnknown и IDispatch

constructor TEventSink.Create;
begin
  FSinkIID := IApplicationEvents;
end;

procedure TEventSink.Connect(pSource: IUnknown);
var
  pcpc: IConnectionPointContainer;
begin
  // код для подключения события
end;

procedure TEventSink.Disconnect;
begin
  // код для отключения события
end;

procedure TEventSink.DoQuit;
begin
  // обработка события Quit
end;

// продолжение реализации класса TEventSink

end.

Пример использования TEventSink в основном приложении

unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
  ExtCtrls, ComObj, Variants, UEventsSink;

type
  TForm1 = class(TForm)
  private
    FEventSink: TEventSink;
    FWordApp: OleVariant;
    procedure ApplicationEventsQuit(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  public
    // другие методы и компоненты формы
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FEventSink := TEventSink.Create;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FEventSink.Disconnect;
  FEventSink.Free;
end;

procedure TForm1.ApplicationEventsQuit(Sender: TObject);
begin
  FEventSink.Disconnect;
  // код для обработки закрытия Word
  FWordApp := unassigned;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    // создание экземпляра Word
    FWordApp := CreateOleObject('Word.Application.14');
    // подключение обработчика событий
    FEventSink.Connect(FWordApp);
    FEventSink.Quit := ApplicationEventsQuit;
    // показ Word
    FWordApp.Visible := TRUE;
  except
    // обработка исключений
  end;
end;

end.

Заключение

Использование ранней привязки COM позволяет легко обрабатывать события Word в приложениях на Delphi. Создание отдельного класса TEventSink для работы с событиями Word позволяет гибко управлять обработкой событий, в том числе и событием Quit.

Создано по материалам из источника по ссылке.

Описание: Пользователь пытается обработать событие закрытия Microsoft Word в своем приложении на Delphi, используя технологии COM и раннюю привязку.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: OLE ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 16:05:40/0.0033271312713623/0