Показать сообщение отдельно
  #12  
Старый 20.03.2012, 18:52
kiman.ru kiman.ru вне форума
Новичок
 
Регистрация: 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;
Ответить с цитированием