Borland Delphi FAQ
Страница 6.



------------------------------------------------------------

Q-71:  Как мне работать с файлами MS Word или таблицами MS Excel?

------------------------------------------------------------
Воспользоваться функцией CreateOLEObject и работать с VBA (Visual Basic for
Applications) или WordBasic.

NB: Обратите внимание на то, как устанавливаются именованные параметры у
процедур WordBasic'а, например, FileOpen(Name := 'myname.doc');

Пример проверен только на русском Word 7.0! Может, поможет...

unit InWord;
interface
uses
  ... ComCtrls; // Delphi3
  ... OLEAuto;  // Delphi2
[skip]
procedure TPrintForm.MPrintClick(Sender: TObject);
var W: Variant;
    S: String;
begin
  S:=VarToStr(Table1['Num']);
file://В D3 без промежуточной записи
                              //
в var у меня не пошло :(
  try //
А вдруг где ошибка :)
    W:=CreateOleObject('Word.Basic');
    //
Создаем документ по шаблону MyWordDot
    //
с указанием пути если он не в папке шаблонов Word
    W.FileNew(Template:='C:\MyPath\DB\MyWordDot',NewTemplate:=0);
    //
Отключение фоновой печати (на LJ5L без этого был пустой лист)
    W.ToolsOptionsPrint(Background:=0);

    //
Переходим к закладке Word'a 'Num'
    W.EditGoto('Num'); W.Insert(S);
   
file://Сохранение
    W.FileSaveAs('C:\MayPath\Reports\MyReport')
    W.FilePrint(NumCopies:='2'); //
Печать 2-х копий
  finally
    W.ToolsOptionsPrint(Background:=1);
    W:=UnAssigned;
  end;
end;
{.....}

Sergey Arkhipov 2:5054/88.10

-----------------------

Второй путь, более правильный.

Нужно импортировать TLB библиотеку соответствующего COM-сервера (MS Word, MS
Excel, AutoCAD, и т.п.) или воспользоваться готовыми компонентами из палитры
Servers поставляемыми с Delphi 5 и

более свежими версиями. Среда построит unit содержащий описания всех
доступных интерфейсов сервера. Кроме того будут созданы классы-обертки для
некоторых интерфейсов сервера. Преимущество этого метода заключается в том
что компилятор может проверить правильность синтаксиса обращений к серверу,
кроме того повышается скорость работы за счет меньших накладных расходов на
каждое обращение.

Пример использования TLB.

program wordemo;

{$APPTYPE CONSOLE}

uses
  SysUtils, ActiveX, Word2000, OleCtrls, Variants;
var
   W:TWordApplication;
   D:_Document;
   P:Paragraph;
   FileName:OleVariant;
begin
   CoInitialize(NIL);
   try
      // создадим экземпляр объекта-обертки вокруг Word 2000
      W:=TWordApplication.Create(NIL);
      try
         // создадим новый документ на основе шаблона Normal

D:=W.Application.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam);
         // добавим новый параграф
         P:=D.Paragraphs.Add(EmptyParam);
         // Запишем туда какой-нибудь текст
         P.Range.InsertAfter('Hello Word :-)');
         // сохраним документ
         FileName:='wordemo.doc';

D.SaveAs(FileName,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,
            EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam);
      finally
         // завершим работу Word
         W.Free;
      end;
   finally
      CoUnInitialize;
   end;
end.

Andrew V. Fionik < Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script >

------------------------------------------------------------

Q-72:  Как сделать так, чтобы запущенная программа не была видна на панели задач?

------------------------------------------------------------
Во-первых, можно по примеру Back Orifice воспользоваться функцией
RegisterServiceProcess.

Во-вторых, предположим, вы пользуетесь компонентой TrxTrayIcon из rxLib,
иначе непонятно, как вы будете возвращать программу обратно из
минимизированного состояния.

(EM, DS):

type
  TForm1 = class(TForm)
    Label1: TLabel;
    RxTrayIcon1: TRxTrayIcon;
    procedure FormCreate(Sender : TObject);
    procedure RxTrayIcon1DblClick(Sender: TObject);
  private
    { Private declarations }
    procedure ApplicationMinimize(Sender : TObject);
    procedure ApplicationRestore(Sender : TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMinimize := ApplicationMinimize;
  Application.OnRestore := ApplicationRestore;
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.ApplicationMinimize(Sender : TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.ApplicationRestore(Sender : TObject);
begin
  ShowWindow(Application.Handle, SW_HIDE);
end;

procedure TForm1.RxTrayIcon1DblClick(Sender: TObject);
begin
  Application.Restore;
  Application.BringToFront;
end;

(AK):
Только сpазу предупреждаю про грабли, на которые я наступал -- будь готов к
тому, что если пpи попытке закрытия приложения в OnCloseQuery или OnClose
выводится вопрос о подтверждении, то могут быть проблемы с автоматическим
завершением пpогpаммы пpи shutdown -- под Win95 просто зависает, под WinNT
не завершается. Очевидно, что сообщение выводится, но его не видно (причем
SW_RESTORE не сpабатывает). Решение -- ловить WM_QUERYENDSESSION и после
всяких завеpшающих действий и вызова CallTerminateProcs выдавать Halt.

 
« Предыдущая статья   Следующая статья »