При сравнении этих способов нужно еще учитывать доступность информации об объектах сервера автоматизации. При использовании 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 Кб)