请教,在delphi中调用word,当你关闭了word之后,word会提示你要不要保存修改了的文档,怎么判断用户是点了保存还是不保存?请知道的一定帮帮我。

解决方案 »

  1.   

    下面是我刚刚写的:不知道对你有没有用处!
    procedure OnSaveFile(Sender: TObject; var Doc: OleVariant;
          var SaveAsUI: OleVariant; var Cancel: OleVariant); //保存Word文档
         procedure OnQuitWord(Sender: TObject);
        procedure FormCreate(Sender: TObject); //关闭Word
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      procedure OpenWord(aFileName,aFileType,aMemo:string;aDataSet:TDataSet);
      function AddWord(aFileName,aFileType:string;aDataSet:TDataSet):String;
      procedure SaveToDB(FileName: string;aDataSet:TDataSet); //保存到数据库中
      function GetWinTempPath(): string; //获取临时目录var
      Form1: TForm1;
      WordObject: TWordApplication;
      WordDoc: TWordDocument;
      TempPath, Path, FileName, FileType: string;
      FileFullName: OleVariant;implementation{$R *.dfm}function GetWinTempPath(): string; //获取临时目录
    {$IFNDEF WIN32}
    const Max_Path=144;
    {$ENDIF}
    var
      TempPath: array[0..Max_Path] of Char;
    begin
      GetTempPath(SizeOf(TempPath), TempPath);
      Result := StrPas(TempPath);
    end;
    procedure TForm1.OnQuitWord(Sender: TObject);
    begin
      //删除临时文件
     // DeleteFile(FileFullName);
      //控制主窗体
      Application.MainForm.Show;
    end;
    procedure TForm1.OnSaveFile(Sender: TObject; var Doc: OleVariant;
      var SaveAsUI: OleVariant; var Cancel: OleVariant); //保存Word文档
    begin
      //保存到临时文件夹中
      WordDoc.Save;
      //保存到数据库中
      SaveToDB(FileFullName,AdoQuery1);
    end;
    procedure OpenWord(aFileName,aFileType,amemo:string;aDataSet:TDataSet);
    var
      OleWord: TOleContainer;
      BlobStream: TStream;
      Confirmconversions, ReadOnly, AddToRecentFiles: OleVariant;
      PassWordDocument, PasswordTemplate, Revert, WritePasswordDocument: OleVariant;
      WritePasswordTemplate, Format, Encoding, Visible: OleVariant;  begin
        FileName := Trim(aDataSet.FieldByName(aFileName).AsString);
        FileType := LowerCase(Trim(aDataSet.FieldByName(aFileType).AsString));
        FileFullName := TempPath+FileName+FileType;
        //创建BLOB流
        BlobStream := aDataSet.CreateBlobStream(aDataSet.FieldByName(aMemo), bmRead);
        //读取BLOB流
        OleWord := TOleContainer.Create(Application);
        try
          OleWord.Visible := False;
          OleWord.Parent := Application.MainForm;
          OleWord.LoadFromStream(BlobStream);
          //存储到临时文件夹中或打开文件
          if (FileType='.doc')or(FileType='.rtf')or(FileType='.gog') then //只能打开Doc,Rtf,Dot文档
          begin
            OleWord.SaveAsDocument(FileFullName);
            OleWord.Free;        //创建Word和Document
            WordObject := TWordApplication.Create(Application);
            WordDoc := TWordDocument.Create(Application);
            //定制Word中的事件
            WordObject.OnDocumentBeforeSave :=Form1.OnSaveFile;
            WordObject.OnQuit :=Form1.OnQuitWord;
            //设置打开参数
            Confirmconversions := False;
            ReadOnly := False;
            AddToRecentFiles := False;
            PassWordDocument := EmptyParam;
            PasswordTemplate := EmptyParam;
            Revert := False;
            WritePasswordDocument := EmptyParam;
            WritePasswordTemplate := EmptyParam;
            Format := EmptyParam;
            Encoding := EmptyParam;
            Visible := True;
            WordObject.Visible := True;
            WordObject.Caption := '[可加入应用程序标题]'; //可加入应用程序标题        //控制主窗体
            Application.MainForm.Hide;        //打开和连接临时文件夹中的文档
            try
              WordObject.Documents.Open(FileFullName, Confirmconversions, ReadOnly,
                AddToRecentFiles, PassWordDocument, PasswordTemplate, Revert,
                WritePasswordDocument, WritePasswordTemplate, Format, Encoding, Visible);
              WordDoc.ConnectTo(WordObject.ActiveDocument);
            except
              Application.MessageBox(Pchar('打开数据库中的文档错误,请与供应商联系!'),
                '错误', MB_ICONERROR+MB_OK);
              WordDoc.Close;
              WordObject.Quit;
              Application.MainForm.Show;
            end;
          end
          else                     //打开非Doc,Rtf,Dot文档
          begin
            OleWord.DoVerb(ovPrimary);
          end;
        finally
          BlobStream.Free;
        end;
    end;function AddWord(aFileName,aFileType:string;aDataSet:TDataSet):String;
    var FileName, FileType: string;
     Dialog:TOpenDialog;
    begin
      Dialog:=TOpenDialog.Create(Application);
      if Dialog.Execute then
        FileName := ExtractFileName(Dialog.FileName);
        FileType := ExtractFileExt(Dialog.FileName);
        FileName := Copy(FileName,1,Length(FileName)-Length(FileType));
      try
        //向数据库中插入数据
        aDataSet.Insert;
        aDataSet.FieldByName('DocName').AsString:=FileName ;
        aDataSet.FieldByName('DocType').AsString:=FileType ;
        aDataSet.Post;
        //BLOB流保存到数据库中
        SaveToDB(Dialog.FileName,aDataSet);
      except
        Application.MessageBox(Pchar('向数据库中插入数据错误!'), '错误',
          MB_ICONERROR+MB_OK);
      end;end;procedure SaveToDB(FileName: string;aDataSet:TDataSet); //保存到数据库中
    var
      BlobStream: TStream;
      Ole: TOleContainer;
    begin
      aDataSet.Edit;
      //创建BLOB流
      BlobStream := aDataSet.CreateBlobStream(
        aDataSet.FieldByName('Content'), bmReadWrite);
      try
        //移动到STREAM的首位
        BlobStream.Seek(0, soFromBeginning);
        //以OLE方式打开文件并保存到BLOB流中
        Ole := TOleContainer.Create(Application);
        try
          Ole.Visible := False;
          Ole.Parent := Application.MainForm;
          Ole.CreateObjectFromFile(FileName, False);
          Ole.SaveToStream(BlobStream);
        finally
          Ole.Free;
        end;
        //释放流
        BlobStream.Free;
        //保存
        aDataSet.Post;
      except
        Application.MessageBox(Pchar('向数据库中写文件错误!'), '错误',
          MB_ICONERROR+MB_OK);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var FileName, FileType: string;
     Dialog:TOpenDialog;
    begin
      Dialog:=TOpenDialog.Create(Application);
      if Dialog.Execute then
        FileName := ExtractFileName(Dialog.FileName);
        FileType := ExtractFileExt(Dialog.FileName);
        FileName := Copy(FileName,1,Length(FileName)-Length(FileType));
      ADOQuery1.Open;
      AddWord('DOCNAME','DOCTYPE',ADOQuery1);
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ADOQuery1.Open;
      ADOQuery1.Edit;
     OpenWord( 'DOCNAME','DOCTYPE','Content',ADOQuery1);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      TempPath := GetWinTempPath();
      Path := ExtractFilePath(Application.ExeName);
    end;end.
      

  2.   

    Frend(一刀) :
           你好!在执行到函数"OpenWord "的OleWord.LoadFromStream(BlobStream)处时出错:
     out of memory!
      

  3.   

    将Word对象创建在OleContainer中,然后通过OleContainer的Modified属性进行判断(注意在激活之间将Modified设为False)。