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

Вниз

Thread, Excel   Найти похожие ветки 

 
Alibaba ©   (2004-01-21 14:37) [0]

Привет.
В потоке пытаюсь работать с Excel:


Type

 TExcelThread = class(TThread)
 public
  constructor Create(pt: string);
 private
  xlRepE: TxlReport;
  PathRes: string;       //Путь к файлу результата
  ExcelSuccess: boolean; //Получилось выгрузить в Excel или нет
  MessageText: string;
  procedure SaveExcel;
 protected
  procedure Execute; override;
 end;

var
ExcelThread: TExcelThread;

{=========} IMPLEMENTATION {=========}

uses
dlgParams, Dialogs, dlgMain, dlgOptions, SysUtils, thAddThread,
ComObj, ActiveX, Forms;

constructor TExcelThread.Create(pt: string);
begin
xlRepE:=TxlReport.Create(Application);

xlRepE.DataSources.Add;  //Добавили источник данных
xlRepE.DataSources[0].Alias:="qr";

//Указали, что информацию для выгрузки в Excel необходимо брать из sql-запроса AddThread.qr (AddThread – это отдельный поток, в котором выполняется sql-запрос)
xlRepE.DataSources[0].DataSet:=AddThread.qr;

PathRes:=pt;  //Указали полный путь к Excel-файлу, который будет сформирован.

inherited Create(False);  //Создаем поток без ожидания
FreeOnTerminate:=True;    //По окончанию разрушается
end;

procedure TExcelThread.SaveExcel;
begin
xlRepE.ReportTo("",PathRes);
end;

procedure TExcelThread.Execute;
begin
try
 SaveExcel;
except
 on E: Exception do
  MessageText:="Ошибка";
end;
xlRepE.Free;
end;

end.



Не работает.


 
Alibaba ©   (2004-01-21 14:41) [1]

Если ставлю синхронизацию:
Synchronize(SaveExcel) - то работает, но исчезает смысл использования отдельного потока.

Потому что поток ExcelThread сихронизируется с главным потоком программы и это все равно что в главной программе выгружать в Excel.


 
YuRock ©   (2004-01-21 14:45) [2]

Что именно не работает? Почему Вы решили, что "не работает"?


 
jack128 ©   (2004-01-21 15:03) [3]


> Alibaba ©   (21.01.04 14:37)  
Я не разбирался детально, но думаю, что COM нужно инициализировать в каждом потоке. Попробуй перенести создание xlReport"a в Execute и самостоятельно вызови CoInitialize


 
Digitman ©   (2004-01-21 15:07) [4]

procedure TExcelThread.Execute;
begin
Coinitialize(nil);
try
try
  // создаем объект-отчет
  xlRepE:=TxlReport.Create(nil);
  try
    ... //настраиваем его св-ва (здесь недопустимо без синхронизации обращаться к объектам, созданным и управляемым в осн.потоке ! например, неким объектам AddThread и qr, явно созданным не в этом потоке !!)
    SaveExcel; //стартуем отчет
  finally
    xlRepE.Free; //уничтожаем
  end;
except
  on E: Exception do
   MessageText:="Ошибка";
end;
finally
Couninitialize;
end;
end;


 
Digitman ©   (2004-01-21 15:10) [5]

к тому же непонятно, на кой шут выполнять строчку

  MessageText:="Ошибка";

если объект-поток будет автоматически разрушен (см. FreeOnTerminate = true) по завершению нити, и прочитать это поле попросту не удастся


 
Alibaba ©   (2004-01-21 15:26) [6]


> Digitman ©   (21.01.04 15:10) [5]
> к тому же непонятно, на кой шут выполнять строчку
>
>   MessageText:="Ошибка";


В этом месте выполняется код по передаче сообщения об ошибке в главную программу.
Я все лишнее убрал, оставив только MessageText:="Ошибка";


 
Digitman ©   (2004-01-21 15:41) [7]


> Я все лишнее убрал, оставив только MessageText:="Ошибка"


зачем ? в каком месте программы ты намерен считывать это св-во ?


 
Alibaba ©   (2004-01-21 16:12) [8]

Digitman, ты работал с TxlReport?


 
Digitman ©   (2004-01-21 16:15) [9]


> Alibaba ©   (21.01.04 16:12) [8]


нет.
и не намерен.

а что ? сомнения в чем-то ?


 
jack128 ©   (2004-01-21 16:35) [10]


> Alibaba ©   (21.01.04 16:12) [8]

Я еще не работал, но он у меня уже есть и я просматривал демку :-)


 
Alibaba ©   (2004-01-21 18:31) [11]


> jack128 ©   (21.01.04 16:35) [10]
>
> > Alibaba ©   (21.01.04 16:12) [8]
>
> Я еще не работал, но он у меня уже есть и я просматривал
> демку :-)


Коллега! :)
Будем обмениваться опытом.
А то - "один в поле не воин" :)



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

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

Наверх




Память: 0.49 MB
Время: 0.021 c
1-1079460298
Shopot
2004-03-16 21:04
2004.04.04
Динамическая библьотека


3-1078766311
Anarki
2004-03-08 20:18
2004.04.04
Ошибка при динамической загрузке данных в таблицу ADO


3-1078903701
BAYES
2004-03-10 10:28
2004.04.04
ADO


3-1078820393
wizz
2004-03-09 11:19
2004.04.04
как передать в переменную результат запроса?


1-1079345571
Bes
2004-03-15 13:12
2004.04.04
насчет Plugin ом....