请问BCB 2010中用ole container在TForm里显示ppt后,怎么进入编辑状态,或者能展示所有页的内容?
且写且珍惜 2014-04-05 10:56:51 我想在ole container所在的窗口里展示ppt(2007)的所有内容,探索了一下,可以通过进入编辑状态来达到效果。但是代码写的进入不了编辑状态。
我先手动在office上人工操作了一下,探到步骤是这样的:
1、powerpoint插入对象:从文件创建对象(看到页面插入了第一页的缩略图),不大但可以调整大小。
2、在上面右键点击“演示文稿对象”可以看到能够对其做哪些操作:有放映、编辑、打开,试了都可以做。
3、点击其中的编辑(其实直接在对象上双击也可),看到zoom和滚动条。所有页面都展示出来了,也能编辑了。
但是,用代码写的却始终进入不了编辑状态,这个编辑状态,应该是对对象进行激活不?
代码是这样写的:
//TOleContainer *Ole; //在TForm里放了这个控件,希望ppt在这个控件里面显示(不是另启powerpoint软件窗口)
Ole->CreateObjectFromFile(m_file, false);
Ole->DoVerb(ovOpen);
Ole->Run();
Ole->SizeMode = 2; // 满屏显示
Ole->AutoActivate = 3; //自动激活:没有看到效果
Ole->AutoVerbMenu = true; //能够看到对象右键菜单有放映、编辑、打开,但是鼠标点了无效
后面做这些都失败的:
Ole->OleObject.OlePropertyGet("Application").OlePropertyGet("Windows"); 或者获取ActiveWindow、ActivePresentation都失败的。
录了宏来看:
在PPT的软件上插入对象:
ActiveWindow.Selection.SlideRange.Shapes.AddOLEObject(Left:=120, Top:=110, Width:=480, Height:=320, FileName:="xxx.pptx", Link:=msoFalse).Select
进入编辑状态:
ActiveWindow.Selection.ShapeRange.OLEFormat.DoVerb Index:=2
Application.WindowState = ppWindowMaximized
但是代码Ole->OleObject.OleFunction("Select");报错,执行Ole->DoVerb(2);没有任何效果,还是没有获取到ActiveWindow。
请大家帮忙看看应该怎么搞?谢谢!刚刚接触ole,完全不懂啊,看了ole和office的一些资料,有点晕了。
备注:
另外一种代码在网上搜到是这样的(但是不满足我的需求):
Ole->CreateObject("PowerPoint.Application",false);
Ole->OleObject.OlePropertySet("Visible", true);
Ole->OleObject.OlePropertyGet("Presentations") .OleFunction("Open", WideString(m_file), false, false, true); //一定要用WideString
这个代码会在ole container外新开窗口和进程(能看到windows开了个新窗口,而不是在BCB的Tform的ole container控件上显示)来启动powerpoint。和预期要的效果不一样。
在程序开头加了Ole->AllowInPlace = true; 也没有作用。
而且这个对象是application的,想用大家的关闭工具条代码,会报错:
IOleInPlaceObject * IOPO ;
Ole->OleObjectInterface->QueryInterface(IID_IOleInPlaceObject,(void **)&IOPO);
IOPO->UIDeactivate(); //报了踩内存的错误
IOPO->Release();
如果不能解决上面的问题,解决这个也行哈:)