打开第二个演示文稿失败 - Delphi XE2 + Windows 8

时间:2014-06-23 07:23:45

标签: delphi powerpoint

需要打开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中失败。 提前谢谢。

2 个答案:

答案 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)之间的兼容性问题。除了那个外表很好。