Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.023 c
9-1062426521
MeF88
2003-09-01 18:28
2004.04.04
Экспортер в x файлы для 3д Макс 4.0


14-1078491385
Ш-К
2004-03-05 15:56
2004.04.04
XML


7-1074689325
Ramario
2004-01-21 15:48
2004.04.04
Меню


1-1079343040
Jager
2004-03-15 12:30
2004.04.04
Как заставить программу запускаться при закгузке в защ. режиме


7-1076403470
Димос
2004-02-10 11:57
2004.04.04
Очистка корзины





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский