1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; OpenDialog1: TOpenDialog; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses ComObj; //Функция записывает новый текст для закладки с именем aBmName. //Функция возвращает значение True, если закладка найдена и её текст изменён //и False - если закладка не найдена. //Переустановка текста закладки выплоняется так: //- Получаем ссылку на объект-диапазон, который содержит текст закладки. //- Удаляем закладку. //- Устанавливаем новый текст для объекта-диапазона. //- Создаём новую закладку с диапазоном, который содержит новый текст. function SetBmText(var aBms : Variant; const aBmName, aText : String) : Boolean; var Bm, Rng : Variant; begin //Проверяем - существует ли закладка с заданным именем. Result := aBms.Exists(aBmName); //Если закладка не найдена - выходим. if not Result then Exit; //Ссылка на закладку. Bm := aBms.Item(aBmName); //Ссылка на диапазон, связанный с закладкой. Rng := Bm.Range; //Удаление закладки. Bm.Delete; //Заменяем текст в диапазоне. Rng.Text := aText; //Добавляем новую закладку с таким же именем. aBms.Add(aBmName, Rng); end; procedure TForm1.Button1Click(Sender: TObject); var wdApp, wdDocs, wdDoc, wdBms : Variant; Od : TOpenDialog; begin Od := OpenDialog1; if Od.InitialDir = '' then Od.InitialDir := ExtractFilePath( Application.ExeName ) ; Od.Title := 'Выберите шаблон, на основе которого будет создан новый документ'; if not Od.Execute then Exit; if not FileExists(Od.FileName) then begin MessageDlg( 'Файл с заданным именем не найден. Действие отменено.' ,mtWarning, [mbOK], 0 ); Exit; end; try wdApp := CreateOleObject('Word.Application'); except ShowMessage('Не удалось запустить MS Word. Действие отменено.'); Exit; end; //Делаем видимым окно MS Word. wdApp.Visible := True; //Ссылка на коллекцию документов. wdDocs := wdApp.Documents; //Попытка открыть выбранный файл. wdDoc := wdDocs.Open(FileName:=Od.FileName); //Подключаемся к коллекции закладок. wdBms := wdDoc.Bookmarks; //Ищем закладки с нужными именами и изменяем их текст, в соответствие //с данными, введёнными на форме. SetBmText(wdBms, 'N_DOC', Edit1.Text); SetBmText(wdBms, 'DATE_CREATE', Edit2.Text); SetBmText(wdBms, 'N_TAB', Edit3.Text); SetBmText(wdBms, 'FIO', Edit4.Text); //Сохранять документ следует под другим именем, чтобы не перезаписать шаблон. //wdApp.DisplayAlerts := False; //Отключаем режим показа предупреждений. //wdDoc.SaveAs(FileName:=...); //wdApp.DisplayAlerts := True; //Включаем режим показа предупреждений. //Закрываем документ. //wdDoc.Close; //Закрываем MS Word. //wdApp.Quit; end; end. |
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).
Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:
uses ComObj; var Word: variant; [...] procedure CreateWord(const Visible: boolean); begin Word:=CreateOleObject('Word.Application'); Word.Visible:=Visible; end;
Всё достаточно просто. Далее мы можем работать с объектом следующим образом:
- Создавать документ Word с нуля
- Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.
Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.
Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:
[...] Word.Documents.Add [...]
и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:
[...] Word.Documents.Add(TamplatePath:string); [...]
Чтобы получить список всех открытых в данный момент документов Word можно воспользоваться следующим листингом:
[...] var List: TStringList; i: integer; begin List:=TStringList.Create; for i:=1 to Word.Documents.Count do List.Add(Word.Documents.Item(i).Name); end; [...]
Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:
Word.Documents.Item(index).Activate
где index — номер документа в коллекции.
Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.
Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:
[...] Word.ActiveDocument.Range.InsertBefore('Hello World'); Word.ActiveDocument.Range.InsertAfter('текст после Hello World'); Word.ActiveDocument.Range.InsertAfter('окончание строки в документа'); [...]
При выполнении этих трех операции Range содержал весь документ.
Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:
var MyRange: variant; begin MyRange:=WordActiveDocument.Range(50,100); MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо end;
Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:
[...] ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе [...]
Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.
Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.
[...] ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text) [...]
В данном случае я вывел на экран последнее слово в документе.
Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.
2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.
Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:
var FilePath: string; [...] Word.Documents.Open(FilePath) [...]
Метод Open можно вызывать с несколькими аргументами:
- FileName: string — путь и имя файла;
- ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
- ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
- AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
- PasswordDocument: string — пароль для открытия документа
- PasswordTemplate: string — пароль для открытия шаблона
- Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
- WritePasswordDocument: string — пароль для сохранения измененного документа в файле
- WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
- Format:integer — формат открываемого документа.
Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:
[...] Word.Documents.Open(FileName:=FilePath, ReadOnly:=true) [...]
В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.
Что касается последнего аргумента — Format, то он может принимать целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.
Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:
function FindAndReplace(const FindText,ReplaceText:string):boolean; const wdReplaceAll = 2; begin Word.Selection.Find.MatchSoundsLike := False; Word.Selection.Find.MatchAllWordForms := False; Word.Selection.Find.MatchWholeWord := False; Word.Selection.Find.Format := False; Word.Selection.Find.Forward := True; Word.Selection.Find.ClearFormatting; Word.Selection.Find.Text:=FindText; Word.Selection.Find.Replacement.Text:=ReplaceText; FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll); end;
Приведенная выше функция позволяет провести поиск и замену текстового фрагмента во всём документе. Для того, чтобы ограничить возможности пользователя при работе с шаблоном документа я обычно ставлю на необработанный файл пароль, а после обработки — пароль снимаю и сохраняю документ с другим названием в необходимую директорию.
Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet
3.1
8
голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Заполнение и печать шаблона MS Word
, Как это делается?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Необходимо программно вставить данные из программы в шаблон документа MS Word и распечатать результат, при этом шаблон оставить прежним. Как это сделать, используя компоненты WordApplication и WordDocument? Пример: есть шаблон pattern.doc, содержащий текст: Нужно программно заполнить этот шаблон: И распечатать. После чего закрыть файл шаблона без изменений. Открывать и писать в документы я научился. Печатать тоже, наверное, смогу. А как писать текст в ОПРЕДЕЛЕННЫЕ места документа? Самое первое что напрашивается, это сделать метки в шаблоне и осуществлять замену. Но метода вроде Replace ни где не нашел. Буду очень благодарен за советы и примеры. |
zx |
|
НА места куда надо вписать данные ставь таблички пустые, потом такой код fil: OleVariant; wordApplication1.Connect; WordDocument1.Tables.Item(1).Range.Text:= ‘текст’; только кто нить знает как потом закрыть всё это корректно, без вопросов и без провисания сервака в памяти? |
zx |
|
Для печати |
AlexAnt |
|
Спасибо! А что если уже в самом шаблоне есть таблицы? У меня именно такая ситуация. Причем заносить данные нужно не просто в пустые ячейки, а в ячейки содержащие уж какой-то текст. Поэтому я сразу пытался избежать обращения к таблицам, шаблон большой и посчитать где какая таблица — практически невыполнимая задача для меня. |
AlexAnt |
|
Аналогичную задачу в Perl я всегда решал расстановкой меток в шаблоне, с последующей их заменой. Например: Фамилия: %surname% Затем используется простое регулярное выражение s/%surname%/Name/g, которое заменяет все метки %surname% на значение переменной Name. И т.д. Неужели ничего подобного нет в сервере MS Word? Я имею ввиду не регулярные выражения естественно, а замену текста на текст. Можете есть еще какие-то объекты, которые можно заменять на текст? |
zx |
|
Попробуй сделать так, на месте где тебе надо установить переменную, делаешь метку, например %name%, тоесть простой текст. |
AlexAnt |
|
В том-то и дело, что я ни где не могу найти инфу о том, как делать замену! Куча доков и книг по работе с Word из Delphi и ни где нет и слова о замене! Сейчас поищу на дельфикингдум… |
ych_boriss |
|
Senior Member Рейтинг (т): 22 |
text := AnsiReplaceText(text, ‘%surname%’, surname); // or text := StringReplace(text, ‘%surname%’, surname, [rfReplaceAll]); // or // … // or написать свою замену Сообщение отредактировано: ych_boriss — 15.04.04, 09:46 |
Song |
|
ych_boriss, тут разговор о замене средствами VBS. |
AlexAnt |
|
Всем кому интересно, приведенный ниже кусок открывает доковский файл FileName, находит первый текст %name% и заменяет его на ‘Вася’, распечатывает и закрывает файл без сохранения (распечатку еще не проверял): procedure TForm1.APrintExecute(Sender: TObject); FindText := ‘%name%’; WordApplication1.Selection.Find.Execute(FindText, OleFalse, OleFalse, WordApplication1.PrintOut; |
Bas |
|
oldStr,newStr,replace:OleVariant; replace:=1; oldStr:=’@1′; newStr:=DateTimeToStr(Now); //Находим в документе метки и производим их замены WordDocument1.Range.Find.Execute(oldStr,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,newStr,replace); |
TarZan |
|
Морока с этими док’ами… |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Общие вопросы
- Следующая тема
[ Script execution time: 0,0962 ] [ 16 queries used ] [ Generated: 13.04.23, 22:37 GMT ]
Собранные версии компонента с примерами использования
Архив на Яндекс.Диск
Файлы в архиве
Файлы для Delphi 7
- ОписаниеРазработки.txt — этот файл.
- WordReport70.zip — исполняемые файлы и ресурсы компонента.
- WR_ExampleD7.zip — пример применения компонента.
- WordReport70src.zip — исходные коды компонента.
Файлы для Delphi XE3
- ОписаниеРазработки.txt — этот файл.
- WordReport170.zip — исполняемые файлы и ресурсы компонента.
- WordReport170src.zip — исходные коды компонента.
- WR_ExampleDXE3.zip — пример применения компонента.
Назначение
Компонент предназначен для автоматизации создания отчетов через MS Word.
Как исходный шаблон, так и готовый отчет представляют собой обычные документы Word, что обеспечивает пользователю самыме богатые возможности редактирования, предпросмотр и печать без каких-либо дополнительных средств.
Программные требования
- Borland Delphi или Embarcadero RAD Studio XE3.
- Microsoft Word 2000 и выше.
Установка
- Извлечь файлы из WordReport(Version).zip в директорию с установленной Delphi (например, WordReport70.zip в «C:Program Files (x86)BorlandDelphi7»).
- Запустить Delphi.
- Выбрать пункт меню Component >> Install Packages…
- Нажать кнопку Add… и выбрать файл WordReport(Version).bpl в DelphiBin (например, WordReport70.bpl в «C:Program Files (x86)BorlandDelphi7BinWordReport70.bpl»)
- Компонент готов к работе. Его можно найти на вкладке WordReport.
Инструкция
Правила создания шаблонов
Шаблон в нашем случае — это документ MS Word (именно документ — т.е. файл *.doc, а не *.dot !), составленный по определенным правилам.
-
Секция — это диапазон шаблона, который должен повторяться в результирующем документе столько раз, сколько требуется для вывода всех записей привязанного к секции набора данных.
-
Каждая секция должна быть отмечена закладкой с именем DataN, где N — целое число от 1 до 8.
Повторяться будет ТОЛЬКО то, что в диапазоне закладки, поэтому закладкой лучше отмечать всю строку документа целиком. Если секция используется
для повторения строки таблицы, то отмечать закладкой следует также всю строку документа, в которой находится эта строка таблицы. -
Существует три категории переменных шаблона:
-
переменные вне секций
Синтаксис объявления: #(ИмяСвободнойПеременной)
Способ определения значения: напрямую, методом SetValue -
переменные секций
Синтаксис объявления: #(ИмяСекции(ИмяСчетчика).ИмяПеременной)
Способ определения значения: из текущей записи привязанного поля набора данных. -
счетчики записей секций
Синтаксис объявления: #(ИмяСчетчика)
Объявление действительно только внутри секции.
Заменяется на текущий номер записи привязанного набора данных при отсутствии групп секций
или на номер записи в неразвывной последовательности при группировке секций.
-
ИмяСвободнойПеременной — ненулевая последовательность латинских букв, цифр и точек (только букв, цифр и точек, никаких других знаков!). Регистр букв не важен.
-
ИмяПеременной — ненулевая последовательность латинских букв и цифр. Регистр букв не важен.
-
ИмяСчетчика — ненулевая последовательность латинских букв и цифр. Регистр букв не важен.
-
ИмяСекции — ненулевая последовательность латинских букв и цифр. Регистр букв не важен.
-
Максимальное количество переменных в секции — 16.
-
Максимальное количество секций в документе — 8.
-
Максимальное количество переменных вне секций — 2^31 — 1, то есть верхняя граница 32-битного целого типа.
Описание функционала компонента
Свойства времени разработки
Имя документа, содержащего шаблон
TemplateDocFileName: string
Имя документа, в котором следует сохранить готовый отчет
ResultDocFileName: string
Показать MS Word c готовым отчетом при вызове Quit
ShowResult: boolean
Свойства времени выполнения
Массив секций документа.
Доступ по имени секции.
Если секция не найдена — возвращает nil.
Bands[Name:string]: TDataBand
Количество секций документа.
BandCount: integer
Методы
Существует ли в шаблоне секция с именем BandName.
function BandExists(BandName: string): boolean;
Сохранить документ в файле FileName.
procedure SaveToFile(FileName: string);
Выйти. Завершает процесс MS Word или показывает готовый документ.
procedure Quit;
Сформировать отчет. Выполняет все операции для формирования одного отчета, сохраняет и закрывает полученный документ.
Однако, сам Word остается запущенным для формирования следующих отчетов.
procedure Build;
Установить значение свободной переменной.
procedure SetValue(VariableName:string; Value:Variant);
Связать две соседние секции вместе
так чтобы они чередуясь выводили записи из одного и того же набора данных (НД).
Однако, для этого требуется указать целочисленное поле в НД,
значение которого и будет определять, какую именно секцию использовать для вывода текущей записи.
procedure JoinBands(BandKeyField:string; BandName1:string; KeyValue1:integer; BandName2:string; KeyValue2:integer);
События
Событие наступает после прочтения структуры документа-шаблона,
т.е. тогда, когда имена всех секций (bands) и переменных уже определены, но
этим переменным еще не установлены значения или поля набора данных (НД).
OnReadMaket:TNotifyEvent;
Объект секции документа (TDataBand)
Свойства времени выполнения
Имя секции документа.
Name: string
Имя поля для переменной VarName.
Field[VarName:string]: string
Формат вывода переменной.
Format[VarName:string]: string
Методы
Подключить набор данных к секции.
Параметром служит указатель на TDataset, т.е. вызов производится так:
AssignDataSet(@IBQuery1) или AssignDataSet(@ADOTable1).
procedure AssignDataSet(aDataSet: PDataSet);
Установить переменной VariableName из секции поле FieldName набора данных, подключенного к этой секции.
Если поле содержит действительные числа, то лучше использовать маску формата для их отображения,
например %10.2f (полный список форматов см. в описании функции SysUtils.Format).
Во всех других случаях значение параметра формат можно оставить пустой строкой, т.к. это ни на что не повлияет
procedure SetField(VariableName,FieldName,Format:string);
Обработка события OnReadMaket
Так как каждый шаблон уникален и содержит свой неповторимый набор секций и переменных, то и связывание этих секций и переменных со своими
значениями также процесс уникальный, а потому не может быть до конца автоматизирован внутри самого компонента. Эту задачу предстоит решить пользователю компонента.
Специально для этой цели и было создано данное событие.
В обработчике этого события НЕОБХОДИМО произвести связывание:
- имен переменных с их значениями (TWordReport.SetValue),
- секций с их заполненными наборами данных (TDataBand.AssignDataset),
- переменных в секции с их полями (TDataBand.SetField),
- а также, если это нужно — формирование групп секций (TWordReport.JoinBands)
Подробнее об этом в примере приложения.
Иные версии Delphi
Если нужен компонент для другой версии Delphi — используйте исходные коды, чтобы собрать пакет на своей Delphi, а затем скопируйте его:
- 32-битную release версию bpl — в поддиректорию bin
- 64-битную release bpl — в bin64
- 32-битную release версию dcu вместе с файлами WordReport.dcr и wrtprogress.dfm в libwin32release.
- 64-битную release версию dcu вместе с файлами WordReport.dcr и wrtprogress.dfm в libwin64release.
- Отладочные DCU, если они нужны, копируются в libwin32debug и libwin64debug уже без файлов ресурсов.
I need to be able to open and edit a Word template from Delphi (using Word)
I can open the template OK but Word assumes it to be a document and not a template.
The problem is that I need to edit the template and not use it as template for a new document.
I use the templates as part of a documenthandling system and I want the users to be able to edit the templates from my app. As it is now they have to open Word and then open the template from there and edit it — doing it from my app would be easier and more secure.
Experimental code
fWordApp: WordApplication;
TempName: OleVariant;
WordDoc: WordDocument;
TemplateFile: string;
begin
TemplateFile := Settings.Directories.RootInsert(qryTemplates.FieldByName('fldtemplate_path').AsString);
if TemplateFile <> '' then
begin
if not Assigned(fWordApp) then
begin
fWordApp := CreateOleObject('Word.Application') as WordApplication;
while fWordApp.Templates.Count = 0 do
Sleep(200); // Normal.dot must be loaded
end;
if Assigned(fWordApp) then
fWordApp.Visible := True
else
raise Exception.Create('Cannot initialize Word application');
TempName := TemplateFile;
WordDoc := fWordApp.Documents.Add(TempName, EmptyParam, wdFormatTemplate, EmptyParam);
Deduplicator
44.3k7 gold badges65 silver badges115 bronze badges
asked Dec 23, 2012 at 9:19
2
As I understand it, you are using the wrong method. The Add
method is used to create a new document. You can pass a template file name to make the new document be based on that template.
But you want to open an existing document and edit it. It doesn’t matter that the document is a template. You still need to open it. And for that you need the Open
method. Here’s a rather trivial example.
var
WordApp, Doc: Variant;
begin
WordApp := CreateOleObject('Word.Application');
WordApp.Visible := True;
Doc := WordApp.Documents.Open('pathtomytemplate.dotx');
Doc.Range.Text := 'Merry Christmas everyone';
Doc.Save;
WordApp.Quit;
end;
I’ve used late binding because I found that easier for this example. But you should stick to your early binding approach. You’ll have to navigate the fact that the open method takes loads of parameters. I think you can simply pass EmptyParam
to all but the first parameter.
answered Dec 23, 2012 at 15:27
David HeffernanDavid Heffernan
598k42 gold badges1061 silver badges1474 bronze badges
0
Thorarin
46.9k11 gold badges73 silver badges109 bronze badges
answered Apr 13, 2013 at 12:38
1