Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Как узнать, когда пользователь закроет документ? (http://forum.oszone.net/showthread.php?t=219437)

game_Racer 01-11-2011 10:55 1786319

Как узнать, когда пользователь закроет документ?
 
Код:

Word:=CreateOleObject('Word.Application');
Word.Documents.Open(FileName:=GetTempDirectory+filename+'.tmp',ReadOnly:=true);
Word.visible:=True;
Doc:=Variant(Word).ActiveDocument;
while doc=filename+'.tmp' do  //не нравится мне это... но другого способа не нашел.
  try
    Doc:=Word.ActiveDocument;
  except
    Doc:='';
  end;
дальше мой код...

Сделал вот так, все работает, но процессор сильно грузит и память набирает. Есть ли другой способ сделать это?

AlexVol 01-11-2011 11:07 1786329

Это неправильно: при переключении на другой документ получите бяку.
А вообще нормального способа определить, когда офис закрывает документ извне, не существует.
Только когда открывается и редактируется СУЩЕСТВУЮЩИЙ файл, можно проверить его на доступность для записи.

game_Racer 01-11-2011 12:01 1786354

AlexVol, Бяку не получал. Файл открывается существующий, я (его предварительно копирую во временную папку). Как проверить его доступность для записи?

AlexVol 01-11-2011 13:57 1786452

Попробовать открыть с правом записи в монопольном режиме. Если получается исключение - файл занят.

game_Racer 01-11-2011 14:04 1786457

AlexVol, попробую, но мне кажется будет также грузить проц. Я ведь правильно понимаю, что это нужно сделать в цикле?

LilLoco 01-11-2011 14:11 1786461

game_Racer, Сделайте в цикле
Код:

Sleep(1000); // 1секунда
Так вы разгрузите процессор. Можно увеличить период засыпания цикла.

Project1 01-11-2011 14:57 1786490

есть нормальный способ:
Код:

unit Unit1;

interface

uses
  WordXP,
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure WordApplicationDocumentBeforeClose(ASender: TObject;
      const Doc: _Document; var Cancel: WordBool);
  private
    { Private declarations }
    WordApplication1: TWordApplication;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  WordApplication1:=TWordApplication.Create(Self);
  WordApplication1.Visible:=True;
  WordApplication1.Documents.Add(EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  WordApplication1.OnDocumentBeforeClose:=WordApplicationDocumentBeforeClose;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  WordApplication1.Quit;
  WordApplication1.Free;
end;

procedure TForm1.WordApplicationDocumentBeforeClose(ASender: TObject;
  const Doc: _Document; var Cancel: WordBool);
begin
  ShowMessage('WordApplicationDocumentBeforeClose');
end;

end.



Время: 18:19.

Время: 18:19.
© OSzone.net 2001-