2016-11-24 3 views
0

私はアプリケーションにLibreOfficeのインスタンスをDelphiで埋め込もうとしています。私の主な目標は、LibreOfficeドキュメントをMSオフィスに埋め込むときにMSオフィスのような結果を達成することです。可能であれば、私はこれを達成するためにTOLEConatinerを使用したいと思います。テストのためにアプリケーションにLibreOfficeのインスタンスを埋め込む(TOLEContainerを使用)

私はTOleContainerコンポーネントでプログラムを書いた:MS Office用

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

を(.docxのファイルを開く)、これはすでに問題なく動作します。 .odtファイルを開いてOLEContainerをアクティブにすると、何も表示されないため、表示も編集もできない空のフレームが表示されます。

私はLibreOffice、OLE、COMについてもっと知ろうとしました。

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

私の問題:私は、私は、私は最初、文書を作成し、デスクトップサービスを作成し、OO ServiceManagerのOLEObject変数を作成するには、このような何かを必要とするその機能にアクセスするためのオブジェクト指向のAPIを使用することができることを見出しました私はこれをOLEContainerと組み合わせて私の期待した結果を得る方法を見ていないということです。私が見つけた例(例えばthis one)は、LibreOfficeの別のインスタンスを開いているときにも私を助けませんでした。私はまた、LibreOfficeのいくつかのサービスについて何か解決策を見つけることを通知しましたが、ドキュメントを手に入れるのは非常に難しいです。

OLE、COM、およびLibreOffice APIは新しいトピックです。だから私は次の質問を出します:

OleContainerに埋め込まれたLibreOfficeインスタンスで文書を表示したり編集したりすることは可能ですか? はいの場合、どうすれば達成できますか? いいえ、私のアプリケーションにLibreOfficeインスタンスを表示するための選択肢がありますか?

+0

これが可能であるという証拠はありますか? –

+0

上記のように、MSOfficeはすでにこの機能を使用していますが、そこで動作します(MSOfficeでもTOleContainerが使用されることを期待しています)。しかし、私はそれがどのように行われたかについて何も見つけることができませんでした。 –

+0

事務所がどこに来るのかわかりません。あなたはlibre officeを使用しています。埋め込むことはできますか? –

答えて

0

それはしばらく前ですが、私は、コンテナ内の空のフレームの理由を発見した:

のMSOfficeと協力しながら、この方法DoVerbが内部FDocObjを含む様々な属性を設定しますTOleContainerIOleDocumentSite.ActivateMeを呼び出します。 LibreOfficeでは、インターフェイスIOleDocumentSiteはサポートされていないようです(QueryInterfaceはエラーを発生させます)。したがって、ActivateMeは呼び出されません。この結果、FDocObjが設定されず、TOleContainer.GetWindowに誤ったハンドルが受信されます(OleContainer自体のハンドルではなく親ハンドルが受信されます)。文書はコンテナに表示されません。

問題を解決するために、DoVerbを呼び出す前にFDocObjをTrueに設定しました。これは最終的な解決策ではないかもしれません。なぜなら、TOleContainerがどのように機能するのかを完全に理解していないのですが、このソリューションは私のために機能します。

関連する問題