I’m not sure exactly what you mean by «ReadOnly».
The WordDocument has a ReadOnly
boolean property which is read-only in the sense that you can read its value but not set it. This property returns true if when the document was opened, it was already open e.g. on a different workstation, so that the user would get the prompt «This document is locked for editing …» and asked whether to open the document in read-only mode or whether Word should open a copy instead.
The other sense in which a Word document might be «read only» is if the used has marked it «Final» by clicking the Word button (that leads to the File menu, etc) and gone to Prepare | Mark as Final
(in the «Ribbon» versions of MS Word).
To read these properties in code you can do e.g.
if WordDoc.Final then
Caption := 'Final'
else
Caption := 'not Final';
if WordDoc.ReadOnly then
Caption := Caption + ' Read only'
else
Caption := Caption + ' Read/write'
Note: The Final
property is not surfaced in Delphi’s Word2000.Pas, so to use it you need to go from early binding to late binding, like this:
var vWordDoc : OleVariant;
[...]
vWordDoc := WordDoc;
if vWordDoc.Final then
[...]
Unlike the ReadOnly
property, you can toggle the Final
property simply by
WordDoc.Final := not WordDoc.Final
But whether you can do this successfully when WordDoc.ReadOnly
is True
depends on why WordDoc.ReadOnly
is True
.
If WordDoc.ReadOnly
is True
because the document was edit-locked when it was opened because it was already open at another workstation, WordDoc.Final
is read-only. Otoh, if it’s True
because you specified ReadOnly
in the call to .Open(), then you need to watch out: You can then set Final
to False
and the user will then be able to edit the document despite its having been opened ReadOnly
!
Another complication is that ProtectionType
is not directly related to «ReadOnly», as I imagine you’ve gathered: it can, but doesn’t necessarily, prevent editing except to certain regions of a document.
Сообщение от droider
Вы о чем?? Режим редактирования так и называется поскольку позволяет редактировать документ!
Я вот об этих основах работы с ворд….
скачайте папку, в ней документ, откроется в режиме просмотра (форматирование текста искажено), нажмите вид-изменить документ (документ в режиме редактирования, с ВЕРНЫМ форматированием текста) НО! благодаря тому что редактирование при защите документа было разрешено только в «Ввод данных в поля форм» — РЕДАКТИРОВАНИЕ и КОПИРОВАНИЕ документа будет ЗАПРЕЩЕНО.
А еще при помощи этого метода можно частично запретить редактирование текста (например если отправлять кому то электронный договор можно оставить редактируемыми только те строки которые нужны при заполнении, делается для того что бы не вычитывать договор несколько раз, а то мало ли что туда вздумают дописать ……)
Добавлено через 1 минуту
Спасибо огромное за помощь! Буду думать дальше!
Добавлено через 1 час 4 минуты
Delphi | ||
|
если кому вдруг понадобиться…..вот решение
Я не уверен , что именно вы подразумеваете под «ReadOnly».
WordDocument имеет ReadOnly
логическое свойство, которое доступно только для чтения в том смысле, что вы можете читать его значение, но не устанавливать его. Это свойство возвращает значение true, если, когда документ был открыт, он уже был открыт, например, на другой рабочей станции, чтобы пользователь получил приглашение «Этот документ заблокирован для редактирования…» и спросил, открывать ли документ в режиме чтения. только режим или должен ли Word открыть копию вместо этого.
Другой смысл, в котором документ Word может быть «только для чтения», заключается в том, что использованный пользователь пометил его как «Окончательный», нажав кнопку Word (которая ведет к меню «Файл» и т. Д.) И перешел к Prepare | Mark as Final
(в «Ленточных» версиях MS Word).
Чтобы прочитать эти свойства в коде, вы можете сделать, например,
if WordDoc.Final then
Caption := 'Final'
else
Caption := 'not Final';
if WordDoc.ReadOnly then
Caption := Caption + ' Read only'
else
Caption := Caption + ' Read/write'
Примечание: Final
свойство не раскрывается в Delphi Word2000.Pas, поэтому для его использования необходимо перейти от раннего связывания к позднему связыванию, например так:
var vWordDoc : OleVariant;
[...]
vWordDoc := WordDoc;
if vWordDoc.Final then
[...]
в отличие от ReadOnly
свойство, вы можете переключать Final
собственность просто
WordDoc.Final := not WordDoc.Final
Но можете ли вы сделать это успешно, когда WordDoc.ReadOnly
является True
зависит от того, почему WordDoc.ReadOnly
является True
,
Если WordDoc.ReadOnly
является True
потому что документ был заблокирован для редактирования, когда он был открыт, потому что он уже был открыт на другой рабочей станции, WordDoc.Final
только для чтения. Ото, если это True
потому что вы указали ReadOnly
в вызове.Open(), то вам нужно остерегаться: затем вы можете установить Final
в False
и тогда пользователь сможет редактировать документ, несмотря на то, что он был открыт ReadOnly
!
Другое осложнение заключается в том, что ProtectionType
не имеет прямого отношения к «ReadOnly», как я полагаю, вы собрались: он может, но не обязательно, предотвращать редактирование, за исключением определенных областей документа.
Delphi –
это один из самых популярных и эффективных инструментов разработки сложных
приложений и возможность интегрировать средства приложений MS Office в разрабатываемые в этой среде проекты.
Известно, что Word и Excel является OLE – объектом. Суть OLE технологии возможность из разрабатываемого
приложения (клиента) взаимодействовать с другими приложениями (серверами). Все
приложения Microsoft Office являются так называемыми «серверами
автоматизации». Microsoft Word, являясь сервером OLE, позволяет
подключаться к себе клиентам и использовать свои методы и свойства.
Работа с MS Word в Borland Delphi. Для
работы с Word
файлами нам потребуется библиотека ComObj, которая входит в стандартную поставку Borland Delphi. Подключается она в разделе Uses.
Для начала нужно подключиться
к Word серверу, другими
словами ещё называют инициализацией. Это происходит следующим образом:
Var
Application: Variant
Begin
Application:=createOLEObject(‘Word.Application’) ;
End;
Сначала вводим
вариантную переменную, затем создаем объект OLE ‘Word.Application‘, и присваиваем его этой
переменной. Эта процедура называется «создание экземпляра сервера».
Создав этот объект, мы затем программируем его свойства и методы.
После создания
экземпляра сервера, нужно либо создать новый документ, либо открыть уже
имеющийся.
Создание нового
документа. Создание документа
производится методом Add. Синтаксис метода:
Add
(Template, NewTemplate, DocumentType, Visible);
Все параметры метода – типа Variant необязательны.
Template |
Имя шаблона, по которому создается новый документ. |
NewTemplate |
Если использовать значение True, то новый документ открывается как шаблон. Значение |
DocumentType |
Может принимать одно из следующих значений констант |
Visible |
Управляет видимостью созданного документа. Если |
Так как все параметры являются
необязательными, то для создания нового документа по шаблону Normal метод можно применить без параметров:
Application.Documents.Add;
Открытие документа. Открытие существующего документа Word реализуется методом Open. Синтаксис метода:
Open (FileName,
ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument,
PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format,
Encoding, Visible);
Кроме параметра FileName все остальные необязательны.
FileName |
В параметре указывается имя файла |
ConfirmConversions |
Если в значении этого параметра |
ReadOnly |
Указывая True, открываем документ только для чтения. |
AddToRecentFiles |
Устанавливая значение в True, позволяем добавлять имя открываемого файла в список |
PasswordDocument |
Пароль открываемого документа. |
PasswordTemplate |
Пароль открываемого шаблона. |
Revert |
Параметр, предусмотренный для |
WritePasswordDocument |
Пароль для сохраняемого документа. |
WritePasswordTemplate |
Пароль для сохраняемого шаблона. |
Format |
Конвертор WdOpenFormat: wdOpenFormatAllWord, wdOpenFormatAuto, wdOpenFormatDocument, wdOpenFormatEncodedText, wdOpenFormatRTF, wdOpenFormatTemplate, wdOpenFormatText, wdOpenFormatUnicodeText, wdOpenFormatWebPages. По умолчанию wdOpenFormatAuto. Необязательный |
Encoding |
Кодировка для просмотра документа, |
Visible |
Устанавливая True, предусматриваем видимое открытие документа. По |
Например, для открытия документа «c:1.doc» метод Open применяется как
Application.Documents.Open(‘c:/1.doc’);
Все элементы рассматриваемого OLE объекта являются так
называемыми коллекциями. Коллекция – это объект, содержащий
специфический набор методов и свойств. Коллекция похожа на динамический массив.
В ней содержится набор объектов, которые обычно имеют один тип. Вы можете
добавлять в нее элементы, удалять и получать их значения. Доступ к элементу
осуществляется либо по его порядковому номеру, либо по его имени. Например, все
открытые документы представляют собой коллекцию.
Обращение к документу. Обращение к открытому документу, как к элементу
набора коллекции, можно по порядковому номеру методом Item. Например, обращение ко второму документу будет выглядеть как:
Application.Documents.Item(2);
Нумерация всех элементов
в коллекции начинается с единицы, а не с нуля. Аналогичную операцию можно
осуществить еще как:
Application.Documents(2);
Для работы с документом,
его сначала нужно активизировать, т.е. передать ему фокус, подготовить для
редактирования или других операций. Активизирование документа производится
методом Activate. Для активизации документа, его нужно выбрать из коллекции
по его порядковому номеру:
Application.Documents.Item(2).Activate; или по имени файла
Application.Document(‘c:1.doc’).Activate;
К активному документу
можно обращаться, используя свойство ActiveDocument, например, закрыть
активный документ:
Application.ActiveDocument.Close;
Вставка текста в
документ. Далее по тексту мы в
основном будем манипулировать коллекций объектов Range, т.е. весь текст удобно будет
рассматривать как несколько непрерывных областей. Добавление текста
осуществляется следующим образом: сначала создается объект Range, представляющий собой непрерывную область
документа, затем методами этого объекта добавляется текст. Объект Range может объявляться как:
выражение. Range (начало области,
конец области);
Например, объявленный ниже объект Range1 охватывает собой первые 10 символов
второго документа.
Var
Range1:variant;
Begin
Range1:=Application.Documents(2).Range(1,10);
End;
В документе сначала
можно создавать абзацы, т.е. объекты Paragraphs, и затем объединять их
в области. К примеру, в начале активного документа методом Add объекта Paragraphs создаем новый абзац, затем на его основе создаем
объект Range1:
Var
Range1:variant;
Begin
Application.ActiveDocument.Paragraphs.Add;
Range1:=Application.ActiveDocument.Paragraphs.Item(1).Range;
End;
Вставка текста производится
двумя методами объекта Range: InsertAfter и InsertBefore. Синтаксис методов:
выражение. InsertAfter(текст);
Этим методом
производится вставка текста после начала объекта Range выражение. InsertBefore(текст), а этим – до.
При использовании этих
методов, в качестве параметра указать нужно только текст в апострофах. К
примеру, вызов двух операторов даст нам две строки: это вставленный текст InsertBefore и это текст InsertAfter:
Range1.InsertAfter(‘это текст InsertAfter ‘);
Range1.InsertBefore(‘это вставленный текст InsertBefore‘);
У объекта Range есть много полезных свойств. Например:
Свойство Font (шрифт), которое имеет свои подсвойства:
Font.Bold:=True – жирность шрифта
Font.Name:=»Arial» – название
шрифта
Font.Size:= 24 – размер шрифта
Font.Color:= clRed – цвет
шрифта
Font.Italic:= True – наклонность шрифта
Например, вставка жирной строки зеленого цвета:
Range1.Font.Bold:=True;
Range1.Font.Size:=14;
Range1.Font.Color:=clGreen;
Range1.InsertAfter(‘вставленная строка‘);
Объект типа Range можно форматировать. Например, следующей строкой содержимое
объекта Range выравнивается по центру:
Range1.ParagraphFormat.Aligment:=wdAlignParagrapfCenter;
Работа с Excel
файлами в Delphi. Для работы с Excel файлами в Delphi так же нужно подключить модуль ComObj в разделе Uses.
Для
начала нужно подключиться к Excel серверу, другими словами ещё называют инициализацией. Это происходит следующим
образом:
var
Excel: Variant;
Excel := CreateOleObject(‘Excel.Application‘);
Сначала вводим
вариантную переменную, затем создаем объект OLE ‘Excel.Application‘, и присваиваем его этой
переменной. Эта процедура называется «создание экземпляра сервера».
Создав этот объект, мы затем программируем его свойства и методы.
После создания экземпляра сервера, нужно либо создать новую книгу, либо
открыть уже имеющуюся.
Создание новой книги:
Excel.Workbooks.Add;
Открытие существующей книги (где путь – путь к файлу с расширением xls.):
Excel.Workbooks.Open[путь]; //(Excel.Workbooks.Open(‘c:2.xls‘));
Открытие существующей книги только для чтения:
Excel.Workbooks.Open[путь, 0,
True];
Excel.Workbooks.Open(‘c:2.xls’,0,true);
Закрытие Excel:
Excel.ActiveWorkbook.Close;
Excel.Application.Quit;
Отображаем или скрываем Excel на экране:
Excel.Visible := True;
Excel.Visible := False;
Печать содержимого активного листа Excel:
Excel.ActiveSheet.PrintOut;
Чтение/запись данных
в Excel.
Доступ к ячейке в текущей книге Excel можно осуществить следующим
образом:
// запись значения в
ячейку
Excel.Range[‘A2′]:=’Привет!’;
// чтение значения
из ячейки
s:=Excel.Range[‘A2’];
где A2 – адрес ячейки.
Или
используя стиль ссылок R1C1:
Excel.Range[excel.Cells[2, 2]]:=’Привет!’; где [2, 2] – координата
ячейки.
Вообще,
ячейке Excel можно присваивать любое значение (символьное, целое, дробное,
дата) при этом Excel установит форматирование в ячейке применяемое по
умолчанию.
Формат ячеек в Excel. Выделить (выбрать) группу ячеек для последующей работы можно так:
Excel.Range[Excel.Cells[1,
1],Excel.Cells[5, 3]].Select; либо
Excel.Range[‘A1:C5’].Select;
При этом
будет выделена область находящаяся между ячейкой A1 и C5.
После выполнения
выделения можно установить:
1) Объединение ячеек:
Excel.Selection.MergeCells:=True;
2) Перенос по
словам:
Excel.Selection.WrapText:=True;
3) Горизонтальное
выравнивание:
Excel.Selection.HorizontalAlignment:=3;
при
присваивании значения 1 используется выравнивание по умолчанию,
при 2 –
выравнивание слева,3 – по центру, 4 – справа.
4) Вертикальное
выравнивание
Excel.Selection.VerticalAlignment:=1;
присваиваемые
значения аналогичны горизонтальному выравниванию.
5) Граница
для ячеек:
Excel.Selection.Borders.LineStyle:=1;
При
значении 1 границы ячеек рисуются тонкими сплошными линиями. Кроме этого можно
указать значения для свойства Borders, например, равное 3. Тогда установится
только верхняя граница для блока выделения:
Excel.Selection.Borders[3].LineStyle:=1;
Значение свойства Borders задает различную комбинацию граней ячеек.В
обоих случаях можно использовать значения в диапазоне от 1 до 10.
Доступ к приложению Word осуществляется, как правило, посредством основных двух объектов, Word.Application и Word.Document. Они же обеспечивают доступ и к другим объектам Word (текст, таблицы, кнопки, меню и т.д.). Наиболее легкий метод работы с COM-сервером Word базируется на использовании переменных типа Variant.
Давайте на примере рассмотрим создание документа Word помощью Delphi.
Для начала создадим новый проект (File | New | VCL Foms Application-Delphi) и поместим на него 4 кнопки (TButton). Поменяем заголовки (свойство Caption) этих кнопок на: «Создать документ Word», «Открыть документ Word», «Сохранить документ Word», «Закрыть документ Word». Как понятно из названий, мы будем открывать, создавать, сохранять и закрывать документ Word при нажатии на эти кнопки.
Чтобы начать работать с Word необходимо в модуле формы указать ссылку на использование библиотеки ComObj, поэтому в разделе uses мы дописываем ComObj. Также нам необходимо объявить переменную типа Variant. Давайте создадим обработчик события OnClick для кнопки «Создать документ Word» и напишем код:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
w:=CreateOleObject(‘Word.Application’);
end;
Если сейчас запустить нашу программу и нажать на кнопку «Создать документ Word», то приложение Word будет запущено, но его окно не будет отображено на экране монитора. В память компьютера будет загружен объект Application, который обеспечивает доступ ко всем внутренним объектам, коллекциям и свойствам. Сейчас нас интересует свойство Visible этого объекта. Если значение этого свойства установить в True, то окно приложения Word станет видимым. Поэтому давайте допишем еще одну строчку в наш код:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
w:=CreateOleObject(‘Word.Application’);// запуск приложения Word
w.Visible:=true; // делаем Word видимым
end;
Вот теперь если запустить программу и нажать на кнопку «Создать документ Word», то наше приложение Word станет видимым и отобразится на экране монитора.
Для того чтобы создать новый документ, необходимо использовать метод Add, коллекции Documents. Поэтому если мы хотим создать новый документ Word с помощью Delphi, необходимо написать:
Код
procedure TForm1.Button1Click(Sender: TObject);
begin
w:=CreateOleObject(‘Word.Application’);// запуск приложения Word
w.Documents.Add; // создание нового документа
w.Visible:=true; // делаем Word видимым
end;
В этом коде, после выполнения метода Add, будет создан новый документ, который отобразится в окне приложения Word. Обратите внимание, что видимым наш документ (w.Visible:=true) я делаю в самую последнюю очередь. При формировании отчетов, рекомендуется так делать. Это сокращает время создания отчетов и повышает производительность работы приложений.
С созданием документа Word в Delphi разобрались. Теперь перейдем к открытию документа Word. Для этого создаем обработчик события OnClick для кнопки «Открыть документ Word» и напишем следующее:
Код
procedure TForm1.Button2Click(Sender: TObject);
begin
w:=CreateOleObject(‘Word.Application’);// запуск приложения Word
w.Documents.Open(ExtractFilePath(paramstr(0))+’/Delphi and MS Word.doc’); //открываем документ Word находящийся в папке с программой
w.Visible:=true; // делаем Word видимым
end;
Синтаксис метода Open глядит следующим образом:
Код
Documents.Open(FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format)
Давайте рассмотрим аргументы метода 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, остальные параметры могут отсутствовать, как отсутствуют в вышеприведенном примере кода. Но если вдруг нам понадобится воспользоваться некоторыми из этих параметров, то их необходимо явно указать при вызове метода. Например, если мы решим открыть файл в режиме «Только для чтения», то код будет выглядеть следующим образом:
Код
procedure TForm1.Button2Click(Sender: TObject);
begin
w:=CreateOleObject(‘Word.Application’);// запуск приложения Word
w.Documents.Open(ExtractFilePath(paramstr(0))+’/DelphiSchool.doc’, ReadOnly:=true); // открываем документ Word находящийся в папке с программой в режиме «Только для чтения»
w.Visible:=true; // делаем Word видимым
end;
С открытием документа Word тоже разобрались. Переходим к сохранению документа. Для кнопки «Сохранить документ Word» создаем обработчик события OnClick и пишем:
Код
procedure TForm1.Button3Click(Sender: TObject);
begin
w:=CreateOleObject(‘Word.Application’);// запуск приложения Word
//открываем документ Word находящийся в папке с программой в режиме «Только для чтения»
w.Documents.Open(ExtractFilePath(paramstr(0))+’/DelphiSchool.doc’, ReadOnly:=true);
// сохраняем документ в папку с программой под именем DelphiSchool Copy.doc
w.ActiveDocument.SaveAs(ExtractFileDir(paramstr(0))+’/DelphiSchool Copy.doc’);
w.Visible:=true; // делаем Word видимым
end;
Аргументы метода SaveAs, их типы и функциональное назначение представлены ниже:
FileName: String — Путь и имя файла
FileFormat — Число Формат файла
LockComments: Boolean — True — не сохранять комментарии
Password: String — Пароль, который будет использоваться при открытии документа
AddToRecentFiles: Boolean — True — добавить имя файла в список меню File
WritePassword: String — Пароль, который будет использоваться для сохранения документа
ReadOnlyRecommended: Boolean — True — в последующем документ можно открыть «только для чтения»
EmbedTrueTypeFonts: Boolean — True — при сохранении перевести шрифты документа в TrueType
SaveNativePictureFormat: Boolean — Используется для импорта графики из форматов, не поддерживаемых Windows. True — импортировать только графику, поддерживаемую Windows
SaveFormsData: Boolean — True — сохранить форму документа без текста
SaveAsAOCELetter: Boolean — Используется в версиях Word для компьютеров Apple Macintosh
При вызове метода SaveAs, как и при Open, можно задавать как один, так и несколько аргументов. Но, как правило, достаточно только первого аргумента (путь и имя файла).
Ну и последнее что мы рассмотрим – это закрытие документа. Закрыть документы можно с помощью метода Close коллекции Documents. Создадим обработчик события OnClick для кнопки «Закрыть документ Word» и напишем код:
Код
procedure TForm1.Button4Click(Sender: TObject);
begin
w.ActiveDocument.Close(True); // сохраняем и закрываем Word
end;
После того как документ закрыт, можно закрывать и приложение Word:
Код
procedure TForm1.Button4Click(Sender: TObject);
begin
w.ActiveDocument.Close(True); // сохраняем и закрываем Word
w.Quit;
end;
К уроку (статье) Основы работы с MS Word. Создание, открытие, сохранение и закрытие документа Word с помощью Delphi прилагается исходник, посмотрев который, вы можете ознакомиться с полным исходным кодом программы и посмотреть как работает созданная программа. Исходный код сопровождается комментариями, благодаря чему вы сможете легко в нем разобраться. Но я настоятельно рекомендую делать все самостоятельно. Так вы лучше и быстрее усвоите то, о чем говорилось в этом уроке
Для того чтобы получить возможность скачать исходник Delphi к этому уроку, необходимо посетить сайт рекламодателя. После этого, появится ссылка на исходник Delphi к уроку Основы работы с MS Word. Создание, открытие, сохранение и закрытие документа Word с помощью Delphi
Нажмите на эту ссылку Ссылка
Barmutik
-
#1
Вопрос следующий:
Каким образом можно показать документ внутри программы только в режиме просмотра?
Желательно бы конечно следующее .. открыть документ.. сделать там изменения для показа и показывать пользователю, но что бы он изменить ничего не мог!
zubr
-
#2
Дык а через OLE контейнер?
Barmutik
-
#3
Ну дык и объяните как его можно открыть .. изменить потом что-то .. потом показать пользователю и что б он был РидОнли в этом OLE контейнере ?
zubr
-
#4
1. Окрыть документ через OLE в режиме Visible=False
2. Внести программно изменения
3. Сохранить программно документ
4. Закрыть документ
5. Открыть документ в OleContainer в режиме внедрения (без связывания) + OleContainer.Enabled:=False
Barmutik
-
#5
А вот мне надо изменения не сохранять…
Задача следующего рода:
1. Открываем документ
2. Ищем в нём требуемые врагменты
3. Перекрашиваем0выделяем их
4. Показываем всё это человеку
5. Он иммет возможность ходить к пред и след выделнным фрагментам
6. Документ НЕ должен сохранить никаких изменений…
zubr
-
#6
Используем не OleContainer, а RichEdit, где RichEdit.ReadOnly:=True
1. Открываем документ
2. Ищем в нём требуемые врагменты
3. Перекрашиваем0выделяем их
4. Сохраняем во временный файл в RTF-формате
5. Загружаем временный файл в RichEdit
6. После окончания работы программы удаляем временный файл
Barmutik
-
#7
Вариант конечно нормальный … но .. надо что бы полностью сохранился формат документа .. а при конверте в РТФ этого не происходит .. опять же эти операции на больших фалах займут очень много времени .. а это критично …
zubr
-
#8
Ну а попроще варианты:
1. ActiveDocument.ReadOnly = True
2. Установить атрибут файла только для чтения
Barmutik
-
#9
В качестве попроще вариантов ответы :
1. ReadOnly — совйство только по чтению
2. Если поставить атрибут тоько для чтения, то я не смогу внести свои изменения.
Спасибо за попытки помочь, я уже перепробовал кучи способов … простые варианты не подходят .. просто я думаю вдруг кто обладает тайными знаниями
zubr
-
#10
Если поставить атрибут тоько для чтения, то я не смогу внести свои изменения.
Так а что мешает менять этот атрибут программно. Перед изменениями снять его, затем опять поставить.
Barmutik
-
#11
Не совсем понял ..
1. Снял аттрибут
2. Внёс изменения
3. Поставил … но документ то уже открыт в ворде ???
Что надо переоткрывать ? Если да то это не вариант .. для больших объёимов ..
zubr
-
#12
1. Снял аттрибут
2. Внёс изменения
3. Поставил … но документ то уже открыт в ворде ???
Сохранить то юзверь свои изменения не сможет, вернее сможет но в другой файл. Согласен, решение не очень красивое, так как изменения юзверь все таки может делать, сохранять не может. Вот еще вариант:
1. Создаете поток, отслеживающий окно документа. Если оно появилось и активно, подменяете процедуру окна, в которой разрешаете только сообщения WM_SCROLL.
Остальная последовательность действий.
Barmutik
-
#13
Вроде как вариант нашёлся … использования Protect
Но … в ворде он работает .. а когда использую его как сервер но протектит нормально .. а вот распротектить уже не хочет
Глюки какие-то … нифига нормально не работает …
Ещё глюкан вылез .. если прячеш тулбары в окне где показывается ворд то если потом вне программы открываеш Ворд то там тоже нет тулбаров
Куда не кинь .. всё не так…
zubr
-
#14
Проверил, у меня снимает защиту нормально. Вот код:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
ev:variant;
begin
W:=CreateOleObject('Word.Application');
W.visible:=True;
W.Documents.open('MyFile.doc');
ev:=wdAllowOnlyFormFields;
W.Documents.Item('MyFile.doc').Protect(ev);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
W.Documents.Item('MyFile.doc').Unprotect;
end;
Barmutik
-
#15
Так да!
Может я что криво делаю … можно попросить пример такой же когда Ворд открывается в TIOleContainer !
Может у меня уже глаза замылились …
zubr
-
#16
Вот сделал по простому, вроде работает:
Код:
procedure TForm1.Open2Click(Sender: TObject);
begin
OLEContainer1.CreateObjectFromFile('MyFile.doc', False);
OleContainer1.DoVerb(ovPrimary);
end;
procedure TForm1.Protect1Click(Sender: TObject);
var
ev, w:variant;
begin
ev:=wdAllowOnlyFormFields;
w:=OleContainer1.OleObject;
w.Protect(ev);
end;
procedure TForm1.Unprotect2Click(Sender: TObject);
var
w:variant;
begin
w:=OleContainer1.OleObject;
w.Unprotect;
end;
Barmutik
-
#17
Так что-то я не догоняю …
Какое Дельфи ? Какой Ворд?
У меня такой код вообще при попытке протекта вываливает ошибку…
Можно экзешник .. которуму указываеш путь какой файл гузить … потом две кнопки протект и анпротект …
Ну и с исходниками можно )
Бо что-то я видать или конкретно туплю .. или где-то тут собака зарыта всё таки …
zubr
-
#18
Delphi5, WordXP.
Куда сбросить экзешник с исходником?
zubr
-
#19
Да, проверил, в Delphi7 при установке Protect выбрасывает ошибку сервера. Delphi7 вообще с вордом глючно работает, я помню как то задавал вопрос на эту тему. Ну еще может быть, так как в Delphi5 делалось, используется модуль Word97 вместо WordXP в Delphi7. А экзешник скомпилированный в Delphi5 работает корректно, тестировал в WinXP и Win98, WordXP.
Barmutik
-
#20
Так .. у меня Д7… само по себе не важно какой модуль .. мы ж используем поздне связывание…
И что интересно это глюк 7 Дельфи .. пора на C# сваливать .. устал я от таких глюков ..
Импорт информации из приложения Delphi в Word
Известно, что Word является OLE-объектом. Суть OLE технологии — возможность из разрабатываемого приложения(клиента) взаимодействовать с другими приложениями(серверами). Все приложения Microsoft Office являются так называемыми «серверами автоматизации». Microsoft Word, являясь сервером OLE, позволяет подключаться к себе клиентам и использовать свои методы и свойства.
Алгоритм импорта данных в Word следующий:
1) создаем подключение к серверу-приложению Word,
2) создаем или открываем существующий документ
3) вносим в документ изменения
4) манипулируем документом, как хотим (сохраняем его, не показывая при этом экране или же наоборот),
5) отсоединяемся от сервера.
1) Подключение к серверу Word производится следующим образом:
-
var
Application: variant;
begin
Application:= CreateOleObject(‘Word.Application’);
end;
Сначала вводим вариантную переменную, затем создаем объект OLE ‘Word.Application‘, и присваиваем его этой переменной. Эта процедура называется «создание экземпляра сервера». Создав этот объект, мы затем программируем его свойства и методы.
2) после создания экземпляра сервера, нужно либо создать новый документ, либо открыть уже имеющийся, дабы только что созданный экземпляр сервера не содержит документов и, следовательно информацию импортировать нам пока что некуда.
Создание нового документа
Создание документа производится методом Add:
Синтаксис метода: Add (Template, NewTemplate, DocumentType, Visible)
Все параметры метода — типа Variant и необязательны,
Template |
Имя шаблона, по которому создается новый документ. Если значение не указано, то используется шаблон Normal. |
NewTemplate |
Если использовать значение True, то новый документ открывается как шаблон. Значение по умолчанию — False. |
DocumentType |
Может принимать одно из следующих значений констант типа WdNewDocumentType: wdNewBlankDocument (новый чистый документ), wdNewEmailMessage(электронное сообщение) или wdNewWebPage(Web-страница). Значение по умолчанию wdNewBlankDocument. |
Visible |
Управляет видимостью созданного документа. Если указать значение True, то документ будет видим. По умолчанию Microsoft Word открывает документ с свойством Visible установленным в True. |
Так как все параметры являются необязательными, то для создания нового документа по шаблону Normal метод можно применить без параметров:
Application.Documents.Add;
Для создания нового документа по шаблону <Шаблон.dot> метод применяется следующим образом
Application.Documents.Add(‘C:Program Files
Microsoft Office1049Шаблон.dot’);
Например, создание нового документа в виде Web-страницы будет выглядеть как
Var
DocumentType: OleVariant;
Application:variant;
begin
Application:= CreateOleObject(‘Word.Application’);
DocumentType:=wdNewWebPage;
Application.Documents.Add(EmptyParam,False,DocumentType,EmptyParam);
Все параметры в методах объявляются типа OleVariant. Если параметр не используется в методе, то вместо него указывается EmptyParam, что означает пустой параметр.
Открытие документа
Открытие существующего документа Word реализуется методом Open.
Синтаксис метода:
Open (FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format, Encoding, Visible)
FileName |
В параметре указывается имя файла документа, включая путь. Обязательный параметр. |
ConfirmConversions |
Если в значении этого параметра указать значение True, то в случае открытия документа с форматом, отличного от Word, будет выводится диалоговое окно конвертирования файла. Необязательный параметр. |
ReadOnly |
Указывая True, открываем документ только для чтения. Необязательный параметр. |
AddToRecentFiles |
Устанавливая значение в True, позволяем добавлять имя открываемого файла в список недавно открытых файлов в меню Файл. Необязательный параметр. |
PasswordDocument |
Пароль открываемого документа. Необязательный параметр. |
PasswordTemplate |
Пароль открываемого шаблона. Необязательный параметр. |
Revert |
Параметр, предусмотренный для открытия файла с именем, уже открытого в данный момент. Если указать True то все изменения текущего документа не сохраняются и открывается файл с подобным именем. При значении False открытый файл активизируется, а новый не открывается. Необязательный параметр. |
WritePasswordDocument |
Пароль для сохраняемого документа. Необязательный параметр. |
WritePasswordTemplate |
Пароль для сохраняемого шаблона. Необязательный параметр. |
Format |
Конвертор файла, необходимый для открытия документа. Может принимать одно из следующих значений типа WdOpenFormat: wdOpenFormatAllWord, wdOpenFormatAuto, wdOpenFormatDocument, wdOpenFormatEncodedText, wdOpenFormatRTF, wdOpenFormatTemplate, wdOpenFormatText, wdOpenFormatUnicodeText, or wdOpenFormatWebPages. По умолчанию wdOpenFormatAuto. Необязательный параметр. |
Encoding |
Кодировка для просмотра документа, может принимать любое правильное значение из ряда констант MsoEncoding. По умолчанию используется системная кодовая станица, установленная по умолчанию. Необязательный параметр. |
Visible |
Устанавливая True, предусматриваем видимое открытие документа. По умолчанию установлено True. Необязательный параметр. |
Например, для открытия документа «c:Example.doc» метод Open применяется как
Application.Documents.Open(‘c:Example.doc’);
а для файла «C:Exam.doc» с паролем на открытие «1» как:
Application.Documents.Open(‘c:Exam.doc’,EmptyParam,EmptyParam,EmptyParam,’1′);
3) Все элементы рассматриваемого OLE объекта являются так называемыми коллекциями. Коллекция — есть объект, содержащий специфический набор методов и свойств. Коллекция похожа на динамический массив. В ней содержится набор объектов, которые обычно имеют один тип. Вы можете добавлять в нее элементы, удалять и получать их значения. Доступ к элементу осуществляется либо по его порядковому номеру, либо по его имени. Например, все открытые документы представляют собой коллекцию.
Обращение к документу
Обращение к открытому документу, как к элементу набора коллекции, можно по порядковому номеру методом Item. Например, обращение ко второму документу будет выглядеть как:
Application.Documents.Item(2);
Нумерация всех элементов в коллекции начинается с единицы, а не с нуля.
Аналогичную операцию можно осуществить еще как.
Application.Documents(2);
Для работы с документом, его сначала нужно активизировать, т.е. передать ему фокус, подготовить для редактирования или других операций. Активизирование документа производится методом Activate. Для активизации документа, его нужно выбрать из коллекции по его порядковому номеру:
Application.Documents.Item(2).Activate;
или по имени файла:
Application.Document(«C:Example.doc»).Activate;
к активному документу можно обращаться, используя свойство ActiveDocument,
например, закрыть активный документ:
Application.ActiveDocument.Close;
3) Внесение изменений в документы.
Теперь настала очередь изучить иерархию методов и свойств OLE объекта.В упрощенном виде картина выглядит следующим образом:
рис.1
Суть иерархии следующая: объект Application содержит коллекцию документов Documents, тот в свою очередь содержит коллекцию Paragraphs (абзацев), областей документа Range, таблиц Table, закладок Bookmark.
Вставка текста в документ
Далее по тексту мы в основном будем манипулировать коллекций объектов Range, т.е. весь текст удобно будет рассматривать как несколько непрерывных областей. Добавление текста осуществляется следующим образом: сначала создается объект Range, представляющий собой непрерывную область документа, затем методами этого объекта добавляется текст. Объект Range может объявляться как
выражение.Range (начало области, конец области)
например, объявленный ниже объект Range1 охватывает собой первые 10 символов второго документа.
var
Range1: variant;
begin
Range1:= Application.Documents(2).Range(1,10);
end;
В документе сначала можно создавать абзацы, т.е. объекты Paragraphs, и затем объединять их в области. К примеру, в начале активного документа методом Add объекта Paragraphs создаем новый абзац, затем на его основе создаем объект Range1:
var
Range1: variant;
begin
Application.ActiveDocument
.
Paragraphs.Add;
Range1:=Application.ActiveDocument.Paragraphs.Item(1).Range;
end;
Вставка текста производится двумя методами объекта Range: InsertAfter и InsertBefore.
Спецификация методов проста:
выражение.InsertAfter(текст) этим методом производится вставка текста после начала объекта Range
выражение.InsertBefore(текст) ,а этим — до.
при использовании этих методов, в качестве параметра указать нужно только текст в апострофах. К примеру, вызов двух операторов
Range1.InsertAfter(‘это текст InsertAfter’);
Range1.InsertBefore(‘это вставленный текст InsertBefore’);
даст нам две строки:
это вставленный текст InsertBefore
это текст InsertAfter
У объекта Range есть много полезных свойств, которые вам неплохо было бы узнать:
свойство Font (шрифт), которое имеет свои подсвойства:
Font.Bold:=True — жирность шрифта
Font.Name:=»Arial»-название шрифта
Font.Size:= 24 — размер шрифта
Font.Color:= clRed — цвет шрифта
Font.Italic:= True — наклонность шрифта
Например, вставка жирной строки зеленого цвета:
Range1.Font.Bold:= True;
Range1.Font.Size:= 24;
Range1.Font.Size:= clGreen;
Range1.InsertAfter(‘вставленная строка’);
Объект типа Range можно форматировать. Например, следующей строкой содержимое объекта Range выравнивается по центру:
Range1.ParagraphFormat.Alignment = wdAlignParagraphCenter