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;
дальше мой код...
Сделал вот так, все работает, но процессор сильно грузит и память набирает. Есть ли другой способ сделать это?
|
Это неправильно: при переключении на другой документ получите бяку.
А вообще нормального способа определить, когда офис закрывает документ извне, не существует.
Только когда открывается и редактируется СУЩЕСТВУЮЩИЙ файл, можно проверить его на доступность для записи.
|
game_Racer |
01-11-2011 12:01 1786354 |
AlexVol, Бяку не получал. Файл открывается существующий, я (его предварительно копирую во временную папку). Как проверить его доступность для записи?
|
Попробовать открыть с правом записи в монопольном режиме. Если получается исключение - файл занят.
|
game_Racer |
01-11-2011 14:04 1786457 |
AlexVol, попробую, но мне кажется будет также грузить проц. Я ведь правильно понимаю, что это нужно сделать в цикле?
|
game_Racer, Сделайте в цикле
Код:
Sleep(1000); // 1секунда
Так вы разгрузите процессор. Можно увеличить период засыпания цикла.
|
есть нормальный способ:
Код:
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.
© OSzone.net 2001-