Question

Nous avons une application Delphi 5, qui est construit sans packages d'exécution, ou dll ressources externes (à savoir un seul exécutables). quand nous installons sur un PC clients, nous obtenons les messages d'erreur suivants:

  

Classe TListView not found

ou

  

TImage de classe introuvable

Nous avons installé sur des dizaines de PC avant sans incident, mais cette dernière installation est problématique.

Le PC cible est une nouvelle installation de Windows XP (Service Pack 3) sans autre logiciel installé.

Il ne se plaint pas de toutes les classes mais seulement un ou deux. par exemple TPanel / TForm / TEdit sont tous OK.

Quelqu'un peut-il penser ce qui est la cause?

EDIT

Le exe sur le nouveau PC est sur quelque 30 autres PC que je connais, allant de Windows XP Sp1,2,3, Windows Vista et Windows Embedded. anciens et nouveaux ordinateurs ont été installés avec une ancienne version, puis mis à jour avec la dernière version. La seule différence est que le saut de version était plus élevée pour la dernière installation.

Était-ce utile?

La solution

Re0sless,

Je vous suggère d'ouvrir et de fermer toutes les formes de votre application et compilons frais après. Si la mémoire me sert bien, ce fut la solution quand nous avons rencontré des problèmes similaires.

Vous pouvez également jeter un oeil à DFM Vérifier pour ouvrir et fermez tous vos et de DFM automatiquement à CnPack pour vous aider à nettoyer votre clause uses .

Cordialement,
Lieven

Autres conseils

Ceci est généralement une erreur lors de la diffusion en continu d'un .DFM. En général, cette erreur se produit avec des composants TLabel parce que beaucoup de gens supprimer les champs TLabel de la forme ou du cadre afin de réduire l'encombrement et de réduire la taille de l'instance du formulaire. L'erreur commune et source de confusion qu'ils font, cependant, est que dans leur excès de zèle, ils enlèvent tous Références TLabel. C'est quand les mauvaises choses commencent à se produire. Permettez-moi de courir vers le bas comment le système de streaming localise la classe d'un composant.

Rappelez-vous que la référence de classe dans le .DFM est juste une chaîne . Le système de diffusion en continu doit convertir cette chaîne en une référence de classe (TComponentClass). Il existe deux mécanismes que le système de streaming utilise pour ce faire. Le premier est très simple et implique une liste globale des références de classe. Vous pouvez appeler RegisterClass ou RegisterClasses faire explicitement le système de diffusion en continu au courant. Le second est beaucoup plus subtile et pas très bien connu; en fait, il fait partie de la « magie » de Delphes :-). Lorsque le compilateur crée le formulaire, tous les champs qui représentent les composants de la fiche sont traitées et une table interne est construit dans le cadre du RTTI ou des métadonnées pour la forme / structure / datamodule lui-même. Ce tableau contient une liste de références à tous les types de composants individuels représentés par les champs de composants. Ainsi, même si un composant est pas dans la liste globale, il se trouve encore en balayant ce compilateur table générée. C'est ce que la méthode Classes.TReader.GetFieldClass () fait.

Retour à mon exemple TLabel, ce problème est facilement corrigé en assurant simplement que au moins un d'un type de composant donné a un champ. Donc, tant qu'il ya au moins champ de type TLabel, tous les autres TLabels se chargeront très bien. Donc, dans votre cas, assurez-vous que le TListView ou les champs de TImage ont pas été supprimés.

Je pense que Lieven est certainement sur la bonne voie: les classes simples de base ne sont pas trouvés lors de l'exécution sont un problème Delphi (linker). Cette exception est pas causée par le système d'exploitation.

Mon expérience avec des problèmes similaires: l'éditeur de liens génère un projet avec les unités mal disposées
. Exemple: une unité de forme est relié en avant que les unités de base. Forcer le projet de recompiler complètement / réassocier lui-même devrait faire cette exception disparaître.

Un simple [Régénérer tout] ne sera probablement pas suffisant. Vous pouvez essayer de recompiler sans optimisations.

J'ai essayé de reproduire cette erreur mais je ne l'ai pas pu. Le compilateur / éditeur de liens Delphi est l'un des meilleurs - vitesse de compilation / vitesse de exes compilé -. Mais ce bug est sans aucun doute un bouchon spectacle

  

Note: Je n'ai connu   cette erreur dans D5. Quelqu'un at-il d'autre   connu cette erreur avec d'autres   versions Delphi?

Je l'ai vu un problème similaire en raison d'une erreur de copie de fichier. Pour rendre les choses plus confuses, la faute était sur un dispositif média intermédiaire. Le problème a été résolu par recopie simplement le fichier à partir de la version de version existante.

Il est probablement impossible de confirmer maintenant, mais il est tout à fait possible que le problème était « résolu »; pas à cause de la suppression d'un unnecessay utilise un objet de la clause, mais parce qu'il a également impliqué une nouvelle copie de l'exécutable.

J'ai eu le même problème. Classe TCheckBox introuvable. J'édite habituellement un grand ensemble de composants par .DFM de la forme (par exemple renommer grande quantité du composant). Cette erreur vient quand je renomme tous CheckBox sur ma forme à travers elle .DFM.

Je viens de couper tout la case à cocher et les coller à nouveau (donc le fichier .DFM est actualisé). L'erreur a disparu.

La solution pour toutes les erreurs de ce type « classe XXX introuvable » est simple. Ouvrir le fichier DFM d'une forme dans l'éditeur de texte et supprimer la définition manualy de l'objet XXX en elle.

Modifier le nom du formulaire et enregistrez-les .pas avec un autre nom. Modifiez toutes les références pour créer le nouveau nom de l'unité si elle est utilisée dans d'autres unités. Construire tous. Avec cette l'erreur a disparu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top