紧急求救:Delphi7如何实现在自己开发的窗体中播放PPT(Office2007)?

mengbo 2011-01-06 11:23:36
紧急求救: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并播放就行,不需要做其它控制,麻烦各位帮帮手,谢谢!
...全文
1184 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
noliver 2013-01-24
  • 打赏
  • 举报
回复
这么费劲干嘛啊,不是要开始全屏播放吗?把ppt的扩展名改成pps,直接命令打开就行了,就播放了。
mengbo 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 sz_haitao 的回复:]
遮,必须:
把WebBrowser设为alClient,
然后在WebBrowser的parent上放个Panel,设为alNone,高与WebBrowser一样,左右正好盖住WebBrowser的上下滚动条,锚位设为左不对齐,右对齐,上下则都对齐
[/Quote]

按你的方法确实是可以遮住的,多谢多谢啊!不过只能在实在没办法解决时折衷使用遮住的方法了。

我想还有一种方法,不知是否可行?
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);
haitao 2011-01-15
  • 打赏
  • 举报
回复
遮,必须:
把WebBrowser设为alClient,
然后在WebBrowser的parent上放个Panel,设为alNone,高与WebBrowser一样,左右正好盖住WebBrowser的上下滚动条,锚位设为左不对齐,右对齐,上下则都对齐
mengbo 2011-01-14
  • 打赏
  • 举报
回复
再顶一下,没人做过这方面的东西吗?
CassiaBlossom 2011-01-07
  • 打赏
  • 举报
回复
楼主的问题你可以这样解决:


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下运行通过.请楼主测试.
mengbo 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 caibirdy 的回复:]
呵呵,用一个panel把WebBrowse的拖动条遮住。。。
[/Quote]

呵呵,遮不到的,加一个Panel就把滚动条挤到中间去了。

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

目前程序效果如下图
mengbo 2011-01-07
  • 打赏
  • 举报
回复
可能是我没有说得太清楚:我的Delphi程序是启动后全屏播放指定PPT,并独占屏幕,在所有窗口前端的显示,并屏蔽了所有热键。

to CassiaBlossom兄:
您提供的这种方式跟ShellExecute直接打开PPT是类似的,存在3个问题:
1、会打开一个Powerpoint的空程序窗口,再打开一个指定文件的播放窗口(我打开的是PPS格式)
2、PPT并不是在Delphi程序的窗体中打开;
3、打开的PPT并未获得焦点,置于当前程序后端;

to ecjtu5208兄:
您的方式要稍微增加了一些内容,但实际效果是在Panel中打开了一个Powerpoint的空程序窗口,指定文件的播放会另开一个新窗口播放,这个PowerPoint的播放窗口也是置于后端的。
CaiBirdy 2011-01-07
  • 打赏
  • 举报
回复
呵呵,用一个panel把WebBrowse的拖动条遮住。。。
ecjtu5208 2011-01-07
  • 打赏
  • 举报
回复

蹭点分,呵呵。得点分不容易啊。
ecjtu5208 2011-01-07
  • 打赏
  • 举报
回复
楼上的也相当于在直接运行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;

mengbo 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ecjtu5208 的回复:]
引用 15 楼 mengbo 的回复:

呵呵,遮不到的,加一个Panel就把滚动条挤到中间去了。


如果是遮盖的话,是可以的,不会把滚动条挤到中间去。
楼主如何遮的?
[/Quote]


呵呵,我只简单试了一下,把WebBrowser设为alClient,然后在上面放个Panel,设为alRight.
麻烦指点一下怎么遮,实在不行只能通过美工做点效果遮一下。
ecjtu5208 2011-01-07
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mengbo 的回复:]

呵呵,遮不到的,加一个Panel就把滚动条挤到中间去了。

[/Quote]
如果是遮盖的话,是可以的,不会把滚动条挤到中间去。
楼主如何遮的?
ecjtu5208 2011-01-06
  • 打赏
  • 举报
回复
没用delphi玩过PPT
尝试一下。
中午先吃饭吧,分给我留着。
JeffChung 2011-01-06
  • 打赏
  • 举报
回复
帮顶。通过oleContainer.oleobject控制不行吗?
mengbo 2011-01-06
  • 打赏
  • 举报
回复
在网上搜到一篇这样的文章,这个方法看得不是太懂,有谁了解的帮忙解释一下,不过我试了一下代码还是去不掉滚动条,不知是不是漏了什么代码或文章写错了一部分代码,呵呵!

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;
haitao 2011-01-06
  • 打赏
  • 举报
回复
查一查ppt的命令行是否支持打开ppt直接播放的
ecjtu5208 2011-01-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mengbo 的回复:]
多谢 ecjtu5208 兄的大力支持,您提到这种方式是把整个程序都嵌入到Panel里面了,还需要去选择PPT文件打开,而且如果点击播放,会再弹出一个播放窗口,难以解决我目前所面临的问题。

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

我是需要程序一启动,就自动打开指定的一个PPT文件,并全屏播放。
ecjtu5208 2011-01-06
  • 打赏
  • 举报
回复
搞了半天,发现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;

haitao 2011-01-06
  • 打赏
  • 举报
回复
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

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧