Fórum EOleSyserror.Resolvido mas... #364644
05/10/2008
0
delhi 7 firebird1,5 Zeos
Uso há tempos com sucesso o codigo que segue para exportar para excel
no uses ´ComObj´
procedure TFCR64.SpeedButton10Click(Sender: TObject);
var
Excel : Variant;
Linha:Integer;
begin
DM2.ZTOpe76.first;
Excel := CreateOleObject(´Excel.Application´);
Excel.Visible :=True;
{Excel.Workbooks.Add;}
Excel.WorkBooks.Open(´C:\Arquivos de programas\EXCEL\GRAVA.xls´);
DM2.ZTOpe76.Open;
Linha:=27;
WHILE NOT DM2.ZTOpe6.Eof do Begin
Excel.WorkBooks[1].Sheets[1].Cells[Linha,2]:=DM2.ZTOpe76opera.Value;
Excel.WorkBooks[1].Sheets[1].Cells[Linha,8]:=DM2.ZTOpe76tem.Value;
DM2.ZTOpe76.Next;
Linha:=Linha+1;
end;
DM2.ZTOPE6.Refresh;
end;
Em uma aplicação de maior porte que tenho deu o seguinte erro
EOleSysError.... ´CoInitialize não foi chamado´
Resolvi com :
No uses adicionar:
Windows, ActiveX;
no on crate do form
CoInitialize(nil);
no on close do form
CoUnInitialize
Resolver resolveu mas não entendi por que do erro se não tenho nada de diferente no outro aplicativo somente que é bem menor.Alguém mais familiarizado com a questão poderia me explicar? Não gosto de aplicar uma solução que não entendo, embora ela funcione.
Grato
Rm
Curtir tópico
+ 0Posts
05/10/2008
Discorpio
A função ColInitialize é uma função que pertence a biblioteca COM da Microsoft, e ela faz chamada a essa biblioteca para instanciar um objeto COM para fazer a conexão com os aplicativos que utilizam o VBA (Visual Basic for Applications), tais como a maioria dos aplicativos do pacote do Office, essa biblioteca inicia numa Thread corrente.
O COM é uma extensão do OLE (Object Linked and Embeded - Vinculação e Incorporação de Objetos). Todos nós sabemos que OLE fazia chamada de uma aplicação Excel e também até do Word ou Access, para dentro de uma aplicação desenvolvida em VB, que mais tarde o Delphi também o adotou. O OLE permite copiar dados de um aplicativo servidor (No caso o Excel) para um aplicativo cliente (No caso o Delphi), com informações a respeito do servidor ou uma referência às informações armazenadas no registro do Windows. Os dados brutos podem ser copiados com o vínculo (Incorporação do Objeto), ou mantido no arquivo Original (Vinculação do Objeto). Agora, os documentos OLE são chamados de documentos ativos.
A Microsoft atualizou o OLE para OLE2 e adicionou novos recursos como a automação OLE e controles OLE. O passo seguinte foi construir o Shell do Windows 95 usando tecnologias e interface OLE, e em seguida renomear os controles OLE (anteriormente conhecidos também como OCX), para controles ActiveX, mudando para permitir a existência de controles leves, convenientes para distribuição através da Internet. Por algum tempo, a Microsoft promoveu os controles ActiveX como convenientes para Internet, mas a idéia não foi bem aceita pela comunidade de desenvolvedores, não como ´convenientes´ para Internet.
Como essa tecnologia foi extendida e se tornou cada vez mais importante para a plataforma Windows, a Microsoft mudou o nome para OLE e depois para COM, e finalmente para o COM+, para o Windows 2000. Essas mudanças de nome estão parcialmente relacionadas as mudanças tecnológicas e foram promovidas em grande parte por questões de marketing.
Mais o que é o COM ?
Basicamente o COM ou Component Object Model - Modelo de Objetos Componentes, é uma tecnologia que define uma maneira padrão para um módulo cliente e um módulo servidor se comunicarem por meio de uma interface específica. Aqui, o módulo indica um aplicativo ou uma biblioteca (DLL) os dois módulos podem ser executados no mesmo computador ou em máquinas diferentes conectadas por uma rede.
Podemos dizer que basicamente foi assim que também surgiu o ADO (ActiveX Data Objects - Objetos de Dados ActiveX), através dos recurso OLE DB, pois se as novas técnologias foram implementadas no controle ActiveX para fazer aplicativo servidor e cliente se comunicarem através da Rede, foi mais fácil então criar esse componente para conectar os bancos de dados SQL Server e o Access em rede, substituindo os antigos componentes DAO (Data Access Object - Objeto de Acesso a Dados). A nova tecnologia ADO implementou o recurso dos RecordSets, cursor contendo dados dispostos em linha e coluna, como se fosse um planilha, de fácil navegação pela rede, e que era armazenado no cache de disco da máquina cliente, praticamente um cópia da tabela no banco de dados. Mas tarde este recurso também foi renomeado para DataSet, onde se inplementou novos recursos na cópia da tabela, incluindo o seu MetaData.
Gostei + 0
05/10/2008
Rm
Mas fiquei com a dúvida do porque este erro ser gerado apenas neste apicativo que menciono enquanto em qualquer outro que tenha ou faça (fiz um de teste) funciona sem a necessidade de declarar na uses ActiveX; no on create do form CoInitialize(nil); no on close do form CoUnInitialize.
Gostei + 0
06/10/2008
Discorpio
Isto só pode ter uma explicação, aliás duas.
1º) Diferentes versões do Office instalado em cada máquina. Frequentemente a Microsoft vem atualizando os componentes para acesso a dados do pacote Office com patches de componentes MDAC (Microsoft Data Access Component), isto inclui também o COM. Possa ser que na máquina que só funciona com a biblioteca ActiveX e a chamada de ColInitialize, esteja instalada a nova versão do Office 2007. A biblioteca ComObj do Delphi neste caso, deve está desatualizada.
2º) Será que nesta máquina que só funciona com ColInitialize e a biblioteca ActiveX declarada em Uses, não esteja faltando outra biblioteca ? Exatamente a ComObj ? Isto é só uma hipótese.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)