Форум: "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