紧急求救:Delphi7如何实现在自己开发的窗体中播放PPT(Office2007)?因为是用的Office2007,Delphi自带Servers组件中的PowerPointApplication已经不能使用了,目前我采用了两种方法去实现,但都不能彻底解决问题,敬请各位大虾帮忙出出主意!
方法一:使用WebBrowser控件,WebBrowser.Navigate('sample.pps');
目前无法解决的问题是:右边会出现滚动条,点击滚动条可以翻到上一页或下一页。方法二:使用OleContainer控件,代码如下:
OleCon := TOleContainerEx.Create(nil);
  OleCon.Parent := Panel1;
  OleCon.Align := alClient;
  OleCon.allowactivedoc := true;
  OleCon.AllowInPlace := True;
  OleCon.AutoActivate := aaGetFocus;
  OleCon.Anchors := [akTop,akLeft,akRight,akBottom];
  OleCon.Visible := True;
  OleCon.SizeMode := smClip;
  OleCon.CreateObjectFromFile('sample.pps',False);
  OleCon.Run;
  OleCon.SetFocus;
目前无法解决的问题是:只能显示PPT的第一页,没办法自动播放或点击播放PPT内容。问题很棘手,也很急,只需要能打开PPT并播放就行,不需要做其它控制,麻烦各位帮帮手,谢谢!

解决方案 »

  1.   

    没用delphi玩过PPT
    尝试一下。
    中午先吃饭吧,分给我留着。
      

  2.   

    VBA是这样的:
    appppt.ActivePresentation.SlideShowSettings
            .ShowType = ppShowTypeSpeaker
            .LoopUntilStopped = msoFalse
            .ShowWithNarration = msoTrue
            .ShowWithAnimation = msoTrue
            .RangeType = ppShowAll
            .AdvanceMode = ppSlideShowUseSlideTimings
            .PointerColor.RGB = RGB(Red:=255, Green:=0, Blue:=0)
            .Run
    end with
      

  3.   

      搞了半天,发现OleContainer只能显示第一页哈。无法操作。
      不知道这样可以不可以。
      把POWPOINT嵌入到你的panel上面,相当于用户直接在你的程序里面玩PowPoint。
      这样的话,他想怎么用就怎么用,完全就是在用Powpoint,和你程序无关联。
      嵌入代码如下:
      
      procedure TForm1.button1onclick(sender:tobject);
      var
      p:olevariant;
      s:string;
      h:hwnd;
      begin
      P := createoleobject('Powerpoint.Application');
      P.visible := true;
      s := P.caption;
      h := FindWindow(nil,Pchar(s));
      windows.SetParent(h,Panel1.Handle); 
      windows.SetWindowPos(h,HWND_TOP,0,0,Panel1.Width,Panel1.Height,SWP_SHOWWINDOW);
      end;
      
      
      

  4.   

    多谢 ecjtu5208 兄的大力支持,您提到这种方式是把整个程序都嵌入到Panel里面了,还需要去选择PPT文件打开,而且如果点击播放,会再弹出一个播放窗口,难以解决我目前所面临的问题。我是需要程序一启动,就自动打开指定的一个PPT文件,并全屏播放。
      

  5.   

    查一查ppt的命令行是否支持打开ppt直接播放的
      

  6.   

    在网上搜到一篇这样的文章,这个方法看得不是太懂,有谁了解的帮忙解释一下,不过我试了一下代码还是去不掉滚动条,不知是不是漏了什么代码或文章写错了一部分代码,呵呵!delphi 使用WebBrowse播放PPT如何隱藏右邊的滾動條?在组件栏Additional找个TApplicationEvents放到窗体上
    在他的OnMessage框里写代码procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
    var Handled: Boolean);
    begin
    if (Msg.message = wm_rbuttondown) or (Msg.message = wm_rbuttonup) or
        (msg.message = WM_RBUTTONDBLCLK)   then
    begin
        if IsChild(Webbrowser1.Handle, Msg.hwnd) then
          Handled := true;//如果有其他需要处理的,在这里加上你要处理的代码
    end;
    end;
      

  7.   

    楼主的问题你可以这样解决:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      olePpt: OLEVariant;
    begin
      try
        olePpt := CreateOleObject('PowerPoint.Application');
      except
        ShowMessage('创建幻灯片应用错误!');
        Exit;
      end;
      olePpt.Visible := True;
      olePpt.Presentations.Open(ExtractFilePath(application.ExeName) + 'sample.ppt');
      olePpt.ActivePresentation.SlideShowSettings.Run;
    end;
    Delphi7下,WindowsXP下运行通过.请楼主测试.
      

  8.   

    楼上的也相当于在直接运行PPT啦,就比我多打开了文件呀。
    楼主这样可以?那在我那段代码后面加上打开文件也行啊。呵呵  procedure TForm1.button1onclick(sender:tobject);
      var
      p:olevariant;
      s:string;
      h:hwnd;
      begin
      P := createoleobject('Powerpoint.Application');
      P.visible := true;
      s := P.caption;
      h := FindWindow(nil,Pchar(s));
      windows.SetParent(h,Panel1.Handle); 
      windows.SetWindowPos(h,HWND_TOP,0,0,Panel1.Width,Panel1.Height,SWP_SHOWWINDOW);
      P.Presentations.Open(ExtractFilePath(application.ExeName) + 'sample.ppt');
      P.ActivePresentation.SlideShowSettings.Run;  end;
      

  9.   

    呵呵,用一个panel把WebBrowse的拖动条遮住
      

  10.   

    可能是我没有说得太清楚:我的Delphi程序是启动后全屏播放指定PPT,并独占屏幕,在所有窗口前端的显示,并屏蔽了所有热键。to CassiaBlossom兄:
    您提供的这种方式跟ShellExecute直接打开PPT是类似的,存在3个问题:
    1、会打开一个Powerpoint的空程序窗口,再打开一个指定文件的播放窗口(我打开的是PPS格式)
    2、PPT并不是在Delphi程序的窗体中打开;
    3、打开的PPT并未获得焦点,置于当前程序后端;to ecjtu5208兄:
    您的方式要稍微增加了一些内容,但实际效果是在Panel中打开了一个Powerpoint的空程序窗口,指定文件的播放会另开一个新窗口播放,这个PowerPoint的播放窗口也是置于后端的。
      

  11.   


    呵呵,遮不到的,加一个Panel就把滚动条挤到中间去了。目前我想达到的效果只有通过WebBrowse来实现,但唯一的缺憾就是滚动条去不掉,试想在一个全屏窗口中播放PPT文件(这个PPT是有点类似网站版面介绍的,可点击去不同的介绍部分),右边突然出来一个滚动条,版面变得很丑不说,还可以点击去到下一页或跳页,太郁闷了。目前程序效果如下图
      

  12.   

    呵呵,我只简单试了一下,把WebBrowser设为alClient,然后在上面放个Panel,设为alRight.
    麻烦指点一下怎么遮,实在不行只能通过美工做点效果遮一下。
      

  13.   

    遮,必须:
    把WebBrowser设为alClient,
    然后在WebBrowser的parent上放个Panel,设为alNone,高与WebBrowser一样,左右正好盖住WebBrowser的上下滚动条,锚位设为左不对齐,右对齐,上下则都对齐
      

  14.   


    按你的方法确实是可以遮住的,多谢多谢啊!不过只能在实在没办法解决时折衷使用遮住的方法了。我想还有一种方法,不知是否可行?
    1)、Delphi写的程序自动最大化运行后独占了屏幕;
    2)、我调用其它方法打开指定的PPT文件(可用ShellExecute或手上的一个可随意控制PPT打开播放关闭的控件PowPnt);
    3)、使用WindowsAPI遍历已打开的程序,找到已打开PPT的窗口句柄h1;(呵呵,这里我不会写代码,哪位帮忙看看这个方法是否可行,如果可行的话,怎么写得到窗口句柄的代码呀?)
    4)、将该窗口提到最前面显示,代码考虑如下:
    ShowWindow(h1,SW_RESTORE);
    SetForegroundWindow(h1);
    BringWindowToTop(h1);
    SetActiveWindow(h1);if IsIconic(Application.Handle) then
    begin
      DefWindowProc(Application.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);
    end;SetWindowPos(h1,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
      

  15.   

    这么费劲干嘛啊,不是要开始全屏播放吗?把ppt的扩展名改成pps,直接命令打开就行了,就播放了。