Pergunta

Nós temos uma aplicação Delphi 5, que é construído sem pacotes de tempo de execução, dlls ou recursos externos (ou seja, um único executável). quando instalá-lo em um PC clientes temos as seguintes mensagens de erro:

Class TListView não encontrado

ou

Class TImage não encontrado

Temos instalado em dezenas de PCs antes sem incidentes, mas esta última instalação é problemática.

O PC-alvo é uma nova instalação do Windows XP (Service Pack 3) com nenhum outro software instalado.

Não se queixam todas as classes no entanto apenas um ou dois. por exemplo TPanel / TForm / TEdit são todos OK.

Alguém pode pensar que está causando isso?

Editar

O exe no novo PC está em 30 ou mais outros PCs que eu saiba, que vão desde o Windows XP Sp1,2,3, Windows Vista e Windows Embedded. antigos e novos PCs foram instalados com uma versão antiga e, em seguida, atualizado com a versão mais recente. A única diferença é que a versão salto foi maior para o mais recente instalação.

Foi útil?

Solução

Re0sless,

Eu sugiro que você abrir e fechar todas as formas de sua aplicação e fazer uma nova compilação após isso. Se a memória me serve bem, que era a solução quando encontramos problemas semelhantes.

Você também pode dar uma olhada em DFM Verifique para aberto e perto toda a sua DFM é automaticamente e em CnPack para ajudá-lo a limpar a sua cláusula uses .

Saudações,
Lieven

Outras dicas

Este é normalmente um erro durante a transmissão de um .DFM. Normalmente, este erro ocorre com componentes TLabel porque muitas pessoas remover os campos TLabel do formulário ou quadro, a fim de reduzir a desordem e reduzir o tamanho instância do formulário. O comum e confundir erro que eles fazem, no entanto, é que, em seu excesso de zelo, eles removem todas referências TLabel. Que é quando as coisas ruins começam a acontecer. Deixe-me correr para baixo como o sistema de streaming localiza a classe de um componente.

Lembre-se que a referência de classe na .DFM é apenas uma seqüência . O sistema de transmissão tem de converter essa string em uma referência de classe (TComponentClass). Existem dois mecanismos que usa o sistema de streaming de fazer isso. O primeiro é muito simples e envolve uma lista global de referências de classe. Você pode chamar RegisterClass ou RegisterClasses fazer explicitamente o sistema de streaming ciente disso. A segunda é muito mais sutil e não muito bem conhecida; na verdade, é tudo parte da "magia" do Delphi :-). Quando o compilador constrói a forma, todos os campos que representam os componentes na forma são processadas e uma tabela interna é construído como parte do RTTI ou metadados para a forma / estrutura / si datamodule. Esta tabela contém uma lista de referências para todos os tipos de componentes individuais representados pelos campos de componentes. Portanto, mesmo se um componente é não na lista global, ele ainda pode ser encontrada através da leitura através deste compilador tabela gerada. Isso é o que o método Classes.TReader.GetFieldClass () faz.

Voltar ao meu exemplo TLabel, este problema é facilmente corrigido simplesmente garantindo que pelo menos um de um determinado tipo de componente tem um campo. Então, enquanto há pelo menos campo do tipo TLabel, todas os outros TLabels irá carregar apenas multa. Assim, no seu caso, certifique-se os campos TListView ou TImage não foram excluídos.

Eu acho que Lieven é definitivamente no caminho certo: classes base simples, não sendo encontrados durante a execução são um (vinculador) problema Delphi. Essa exceção é não causado pelo sistema operacional.

A minha experiência com problemas semelhantes: o vinculador gera um projeto com as unidades de forma errada dispostos
. Exemplo: uma unidade de forma está ligada em diante as unidades de base. Obrigando o projeto a completamente recompilação / vincular novamente em si deve fazer esta exceção ir embora.

Um simples [Rebuild All] provavelmente não suficiente. Você pode tentar recompilar sem otimizações.

Eu tentei reproduzir este erro, mas eu não tenho sido capaz de fazer. A Delphi compilador / vinculador é um dos melhores - a velocidade de compilação / velocidade de exes compilados -. Mas este bug é definitivamente um show rolha

Nota: Eu só tenho experimentado esse erro no D5. Tem mais alguém experimentado este erro com outro versões do Delphi?

Eu vi um problema semelhante devido a um erro de cópia de arquivo. Para tornar as coisas mais confusas, a falha foi num dispositivo de suporte intermediário. O problema foi resolvido por simplesmente copiando o arquivo da versão de compilação existente.

É provavelmente impossível confirmar agora, mas é bem possível que o problema foi 'resolvido'; não por causa da remoção de um item cláusula de usos unnecessay, mas porque também envolvia uma nova cópia do executável.

Eu tive o mesmo problema. Classe TCheckBox não encontrado. I geralmente editar conjunto grande de componentes através de .DFM de forma (por exemplo, mudar o nome grande quantidade de componente). Este erro vem quando eu mudar o nome de todos os CheckBox no meu formulário através dele .DFM.

Eu só cortar toda a caixa de seleção e colá-los novamente (arquivo Então .DFM é atualizado). O erro desapareceu.

A solução para todos os erros deste tipo "Classe XXX não encontrado" é simples. Abrir arquivo DFM de um formulário no editor de texto e manualmente remover a definição do objeto XXX nele.

Alterar o nome do formulário e salvar o .pas com outro nome. Alterar todas as referências para criar o novo nome da unidade se este é usado em outras unidades. Construir tudo. Com isso, o erro desapareceu.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top