![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.