2011-04-15 76 views
3

下午好:-),在我的應用程序中我使用OleContainer查看來自Microsoft Powerpoint的演示文稿Delphi - OleContainer - PowerPoint - 自動播放

此代碼,我用它來加載和運行演示文稿文件

with oleContainer do begin 
    Parent := mediaPanel; Left := 0; Top := 0; 
    Width := mediaPanel.Width; Height := mediaPanel.Height; 
    CreateObjectFromFile('C:\Users\Nanik\Desktop\Present.ppt', false); 
    Iconic := false; Visible := true; Run; 
end; 

演示文稿已爲自動播放幻燈片(Microsoft PowerPoint中工作的)創建的,但在我的應用程序呈現爲仍然第一張幻燈片。運行命令不正確?

回答

3

您不需要OleContainer在應用程序的容器中運行演示文稿。把面板容器運行在您的形式呈現,並嘗試這個程序:

procedure TForm2.Button3Click(Sender: TObject); 
const 
    ppShowTypeSpeaker = 1; 
    ppShowTypeInWindow = 1000; 
    SHOW_FILE = 'C:\Users\jcastillo\Documents\test.pps'; 
var 
    oPPTApp: OleVariant; 
    oPPTPres: OleVariant; 

    screenClasshWnd: HWND; 
    pWidth, pHeight: Integer; 

    function PixelsToPoints(Val: Integer; Vert: Boolean): Integer; 
    begin 
    if Vert then 
     Result := Trunc(Val * 0.75) 
    else 
     Result := Trunc(Val * 0.75); 
    end; 

begin 
    oPPTApp := CreateOleObject('PowerPoint.Application'); 
    oPPTPres := oPPTApp.Presentations.Open(SHOW_FILE, True, True, False); 
    pWidth := PixelsToPoints(Panel1.Width, False); 
    pHeight := PixelsToPoints(Panel1.Height, True); 
    oPPTPres.SlideShowSettings.ShowType := ppShowTypeSpeaker; 
    oPPTPres.SlideShowSettings.Run.Width := pWidth; 
    oPPTPres.SlideShowSettings.Run.Height := pHeight; 
    screenClasshWnd := FindWindow('screenClass', nil); 
    Windows.SetParent(screenClasshWnd, Panel1.Handle); 
end; 

我沒有手頭有文件,但我的想法是Run.Width和Run.Height必須點提供,不以像素爲單位。我的窮人解決方案將像素轉換爲點在這裏,它在我的測試中適用於我......在您的環境中找到正確的轉換方式取決於您。

假設您可以從oPPTPres.SlideShowSettings.Run.HWND屬性獲取演示文稿窗口的句柄,但這對我來說不起作用,因此也是FindWindow調用。

4

RunTOleContainer的方法,它是不特定於任何類型的OLE對象的方法,比方說,一個Power Point演示或位圖圖像.. Documentation狀態「呼叫運行,以確保服務器應用程序正在運行..「

您需要調用對象特定的方法來對它們進行操作,請參閱PowerPoint Object Model Reference。示例代碼:

procedure TForm1.Button1Click(Sender: TObject); 
const 
    ppAdvanceOnTime = $00000002; 
var 
    P: OleVariant; 
    S: OleVariant; 
    i: Integer; 
begin 
    P := OleContainer1.OleObject.Application.Presentations.Item(1); 

    // below block would not be necessary for a slide show (i.e. a *.pps) 
    for i := 1 to P.Slides.Count do begin 
    P.Slides.Item(i).SlideShowTransition.AdvanceOnTime := True; 
    P.Slides.Item(i).SlideShowTransition.AdvanceTime := 1; 
    end; 
    S := P.SlideShowSettings; 
    S.AdvanceMode := ppAdvanceOnTime; 

    S.Run; 
end; 


雖然上面會運行演示文稿作爲幻燈片放映時,它可能不是你想要的,因爲它在全屏運行。我不知道如何在容器窗口中運行它..

+0

感謝您的解答:-)。爲什麼我無法訪問:OleContainer1.OleObject.Application.Presentations.Item(1).Run? – Nanik 2011-04-16 11:49:54

+0

有沒有可能檢查劇本結束? – Nanik 2011-04-16 11:50:41