Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Thread, Excel [D6, Win2k]


Alibaba ©   (2004-01-21 14:37:00) 

Привет.
В потоке пытаюсь работать с 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 18:31:00) [1]


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


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


jack128   (2004-01-21 16:35:00) [2]


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

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


Digitman   (2004-01-21 16:15:00) [3]


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


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

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


Alibaba   (2004-01-21 16:12:00) [4]

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


Digitman   (2004-01-21 15:41:00) [5]


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


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


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


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


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


Digitman   (2004-01-21 15:10:00) [7]

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

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

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


Digitman   (2004-01-21 15:07:00) [8]

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;


jack128   (2004-01-21 15:03:00) [9]


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


YuRock   (2004-01-21 14:45:00) [10]

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


Alibaba   (2004-01-21 14:41:00) [11]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо