打开第二个演示文稿失败-Delphi XE2+;视窗8
需要打开PowerPoint演示文稿。我使用下面的语句 变量 ppt:_应用程序; pres:_演示打开第二个演示文稿失败-Delphi XE2+;视窗8,delphi,powerpoint,Delphi,Powerpoint,需要打开PowerPoint演示文稿。我使用下面的语句 变量 ppt:_应用程序; pres:_演示 try ppt := GetActiveOleObject('PowerPoint.Application') as _Application; except ppt := CreateOleObject('PowerPoint.Application') as _Application ; end;
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;
无论何时调用exception中的CreateOleObject(),它都可以正常工作。(即,尚未打开任何演示文稿)
但是,如果一个演示文稿已经打开,则上述语句将失败。(即,在GetActiveOleObject()函数之后调用ppt.Presentations.Open()
使用Delphi XE2、MS Office 2013、Windows 8
这仅在Windows 8中失败,而在Windows 7中不失败。
提前谢谢。我不知道问题出在哪里,是您的Delphi版、Office版还是Windows版。但该代码在Windows8.1x64、DelphiXe2(32位目标)、Office2007中运行没有问题。不幸的是,我没有Office 2013来测试它 我的Delphi中没有导入任何类型库。所以我只使用普通的
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类型库对其进行了测试。您的代码在这里是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;
OFFICE 2013解决方案
正如您已经发现的那样:当更改
ppt.Presentations的Title
参数时,它似乎与Office 2013
一起工作。打开到msoFalse
==>ppt.Presentations.Open(FPOTX,msoFalse,msoFalse,msoTrue)
这对我来说绝对没有任何问题。面临的问题是XXX.pot(Office1997-2003)和XXX.potx(office2014)之间的兼容性问题。除此之外,一切正常。-1“失败”不是一个好的问题描述。这个问题似乎很熟悉。看起来您删除了以前的版本并再次询问。这不是它真正的工作原理。至少,如果你想再问一次,请不要让我们像上次一样,再次完成所有问题的改进。因此,请不要让我们再次从您身上拖出错误消息等。我们已经做过一次了。“我们为什么还要再做一次?”大卫,你可能是说…@特拉玛是的,就是那个。不知什么原因,我找不到它。而且我不能投票决定以被骗者的身份关闭(因为它是由另一个用户要求的)。因此,在有人给其中一个写答案之前,提问者可以不断创建新帐户并提出新问题。谢谢你的回复。在这里,我必须使用ppt作为应用程序类型,而pres作为演示类型,而不是变体(如您所建议的)。你能告诉我这附近的工作吗。因为,在我的应用程序中,应用程序、演示文稿、幻灯片用于打开演示文稿中的每张幻灯片并在每张幻灯片上书写。由于这是我的应用程序中的现有代码,我无法按照您的建议进行更改。大家好,将标题参数更改为msofalse解决了Win8中的问题。i、 打开(FPOTX,msoFalse,msoFalse,msoTrue)我刚刚再次测试了它,但是使用了导入的PowerPoint_TLB单元和您第一篇文章中的初始代码,这里的效果也是1:1。但我很高兴你找到了适合你的解决方案。谢谢你把它贴在这里。我用你的解决方案更新了我的答案,这样搜索它的人会发现它更容易。你说的1:1是什么意思。我不明白?