大家看看这个东西是怎么做的(web内嵌word)(200分)


dfwlogo.gif
 
Activex控件
 
Cipher兄,能告诉一下你那控件是如何做的和如何调用的吗?
愿用其它代码交换
yzrlz@163.com
 
帮踢一下
看看有没有人真正的解决了!
如果有人很好的解决的话,我要另开300分给他!!!!
 
写一个ocx控件,用ole包装word,提供可以操作word的接口,将这个ocx嵌入ie,当然,用
asp写一个页面,调用ocx的接口,就可以了。我已经完成了。但是存在一个问题,我正在试
着解决,ocx中word进程与手动创建word进程的冲突问题。如果需要代码,我可以提供一个
简单的示例,但是要给分哦!
 
至Tsir222:
您好!如果你解决ocx中word进程与手动创建word进程的冲突问题,可否提供代码给我呢?
javahere@vip.sina.com 可送分
 
我的解决方法跟Tsir222所述完全一样,但是还有两个问题,一个就是跟手工启动的word之间有冲突,第二就是我想获得关于控制word的更多信息,我现在需要自动启动文档保护功能,还不知道如何写

下面为具体步骤:
新建ActiveForm名为AF
添加接口:LocalFileName, DownloadURL, UploadURL, Operator,并在AF中创建同名成员变量,对应赋值

在AF中加入panel,onclick事件中写如下代码
if Panel1.Tag = 1 then Exit;
MainForm := TMainForm.Create(Application);
try
MainForm.LocalFileName := LocalFileName;
MainForm.Operator := Operator;
MainForm.DownloadURL := DownloadURL;
MainForm.UploadURL := UploadURL;

MainForm.Caption := ExtractFileName(LocalFileName) + ' [' + Operator + ']';

MainForm.ShowModal;
finally
MainForm.Free;

Panel1.Caption := '谢谢使用';
Panel1.Tag := 1;
end;


然后新建一个Form名为MF,放一个菜单,放一个TOleContainer,一个TIdHTTP
菜单里面添加,File->Reload, Update, Exit

Reload的onclick中
var
Stream: TStream;
begin
Stream := TFileStream.Create(FLocalFileName, fmCreate);
try
HTTP.Get(FDownloadURL, Stream);
finally
Stream.Free;
end;

OLEC.CreateObjectFromFile(FLocalFileName, True);
OLEC.DoVerb(ovShow);
FOperatorOrg := OLEC.OleObject.Application.UserName;
OLEC.OleObject.Application.UserName := FOperator;
end;

Update的onclick中
var
Request : TMemoryStream;
FileData : TMemoryStream;
Response : TStringStream;
tempArray : array[0..10000] of char;
tempString : String;
FileName : String;
const
NewLine = chr(13) + chr(10);
begin

Screen.Cursor := crHourGlass;

FileName := FLocalFileName+'.doc';
OLEC.SaveAsDocument(FileName);

// Set the properties for HTTP
HTTP.Request.ContentEncoding := 'multipart/form-data'
//'application/x-www-form-urlencoded';

try
// create streams
Response := TStringStream.Create('');
Request := TMemoryStream.Create;
FileData := TMemoryStream.Create;

// load file data
FileData.LoadFromFile( FileName );
FileData.Seek( 0, soFromBeginning );
// copy form data
TempString := '';
TempString := TempString + '-----------------------------7d18914904ee' + NewLine;
TempString := TempString + 'Content-Disposition: form-data
name="myapp"
filename="' + FileName + '"' + NewLine;
TempString := TempString + 'Content-Type: application/file' + NewLine;
TempString := TempString + '' + NewLine;

// Add data to post
FillChar( temparray, SizeOf( temparray ), #0 );
strpcopy( temparray, tempstring );
Request.Write( temparray, length(tempstring) );
Request.Seek( 0, soFromEnd );
Request.CopyFrom( FileData, FileData.Size );

// copy form data
TempString := '';
TempString := TempString + '' + NewLine;
TempString := TempString + '-----------------------------7d18914904ee' + NewLine;
TempString := TempString + 'Content-Disposition: form-data
name="Submit"' + NewLine;
TempString := TempString + '' + NewLine;
TempString := TempString + 'Submit' + NewLine;
TempString := TempString + '-----------------------------7d18914904ee--' + NewLine;
// Add data to post
FillChar( temparray, SizeOf( temparray ), #0 );
strpcopy( temparray, tempstring );
Request.Write( temparray, length(tempstring) );

// post file
try
HTTP.Post( FUploadURL, Request, Response);
MessageDlg('保存成功!', mtInformation, [mbOK], 0);
except
MessageDlg('保存失败!', mtError, [mbOK], 0);
end;

finally
Response.Free;
Request.Free;
FileData.Free;

Screen.Cursor := crDefault;
end;
end;

Exit的onclick中
begin
Close;
end;

MF的onclose中
begin
OLEC.OleObject.Application.UserName := FOperatorOrg;
OLEC.Close;
OLEC.DestroyObject;

if FileExists(FLocalFileName) then DeleteFile(FLocalFileName);
if FileExists(FLocalFileName + '.doc') then DeleteFile(FLocalFileName + '.doc');
end;

然后从project->Web deploy发布。。。ok了
 
我也是最近才发现手动启动word文档与ole创建的文档冲突的问题,因为我用的是
GetActiveOleObject('Word.Application')获得当前的文档,但当你从另一个手动启动的
word切换到ie中时,直接操作将会时刚才那个word,我用了一个比较土的办法,就是在操作
ie中的word时,先调用oleContainer的doverb(),这样可以,但是会闪动一下。我也正在找
更好的方法,如果谁有给我回个话。另外,我又遇到一个新问题,就是当你有ie中的word和
手工启动的word共存时,如果先将手动启动的word关掉,再用开始菜单中的新建office文档
创建word,则会出现错误,而要是直接新建word文档,或者有手工创建的word存在,则不会
出现这个问题。我用任务管理器,注意到如果手工创建word,这个word的进程id,始终不变
,要是ie中启动再用新建office文档创建则会改变。所以当将手工启动的全关掉时,ie中的
word进程id与以前的不一样,所以当然会出错。但我不知道从何处下手来解决它。
pid发生了变化,所以再
 
楼上的:
如果你用olecontainer的话,这样
OLEC.OleObject.Application
也可以获得word的application,我就是这么用的

另外。。。你对application的方法了解么?我需要一个对指定文档(一般也就是活动文档)启用文档保护,有无建议?
 
文档保护
OLEC.OleObject.protect(2)
 
水手,能否详细结识一下。。。可否告知哪里有相关资料?(msdn的好乱套,根本不知道方法和对象的关系。。呜呜呜)
 
to Cipher:请看office目录下2052下的vbawrd9.chm,可以查找到所有你想要的,其中查找
方法里的protect即可找到。另外,在word里直接用visual Basic编辑器也可以发现更多的
东西。我就是边用边摸索,有什么想法继续交流。
mail:tzg7290@sina.com
 
应该是通过activex
 
to Cipher:感谢你!我以前得到内存中的word用GetActiveOleObject('Word.Application'),
会出现冲突的问题,现在用你的方法不会了,真是太感谢了。以后多多交流。
 
多人接受答案了。
 
tsir222去另外一贴 http://www.delphibbs.com/delphibbs/dispq.asp?lid=1711927 领另外200分吧

自由水手,如果你也去,就在分给你50分^_^

谢谢大家!
 
对 那是一个active控件。其实用msxml做的话更好。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
607
import
I
D
回复
0
查看
916
DelphiTeacher的专栏
D
I
回复
0
查看
731
import
I
顶部