下午好:-),在我的应用程序中,我使用 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工作中),但在我的应用程序中,仍然 第一张幻灯片。运行命令不对吗?
答案 0 :(得分:4)
Run
是TOleContainer
的方法,它不是特定于任何类型的OLE对象的方法,例如,功率点表示或位图图像。Documentation状态< em>“调用Run以确保服务器应用程序正在运行..”。
您需要调用特定于对象的方法来操作它们,请参阅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;
虽然以上会将演示文稿作为幻灯片放映,但它可能不是您想要的,因为它以全屏模式运行。我不知道如何在容器窗口中运行它..
答案 1 :(得分:4)
您不需要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调用。