Назад Оглавление Дальше Общаемся с сервером Word через COM-интерфейсы


COM-интерфейсы

Хорошая статья об этом есть на сайте Королевства Делфи.
Как известно, доступ к объектам автоматизации можно осуществлять следующими способами:

При сравнении этих способов нужно еще учитывать доступность информации об объектах сервера автоматизации. При использовании COM-интерфейсов (для Word) нужные сведения можно найти в файле ..\Program Files\Borland\Delphi7\Ocx\Servers\WordXP.pas, причем если пользоваться поиском фраз типа Documents = interface(IDispatch), Paragraphs = interface(IDispatch), то описания интерфейсов легко находятся. Просмотрев свойства и методы интерфейса, видим, как к ним обращаться из программы.

Кроме того, для изучения структуры объектов можно смотреть \Program Files\MS Office\Office10\1049\WDMAIN10.CHM (если инсталлирована справка VBA), но эта справка на английском.

При использовании COM-интерфейсов и подключении WordXP.pas в предложении uses работает автоматическое завершение синтаксиса в Делфи и это удобно.

Для приложений, входящих в состав MS Office информации достаточно. Для других серверов автоматизации желательно найти библиотеку типов. IDE Delphi может импортировать эти библиотеки (Project | Import Type Library) и создавать для них интерфейсные оболочки (файлы *_TLB.pas) - похожие на WordXP.pas (в том смысле, что там тоже описаны интерфейсы, константы и другие иденификаторы, которые будут доступны Вашему приложению, если Вы включите этот файл _TLB.pas в предложение uses). Не забудьте, что доступны только ЗАРЕГИСТРИРОВАННЫЕ в оперативной системе (т е в реестре) серверы. Так что разобрав примеры И.Ю.Баженовой, Вы можете создавать контроллеры автоматизации и для других серверов. Если же библиотеки типов нет, то можно использовать компонент TOleContainer, но это сложнее.

Текст модуля:

{ 
1. автозавершение синтаксиса действует (т к подключен в uses WordXP)
2. Поизучаем ..\Program Files\Borland\Delphi7\Ocx\Servers\WordXP.pas:
 здесь можно найти описание интерфейсов, для каждого из которых -
 список доступных нам методов и свойств, например:
   WordApplication = _Application;
  _Application = interface(IDispatch)
    property Visible: WordBool read Get_Visible write Set_Visible
    property Application: WordApplication read Get_Application;
    property Documents: Documents read Get_Documents;
    property Windows: Windows read Get_Windows;
    property ActiveDocument: WordDocument read Get_ActiveDocument;
    property ActiveWindow: Window read Get_ActiveWindow;
    property Selection: WordSelection read Get_Selection;
    property Caption: WideString read Get_Caption write Set_Caption
    property DisplayScrollBars: WordBool read Get_DisplayScrollBars
      write Set_DisplayScrollBars;
    property Left: Integer read Get_Left write Set_Left;
    property Top: Integer read Get_Top write Set_Top;
    property Width: Integer read Get_Width write Set_Width;
    property Height: Integer read Get_Height write Set_Height;
 -----
  Documents = interface(IDispatch)
    function AddOld(var Template: OleVariant; var NewTemplate: OleVariant):
       WordDocument; safecall;
    function OpenOld(var FileName: OleVariant; var ConfirmConversions: OleVariant;
       var ReadOnly: OleVariant; var AddToRecentFiles: OleVariant;
       var PasswordDocument: OleVariant; var PasswordTemplate: OleVariant;
       var Revert: OleVariant; var WritePasswordDocument: OleVariant;
       var WritePasswordTemplate: OleVariant; var Format: OleVariant):
          WordDocument; safecall;
    function Add(var Template: OleVariant; var NewTemplate: OleVariant;
       var DocumentType: OleVariant; var Visible: OleVariant): WordDocument; safecall;
    function Open2000(var FileName: OleVariant; var ConfirmConversions: OleVariant;
       var ReadOnly: OleVariant; var AddToRecentFiles: OleVariant;
       var PasswordDocument: OleVariant; var PasswordTemplate: OleVariant;
       var Revert: OleVariant; var WritePasswordDocument: OleVariant;
       var WritePasswordTemplate: OleVariant; var Format: OleVariant;
       var Encoding: OleVariant; var Visible: OleVariant): WordDocument; safecall;
    function Open(var FileName: OleVariant; var ConfirmConversions: OleVariant;
       var ReadOnly: OleVariant; var AddToRecentFiles: OleVariant;
       var PasswordDocument: OleVariant; var PasswordTemplate: OleVariant;
       var Revert: OleVariant; var WritePasswordDocument: OleVariant;
       var WritePasswordTemplate: OleVariant; var Format: OleVariant;
       var Encoding: OleVariant; var Visible: OleVariant; var OpenAndRepair: OleVariant;
       var DocumentDirection: OleVariant; var NoEncodingDialog: OleVariant): WordDocument;
---------
  WordDocument = _Document;
  _Document = interface(IDispatch)
    property InlineShapes: InlineShapes read Get_InlineShapes;
    function Get_InlineShapes: InlineShapes; safecall;
   procedure Select; safecall;
   procedure Close(var SaveChanges: OleVariant; var OriginalFormat: OleVariant; 
                    var RouteDocument: OleVariant); safecall;

--------
  Paragraphs = interface(IDispatch)
    property Count: Integer read Get_Count;
    property First: Paragraph read Get_First;
    property Last: Paragraph read Get_Last;
    property Format: WordParagraphFormat read Get_Format write Set_Format;
    function Item(Index: Integer): Paragraph; safecall;
    function Add(var Range: OleVariant): Paragraph; safecall;

---------
  Paragraph = interface(IDispatch)
    property Range: Range read Get_Range;
    property Format: WordParagraphFormat read Get_Format write Set_Format;
    property Alignment: WdParagraphAlignment read Get_Alignment
       write Set_Alignment;
    property RightIndent: Single read Get_RightIndent write Set_RightIndent;
    property LeftIndent: Single read Get_LeftIndent write Set_LeftIndent;
    property FirstLineIndent: Single read Get_FirstLineIndent
       write Set_FirstLineIndent;
    property SpaceBefore: Single read Get_SpaceBefore write Set_SpaceBefore;
    property SpaceAfter: Single read Get_SpaceAfter write Set_SpaceAfter;
    function Get_Style: OleVariant; safecall;
    procedure Set_Style(var prop: OleVariant); safecall;
    function Next(var Count: OleVariant): Paragraph; safecall;
    function Previous(var Count: OleVariant): Paragraph; safecall;

-----------
  Range = interface(IDispatch)
    property Text: WideString read Get_Text write Set_Text;
    property Start: Integer read Get_Start write Set_Start;
    property End_: Integer read Get_End_ write Set_End_;
    property Font: WordFont read Get_Font write Set_Font;
    property Sections: Sections read Get_Sections;
    property Paragraphs: Paragraphs read Get_Paragraphs;
    property Font: WordFont read Get_Font write Set_Font;    
    procedure Select; safecall;
    procedure InsertBefore(const Text: WideString); safecall;
    procedure InsertAfter(const Text: WideString); safecall;
    procedure Cut; safecall;
    procedure Copy; safecall;
    procedure Paste; safecall;
    procedure InsertParagraph; safecall;
    procedure InsertParagraphAfter; safecall;
    procedure CheckGrammar; safecall;

-----------
  WordSelection = interface(IDispatch)
    property Text: WideString read Get_Text write Set_Text
    property Start: Integer read Get_Start write Set_Start;
    property End_: Integer read Get_End_ write Set_End_;
    property Font: WordFont read Get_Font write Set_Font;
    property Paragraphs: Paragraphs read Get_Paragraphs;
    property Range: Range read Get_Range;

---------
  InlineShapes = interface(IDispatch)
    function Item(Index: Integer): InlineShape; safecall;
    function AddPicture(const FileName: WideString; var LinkToFile: OleVariant;
                        var SaveWithDocument: OleVariant; var Range: OleVariant):
                         InlineShape; safecall;
----------
  WordFont = _Font;
  _Font = interface(IDispatch)
    property Bold: Integer read Get_Bold write Set_Bold;
    property Italic: Integer read Get_Italic write Set_Italic;


---------
  т е обычным поиском в файле ищете, например: range = interface
  и находите.

3. =====================================================
 В WDMAIN10.CHM удобно изучать структуру документа (DOM).
 \Program Files\MS Office\Office10\1049\WDMAIN10.CHM
 (однако - примеры на Бесике !!!!)

 - Здесь Вы найдете подробности (о параметрах и использовании)
   Например, Add:
-------
Add method as it applies to the Documents object.

Returns a Document object that represents a new, empty document added
 to the collection of open documents.
expression.Add(Template, NewTemplate, DocumentType, Visible)

expression  Required. An expression that returns a Documents object.
Template  Optional Variant. The name of the template to be used for
  the new document. If this argument is omitted, the Normal template is used.
NewTemplate  Optional Variant. True to open the document as a template. 
The default value is False.
DocumentType  Optional Variant. Can be one of the following WdNewDocumentType
 constants: wdNewBlankDocument, wdNewEmailMessage, wdNewFrameset, or wdNewWebPage.
 The default constant is wdNewBlankDocument.
Visible  Optional Variant. True to open the document in a visible window.
If this value is False, Microsoft Word opens the document but sets the
Visible property of the document window to False. The default value is True.

========= Нужно разобраться с Range =============
Document.Range()..., где
 function Range(var Start: OleVariant; var End_: OleVariant): Range; safecall;

ActiveDocument.Sections(1).Range.Paragraphs.LineSpacingRule = _ 
    wdLineSpaceSingle
Selection.Paragraphs(1).LineSpacingRule = wdLineSpaceDouble
ActiveDocument.Paragraphs(1).Alignment = wdAlignParagraphRight
Set aRange = ActiveDocument.Paragraphs(1).Range
Range.InsertBefore(const Text: WideString); safecall;

-------- Из моего старого исходника: --------
WordApplication1.Visible := true; - показать 
WordApplication1.Documents.AddOld(EmptyParam,EmptyParam); - добавить документ
WordDocument1.ConnectTo(WordApplication1.ActiveDocument); - подключить документ
ss := Memo1.Text; WordApplication1.Selection.TypeText(ss); - заполнить текстом
WordApplication1.Selection.Font.Size := StrToInt(Edit1.text);
WordApplication1.ListCommands(true);
WordApplication1.StatusBar:='Это Word - Application';
----
procedure TForm1.Button9Click(Sender: TObject);
var num: OleVariant;
begin Num:=1;
   showmessage( WordApplication1.Documents.Item(Num).Name );
end;

4. ====================== Записанные в Ворде макросы =========
Sub Макрос1()
    Selection.InlineShapes.AddPicture FileName:= _
        "E:\XRAN_RW_MyProg\_Servers\Bajenova\Word_COM_Interface\patak1.gif", _
        LinkToFile:=False, SaveWithDocument:=True
End Sub

 Пытаюсь перевести на язык интерфейсов: см. Button8Click
}

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ActiveX, WordXP, StdCtrls, ComCtrls, ExtCtrls, ExtDlgs;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    SB1: TStatusBar;
    Button3: TButton;
    Panel1: TPanel;
    Memo1: TMemo;
    Button4: TButton;
    Button5: TButton;
    Button7: TButton;
    Button8: TButton;
    OPD1: TOpenDialog;
    FD1: TFontDialog;
    Button9: TButton;
    Button10: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TWordObject = Class
  private
  FWordApp: _Application;
  procedure SetVisible(value: boolean);
  public
  constructor Create;
  destructor Destroy; override;
  published
  property Application: _Application read FWordApp;
  end;

var
  Form1: TForm1; WordObj: TWordObject = nil;
  Wapp: WordApplication = nil;  WD: WordDocument = nil;

implementation uses ComObj;

{$R *.dfm}

constructor TWordObject.Create;
begin
FWordApp:= CoWordApplication.Create;
end;

destructor TWordObject.Destroy;
var S,O,R: OleVariant;
begin
  S:= wdDoNotSaveChanges;
  O:= UnAssigned;
  R:= UnAssigned;
  try
    FWordApp.Quit(S,O,R);
  except
    showmessage('Сервер уже закрыт...');
  end;
end;

procedure TWordObject.SetVisible(Value: boolean);
begin
  FWordApp.Visible:= value;
end;

procedure WDClose;
var  a,b,c: OLEVariant;
begin
 if WD <> nil then
    begin if
     MessageDlg('Сохранить документ ?',mtConfirmation,[mbYes, mbNo],0)=mrYes
     then
//  WD.Save;
      begin
        a:= wdPromptToSaveChanges; b:= EmptyParam; c:= EmptyParam;
        WD.Close(a,b,c);
      end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ii: integer;
begin
  SB1.Font.Size:= 12;
  SB1.Font.Style:= [fsBold];
 try
  WordObj:= TWordObject.Create;
  WordObj.SetVisible(true);
  WApp:= WordObj.Application;
  WApp.Width:= 400;
  WApp.Height:= 300;
  SB1.SimpleText:= 'Сервер открыт';
  for ii:=1 to 40 do
    begin
      SB1.SimpleText:= ' ' + SB1.SimpleText;
      sleep(20);
    end;
 except
  SB1.SimpleText:= 'Не могу открыть Сервер';
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var ii: integer; ss: string; a,b,c: OLEVariant;
begin
 WDClose;

  WordObj.Free;
  WordObj:= nil;
  SB1.Font.Size:= 12;
  SB1.Font.Style:= [fsBold];
  ss:= '                                         Сервер закрыт';
  for ii:=1 to 40 do
    begin
      delete(ss,1,1);
      SB1.SimpleText:= ss;
      sleep(10);
    end;
end;

procedure TForm1.Button3Click(Sender: TObject);
var visi,a,b,c: OLEvariant; ii: integer;
begin
  visi:= true;
  a:= EmptyParam;
  b:= EmptyParam;
  c:= EmptyParam;
  if WordObj <> nil then
    WD:= WApp.Documents.Add(a,b,c,visi)
    else
  begin beep;
  SB1.Font.Size:= 12;
  SB1.Font.Style:= [fsBold];  
  SB1.SimpleText:= 'Однако, сервер закрыт';
  for ii:=1 to 40 do
    begin
      SB1.SimpleText:= ' ' + SB1.SimpleText;
      sleep(10);
    end;
  end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var ss: WideString; RR: Range; S,E: OLEVariant;
begin
 if WD = nil then
   begin
     showmessage('Документ не открыт');
     exit;
   end;

  ss:= Memo1.Text;
 S:= 0; E:=0;
 RR:= WD.Range(S,E);
 RR.InsertBefore(ss);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  WApp.ListCommands(true);
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  if WordObj.Application.Visible = true then
    WordObj.SetVisible(false) else
    WordObj.SetVisible(true);
end;

procedure TForm1.Button8Click(Sender: TObject);
var ss: WideString; a,b,s,e,RR: OleVariant; Sh: InlineShape;
begin
 if WD = nil then
   begin
     showmessage('Документ не открыт');
     exit;
   end;

  if OPD1.Execute then
  begin
    ss:= OPD1.FileName;
    a:= false;
    b:= true;
    s:=0;
    e:=0;
    RR:= WApp.Selection.Range;
    Sh:= WD.InlineShapes.AddPicture(ss,a,b,RR);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if  WordObj <> nil then
  Button2Click(Sender);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
 Button2Click (Sender);
 Application.Terminate;
end;

procedure TForm1.Button10Click(Sender: TObject);
var RR: Range; FF: TFont;
  WDF: WordFont;
begin
 if WD = nil then
   begin
     showmessage('Документ не открыт');
     exit;
   end;

 RR:= WApp.Selection.Range;
 WDF:= RR.Font;

 RR.Select;

 if FD1.Execute then
   begin
     FF:= FD1.Font;
      if fsBold in FF.Style then WDF.Bold:= 1
        else WDF.Bold:= 0;
      if fsItalic in FF.Style then WDF.Italic:= 1
        else WDF.Italic:= 0;

      WDF.Name:= FF.Name;
      WDF.Color:= FF.Color;
      WDF.Size:= FF.Size;
   end;
end;

end.
Скачать RAR-архив исходников + .exe(200 Кб)

Назад Дальше
Rambler's Top100
Hosted by uCoz