WORD问题,请问如何实现以下功能?200分(200分)

  • 主题发起人 主题发起人 playlife
  • 开始时间 开始时间
P

playlife

Unregistered / Unconfirmed
GUEST, unregistred user!
做了一个简单的人事系统,对方提出需要对每个员工提供电子档案功能。要求实现功能如下:
在打开该员工信息后,当切换到电子档案页面时,系统自动将该员工的Word档案打开。该Word内容写在数据库的ygxxb_word字段中。在编辑完成后,点击保存按钮自动更新到该字段中,其它Word功能不需要,请提供源代码,如果编译成功运行通过,立即送分!谢谢!
 
这个问题比较容易,
一、通过 TBlobField 的 LoadFromFile 方法将 WORD 文件写入字段中
二、读出时用 TBlobField 的 SaveToFile 方法存成 WORD 文件
三、建立 WORD Application 对象,打开文件
四、启动一个计时器,去判断 WORD 是否已经退出
五、如果 WORD 已经退出,运行第二点的保存方法

代码如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBTables, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Query1: TQuery;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
WordApp: Variant;
WordCap: string;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses
ComObj;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
// 保存代码
TBlobField(Query1.FieldByName('ygxxb_word')).LoadFromFile('c:/XXX员工档案.DOC');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
// 取出文件代码
TBlobField(Query1.FieldByName('ygxxb_word')).SaveToFile('c:/XXX员工档案.DOC');
end;

procedure TForm1.Button3Click(Sender: TObject);
var
FileName: string;
begin
// 打开文件代码
FileName := 'c:/XXX员工档案.DOC';
WordApp := CreateOleObject('Word.Application');

WordApp.Documents.Open(FileName);
WordCap := ExtractFileName(FileName) + ' - ' + String(WordApp.Caption);
WordApp.Visible := true;
{ 启动计时器监视 WORD 是否被关闭 }
Timer1.Enabled := true;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
WordHandle: Integer;
begin
{ 查找当前打开的 WORD 文档窗口 }
Timer1.Enabled := False;
WordHandle := FindWindow(nil, PChar(WordCap));
{ 如果未关闭,则关闭它 }
if IsWindow(WordHandle) then
begin
try
if not WordApp.ActiveDocument.ReadOnly then
WordApp.Documents.Save;
WordApp.Documents.Close;
WordApp.Quit;
except
SendMessage(WordHandle, WM_QUIT, 0, 0);
end;
end;
WordApp := Unassigned;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
WordHandle: Integer;
begin
Timer1.Enabled := False;
Timer1.Tag := Timer1.Tag + 1;
{ 查找当前打开的 WORD 文档窗口 }
WordHandle := FindWindow(nil, PChar(WordCap));
{ 如果未关闭,每隔 2 秒钟存盘一次,
主要是为了用户的修改能及时保存 }
if IsWindow(WordHandle) then
begin
try
if not WordApp.ActiveDocument.ReadOnly then
if (Timer1.Tag mod 4) = 0 then WordApp.Documents.Save;
except end;
end
else { 用户关闭了 WORD }
begin
FormDestroy(Sender);
Exit;
end;
Timer1.Enabled := True;
end;
end.

随便写一下,请多包含
 
谢谢楼上朋友指点,今天我测试一下,通过后立即送分!再次感谢!
 
bundur:你好!还有一个小问题,在该员工没有电子档案的时候,还要加判断处理新增加文档吧。这个如何写?谢谢!
 
用OleContainer也可以,它可以在你的界面中进行WORD文档的编辑,而不用启动WORD,也不用去判别WORD是否关闭。
 
to: 蒋劲刚
OleContainer 经常会有一些不可控的问题,我以前用,但现在已不用了。
而且用 CreateOleObject 方法,可以更灵活的控制,当然代价是多写代码。

to: playlife
如果没有,在数据库中判断就行了,
这时,改打开文件为新建文件,新建完成立即为它起个名存起来:
if (没有档案文件) then
begin
WordApp.Run('FileNewDefault');
WordApp.ActiveDocument.SaveAs(FileName, 0, False, '',
true, '', false, false,
false, false, false);
end else
WordApp.Documents.Open(FileName);

 
楼上说的有理!这两种我也都用过,但我现在不是万不得已我是不用OLE的,因为OLE调用一是控制比较困难,二是速度也比较慢,所以我现在都尽量用自己的代码去实现客户的要求。以前我就写了一个类似EXCEL的控件取代EXCEL调用,最近正在做一个类似WORD的排版控件,还没写完。[:D]
 
TO bundur锛?杩樻湁涓
 
怎么会是乱码了?
TO bundur:
还有一个小问题有劳您一下,如果当前电脑已打开一WORD文档,应该怎么处理?
目前您的方法是:WordApp := CreateOleObject('Word.Application');,但如果已有则如何取到WordApp?真不好意思,要麻烦您这么多次,谢谢!!
 
to:蒋劲刚
谢谢您的参与!也让我受益非浅!
 
如下:
try
WordApp := GetActiveOleObject('Word.Application');
except
WordApp := CreateOleObject('Word.Application');
end;

但我不推荐这样做,应该为每个程序打开的WORD创建一个实例,这样当程序代码中有对WORD进行关闭的操作中,只针对自己打开的实例,而不影响已经打开的WORD,不然一旦执行关闭WORD操作就会关闭整个WORD,如果这时用户事先打开的WORD中正在编辑其它文件,却也会被迫关闭。

 
我也想要点分阿
 
谢谢bundur,在我运行以下代码时出错:
WordApp := CreateOleObject('Word.Application');
if not FileExists(WordFileName) then
begin
WordApp.Run('FileNewDefault');
WordApp.ActiveDocument.SaveAs(WordFileName, 0, False, '',
True, '', False, False, False, False, False);
end
else
WordApp.Documents.Open(WordFileName);
WordCap := ExtractFileName(WordFileName) + ' - ' +
string(Wordapplication.Caption);
Wordapplication.Visible := True;
{ 启动计时器监视 WORD 是否被关闭 }
WORD并没有帮我新建文档出来,但关掉word后,又能够在当前目录下找到创建的文档。
却也无法打开和删除。
如果我事先COPY一个WORD同名文档也无法自动打开。请帮忙看一下,谢谢!
 
对不起,是我自己忽略了,快搞定了。下班前送分给大家,再次感谢!!
 
你用WordApp创建对象
WordApp := CreateOleObject('Word.Application');
为什么用Wordapplication去访问对象?
WordCap := ExtractFileName(WordFileName) + ' - ' +
string([red]Wordapplication[/red].Caption);
[red]Wordapplication[/red].Visible := True;


 
多人接受答案了。
 
后退
顶部