需要打开PowerPoint演示文稿。我使用以下声明。
无功 ppt:_Application; pres:_Presentation;
try
ppt := GetActiveOleObject('PowerPoint.Application') as _Application;
except
ppt := CreateOleObject('PowerPoint.Application') as _Application ;
end;
ppt.Visible := msoTrue;
try
pres := ppt.Presentations.Open(FPOTX, msoFalse, msoTrue, msoTrue);
except
on e:exception do begin
printtofile('Error in call to ppt.Presentation.Open' + e.message);
end;
end;
只要调用异常中的CreateOleObject(),它就可以正常工作。 (即,没有任何演示文稿已经开放)。
但如果一个演示文稿已经打开,则上述声明失败。 (即,在GetActiveOleObject()函数之后调用ppt.Presentations.Open()。
使用Delphi XE2,MS Office 2013,Windows 8
仅在Windows 8中不在Windows 7中失败。 提前谢谢。
答案 0 :(得分:1)
我不知道问题出在哪里,如果是你的Delphi或Office或Windows版本。但是这个代码在Windows 8.1 x64,Delphi XE2(32位目标),Office 2007中没有问题。不幸的是我没有Office 2013来测试它。
我的Delphi中没有导入任何Type LIB。所以我只使用普通的Variant
类型进行了测试。
如果未打开PPT,代码会打开它。否则它获取OLE对象。然后打开所需的演示文稿。无论PPT是关闭还是打开,都可以像我测试的那样经常使用。
...
implementation
uses
ComObj, ActiveX;
const
msoFalse = TOleEnum(False);
msoTrue = TOleEnum(True);
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ppt, pres: Variant;
begin
ppt := Unassigned;
pres := Unassigned;
try
ppt := GetActiveOleObject('PowerPoint.Application');
except
ppt := CreateOleObject('PowerPoint.Application');
end;
ppt.Visible := msoTrue;
try
pres := ppt.Presentations.Open('C:\Temp\Test.pptx', msoFalse, msoTrue, msoTrue);
except
on E:Exception do
ShowMessage('OOPS');
end;
end;
修改强>
我还使用导入的PowerPoint Type Lib测试了它。你的代码在这里1:1工作:
...
implementation
uses
ComObj, ActiveX, PowerPoint_TLB;
const
msoFalse = TOleEnum(False);
msoTrue = TOleEnum(True);
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ppt: _Application;
pres: _Presentation;
begin
ppt := nil;
pres := nil;
try
ppt := GetActiveOleObject('PowerPoint.Application') as _Application;
except
ppt := CreateOleObject('PowerPoint.Application') as _Application;
end;
ppt.Visible := msoTrue;
try
pres := ppt.Presentations.Open('C:\Temp\Test.pptx', msoFalse, msoTrue, msoTrue);
except
on E:Exception do
ShowMessage('OOPS');
end;
end;
2013办公室解决方案
正如您已经发现:将Office 2013
的{{1}}参数更改为Title
==>时似乎与ppt.Presentations.Open
一起使用msoFalse
答案 1 :(得分:0)
这对我来说绝对没有任何问题。面临的问题是XXX.pot(办公室1997-2003)和XXX.potx(办公室2014)之间的兼容性问题。除了那个外表很好。