Открыть текстовый документ в режиме только для чтения

Я использую автоматизацию для открытия документов в Word. Иногда мне нужно открыть документ в режиме чтения ON:

 var
       WordDocument: _Document;
       WA: TWordApplication;  
     begin
       WA := TWordApplication.Create( nil );
       WA.OnQuit := DocumentClose;
       WA.Connect;
       WordDocument := Wa.Documents.Open( FileName, EmptyParam, true {ReadOnly}, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam );

Но пользователь может отключить режим чтения в открытом документе:

Как я могу справиться с этим в OnQuit событие в процедуре DocumentClose? В DocumentClose Я хочу знать, находится ли документ в режиме чтения или нет.

У меня нет никакого решения, потому что у меня не было достаточно опыта с ним. Итак, мне нужны ваши предложения, советы по этому поводу. Извините за мой английский, и если мне нужно добавить больше информации, пожалуйста, дайте мне знать. Спасибо

ОБНОВИТЬ
Я пытался прочитать тип защиты, но он всегда возвращает первый случай. Таким образом, когда документ открывается как ReadOnly, он не защищен как wdAllowOnlyReading. Некоторые документы могут быть защищены паролем, но с этим проблем нет.

const 
  wdAllowOnlyReading: Longword = $00000003;
  wdNoProtection:     Longword = $ffffffff;
var
  ProtectionType: TOleEnum;
begin
  ProtectionType := WordDocument.ProtectionType;
  case ProtectionType  of
    wdNoProtection : Showmessage('NoProtection');  
    wdAllowOnlyReading: Showmessage('ReadOnly');
  end;
end;

1 ответ

Решение

Я не уверен , что именно вы подразумеваете под "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", как я полагаю, вы собрались: он может, но не обязательно, предотвращать редактирование, за исключением определенных областей документа.

Другие вопросы по тегам