2009-02-23 5 views
2

Nous avons une application Delphi 5, qui est construite sans paquets d'exécution, dll ou ressources externes (c'est-à-dire un seul exécutable). quand nous installons sur un PC clients, nous obtenons les messages d'erreur suivants:Delphi - Class TListView non trouvé

Classe TListView pas trouvé

ou

Classe TImage pas trouvé

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 aucun autre logiciel installé.

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

Quelqu'un peut-il penser à ce qui cause cela?

EDIT

L'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. Les anciens et les nouveaux PC ont été installés avec une ancienne version, puis mis à jour avec la version la plus récente. La seule différence est que le saut de version était plus élevé pour la dernière installation.

+0

@ Re0sless, supporter avec moi pendant que je joue le défenseur des diables, mais avez-vous réellement copié un exe d'une machine de travail à une machine non-travail et vérifié que cela n'a pas fonctionné? Si vous l'avez fait, nous pouvons poser ce chemin pour nous reposer. Malheureusement, en plus de nettoyer la clause d'utilisation, je suis à court de suggestions. –

+0

@ Re0sless - vous souciez-vous de partager quel était le dernier problème? –

+0

J'ai découvert qu'il y avait une unité dans la clause uses que nous n'utilisions plus, une fois qu'elle a été retirée de toutes les unités que nous utilisions, le problème est parti, je ne sais toujours pas pourquoi elle n'a pas été affichée les autres ordinateurs. – Re0sless

Répondre

4

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, c'était la solution lorsque nous avons rencontré des problèmes similaires.

Vous pouvez également jeter un oeil à DFM Check pour ouvrir et fermer tous vos fichiers automatiquement et au CnPack pour vous aider à nettoyer votre clause d'utilisation.

Cordialement,
Lieven

+0

Je viens d'essayer "DFM Check" et il peut revenir en arrière, donc j'essaierai d'ouvrir chaque formulaire pour essayer de le résoudre, y at-il une raison pour que je ne reçoive pas les erreurs sur d'autres PCs ? – Re0sless

+0

@ Re0sless. Ma première action serait alors de nettoyer toutes les clauses de mes utilisations avec CnPack et de vérifier que je ne suis pas par erreur en utilisant des paquets d'exécution. Je voudrais utiliser procmon et filtrer sur * .bpl pour vérifier si l'application essaie de charger un bpl. hth, Lieven –

+0

... aussi, avez-vous comparé l'exe que vous installez sur les nouvelles machines avec celui installé sur l'ancien? Avez-vous essayé de prendre l'exe d'une "vieille" machine et de le copier sur une nouvelle machine? –

1

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

Mon expérience avec des problèmes similaires: le lieur génère un projet avec les unités mal agencées.
Exemple: une unité de formulaire est liée avant les unités de base. Forcer le projet à se recompiler/se reconnecter complètement devrait faire disparaître cette exception.

Un simple [Rebuild All] ne suffira probablement pas. Vous pourriez essayer de recompiler sans optimisations.

J'ai essayé de reproduire cette erreur mais je n'ai pas pu. Le compilateur/éditeur de liens Delphi est l'un des meilleurs - compilation/vitesse des exes compilés - mais ce bug est définitivement un bouchon de spectacle.

Remarque: Je n'ai expérimenté que cette erreur dans D5.Est-ce que quelqu'un d'autre a rencontré cette erreur avec d'autres versions Delphi ?

9

Il s'agit généralement d'une erreur lors du streaming d'un fichier .DFM. Habituellement, cette erreur se produit avec les composants TLabel car de nombreuses personnes suppriment les champs TLabel du formulaire ou de l'image afin de réduire l'encombrement et réduire la taille d'instance du formulaire. L'erreur commune et confuse qu'ils font, cependant, est que dans leur excès de zèle, ils suppriment toutes les références TLabel. C'est alors que de mauvaises choses commencent à se produire. Laissez-moi 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 y a deux mécanismes que le système de streaming utilise pour faire cela. Le premier est très simple et implique une liste globale de références de classe. Vous pouvez appeler RegisterClass ou RegisterClasses pour en informer explicitement le système de streaming. La seconde est beaucoup plus subtile et pas très bien connue; en fait tout cela fait partie de la "magie" de Delphi :-). Lorsque le compilateur génère le formulaire, tous les champs qui représentent les composants sur le formulaire sont traités et une table interne est créée dans le cadre du RTTI ou des métadonnées pour le formulaire/frame/datamodule lui-même. Cette table contient une liste de références à tous les types de composants individuels représentés par les champs du composant. Donc, même si un composant est et non dans la liste globale, il peut toujours être trouvé en analysant cette table générée par le compilateur. C'est ce que fait la méthode Classes.TReader.GetFieldClass().

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

0

J'ai rencontré un problème similaire en raison d'une erreur de copie de fichier. Pour rendre les choses plus confuses, la faute était sur un périphérique multimédia intermédiaire. Le problème a été résolu simplement en recopiant le fichier à partir de la version existante.

Il est probablement impossible de confirmer maintenant, mais il est tout à fait possible que le problème ait été «résolu»; pas à cause de la suppression d'un élément de clause uses inutiles, mais parce qu'il impliquait également une nouvelle copie de l'exécutable.

0

J'ai eu le même problème. Classe TCheckBox introuvable. J'édite généralement un grand ensemble de composants via .DFM de formulaire (par exemple renommer une grande quantité de composant). Cette erreur survient lorsque je renommer tout CheckBox sur mon formulaire via .DFM.

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

0

La solution pour toutes les erreurs de ce type "Classe XXX non trouvée" est simple. Ouvrez le fichier DFM d'un formulaire dans l'éditeur de texte et supprimez manuellement la définition de l'objet XXX dans celui-ci.