PDA

Показать полную графическую версию : [решено] Как узнать, когда пользователь закроет документ?


game_Racer
01-11-2011, 10:55
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
Это неправильно: при переключении на другой документ получите бяку.
А вообще нормального способа определить, когда офис закрывает документ извне, не существует.
Только когда открывается и редактируется СУЩЕСТВУЮЩИЙ файл, можно проверить его на доступность для записи.

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

AlexVol
01-11-2011, 13:57
Попробовать открыть с правом записи в монопольном режиме. Если получается исключение - файл занят.

game_Racer
01-11-2011, 14:04
AlexVol, попробую, но мне кажется будет также грузить проц. Я ведь правильно понимаю, что это нужно сделать в цикле?

LilLoco
01-11-2011, 14:11
game_Racer, Сделайте в цикле
Sleep(1000); // 1секунда
Так вы разгрузите процессор. Можно увеличить период засыпания цикла.

Project1
01-11-2011, 14:57
есть нормальный способ:
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.




© OSzone.net 2001-2012