IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Type de class manquant alors qu'il existe


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut Type de class manquant alors qu'il existe
    Bonjour

    En préambule, il s'agit d'une application format BDE qui passe en Firedac.

    J'ai fait un un utilitaire qui modifie les dfm du projet. Le but est d'ajouter une clé primaire à chaque composant TTable en se basant sur le nom de la table et du composant, sachant que la clé existe dans les tables (même si ça n'entre pas en ligne de compte avec le problème que j'ai).
    Tout fonctionne bien et le code compile sans problème.

    Une fois fait, je passe l'utilitaire Refind.exe pour migrer le code vers les composants Firedac.
    Nouvelle compilation et après quelques réglages et ajustements, ça compile sans problème.

    Je lance le programme et sur quelques fenêtres, je reçois un message m'indiquant que le type TFDAutoIncField est inconnu.
    Ce type a bien été mis par refind pour les composants champs clé ajoutés par mon programme et le "uses" correspondant FireDAC.Comp.DataSet est bien présent.

    Je regarde dans l'inspecteur d'objet, ma clé primaire est bien là, avec le bon type TFDAutoIncField.

    Donc, à la compilation, tout fonctionne, mais à l'exécution, il ne trouve pas le type.

    Pour être sûr de moi, je supprime l'objet dans l'éditeur de champ, puis avec le menu "ajouter des champs", je choisis le champ que je viens d'enlever (donc le même champ) et je relance le programme. Et là, ça fonctionne. Du coup je me dis que j'ai du oublier quelque chose dans mon utilitaire alors je compare la version originale du DFM et DU PAS avec la version modifiée, mais il n'y a rien de plus que ce que j'y ai mis. C'est comme si le fait d'avoir ajouter le champ au composant table dans l'EDI avait fait un truc caché.

    Je sais que c'est un peu tordu mais si je comprenais le pourquoi du comment ça m'éviterait sans doute de tester les innombrables écrans du programme pour faire cette manip' fastidieuse.

  2. #2
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Effectivement chelou, truc caché ce n'est pas possible.

    Si pas de différence dans le fichier Pascal enregistré, tu as bien les bonnes unités.

    Peut-être l'ordre des champs dans le DFM même si ce serait encore plus étrange ?

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 102
    Par défaut
    Fais-un construire complet du projet pas un simple "compiler", faut le forcer à régénérer les ressources des DFM et un "truc caché" comme tu le dis dont j'ignore le mécanisme exacte mais pour chaque unit de form, il y a une sorte de RegisterClass implicite qui permet justement qu'il trouve les classes à instancier via le mécanisme de chargement de Flux DFM ... la FieldClassTable est bien rempli à moment donné pour lister les classes contenues dans la TForm (une liste différence par classe)

    Parfois, il faut même ouvrir chaque fenêtre, comme à l'époque de la transition de DFM binaire à DFM Texte.

    Citation Envoyé par pprem Voir le message
    Effectivement chelou, truc caché ce n'est pas possible.
    Même si cela remonte à D7, j'ai fait l'expérience de ça

    Par exemple, tu fais un GetClass/FindClass sur un TEdit qui n'existe pas dans la fenêtre, classe non trouvée (sauf avec un RegisterClass explicite)
    Ajout d'un TEdi dans la fenêtre, le FindClass fonctionne même sans RegisterClass
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Je n'avais pas pensé à ce registerclass mais refind ne fait que modifier le source (du moins je le pense). Alors pourquoi ça fonctionne pour toutes les autres classes et pas pour celle-ci ? Il n'y a que pour cette classe que ça pose problème.

    Sauf si refind fait autre chose mais pour ça il faudrait avoir plus de détails sur ce programme.

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Absolument Shai, pour retrouver la classe d'après son nom dans un DFM, Delphi utilise deux mécanismes, les propriétés publiées de la fiche, et les composants qui ont été enregistrés par RegisterClass()

    si la fiche publie un membre du type (ce qui est le cas quand on dépose un composant sur celle-ci), pas de problème, sinon il faut obligatoirement ajouter un RegisterClass() car même avec un Uses, le composant ne serait pas intégré dans l'application pour peu qu'il ne soit référencé nulle part (suppression automatique du code mort), et même s'il est référencé sur une autre fiche, les RTTI ne sont utilisées que sur la fiche en cours de chargement.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Ah !!! Donc, pour ne pas me casser la tête, est-ce que je peux compléter mon outil pour ajouter ce RegisterClass dans les fichiers de code ?
    Cela suffirait pour m'éviter de repasser partout ?

    euh, en fait, pas partout, juste dans une initialization :-)

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 102
    Par défaut
    Supprime toutes les DCU puis fait construire, c'est obligatoire lorsque l'on fait ce genre de bidouille
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    Bilan : J'ai "nettoyé" le code, construit au lieu de compiler, ça ne change rien.

    En faisant un RegisterClass dans la première form du projet, ça fonctionne.

    Problème résolu ! :-)

    Merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ma classe ne trouve pas de signal alors qu'il existe
    Par alpha_one_x86 dans le forum Qt
    Réponses: 2
    Dernier message: 11/04/2008, 19h49
  2. Trier un tableau de plusieurs type de classes.
    Par storm_2000 dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 14/01/2007, 15h50
  3. [VS 2005][C#] Type projet ApplicationWeb manquant
    Par bartoumi dans le forum Visual Studio
    Réponses: 11
    Dernier message: 14/12/2006, 14h43
  4. [.NET2.0][C#]Passage type de classe dans une fonction
    Par SLE dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/06/2006, 15h48
  5. [POI] Classe manquante
    Par Hoegaarden dans le forum Documents
    Réponses: 2
    Dernier message: 12/10/2005, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo