Обработка события 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.