Главная страница
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.014 c
3-48402
Relaxxx
2003-08-26 11:59
2003.09.15
Сложный вопрос, вообще возможно такое здеслать???


1-48499
Urvin
2003-09-02 18:47
2003.09.15
Как использовать WM_...


1-48538
Belka
2003-09-02 11:53
2003.09.15
Програмное переключение ракскладки клавиатуры.


1-48506
alex732
2003-09-02 15:18
2003.09.15
Различный цвет и стиль шрифта


1-48578
Vinter
2003-09-04 09:38
2003.09.15
Полупрозрачная форма