2016-11-24 11 views
0

내 응용 프로그램에 Delphi와 LibreOffice의 인스턴스를 포함하려고합니다. 필자의 주요 목표는 LibreOffice 문서를 MS Office에 임베드 할 때와 같은 결과를 얻는 것입니다. 가능하다면 TOLEConatiner를 사용하여 이것을 수행하고 싶습니다.응용 프로그램에 LibreOffice 인스턴스 포함 (TOLEContainer 포함)

는 테스트를 위해 나는 TOleContainer 구성 요소와 프로그램을 작성 :

(A .DOCX 파일을 여는) MS 오피스를 들어
procedure TForm1.btn1Click(Sender: TObject); 
begin 
    if OpenDialog.Execute then 
    if FileExists(OpenDialog.FileName) then 
    OleContainer.CreateObjectFromFile(OpenDialog.FileName, false) 
end; 

, 이것은 이미 문제없이 작동합니다. .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입니다을 만들려면이 같은 뭔가가 필요 그 기능에 액세스 할 OO 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가 정확히 작동하는 방식을 완전히 이해하지는 못했지만이 솔루션은 저에게 효과적입니다.