Delphi-OleContainer-PowerPoint-AutoPlay

|| 下午好:-),在我的应用程序中,我使用OleContainer来查看Microsoft 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中运行),但是在我的应用程序中,演示文稿仍在第一张幻灯片上。运行命令不对吗?     
已邀请:
您不需要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
属性中获取演示文稿窗口的Handle,但这对我来说不起作用,因此需要FindWindow调用。     
Run
是of4ѭ的方法,它不是特定于任何种类的OLE对象(例如,PowerPoint演示文稿或位图图像)的方法。文档指出“调用运行以确保服务器应用程序正在运行。” 。 您需要调用特定于对象的方法以对其进行操作,请参见《 PowerPoint对象模型参考》。样例代码:
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;
尽管以上内容将演示文稿作为幻灯片放映,但它可能不是您想要的,因为它在全屏模式下运行。我不知道如何在容器窗口中运行它。     

要回复问题请先登录注册