Этот пример выполняет те же действия, что и два предыдущих, но позволяет выбрать тип доступа к серверу автоматизации Word:
unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, WordXP, StdCtrls, ComCtrls, ExtCtrls; type TForm1 = class(TForm) btnRunServ: TButton; btnServClose: TButton; SB1: TStatusBar; btnNewDoc: TButton; Panel1: TPanel; Memo1: TMemo; btnInsText: TButton; btnShowCmd: TButton; btnShowHide: TButton; btnInsPicture: TButton; OPD1: TOpenDialog; FD1: TFontDialog; btnQuit: TButton; btnFormat: TButton; RG1: TRadioGroup; procedure btnRunServClick(Sender: TObject); procedure btnServCloseClick(Sender: TObject); procedure btnNewDocClick(Sender: TObject); procedure btnInsTextClick(Sender: TObject); procedure btnShowCmdClick(Sender: TObject); procedure btnShowHideClick(Sender: TObject); procedure btnInsPictureClick(Sender: TObject); procedure btnQuitClick(Sender: TObject); procedure btnFormatClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure RG1Click(Sender: TObject); private { Private declarations } FWordintf: _Application; FWordDispIntf: _ApplicationDisp; FVari: integer; FOle: OleVariant; procedure pokaz(messa: string); public { Public declarations } end; var Form1: TForm1; // WordObj: TWordObject = nil; Wapp: WordApplication = nil; WD: WordDocument = nil; WD_Ole, Docs, Range_Ole: OleVariant; App: WordApplication; IDisp: IDispatch; implementation uses ComObj, Variants; {$R *.dfm} var lada: integer; procedure TForm1.pokaz(messa: string); var ii: integer; begin SB1.Font.Size:= 12; SB1.Font.Style:= [fsBold]; for ii:=1 to 40 do begin messa:= ' ' + messa; SB1.SimpleText:= messa; sleep(5); end; end; procedure WDClose; var a,b,c: OLEVariant; begin a:= wdDoNotSaveChanges; b:= wdPromptUser; c:= false; case Form1.FVari of 0: if WD <> nil then begin try WD.Close(a,b,c); WD:= nil; except end; end; 2: begin try WD_Ole.Close(a,b,c); WD_Ole:= UnAssigned; except end; end; end; end; procedure TForm1.btnRunServClick(Sender: TObject); begin try case FVari of 0: begin FWordintf:= CoWordApplication.Create; FWordintf.Visible:= true; FWordintf.Left:=2; FWordintf.Top:=2; FWordintf.Width:= 400; FWordintf.Height:=300; end; 1: begin FWordDispIntf:= CreateComObject(CLASS_WordApplication) as _ApplicationDisp; FWordDispIntf.Visible:= true; FWordDispIntf.Left:=2; FWordDispIntf.Top:=2; FWordDispIntf.Width:= 400; FWordDispIntf.Height:=300; end; 2: begin FOle:= CreateOleObject('Word.Application'); FOle.Visible:= true; FOle.Left:=2; FOle.Top:=2; FOle.Width:= 500; FOle.Height:=200; FOle.Caption:= 'Word by OleObject'; end; end; pokaz('Сервер открыт'); except pokaz('Не могу открыть Сервер'); end; end; procedure TForm1.btnServCloseClick(Sender: TObject); var a,b,c: OLEVariant; begin a:= wdPromptToSaveChanges; // a:= wdSaveChanges; b:= wdWordDocument; //EmptyParam; c:= false; //EmptyParam; WDClose; case FVari of 0:if FWordintf <> nil then begin FWordintf.Quit(a,b,c); FWordintf:= nil; pokaz('Сервер закрыт'); end; 1:if FWordDispIntf <> nil then begin { FWordDispIntf.Quit(a,b,c); FWordDispIntf:= nil; pokaz('Сервер закрыт'); } end; 2: begin try FOle.Quit(a,b,c); except end; FOle:= UnAssigned; // Требует модуль Variant pokaz('Сервер закрыт'); end; end; end; procedure TForm1.btnNewDocClick(Sender: TObject); var visi,a,b,c: OLEvariant; begin visi:= true; a:= EmptyParam; // EmptyParam Требует Variant b:= false; c:= wdNewBlankDocument; case FVari of 0: if FWordintf <> nil then WD:= FWordintf.Documents.Add(a,b,c,visi) else begin pokaz('Однако, сервер закрыт. Запустите '); end; 1: if FWordDispIntf <> nil then begin { Docs:= FWordDispIntf.Application.Documents; Docs.Add; } // FWordDispIntf.Application.Documents.Add(a,b,c,visi); //,c,visi); // WD:= FWordDispIntf.Application.ActiveDocument; // WD:= FWordDispIntf.Documents.Add(a,b,c,visi) end else begin pokaz('Однако, сервер закрыт. Запустите '); end; 2: begin FOle.Application.documents.add; WD_Ole:= FOle.Application.ActiveDocument; Range_Ole:= WD_Ole.Range; end; end{case}; end; procedure TForm1.btnInsTextClick(Sender: TObject); var ss: WideString; RR: Range; S,E: OLEVariant; begin ss:= Memo1.Text; case FVari of 0: begin if WD = nil then begin pokaz('Документ не открыт. Создайте новый документ'); exit; end; S:= 0; E:=0; RR:= WD.Range(S,E); RR.InsertBefore(ss); end; 2: begin S:= 0; E:=0; Range_Ole:= WD_Ole.Range(S,E); Range_Ole.InsertBefore(ss); end; end{case}; end; procedure TForm1.btnShowCmdClick(Sender: TObject); begin case FVari of 0: if FWordintf <> nil then FWordintf.ListCommands(true) else pokaz('Нет сервера. Запустите сервер'); 1: if FWordDispIntf <> nil then FWordDispIntf.ListCommands(true) else pokaz('Нет сервера. Запустите сервер'); 2:FOle.Application.ListCommands(true); end; end; procedure TForm1.btnShowHideClick(Sender: TObject); begin case FVari of 0: begin if FWordintf <> nil then FWordintf.Visible:= not FWordintf.Visible else pokaz('Нет сервера. Запустите сервер'); end; 1: begin if FWordDispIntf <> nil then FWordDispIntf.Visible:= not FWordDispIntf.Visible else pokaz('Нет сервера. Запустите сервер'); end; 2: begin // if FOle <> Unassigned then FOle.Visible:= not FOle.Visible; end; end; end; procedure TForm1.btnInsPictureClick(Sender: TObject); var ss: WideString; a,b,s,e,RR: OleVariant; Sh: InlineShape; Sh_Ole: OleVariant; begin case FVari of 0,1: begin if WD = nil then begin pokaz('Документ не открыт. Создайте новый документ'); exit; end; if FVari = 0 then RR:= FWordintf.Selection.Range else RR:= FWordDispIntf.Selection.Range; if OPD1.Execute then begin ss:= OPD1.FileName; a:= false; b:= true; s:=0; e:=0; RR:= FWordintf.Selection.Range; Sh:= WD.InlineShapes.AddPicture(ss,a,b,RR); end; end; 2: begin Range_Ole:= FOle.Application.Selection.Range; if OPD1.Execute then begin ss:= OPD1.FileName; a:= false; b:= true; s:=0; e:=0; Sh_Ole:= WD_Ole.InlineShapes.AddPicture(ss,a,b,Range_Ole); end; end; end{case}; end; procedure TForm1.btnQuitClick(Sender: TObject); begin btnServCloseClick(Sender); Application.Terminate; end; procedure TForm1.btnFormatClick(Sender: TObject); var RR: Range; FF: TFont; WDF: WordFont; WDF_OLe: OleVariant; begin case FVari of 0: begin if WD = nil then begin pokaz('Документ не открыт. Создайте новый документ'); exit; end; if FVari = 0 then RR:= FWordintf.Selection.Range else RR:= FWordDispIntf.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; if FF.Color < 0 then WDF.Color:= 0 else WDF.Color:= FF.Color; WDF.Size:= FF.Size; end; end; 2: begin Range_Ole:= FOle.Application.Selection.Range; WDF_Ole:= Range_Ole.Font; Range_Ole.Select; if FD1.Execute then begin FF:= FD1.Font; if fsBold in FF.Style then WDF_Ole.Bold:= 1 else WDF_Ole.Bold:= 0; if fsItalic in FF.Style then WDF_Ole.Italic:= 1 else WDF_Ole.Italic:= 0; WDF_Ole.Name:= FF.Name; if FF.Color < 0 then WDF_Ole.Color:= 0 else WDF_Ole.Color:= FF.Color; WDF_Ole.Size:= FF.Size; end; end; end{case}; end; procedure TForm1.FormCreate(Sender: TObject); begin Fvari := 0; // FOle:= UnAssigned; - требует Variant end; procedure TForm1.RG1Click(Sender: TObject); begin FVari := RG1.ItemIndex; end; end.Скачать RAR-архив исходников + .exe(200 Кб)