OleException quot;objeto não conectado ao servidorquot;

Delphi

24/04/2007

Olá!

O problema é o seguinte: minha aplicação gera relatórios em planilhas Excel, usando TExcelApplication e seus amigos da paleta Servers.

Como as consultas SQL e o preenchimento da planilha em si são demorados, a aplicação ficava ´congelada´ até que o status da operação mudasse, chamando o famoso Application.ProcessMessages, para então congelar novamente.

Então resolvi criar uma Thread separada para fazer as consultas e o preenchimento da planilha. Desta forma, a aplicação não congela e eu ainda ganho a possibilidade de interromper o processo de forma elegante, sem apelar para o ctrl + alt + del.

Criei a Thread, usei num programinha de teste e funcionou. Então fui usá-la no programa principal. Aparentemente estava tudo certo, até que me deparei com a mensagem de erro aí do título do tópico!

Debugando, descobri que ela acontecia no momento em que a aplicação tentava preencher a planilha Excel.

Alguém sabe o que pode ser isso?


Programaker

Programaker

Curtidas 0

Respostas

Cd.wagner.sena

Cd.wagner.sena

24/04/2007

vc se conecta com que tipo de recurso?

Outra coisa, vc esta tentando exportar quantos dados para o excel? numero de linhas?


GOSTEI 0
Programaker

Programaker

24/04/2007

Não entendi muito bem o que você quis dizer com ´recurso com o qual eu me conecto´. Estou usando os componentes TExcelApplication, TExcelWorkbook e TExcelWorksheet. Alguns desenvolvedores usam CreateOLEApplication e usam um Variant para referenciar o objeto resultante (eu pessoalmente não gosto muito desta abordagem, pois não permite explorar os objetos com code-completion)... seria isso?

Quanto à quantidade de dados, eles usam os resultados de várias consultas para preencher a planilha e o layout delas nem sempre é simples, apenas em forma de tabela. Este relatório que threadifiquei primeiro pode variar de 1 a 30-e-poucas linhas, usando entre 8 e 9 consultas, de acordo com o filtro informado.

Os outros são ainda mais complexos, tem um que usa 46 consultas diferentes. Mas isso nunca foi problema, até eu colocar o multithreading na jogada.


GOSTEI 0
Programaker

Programaker

24/04/2007

Mais uma informação: usando o método Synchronize, o erro desaparece. Só que ao mesmo tempo, a aplicação volta a ficar congelada.

Desse jeito, tendo que sincronizar com a main-thread da VCL, o sentido de ter uma thread separada se perde, porque eu queria justamente que a aplicação continuasse respondendo durante o processo de emissão.

Será que multithreading usando essas automações OLE é inviável? :(


GOSTEI 0
Massuda

Massuda

24/04/2007

Inclua, no início da sua procedure TThread.Execute, antes de ativar o Excel, o seguinte...
CoInitialize(nil);
... e no final inclua...
CoUninitialize;
...essas funções estão na unit Windows ou ActiveX.


GOSTEI 0
Programaker

Programaker

24/04/2007

Era isso mesmo! agora funcionou! Brigadão pela dica! :D


GOSTEI 0
POSTAR