紧急求救: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并播放就行,不需要做其它控制,麻烦各位帮帮手,谢谢!
方法一:使用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并播放就行,不需要做其它控制,麻烦各位帮帮手,谢谢!
尝试一下。
中午先吃饭吧,分给我留着。
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
不知道这样可以不可以。
把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;
在他的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;
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下运行通过.请楼主测试.
楼主这样可以?那在我那段代码后面加上打开文件也行啊。呵呵 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;
您提供的这种方式跟ShellExecute直接打开PPT是类似的,存在3个问题:
1、会打开一个Powerpoint的空程序窗口,再打开一个指定文件的播放窗口(我打开的是PPS格式)
2、PPT并不是在Delphi程序的窗体中打开;
3、打开的PPT并未获得焦点,置于当前程序后端;to ecjtu5208兄:
您的方式要稍微增加了一些内容,但实际效果是在Panel中打开了一个Powerpoint的空程序窗口,指定文件的播放会另开一个新窗口播放,这个PowerPoint的播放窗口也是置于后端的。
呵呵,遮不到的,加一个Panel就把滚动条挤到中间去了。目前我想达到的效果只有通过WebBrowse来实现,但唯一的缺憾就是滚动条去不掉,试想在一个全屏窗口中播放PPT文件(这个PPT是有点类似网站版面介绍的,可点击去不同的介绍部分),右边突然出来一个滚动条,版面变得很丑不说,还可以点击去到下一页或跳页,太郁闷了。目前程序效果如下图
麻烦指点一下怎么遮,实在不行只能通过美工做点效果遮一下。
把WebBrowser设为alClient,
然后在WebBrowser的parent上放个Panel,设为alNone,高与WebBrowser一样,左右正好盖住WebBrowser的上下滚动条,锚位设为左不对齐,右对齐,上下则都对齐
按你的方法确实是可以遮住的,多谢多谢啊!不过只能在实在没办法解决时折衷使用遮住的方法了。我想还有一种方法,不知是否可行?
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);