初步的想法是,在调用文件前记录文件的属性如大小、时间等,在调用进行操作,并结束退出时再一次记录文件的属性,然后将两者对照,根据差别来判断是否被修改?
但具体如何实现,看大家有没有什么例子(包括OLE调用、属性对照等),因为时间紧迫,没多少时间去研究它们,求大家帮点忙!重分酬谢
贴上或者发到

解决方案 »

  1.   

    Delphi5已经进行了封装;
    以下是一个e.g:
    Delphi自带了一个简单的Word例题,但功能太简单。通过查找VBA的说明,再对照Delphi的VCL,如下代码实现了基本的公文管理功能。 启动Word时用如下代码: 
    begin
    try 
    Wordapplication.Connect; 
    except 
    MessageDlg('Word may not be installed', mtError, [mbOk], 0); 
    Abort; 
    end; 
    Wordapplication.Visible := True; 
    WordApplication.Caption := 'Delphi automation'; 
    end; 关闭Word用如下代码。如果想保存Doc文件,请修改SaveChanges变量的内容: 
    var 
    SaveChanges, OriginalFormat, RouteDocument: OleVariant; 
    begin 
    SaveChanges := WdDoNotSaveChanges; 
    OriginalFormat := UnAssigned; 
    RouteDocument := UnAssigned; 
    try 
    WordApplication.Quit(SaveChanges, OriginalFormat, RouteDocument); 
    WordApplication.Disconnect; 
    except 
    on E: Exception do 
    begin 
    Showmessage(E.Message); 
    WordApplication.Disconnect; 
    end; 
    end; 
    end; 让Word打开一个指定的文件,需要先放置OpenDialog,然后调用WordApplication.Documents.Open: 
    var 
    ItemIndex :OleVariant; 
    FileName, ConfirmConversions, ReadOnly, AddToRecentFiles, 
    PasswordDocument, PasswordTemplate, Revert, 
    WritePasswordDocument, WritePasswordTemplate, Format: OleVariant; 
    begin 
    if not dlgOpen.Execute then 
    Exit; {Open document} 
    FileName := dlgOpen.FileName; 
    ConfirmConversions := False; 
    ReadOnly := False; 
    AddToRecentFiles := False; 
    PasswordDocument := ''; 
    PasswordTemplate := ''; 
    Revert := True; 
    WritePasswordDocument := ''; 
    WritePasswordTemplate := ''; 
    Format := wdOpenFormatDocument; WordApplication.Documents.Open( FileName, ConfirmConversions, 
    ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate, 
    Revert, WritePasswordDocument, WritePasswordTemplate, Format ); {Assign WordDocument component} 
    ItemIndex := 1; 
    WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex)); {Turn Spell checking of because it takes a long time if enabled and slows down Winword} 
    WordApplication.Options.CheckSpellingAsYouType := False; 
    WordApplication.Options.CheckGrammarAsYouType := False; 
    end; 让Word替换标记字符串要使用WordDocument.Range.Find.Execute,这里用Delphi替换了<#Name>: 
    var 
    FindText, MatchCase, MatchWholeWord, MatchWildcards, MatchSoundsLike, 
    MatchAllWordForms, Forward, Wrap, Format, ReplaceWith, Replace: OleVariant; 
    begin 
    FindText := '<#Name>'; 
    MatchCase := False; 
    MatchWholeWord := True; 
    MatchWildcards := False; 
    MatchSoundsLike := False; 
    MatchAllWordForms := False; 
    Forward := True; 
    Wrap := wdFindContinue; 
    Format := False; 
    ReplaceWith := 'Delphi'; 
    Replace := True; WordDocument.Range.Find.Execute( FindText, MatchCase, MatchWholeWord, 
    MatchWildcards, MatchSoundsLike, MatchAllWordForms, Forward, 
    Wrap, Format, ReplaceWith, Replace ); end; 上面这4段代码完成了公文管理的基本功能,再把它和数据库结合起来,就可以开发一个与Lotus Notes类似的产品了。
      

  2.   

    楼主,没你想的难,用activedocument.saved就可以判断
      

  3.   

    多谢楼上的兄弟
    但是我这OLE可能调用doc/xls/ppt/txt等一系列基本的文件,都要判断的!
    那我岂不是对于每种文件的属性及方法都要了解,我都不想用OLE做这事了,干脆直接shellexcute,然后按上面说的方法做得了
    不知大家有没有什么更好的建议。
      

  4.   

    如果用shellexcute的话,无法控制外部程序何时会关闭啊,请大家出点主意
      

  5.   

    需要这么麻烦?直接读文件属性的最后修改时间不就可以了?
    不用Ole或word的application,是操作系统基本的功能
      

  6.   

    to  befree(似有似无) :我是在自己的应用程序里打开文件,你不知什么时候用户会关闭程序。不可能下次使用应用程序的时候,再来遍历整个数据库,对比每个文件的时间吧! 并且你无法记录上次的修改时间,
    何况我还要记录是哪个操作员对文件进行了修改?
      

  7.   

    我搞不明白楼主的问题,
    是不能用OLE来调用多种文件呢,还是其它?我以前做过用OLE调用打开不同格式的多种文件,比如,图片、word文档、Excel文档等.这是我的打开方式:
    在这里我用了ActiveX控件RichTextBox.
    procedure TfrmContractOther.cmdInsertClick(Sender: TObject);
    var
        nCount:Integer;
        sname:string;
        strFileName:String;
    begin
        nCount := RichTextBox1.OLEObjects.Count;
        sname := 'f'+inttostr(nCount);
        if OpenDialog1.Execute() then
        begin
            strFileName := OpenDialog1.FileName;
            RichTextBox1.OLEObjects.Add(nCount, sname ,strFileName,0);
        end;
    end;
      

  8.   

    那就不要用D5了,office的封装是D6比D5好,D7比D6好,用D7的servers吧
    D6支持office2000,D7支持officeXP
      

  9.   

    谢谢几位的热心指导,我还是讲清楚一点吧!
    应用程序管理导入到系统中的文件,记录导入前的文件大小,时间等属性在数据库中,但数据库中只存文件路径等,不存文件,这些文件可以是任意格式的文件,不只是office文档。
    我想实现的功能是:如果用户通过系统打开相应的文件进行修改,系统能记录该文件是被谁修改过,什么时候修改的等操作日志信息。
    我开始想用OLE来操作,不知对各种格式的文件操作实现起来会不会很麻烦?
    如果直接用ShellExecute来调用的话,用户何时关闭外部程序不能得到有效的控制,所以无法判断是否被修改。
    我想大家给我点意见,怎样实现起来简单并且能达到目的?我用D6开发
      

  10.   

    ShellExecute不可靠,还得用Ole
    有office的old服务
      

  11.   

    用FINDfirst的基本文件函数,TSearchRec里面有文件修改时间,如果不要office文件的摘要等信息的话
      

  12.   

    to befree(似有似无) : 
    是的,修改时间我是可以得到,但问题是我上面提到的目的根本达不到啊!
    如果用OLE的话,我如何去控制每种格式的文件,而且我不知道具体会有哪些文件格式,虽然大部分是常见的。
      

  13.   

    1.这样的想法也可以,做成运行后自动缩小,不占任务栏,类似托盘
    2.如果客户是用office建立或修改的文件,可以用Ole对象取得文件的详细信息,如果其它方式,就不可以
    3.DocumentProperty 对象提供以下信息:
    标题 
    主题
    作者
    关键词
    备注
    模板
    上一个作者
    修订次数
    应用程序名
    上次打印时间
    创建时间
    上次保存时间
    编辑时间总计
    页数
    字数
    字符数
    安全性
    类别
    格式
    经理
    单位
    字节数
    行数
    段落数
    幻灯片数
    备注
    隐藏幻灯片
    多媒体剪辑
      

  14.   

    多谢 befree(似有似无) 。
    如果用户是先关闭我开发的系统,再来关闭所修改的文档。有一个非常重要的信息无法记录:是谁修改了文件,这才是用户所需的功能。因为系统存在不同用户与不同权限。
    如果这一点实现不了,只是得到文件被修改过及修改过的时间,无法追究修改人的责任。也没多大意义了,我也不想再把这个文件跟踪功能做进去了。
      

  15.   

    如果他不是用其它应用程序打开,还是用office的话,不用钩子跟踪,用ole对象不影响判断的
      

  16.   

    把整个文件都放到数据里面去啊!,只能通过你的程序修改文件内容。我有时候就是这么干的啊!数据库里面可以放任何东西,我什么玩意都往里面放,除了WPS文档,那个玩意没有Com对象结构操纵,垃圾!