0

我正在使用自动化在 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 );

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

在此处输入图像描述

在过程中如何处理这个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;
4

1 回答 1

1

我不确定您所说的“只读”是什么意思。

WordDocument 有一个ReadOnly布尔属性,它是只读的,您可以读取它的值但不能设置它。如果文档在打开时已经打开,例如在不同的工作站上打开,则此属性返回 true,以便用户会收到提示“此文档已锁定编辑...”并询问是否以阅读方式打开文档-仅模式或 Word 是否应改为打开副本。

Word 文档可能是“只读”的另一种含义是,如果用户通过单击 Word 按钮(导致文件菜单等)将其标记为“最终”并转到Prepare | Mark as Final(在“功能区”版本中微软字)。

要在代码中读取这些属性,您可以执行例如

  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因为您ReadOnly在对 .Open() 的调用中指定,那么您需要注意:然后您可以设置FinalFalse,然后用户将能够编辑文档,尽管它已被打开ReadOnly

另一个复杂因素是ProtectionType与“ReadOnly”没有直接关系,正如我想你已经收集到的那样:它可以但不一定会阻止编辑,但文档的某些区域除外。

于 2015-10-07T07:16:05.453 回答