Выбрать главу

var

 PointContainer: IConnectionPointContainer;

 Point: IConnectionPoint;

begin

 try

  // TWordConnection is the COM object which receives the

  // notifications from Word. Make sure to free WordSink when

  // you are done with it.

  WordSink := TWordConnection.Create;

  WordSink.WordApp := WordApp;

  WordSink.WordDoc := WordDoc;

  // Sink with a Word application

  OleCheck(WordApp.QueryInterface(IConnectionPointContainer, PointContainer));

  if Assigned(PointContainer) then begin

   OleCheck(PointContainer.FindConnectionPoint(ApplicationEvents, Point));

   if Assigned(Point) then Point.Advise((WordSink as IUnknown), WordSink.AppCookie);

  end;

  // Sink with a Word document advise

  OleCheck(WordDoc.QueryInterface(IConnectionPointContainer, PointContainer));

  if Assigned(PointContainer) then begin

   OleCheck(PointContainer.FindConnectionPoint(DocumentEvents, Point));

   if Assigned(Point) then Point.Advise((WordSink as IUnknown), WordSink.DocCookie);

  end;

 excepton E: Exception do

  ShowMessage(E.Message);

 end;

end;

procedure TmainForm.btnStartClick(Sender: TObject);

begin

 FWordApp := CoApplication_.Create;

 FWordDoc := FWordApp.Documents.Add(EmptyParam, EmptyParam);

 FWordApp.Visible := True;StartWordConnection(FWordApp, FWordDoc, FWordSink);

end;

procedure TmainForm.btnExitClick(Sender: TObject);

begin

 FWordApp := CoApplication_.Create;

 FWordDoc := FWordApp.Documents.Add(EmptyParam, EmptyParam);

 FWordApp.Visible := True;

 StartWordConnection(FWordApp, FWordDoc, FWordSink);

end;

procedure tmainform.btnexitclick(sender: tobject);

begin

 FWordApp.Quit(EmptyParam, EmptyParam, EmptyParam);

end;

Модуль отслеживания линков

unit ConnectionObject;

interface

uses Word_TLB, dialogs;

type TWordConnection = class(TObject, IUnknown, IDispatch)

protected

 {IUnknown}

 function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;

 function _AddRef: Integer; stdcall;

 function _Release: Integer; stdcall;

 { IDispatch }

 function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;

 function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;

 function GetTypeInfoCount(out Count: Integer): HResult; stdcall;

 function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;

public

 WordApp: _Application;

 WordDoc: _Document;

 AppCookie, DocCookie: Integer;

end;

implementation

{ IUnknown Methods }

uses windows, activex, main;

procedure LogComment(comment: string);

begin

 Form1.Memo1.Lines.Add(comment);

end;

function TWordConnection._AddRef: Integer;

begin

 Result := 2;

end;

function TWordConnection._Release: Integer;

begin

 Result := 1;

end;

function TWordConnection.QueryInterface(const IID: TGUID; out Obj): HResult;

begin

 Result := E_NOINTERFACE;

 Pointer(Obj) := nil;

 if (GetInterface(IID, Obj)) then Result := S_OK;

 if not Succeeded(Result) then

  if (IsEqualIID(IID, DocumentEvents) or IsEqualIID(IID, ApplicationEvents)) then

   if (GetInterface(IDispatch, Obj)) then Result := S_OK;

end;

{ IDispatch Methods }

function TWordConnection.GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult;

begin

 Result := E_NOTIMPL;

end;

function TWordConnection.GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult;

begin

 Pointer(TypeInfo) := nil;

 Result := E_NOTIMPL;

end;

function TWordConnection.GetTypeInfoCount(out Count: Integer): HResult;

begin

 Count := 0;

 Result := E_NOTIMPL;

end;

function TWordConnection.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;

begin

 //This is the entry point for Word event sinking

 Result := S_OK;

 case DispID of

 1: ; // Startup

 2: ShowMessage('quit'); // Quit

 3: ; // Document change

 4: ; // New document

 5: ; // Open document

 6: ShowMessage('close'); // Close document

 else Result := E_INVALIDARG;

 end;

end;

end. 

Автоматизация WORD 7

Delphi 3 

Вы можете воспользоваться любым интерфейсом, предлагаемым сервером автоматизации Word. Все реализованные интерфейсы вы можете увидеть при загрузке MSWORD8.OLB в Delphi, данный файл представляет собой библиотеку типов Word 7. Для исполнения VB в Word вы можете использовать свойство WordBasic Application. Следующий пример демонстрирует оба метода:

implementation

uses ComObj;

{$R *.DFM}

var V: OleVariant;

procedure TForm1.Button1Click(Sender: TObject);

begin

 V := CreateOleObject('Word.Application');

 V.ShowMe;

 V.WordBasic.FileNew;

 V.WordBasic.Insert('тест');

 V.Run('mymac');

 V.WordBasic.FileSave;

end;

end. 

ReportSmith 

Передача переменных отчета в ReportSmith III

…вы говорите можно передавать переменные? В документации только красивые схемы. Я пытаюсь передать две даты, но мне необходимо чтобы первую дату ввел пользователь, вторую я вычисляю в Delphi сам и передаю результат ReportSmith.

Вот кусор работающего у меня кода, передающий использующийся при выборе Timestamp. Я использую строковую переменную просто как способ проверить строку прежде, чем я ее добавлю в отчет. Если вы хотите, можете это убрать. Примечание: убедитесь в том, что переменная, которой вы передаете значение, написана верно. Переменные отчета Reportsmith ЧУСТВИТЕЛЬНЫ К РЕГИСТРУ.