在Delphi下开发公文流转审批系统的思路(100分)

  • 主题发起人 主题发起人 dtwind
  • 开始时间 开始时间
D

dtwind

Unregistered / Unconfirmed
GUEST, unregistred user!
本人在做一个公文流转审批的东西,思路是利用delphi直接操作Word的对象,主要是利用
Word中的文字型窗体域(FormFields.TextInput对象)达到文档部分保护的目的。,当在程序中
控制窗体锁定时候,只有文字型窗体域中可以接受输入输出,其他的地方不能够输入输出,
可以很好地控制审批的安全问题,同时,对于用户来说,仅仅是在Word文档中可以输入的
地方填写审批内容,在后台数据库中,保存窗体域中的内容。
各位打下可以探讨一下这种思路的可行性!!!
 
[?]不大可能实现[?][?]
 
我已经可以做到这一点

就是在程序中控制Word文档中的文本窗体域的输入输出,问题在于当窗体锁定的时候,虽然
其他的区域不可以修改,只有文本窗体域可以接受输入输出,但现在变成所有的文本窗体
域都可以接受输入输出,而不能够进行单个控制文本窗体域的输入输出,虽然可以通过解
除域的方式使文本窗体域取消,但非常麻烦
是否可以通过光标输入焦点的控制来达到这一个目的呢???

就是说如果光标不在应该所处的文本窗体域的位置,则自动回到应该所处的文本窗体域。
各位大虾可以探讨一下。例程在下面:
==============================================================
其中,f1,f2就是2个文本窗体域
==============================================================
unit test;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,COMobj,ActiveX,Word2000;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}

var Word_ole: Variant;
function GetWordObject (const ClassName: string): IDispatch;
{ 如果Word没有运行,则启动它,并返回一个自动化对象;
如果Word已经启动,就返回正在运行的实例的自动化对象。}
var
ClassID: TGUID;
Unknown: IUnknown;
begin
ClassID := ProgIDToClassID (ClassName);
if Succeeded (GetActiveObject (ClassID, nil, Unknown)) then
OleCheck (Unknown.QueryInterface (IDispatch, Result))
else
Result := CreateOleObject (ClassName);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
{获取创建Word.Application自动化对象,
如果Word尚未运行,Word启动}
Word_ole := GetWordObject ('Word.Application');
end;

procedure TForm1.Button1Click(Sender: TObject);
var NewDocument,f1,f2: Variant;
begin
Word_ole.Visible := True;
Word_ole.UserName:='user
Word_ole.Caption:='测试';
//增加一个新的Word文档对象
NewDocument:=Word_ole.Documents.open('d:/test/test.doc');
f1:=NewDocument.Application.ActiveDocument.FormFields.Item(1);
f2:=NewDocument.Application.ActiveDocument.FormFields.Item(2);
//锁定窗体,保护文档
NewDocument.Application.ActiveDocument.Protect(NoReset:=False, Type:=wdAllowOnlyFormFields);

f1.Result:='你好2!!';
Edit1.Text:=f1.Result;
f2.Result:=Memo1.Text;
//取消域,恢复成文本
f2.Selection.Fields.Unlink;
//保护文档
// NewDocument.PrintPreview;
end;

end.
 
我也在做OA,希望与你交流,我没有使用WORD来做输入表单,原因是加载太慢,你完全可以用
EXCEL风格的第三方控件来模拟,一切都是控制之中,我的程序已经实现,Mail: jllhuu@vip.sina.com
 
加载不是问题啊
在主界面出来以前,可以先加载Word
程序运行时就没有什么感觉了阿
 
多人接受答案了。
 
后退
顶部