Главная » Delphi » Работа с Word через объект Word Basic

0

Создадим новый проект (Gleval8\l) под названием WordTxt, поместим на форму компонент Memo, две кнопки Button (Открыть документ Word и Сохранить текст), а также диалог OpenDialog, у которого в свойстве Filter установим маску документы doc и RTF| *.doc; *.rtf. В предложение uses надо вставить упомянутый ранее модуль ComObj, а в секции var объявить переменную WordApp: OLEVariant. Для большей широты охвата темы я также покажу, как проверять наличие OLE-объекта word в системе через реестр, для чего добавим в uses еще и ссылку на модуль Registry.

Функция проверки тогда будет выглядеть так:

function Wordlnstalled: Boolean;

var Iустановлен ли Hord – через реестр)

Reg: TRegistry;

begin

Reg:=TRegistry,Create;

with Reg do

begin

RootKey := HKEY_CLASSES_ROOT; Result := KeyExists{‘Word.Application’); Free; end; end;

А процедуру создания формы при запуске приложения тогда сделаем такую:

procedure TForml.FormCreate (Sender: TObject); begin

if not Wordlnstalled then {если не установлен)

begin

Application.MessageBoxt"Текстовые файлы DOC и RTF не могут бьггь прочитаны’,’MS Word не установлен’,mb_OK);

exit; (на выход! end; end;

Наконец, главная процедура создания объекта Word, открытие выбранного файла и чтение из него текста:

proaedure TForml.ButtonlClick(Sender: TObject); var st:string;

begin (открываем документ, как объект Word Basic,

читаем текст в строку и выводим в Memo}

Memol.Lines.Clear;

if OpenDialog1.Execute then

begin

Forml.Caption := ExtractFileName(OpenDialogl.FileName); WordApp CreateOleObject(‘Word.Basic") ; if not VarlsEmpty(WordApp) then begin WordApp.AppHide;

WordApp.FileOpen(OpenDialogl.FileName,ConfirmConversions:=0); WordApp.EditSelectAll; s t:=WordApp.Select ion; Memol.Text:=st; end

else ShowMessage(‘MS Word не найден’); end; end;

Обратите внимание, что при выполнении этой процедуры сам объект мы не показываем (wordApp.AppHide). Параметр ConfirmConversions определяет, подтверждать ли преобразование при открытии, нам этого не надо, потому мы задаем его равным 0. Правда, если при открытии возникнет ошибка, то мы получим обычное сообщение Word, но бороться с этим мы пока не будем — здесь это, как вы увидите, еще не самое страшное. Обратите внимание, что, как и говорилось ранее, функции объекта word допускают вызов с переменным числом параметров — обязательно одно только имя файла, а на самом деле там могут быть еще МНОГО параметров, кроме ConfirmConversions. То же самое относится и к вызову функций VBA (см. далее).

По выполнении этой процедуры в Memo возникнет неразрывный текст в виде одной строки с вкраплениями черных прямоугольничков— Word, как уже говорилось, использует в качестве конца абзаца только один знак <CR> (#13).

а свойство Memo.Text переводы строки не признает и просто выводит его, как "неопознанный символ".

Далее мы хотим при нажатии кнопки Button2 сохранить открытый файл п другом формате. Я приведу прямо в процедуре всю таблицу доступных форматов в виде комментария, и для примера сохраню файл в виде чистого текста с концами строк:

procedure TForml.Button2Click(Sender: TObject); begin

/Format: Value:

Normal (Word format:)

1   Document Template

2   Text Only (extended characters saved in ANSI character set)

3   Text+Breaks (plain text with Иле breaks; extended characters saved in ANSI character set)

4   Text Only (DOS) ("extended characters saved in IBM PC character set)

5   Text+Breaks (DOS) (text with line breaks; extended characters saved in IBM PC character set)

Rich-text format (RTF))

(сохраняем, как текст с концами строк:) if not VarlsEmpty(WordApp) then begin

WordApp.FileSaveAs(ChangeFileExt(OpenDialogl.FileName,’.txt’) ,Format:=3);

WordApp.AppClose; WordApp:=Unaasigned; : Forml.Caption := ‘NSWord'; end

else ShowMessage(‘Текст MS Word не найден’); end;

Наконец, если мы захотим выйти без сохранения, то напишем процедуру закрытия word при выходе из программы:

procedure TForml.FormDestroy(Sender: TObject); begin (при закрытии уничтожаем, если есть) if not VarlsEmpty(WordApp) then begin Wo rdApp.AppC1os e; WordApp:=Unass igned; end; end;

Пример чисто демонстрационный, потому что в нем есть баг— нельзя без сохранения файла или без перезапуска программы еще раз нажать на кнопку Загрузить, потому при этом создастся еще один word под тем же именем объекта. Далее в более "солидном" примере с использованием VBA мы от этого избавимся. Важнее, что при вызове метода Appciose нас подстерегают серьезные подводные камни: если файл, который вы открывали, менялся по ходу дела, а вы его не сохранили, то получите по полной программе: возникнет диалог "Сохранить изменения в документе…", как будто вы с настоящим Word работаете (что на самом деле и происходит). Но здесь мы ничего такого не делаем, поэтому гораздо хуже, что при открытии файла, например, в формате Word 6.0, вы получите при закрытии неотключаемое предложение сохранить его в нормальном формате. И пути, как бороться с этим недостатком, в рамках Word Basic я не нашел, что, если вдуматься, естественно — у Word 6.0 такого диалога вообще не было. Поэтому, как мы видим, сохранить DOC-файл в ином формате таким способом вполне возможно, а для простого чтения попробуем пойти по более "правильному" пути.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии