Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.15;
Скачать: CL | DM;

Вниз

Контроллер автоматизации, события автоматизации   Найти похожие ветки 

 
fool ©   (2003-09-04 13:39) [0]

Всем привет, а проблема такая:
генерирую отчеты в Word (office2000)

procedure TMainForm.Button1Click(Sender: TObject);
begin
ThreadNDS := TThreadNDS.Create(False);
end;

procedure TThreadNDS.Execute;
var
Unknown: IUnknown;
Result: HResult;
AppProdID: String;
App: variant;
Rng: variant;
Doc: variant;
I: Integer;
Flag: Boolean;
CurPar: Integer;
begin
inherited;
Flag := True;
try
repeat
CoInitializeEx(nil, 2);
AppProdID := "Word.Application";
Result := GetActiveObject(ProgIDToClassID(AppProdID), nil, Unknown);
if Result = MK_E_UNAVAILABLE then App := CreateOleObject(AppProdID)
else App := GetActiveOleObject(AppProdID);

App.Visible := True;
App.Documents.Add;

Doc := App.Documents.Item(App.Documents.Item(1).Name);

CurPar := 0;
for I := 0 to 50 do
begin
Doc.Paragraphs.Add;
Inc(CurPar);
Rng := Doc.Paragraphs.Item(CurPar).Range;
Rng.InsertBefore("Test"+IntToStr(I+1)+", ");
end;
App := UnAssigned;
CoUnInitialize;
until Flag;
except
on E:Exception do
begin
ShowMessage(E.Message);
end;
end;
end;

Все нормально работает, но! если в процессе генерации документа происходит некоторое событие в Ворде (для другого документа), требующее вмешательства пользователя (подтверждение сохранения документа при закрытии, диалог выбора принтера и т.д.) происходит исключение "Call was rejected by callee". Т.е. блокируются все документы до ответа пользователя и соответственно генерация прекращается. Возможно ли как с этим боротся и как? Останавливать поток и ждать пока пользователь ответит? Узнать это можно по идее реализовав в приложении сток для Ворда, где отлавливать соответствующие события. Но нормальной литературы под рукой нет, если кто реализовывал подобное, просьба показать примеры или оставить ссылки по теме.

PS
пока за нехваткой времени сделал так (т.е. для каждого генерируемого документа создаю свой экзэмпляр Ворда, но это шибко неправильно т.к. сильно жрет ресурсы и время):
procedure TThreadNDS.Execute;
var
Unknown: IUnknown;
Result: HResult;
AppProdID: String;
App: variant;
Rng: variant;
Doc: variant;
I: Integer;
Flag: Boolean;
CurPar: Integer;
begin
inherited;
Flag := True;
try
repeat
CoInitializeEx(nil, 2);
AppProdID := "Word.Application";
App := CreateOleObject(AppProdID);

App.Visible := True;
App.Documents.Add;

Doc := App.Documents.Item(App.Documents.Item(1).Name);

CurPar := 0;
for I := 0 to 50 do
begin
Doc.Paragraphs.Add;
Inc(CurPar);
Rng := Doc.Paragraphs.Item(CurPar).Range;
Rng.InsertBefore("Test"+IntToStr(I+1)+", ");
end;
App := UnAssigned;
CoUnInitialize;
until Flag;
except
on E:Exception do
begin
ShowMessage(E.Message);
end;
end;
end;


 
fool ©   (2003-09-04 16:23) [1]

Неужели у МАСТЕРОВ времени нет даже ссылки оставить, или никто контроллеры со стоками не реализовывал.

Грустно как-то...



Страницы: 1 вся ветка

Текущий архив: 2003.09.15;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.038 c
1-48603
AlexPul
2003-09-03 13:02
2003.09.15
Кодировка в консольных приложениях


4-48824
ViJen
2003-07-15 15:48
2003.09.15
Grid


1-48515
Sfagnum
2003-09-02 15:30
2003.09.15
Можно ли результатом функции сделать динамический массив записей


3-48462
XMbIPb
2003-08-22 21:11
2003.09.15
Редактировать записи в таблице


1-48547
Sam Stone
2003-09-01 18:42
2003.09.15
функции в dll ках