
20.03.2012, 18:52
|
Новичок
|
|
Регистрация: 11.02.2010
Сообщения: 63
Репутация: 10
|
|
Цитата:
Сообщение от Aristarh Dark
Что-то сегодня меня подводят мои телепатические способности...
Надо бы код смотреть.
И вдогонку: а на кой надо открывать ворд в потоке???
Короче, надо код смотреть, иначе не понятно ничего
|
Мне надо скопировать файл Word, открыть его, а потом по желанию пользователя распеатать его. Во время копирования файла и открытия должен бегать ProgressBar. Не важно что он не привязан к отображению точного времени копирования и открытия документа — он просто постоянно бегает. Так вот в момент открытия файла, основной поток подвисает на время выполнения процедуры, поэтому я вынес открытие файла в отдельный поток.
Код:
{ ГЛАВНЫЙ ЮНИТ}
. . .
// объявление переменных
public
{ Public declarations }
d, w: Variant;
SaveChanges: OleVariant;
end;
. . .
// Открытие документа
procedure TForm1.WordOpen;
begin
w := CreateOleObject('Word.Application');
w.DisplayAlerts := False;
try
d := w.Documents.Open(FileName := 'C:\test.doc',ReadOnly := True);
except
ShowMessage('Err');
end;
end;
// печать открытого документа
procedure TForm1.ButtonPrintClick(Sender: TObject);
begin
d.PrintOut;
end;
// запуск процедуры открытия документа в потоке
procedure TForm1.ButtonThreadWordClick(Sender: TObject);
var
ThreadWordOpen: WORDOPEN;
begin
ThreadWordOpen := WORDOPEN.Create(True);
ThreadWordOpen.FreeOnTerminate := False;
ThreadWordOpen.Resume;
end;
{ ОПИСАНИЕ ЮНИТА ПОТОКА }
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ShellCtrls, ExtDlgs, ExtCtrls, Unit1, ComObj, OleCtnrs, Printers, ActiveX;
type
WORDOPEN = class (TThread)
private
{private}
protected
procedure UpdateCaption;
procedure ShowErr;
procedure Execute; override;
end;
implementation
procedure WORDOPEN.Execute;
begin
CoInitialize(nil);
Form1.WordOpen;
// если здесь вызвать процедуру печати документа, то он выводится на печать
//Form1.ButtonPrint.OnClick(Self);
end;
|