2014-06-23 2 views
0

PowerPoint 프레젠테이션을 열어야합니다. 아래의 진술을 사용하고 있습니다.두 번째 프레젠테이션 열기 실패 - Delphi XE2 + Windows 8

바르 PPT : _Application; pres : _Presentation;

 try 
      ppt := GetActiveOleObject('PowerPoint.Application') as _Application; 
     except 
      ppt := CreateOleObject('PowerPoint.Application') as _Application ; 
     end; 

     ppt.Visible := msoTrue; 

     try 
      pres := ppt.Presentations.Open(FPOTX, msoFalse, msoTrue, msoTrue); 
     except 
     on e:exception do begin 
      printtofile('Error in call to ppt.Presentation.Open' + e.message); 
      end; 
     end; 

예외가 발생하면 CreateOleObject()가 호출 될 때마다 정상적으로 작동합니다. (즉, 프리젠 테이션이 이미 열려 있지 않음).

그러나 하나의 프리젠 테이션이 이미 열려있는 경우 위의 문은 실패합니다. (즉, GetActiveOleObject() 함수 다음에 ppt.Presentations.Open()이 호출됩니다. 델파이 XE2를 사용

, MS 오피스 2013, 윈도우 8

이 7 감사합니다 사전에없는 윈도우에서만 윈도우 8에 실패합니다. 문제가 어디에 귀하의 델파이 또는 Office 또는 Windows 버전의 경우

+1

-1 "실패"는 좋은 문제 설명이 아닙니다. 그리고이 질문은 친숙한 것 같습니다. 이전 버전을 삭제하고 다시 묻는 것 같습니다. 그것은 그것이 실제로 어떻게 작동하는지 아닙니다. 그리고 적어도 다시 묻는다면 지난 번에했던 것처럼 모든 문제 개선 작업을 다시해야하지 마십시오. 그래서 우리가 다시 오류 메시지 등을 드래그하지 마십시오. 우리는 이미 그것을 한 번했습니다. 왜 다시해야합니까? –

+0

@ 데이비드, 당신은 아마 의미 ['이 one'은] (http://stackoverflow.com/q/24326026/960757) ... – TLama

+0

@TLama 예, 그것은 하나입니다. 웬일인지 나는 그것을 발견 할 수 없었다. 그리고 (다른 사용자가 물었 기 때문에) 속임수로 투표를 마감 할 수는 없습니다. 그래서 누군가가 그들 중 한 사람에게 대답을 쓸 때까지, 묻는 사람은 계속 새로운 계정을 만들고 새로운 질문을 할 수 있습니다. –

답변

1

는 나는 모른다. 그러나이 코드는 Windows 8.1 x64, Delphi XE2 (32 비트 대상), Office 2007에서 문제없이 작동합니다. 불행히도 Office 2013을 테스트하지 않아도됩니다.

나는 내 델파이에서 수입 된 모든 종류의 LIBS이 없습니다. 그래서 그냥 평범한 Variant 유형을 사용하여 테스트했습니다.

PPT가 열리지 않으면 코드가 엽니 다. 그렇지 않으면 OLE 객체를 가져옵니다. 그 후 원하는 프레젠테이션이 열립니다. PPT가 닫혀 있거나 열렸는지 상관없이 필자가 테스트 한만큼 자주 작동합니다.

... 

implementation 

uses 
    ComObj, ActiveX; 

const 
    msoFalse = TOleEnum(False); 
    msoTrue = TOleEnum(True); 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ppt, pres: Variant; 
begin 
    ppt := Unassigned; 
    pres := Unassigned; 
    try 
     ppt := GetActiveOleObject('PowerPoint.Application'); 
    except 
     ppt := CreateOleObject('PowerPoint.Application'); 
    end; 

    ppt.Visible := msoTrue; 
    try 
     pres := ppt.Presentations.Open('C:\Temp\Test.pptx', msoFalse, msoTrue, msoTrue); 
    except 
     on E:Exception do 
      ShowMessage('OOPS'); 
    end; 
end; 

편집

또한 가져온 파워 포인트 형식 해방과 테스트. 1 여기 : 그리고 당신의 코드는 1 일 이미 발견으로 사무실

... 

implementation 

uses 
    ComObj, ActiveX, PowerPoint_TLB; 

const 
    msoFalse = TOleEnum(False); 
    msoTrue = TOleEnum(True); 

{$R *.dfm} 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    ppt: _Application; 
    pres: _Presentation; 
begin 
    ppt := nil; 
    pres := nil; 
    try 
     ppt := GetActiveOleObject('PowerPoint.Application') as _Application; 
    except 
     ppt := CreateOleObject('PowerPoint.Application') as _Application; 
    end; 

    ppt.Visible := msoTrue; 
    try 
     pres := ppt.Presentations.Open('C:\Temp\Test.pptx', msoFalse, msoTrue, msoTrue); 
    except 
     on E:Exception do 
      ShowMessage('OOPS'); 
    end; 
end; 

SOLUTION 2013

: msoFalseppt.Presentations.OpenTitle 매개 변수를 변경할 때 Office 2013와 함께 작동하는 것 같다 ==>ppt.Presentations.Open(FPOTX, msoFalse, msoFalse, msoTrue)

+0

답장을 보내 주셔서 감사합니다. 여기서 ppt는 _Application 유형으로, pres는 _Presentation 유형으로 변형하지 않아야합니다 (제안한대로). 여기 주위에서 일한다고 말할 수 있니?왜냐하면 내 응용 프로그램에서는 _Application, _Presentation, _Slide를 사용하여 프레젠테이션의 각 슬라이드를 열고 각 슬라이드에 씁니다. 이 코드는 애플리케이션의 기존 코드이므로 사용자가 제안한대로 변경할 수 없습니다. – user3766458

+1

안녕 얘들 아, msofalse로 제목 매개 변수를 변경하면 Win8에서 문제가 해결되었습니다. 즉, ppt.Presentations.Open (FPOTX, msoFalse, msoFalse, msoTrue) – user3766458

+0

방금 ​​테스트했지만 방금 가져온 PowerPoint_TLB 단위로 첫 번째 게시물의 초기 코드가 1 : 1로 작동합니다. 그러나 나는 당신이 솔루션을 찾은 것을 기쁘게 생각합니다. 그리고 여기에 게시 해 주셔서 감사합니다. –

0

이 어떤 문제없이 절대적으로 나를 위해 작동합니다. 직면 된 문제는 XXX.pot (office 1997-2003)과 XXX.potx (office2014) 간의 호환성 문제였습니다. 그것과는 별개로 모든 것이 좋았습니다.