以只读模式打开word文档

Open word document in readonly mode

我正在使用自动化功能在 Word 中打开文档。有时我需要以阅读模式打开文档:

 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 );

但用户可以在打开的文档中关闭阅读模式:

如何在过程 DocumentCloseOnQuit 事件中处理这个问题? DocumentClose 我想知道文档是否处于阅读模式。

我没有任何解决方案,因为我没有足够的经验。 所以,我需要你的建议,关于它的建议。对不起我的英语,如果我需要添加更多信息,请告诉我。谢谢

更新
我试过读取保护类型,但总是 return 第一种情况。因此,当以 ReadOnly 方式打开的文档不受 wdAllowOnlyReading 保护时。有些文件可以用密码保护,但没有问题。

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

我不确定你所说的"ReadOnly"是什么意思。

WordDocument 有一个 ReadOnly 布尔值 属性,它是只读的,您可以读取它的值但不能设置它。这 属性 returns 如果打开文档时它已经打开,则为真在不同的工作站上,这样用户会收到提示 "This document is locked for editing ..." 并询问是否以只读模式打开文档,或者 Word 是否应该打开副本。

Word 文档可能 "read only" 的另一种意义是,如果用户通过单击 Word 按钮(指向文件菜单等)将其标记为 "Final" 并转到Prepare | Mark as Final(在 "Ribbon" 版本的 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.ReadOnlyTrue的时候你能不能做到这一点取决于为什么WordDoc.ReadOnlyTrue

如果 WordDoc.ReadOnlyTrue 因为文档在打开时被编辑锁定,因为它已经在另一个工作站上打开,WordDoc.Final 是只读的。 Otoh,如果它是 True 因为你在调用 .Open() 时指定了 ReadOnly,那么你需要注意:然后你可以将 Final 设置为 False 并且然后用户将能够编辑该文档,尽管它已被打开 ReadOnly!

另一个复杂的问题是 ProtectionType 与 "ReadOnly" 没有直接关系,正如我想你已经收集到的那样:它 可以 ,但不一定要防止对文档的某些区域进行编辑。