【问题标题】:Open word document in readonly mode以只读模式打开word文档
【发布时间】:2015-10-06 23:19:15
【问题描述】:

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

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

如何在过程 DocumentClose 中的 OnQuit 事件中处理此问题? 在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;

【问题讨论】:

  • 我想您可以尝试在打开文件之前将文件临时设置为只读,但这似乎是一种草率的解决方法。
  • 也许this link 有解决办法。
  • 我以为你在自动化。在哪种情况下,用户如何参与?
  • @DavidHeffernan 当用户刚刚打开 ReadOnly 文档时 - 当用户打开 ReadOnly 文档时不需要操作。然后在 MSWord 中选择 View-Edit Document 然后我需要在我的代码中执行一些操作
  • 用户可以做任何他们喜欢的事情。毕竟是他们的电脑。如果他们愿意,他们可以直接杀死 Word。在完成之前关闭文档。只需要求用户不要管它。或者更好的是,甚至不向他们展示文档

标签: delphi ms-word activex ole-automation


【解决方案1】:

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

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.ReadOnlyTrue 时你能否成功地做到这一点取决于为什么 WordDoc.ReadOnlyTrue

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

另一个复杂情况是ProtectionType 与“只读”没有直接关系,正如我想你已经收集到的那样:它可以,但不一定阻止编辑,除了某些区域一份文件。

【讨论】:

  • 感谢您的回答。第一:我的意思是“只读”是文件在屏幕截图中打开
  • a) 你使用的是什么 exact 版本的 MS Word 和 b) 哪个接口单元(我的意思是 Delphi 附带的那个将 MS Office 服务器放在组件上的接口单元调色板)你在你的项目中使用吗?
  • a) 客户端可以有不同版本的 MSWord。 b) 单元 Word2000
  • 啊,好的,Word2000 没有 Final 属性,但您仍然可以使用它(前提是用户使用的 Word 版本比 2000 更新)。请参阅我的答案的注释部分。
  • 我问你的屏幕截图来自哪里的原因是它看起来不像我用过的任何版本的 Word,但我没有全部使用过。那么,作为一个有趣的问题,它是哪个版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多