2016-11-24 258 views
0

我想在Delphi中嵌入LibreOffice的实例。我的主要目标是在即时将LibreOffice文档嵌入到MS办公室时获得类似于MS Office的结果。如果可能的话,我想使用TOLEConatiner来实现这一点。将LibreOffice的实例嵌入到应用程序中(使用TOLEContainer)

为了测试我写了一个程序与TOleContainer组件:

procedure TForm1.btn1Click(Sender: TObject); 
begin 
    if OpenDialog.Execute then 
    if FileExists(OpenDialog.FileName) then 
    OleContainer.CreateObjectFromFile(OpenDialog.FileName, false) 
end; 

对于微软Office(打开的.docx文件),该作品已经没有问题。打开一个.odt文件,然后激活OLEContainer会产生一个空框架,显示或多或少没有任何内容,因此不可查看或编辑。

所以我试图找出更多关于LibreOffice,OLE和COM的信息。我发现,我可以使用面向对象的API来访问其功能,我首先需要创建的面向对象的ServiceManager的OLEOBJECT,然后创建一个桌面服务来创建文档,像这样:

Server := CreateOleObject('com.sun.star.ServiceManager'); 
Desktop := Server.CreateInstance('com.sun.star.frame.Desktop') 
LoadParams := VarArrayCreate([0, 0], varVariant); 
Param := Server.Bridge_GetStruct('com.sun.star.beans.PropertyValue'); 
Param.Name := 'Hidden'; 
Param.Value := True; 
LoadParams[0] := Param; 
Document := Desktop.LoadComponentFromURL('private:factory/swriter', '_default', 0, LoadParams); 

我的问题是我没有看到如何将这与OLEContainer结合起来,以得到我的预期结果。我发现的例子(例如this one)无法帮助我,因为他们打开了LibreOffice的单独实例。我也向LibarOffice提供了一些服务,以便找到任何解决方案,但我很难完成文档。

OLE,COM和LibreOffice API对我来说是一个新话题,我觉得很遗憾。所以我想出了以下问题:

甚至可以显示和编辑OleContainer中嵌入的LibreOffice实例中的文档吗? 如果是,我该如何实现? 如果不是,那么在我的应用程序中是否有替代方案来显示LibreOffice实例?

+0

你有任何证据证明这甚至有可能吗? –

+0

如上所述,MSOffice已经使用了这个功能,并且它在那里工作(我希望MSOffice也使用TOleContainer)。但我无法找到有关如何完成的任何事情。 –

+0

我没有看到办公室进入此处。你正在使用libre办公室。它可以被嵌入吗? –

回答

0

它是前一段时间,但我们发现,之所以在容器中的空帧:

虽然用的MSOffice工作,该方法DoVerb内部调用的TOleContainer这台不同的属性,包括FDocObjIOleDocumentSite.ActivateMe。对于LibreOffice,接口IOleDocumentSite似乎不受支持(QueryInterface引发错误),因此不会调用ActivateMe。这导致没有设置FDocObj,因此在TOleContainer.GetWindow(而不是OleContainer自己的句柄接收到其父句柄)中接收到错误的句柄,并且该文档未在容器中显示。

为了解决这个问题,我在调用DoVerb之前将FDocObj设置为True。这可能不是最终的解决方案,因为我仍然不完全明白TOleContainer是如何工作的,但是现在这个解决方案对我来说很有用。