这段代码为什么没有效果?(200分)

  • 主题发起人 主题发起人 henry0612
  • 开始时间 开始时间
H

henry0612

Unregistered / Unconfirmed
GUEST, unregistred user!
我在ActiveForm的OnActive事件中加了如下代码:
var
vWordObject: Variant;
begin
WordContainer.CreateObject('Word.Document',false);
vWordObject:= Wordcontainer.OleObject;
WordContianer.OleObject.Application.CommandBars['Word Count'].Visible:= false;
vWordObject.Application.ActiveWindow.ActivePane.DisplayRulers:= False;
btnLook.Enabled:= false;
end;
WordContainer是个OLE容器名称
这段代码的意思是打开页面,下在ActiveForm后,希望WordContainer中有一个空白的Word
文档,没有常用工具栏和标尺。
可是真正的结果,以上的都没实现,只得双击Ole控件才能加入Word文档,且常用工具条
也没有消失。
但是在普通的应用程序上,代码的功能都实现了,这是为什么?
请问各位大虾要ActiveForm达到如上效果应怎样处理?
 
以下是成功代码,我发过一遍了,怎么没提交。

procedure TForm1.Button1Click(Sender: TObject);
var
vWordObject: Variant;
begin
WordContainer.CreateObject('Word.Document',false);
vWordObject:= Wordcontainer.OleObject;
vWordObject.Application.CommandBars['Standard'].Visible:= false;
vWordObject.Application.CommandBars['Formatting'].Visible:= false;
WordContainer.doverb(ovPrimary);
vWordObject.ActiveWindow.ActivePane.DisplayRulers:= False;
btnLook.Enabled:= false;
end;
 
to jsxjd
在普通的程序里面没有问题。
但是在ActiveForm的OnActive事件中好像没执行?
 
有没有 WordContainer.doverb(ovPrimary) ?

Qiuliang
http://www.nicesoft.net
 
是的, ActiveForm 不会执行 OnActivate的
而且 OnActivate 并不是最理想的在启动以后执行代码的地方
(在普通 Form 中也不推荐,因为每次 Form 激活时都会执行)
放在 OnCreate 可以,但是在OnCreate如果引用了别的单元对象也可能出错,
因为OnCreate时往往并不是所有 Form 都初始化完了。。。(尤其是主 Form,Delphi 要求第一被创建)
那么哪里才是启动后执行一次最好的地方呢。
我一般是这样做,放一个 Timer,间隔为0,启动后初始化工作完了后,
Applicaiton 开始进入消息循环后就会执行它,
OnTimer 事件第一句话就是 Timer.Enabled := false;...然后执行启动一次
的操作。
 
我这边放在 ActiveForm 的 OnCreate 事件中是成功的,我
测试过了,你试一下。
 
这段代码放在普通的应用程序的OnCreate中将会引发异常,而在ActiveForm的OnCreate中
没有这种现象,采用轻松虎的方法,好像timer的事件也没执行。
奇怪!不知是不是我代码编制的问题。
求这样的一个功能模块,在ActiveForm下载完毕后OLEContainer中显示出一个空白的文档。
不知轻松虎是否能给出实现的代码。
问题解决就会加分,两贴共500分,
请诸位大虾多帮忙。
 
该异常主要是由于 在 Create 时OLEcantainer不可见,
而进行了一些不该做的操作。

我将该段初始程序移至OleContainer 的 OnResize事件
(只能放在这个事件中)后,不再有异常出现。而且非常爽。

在浏览器改变大小或最小化时并不会再次触发 OleContainer
的 OnResize事件.只有当用户用“前进”、“倒退”等方法进行
页面切换时才会触发该事件。所以,如果用户用各种方法返回到
先前页面时,如果不需要显示先前OleContainer 中的内容,那么
仅在该事件中处理就行。

我这里添加了一个功能,就是当用户“返回”到该页面时,
必须显示用户先前在 OleContainer中输入的内容。这样就需要
考虑OleContainer中对象的保存。
保存的唯一时机就是在OleContainer 的 OnDeactivate事件
中(同样,放在其它事件中是不行的)。

声明一个全局变量 ReturnToPage,表示是“返回”到该页面,
还是首次激活该页面。以使进行显示OleContainer的空文档,
或装入先前输入的内容。

var
ReturnToPage:Boolean=false;

以下是两个事件处理:

procedure TActiveFormX.WordContainerResize(Sender: TObject);
var
vWordObject: Variant;
begin
if ReturnToPage then
begin
WordContainer.LoadFromFile('c:/tt.doc');
WordContainer.doverb(ovShow);
end
else
begin
WordContainer.CreateObject('Word.Document',false);
ReturnToPage:=true;
vWordObject:= Wordcontainer.OleObject;
vWordObject.Application.CommandBars['Standard'].Visible:= false;
vWordObject.Application.CommandBars['Formatting'].Visible:= false;
WordContainer.doverb(ovShow);
vWordObject.ActiveWindow.ActivePane.DisplayRulers:= False;
end;
btnLook.Enabled:= false;
end;

procedure TActiveFormX.WordContainerDeactivate(Sender: TObject);
begin
Wordcontainer.SaveToFile ('C:/tt.doc');
end;

以上程序在浏览器中经反复测试(不断地前进、后退、修改),从未见异常。

但是这里有一个奇怪的问题,当我向ActiveForm放置一编辑框时,
使OleContainer失去焦点后,又去点击它时,没有反应。而且这和事件处理
无关,因为我把所有事件处理拿掉后,还是这样。还望告知是何原因?
然而这一问题也是可以解决的,在ActiveForm中放一按钮,在按钮中
执行以下命令后就又可以进行编辑了。

WordContainer.doverb(ovShow);

当然我上面在保存信息时使用的是文件,你也可以考虑用流。在用文件时
应该考虑一下文件的可用性。

以上见解,仅你参考!

 
结束此问题,特别感谢jsxjd, 轻松虎
 
后退
顶部