这个问题有人问过,没有满意的答案。。。。。TOleContainer的Bug?(100分)

  • 主题发起人 主题发起人 let_it_be
  • 开始时间 开始时间
L

let_it_be

Unregistered / Unconfirmed
GUEST, unregistred user!
TOleContainer 不能用,有个致命的Bug,求一解决办法。
(可用C:/Program Files/Borland/Delphi7/Demos/ActiveX/OleCtnrs
下面的Demo看一下效果)

用OleContainer打开一个Word 文档,OK,一切正常。
这时候,客户往往想打开一个已经存在的Word文档进行Copy
问题就出现了。
我们再用Word打开一个已经有的Word文档,然后回来到我们的程序,
看看出现了什么效果吧。

不能进行编辑了............555555555...........

而我们的客户,多数时候都需要新开个Word 打开一些
其它文档,进行复制些文本内容过来。。。。
致命啊,因此要寻求个解决办法。。。
 
不是这样的,BUG是存在,实际上,在OleContainer失去焦点的某些时候就会使OleContainer不能存取,我用这个BUG以前做了一个word和EXCEL的只读浏览器,效果还不错,不过我没想去改他,OleContainer的BUG我自己就改过几次了,这次的问题也一样严重,肯定是要改源码的.
 
menxin:
怎样作?分不够可以加,可以在下面拿分的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2447301
 
唉!
同情!
 
这个问题可能是太复杂了。
高手,过来吧。
 
可使用自动获得WORDOBJ的方式,可改,可写~,可复制!
不使用DELPHI提供的工具~
 
能不能详细点呀?
 
如果自己改不了,最好的办法就是不要用这个olecontainer了,BUG多多,想别的办法吧,最近太忙,实在是没有时间帮你改了,不好意思.
 
Variant GetWordObject(void)
{
Variant Obj1;
AnsiString AppName="Word.Application" ;
HWND hWordEx=::FindWindow(NULL,"Microsoft Word");
if(!hWordEx)
{
Obj1=CreateOleObject(AppName) ;
//Word 没 启 动 就 启 动 它 返 回 一 自 动 化 对 象
}
else
Obj1=GetActiveOleObject(AppName);
// 否 则 返 回 正 在 运 行 的 实 例 自 动 化 对 象
Obj1.OlePropertySet("Visible",true);
return Obj1;
}
//------------------------------------------------------------------
AnsiString strFullFileName = ExtractFilePath(Application->ExeName) + "//Merge.DOC";
bool ReadOnly =False;
bool AddToRecentFiles=False;
try{
V = GetWordObject(); //获得Obj
V.Exec(PropertySet("Visible")<<true);//设置为显示
Variant Docs = V.Exec(PropertyGet("Documents"));//获得WORD的Documents对象
Docs.Exec(Procedure("Open")<<strFullFileName<<ReadOnly<<AddToRecentFiles);//打开一个WORD文档
V.Exec(Procedure("Run")<<pageoption);//运行宏处理
}
catch(...) {
ShowMessage(" 执行WORD程序PageOption宏出错!");
return;
}
我用的是BCB,和DELPHI的OLE有些区别,你叫别人帮转一下吧.
用自定义的OBJ获取~
记住要给分哦,我没多少分啊~赚点分
 
当然,在Delphi下取的 Word Obj是很容易的,(其实跟WordApplication和wordDocument差不多),
这不符合我的要求。我的要求是Delphi的菜单跟Word菜单可以融合,这在oleContainer中可以做到;但OleContainer存在上面的问题;
 
关键是olecontainer焦点的问题?
我也遇到了同样的问题,正在寻求解决办法
 
是bug吗?
 
我来解决
修改源码,加入一个属性如 CanDeActiveOnHost: boolean
CanDeActiveOnHost := True 则是默认效果
CanDeActiveOnHost := False 则是你想要的效果
修改以下代码:
procedure TMrOleContainer.CMDocWindowActivate(var Message: TMessage);
begin
//Modify Begin
//Org Code
//if Assigned(FDocForm) and IsFormMDIChild(FDocForm.Form) then begin
if Assigned(FDocForm) and (IsFormMDIChild(FDocForm.Form) or not FDeActiveOnHost) then begin //让Ole在激活状态下不会因为开启一个服务程序而不可用
if not FDeActiveOnHost then Message.WParam := 1; //让Ole在激活状态下不会因为开启一个服务程序而不可用
//Modify End
FOleInPlaceActiveObject.OnDocWindowActivate(LongBool(Message.WParam));
if Message.WParam = 0 then begin
FFrameForm.SetMenu(0, 0, 0);
FFrameForm.ClearBorderSpace;
end;
end;
end;
不知谁还有更好的解决方法,希望共同切磋
 
好的,我试试看
 
該死的TOleContainer! 有時真的很好用,但bug太多了...
 
为什么有这么多问题??我以为就我一个人解决不了,原来多是一样,我也在求解
 
不是oleControl的bug,是ActiveX的bug。
 
后退
顶部