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 :

Exception: EClassNotFound class TLabel


Sujet :

Langage Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut Exception: EClassNotFound class TLabel
    Bonjour à tous,

    j'ai une erreur bizarre qui apparait lors de l'exécution de mon programme, et je ne sais vraiment pas comment la résoudre. Elle apparaît à chaque lancement de mon appli, lors de la première instruction du constructeur.

    Exception EClassNotFound dans le module toto.exe à 00013126
    Class TLabel non trouvée.
    Je précise que tout fonctionnait parfaitement et que je n'ai pas modifié mon code. Je le poste quand même, on ne sait jamais, mais je soupçonne fortement delphi de s'être emmelé dans son propre code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
     
    unit UnitMainForm;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    const
      ARRAY_DEFAULT_SIZE = 5;
    type
      {Exception lancée lorsque l'on cherche à assigner des valeurs négatives aux
       coordonnées d'un point}
      TNegativeIntException=class(Exception)
        public
          constructor Create(); overload;
          constructor Create(Msg:String); overload;
          constructor Create(Value:Integer); overload;
          constructor Create(Msg:String; Value:Integer); overload;
      end;
     
      {Classe représentant un point}
      TPoint = class
        private
          fx, fy:Integer;
          procedure setX(x:Integer);
          procedure setY(y:Integer);
        public
          constructor Create(); overload;
          constructor Create(x:Integer); overload;
          constructor Create(x,y:Integer); overload;
          property x:Integer read fx write setX default 0;
          property y:Integer read fy write setY default 0;
          function AsString():String; virtual;
          destructor Destroy(); override;
      end;
     
      {Classe de la fiche principale}
      TMainForm = class(TForm)
        private
          Points:array of TPoint;
          procedure InitArray(MaxVal:Integer); overload;
          procedure InitArray(MaxVal, Size:Integer); overload;
          procedure ClearArray();
          procedure Refresh();
        public
          LabelPoints: TLabel;
          LabelUsableIndex: TLabel;
          LabelRange: TLabel;
          ButtonInitArray: TButton;
          ButtonClearArray: TButton;
          ButtonRefreshForm: TButton;
          EditChoosePoint: TEdit;
          LabelChoosePoint: TLabel;
          ButtonModifyPoint: TButton;
          ButtonInsert: TButton;
          constructor Create(AOwner:TComponent); override;
          procedure ButtonInitArrayClick(Sender: TObject);
          procedure ButtonRefreshFormClick(Sender: TObject);
          procedure ButtonClearArrayClick(Sender: TObject);
      end;
     
    var
      MainForm: TMainForm;
     
    implementation
    {$R *.dfm}
     
      {Implémentation de la classe TNegativeIntException}
      constructor TNegativeIntException.Create(); begin
          inherited Create('Vous avez introduit une valeur négative !');
      end;
     
      constructor TNegativeIntException.Create(Msg:String); begin
          inherited Create(Msg);
      end;
      constructor TNegativeIntException.Create(Value:Integer); begin
          inherited Create('Vous avez introduit une valeur négative ('+
                          IntToStr(Value)+') !');
      end;
      constructor TNegativeIntException.Create(Msg:String; Value:Integer); begin
          inherited Create(Msg+sLineBreak+'Valeur incorrecte: '+IntToStr(Value));
      end;
     
      {Implémentation de la classe TPoint}
      constructor TPoint.Create(); begin
          inherited Create();
          x := 0;
          y := 0;
      end;
      constructor TPoint.Create(x:Integer); begin
          inherited Create();
          Self.x := x;
          y := 0;
      end;
      constructor TPoint.Create(x,y:Integer); begin
          inherited Create();
          Self.x := x;
          Self.y := y;
      end;
      procedure TPoint.setX(x:Integer); begin
          if(x<0) then
            raise TNegativeIntException.Create(x);
          fx := x;
      end;
      procedure TPoint.setY(y:Integer); begin
          if(y<0) then
            raise TNegativeIntException.Create(y);
          fy := y;
      end;
      function TPoint.AsString():String; begin
          Result := 'TPoint: x='+IntToStr(x)+', y='+IntToStr(y);
      end;
      destructor TPoint.Destroy(); begin
          ShowMessage('TPoint.Destroy()');
          inherited; {TObject.Destroy();}
      end;
     
     
      {Implémentation de la classe TMainForm}
      constructor TMainForm.Create(AOwner:TComponent); begin
          inherited; // invoque TForm.Create(AOwner);
          ShowMessage('constructor TMainForm.Create(AOwner:TComponent)'); // <<=== ICI ===  //
          InitArray(10);
          Refresh();
      end;
     
      procedure TMainForm.InitArray(MaxVal:Integer); begin
          Self.InitArray(MaxVal, ARRAY_DEFAULT_SIZE);
      end;
     
      procedure TMainForm.InitArray(MaxVal, Size:Integer);
        var
          i:Integer;
        begin
          {Contrôle paramètres}
          if(MaxVal<=1)then
            raise TNegativeIntException.Create(MaxVal);
          if(Size<=0)then
            raise TNegativeIntException.Create(Size);
     
          SetLength(Points, Size);
     
          for i := Low(Points) to High(Points) do
            Points[i] := TPoint.Create(random(MaxVal), random(MaxVal));
     
          ShowMessage('Array inited: '+IntToStr(Size)+' new points between 0 and '
                      +IntToStr(MaxVal)+' created !');
      end;
     
      procedure TMainForm.ClearArray(); begin
          Finalize(Points);
          ShowMessage('Points cleared !');
      end;
     
      procedure TMainForm.Refresh();
        var
          i:Integer;
          s:String;
        begin
          if Low(Points) > High(Points) then
            s := '(aucun point)'
          else
            s := '('+IntToStr(Low(Points))+' - '+IntToStr(High(Points))+')';
     
          LabelRange.Caption := s;
     
          s := '';
     
          for i := Low(Points) to High(Points) do
            s := s + sLineBreak + IntToStr(i)+ '>> ' + Points[i].AsString();
     
          LabelPoints.Caption := s;
          ShowMessage('Form Refreshed !');
      end;
     
      procedure TMainForm.ButtonInitArrayClick(Sender: TObject); begin
          InitArray(100);
      end;
     
      procedure TMainForm.ButtonRefreshFormClick(Sender: TObject); begin
          Refresh();
      end;
     
      procedure TMainForm.ButtonClearArrayClick(Sender: TObject); begin
          ClearArray();
      end;
    end.
    Est-ce que quelqu'un a déjà rencontré le même problème ? Comment le résoudre ? Je n'ai pas envie de recommencer un nouveau projet à chaque fois !


    Merci d'avance
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  2. #2
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Bonjour,


    puisque tu crées les composants de ta form dynamiquement, tu va devoir mettre dans les uses, les unit dans lesquelles sont implémentées les composants que tu utilises (pour le TLabel, c'est StdCtrls).
    Lorqu'on utilise l'IDE, delphi les rajoute automatiquement lorsque tu lances par F9.

    en plus il va falloir les créer dans le OnCreate de la form et les libérer dans le OnCLose.

    petit point supplémentaire. TPoint éxiste déjà dans Delphi. il serait peut être préférable de renomer ton objet.

  3. #3
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    Citation Envoyé par bjl
    puisque tu crées les composants de ta form dynamiquement, tu va devoir mettre dans les uses, les unit dans lesquelles sont implémentées les composants que tu utilises (pour le TLabel, c'est StdCtrls).
    Lorqu'on utilise l'IDE, delphi les rajoute automatiquement lorsque tu lances par F9.
    si tu regardes le code, c'est déjà fait... mais ça marche quand même pas...

    Citation Envoyé par bjl
    en plus il va falloir les créer dans le OnCreate de la form et les libérer dans le OnCLose.
    :

    créer quoi ? les boutons et autres composants ?



    Citation Envoyé par bjl
    petit point supplémentaire. TPoint éxiste déjà dans Delphi. il serait peut être préférable de renomer ton objet.
    ok, j'ai remplacé par "TDot", mais cela n'a pas résolu le problème...
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    J'ai placé mon projet sur un serveur:

    http://www.hmcrecord.ch/ProjetPoints.zip (212Ko)

    si vous avez envie de tester chez vous.....
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    après test,

    1) ne pas overrider le Create de la form mais utiliser l'évènement OnCreate.

    2) remettre les déclarations de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
      TMainForm = class(TForm)
          LabelPoints: TLabel;
          LabelUsableIndex: TLabel;
          LabelRange: TLabel;
          ButtonInitArray: TButton;
          ButtonClearArray: TButton;
          ButtonRefreshForm: TButton;
          EditChoosePoint: TEdit;
          LabelChoosePoint: TLabel;
          ButtonModifyPoint: TButton;
          ButtonInsert: TButton;
          procedure ButtonInitArrayClick(Sender: TObject);
          procedure ButtonRefreshFormClick(Sender: TObject);
          procedure ButtonClearArrayClick(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        private
          Points:array of TDot;
          procedure InitArray(MaxVal:Integer); overload;
          procedure InitArray(MaxVal, Size:Integer); overload;
          procedure ClearArray();
          procedure Refresh();
        public
      end;

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par bjl
    après test,

    1) ne pas overrider le Create de la form mais utiliser l'évènement OnCreate.
    euh.........


    Citation Envoyé par bjl
    2) remettre les déclarations de cette manière
    ça, ça a suffit à règler le problème !

    mais maintenant, va falloir que l'on m'explique pourqoi !

    Le niveau de visibilité des variables et procédures déclarées sous la définition d'une classe est bien "public", non ? Pourquoi est-ce que le simple fait de les placer direct sous la classe (sans modificateur d'accès) a résolu mon problème ??!
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    d'après les tests que j'ai réalisés, il semblerait que cette zone soit "published" et non "public". Quelqu'un pourrait-il confirmer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    type
      TToto=class
          // ici on est "published" ?? //
     
        private
          // ...
        public
          // ...
      end;
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  8. #8
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Je dirais que c'est plus au niveau du compilateur.


    Quand on déclares les objets en public ou en published, je penses qu'il n'y a pas création correctes des objets.

    par exemple, les propriétés event des boutons n'étaient plus assignées.

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    685
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 685
    Points : 1 608
    Points
    1 608
    Par défaut
    Oui, il faut mettre le déclarations avant... Et effectivement, ce n'est pas public mais published :-)

    ne pas overrider le Create de la form mais utiliser l'évènement OnCreate.
    Pourquoi ? Il est légal, correct et fonctionnel de surcharger le constructeur de la fenêtre.
    "It's more fun to compute !"

  10. #10
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Ok, merci des précisions !!

    problème résolu

    Merci !
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2017
    Messages : 15
    Points : 0
    Points
    0
    Par défaut
    bonjour j'ai le meme probleme avec TEdit dit mois votre solution pour TLabel !
    merci d'avance .

  12. #12
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Citation Envoyé par elkader Voir le message
    bonjour j'ai le meme probleme avec TEdit dit mois votre solution pour TLabel !
    merci d'avance .
    Jamais vu ça !
    Tu réponds sur un post pour demander la solution alors qu'il te suffit de relire les réponses précédentes pour l'obtenir !!!
    Pour info, la réponse se trouve dans le 5ème message, celui de bjl.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par popo Voir le message
    Jamais vu ça !
    Tu réponds sur un post pour demander la solution alors qu'il te suffit de relire les réponses précédentes pour l'obtenir !!!
    Pour info, la réponse se trouve dans le 5ème message, celui de bjl.
    c'est pas faux, mais il manque peut-être l'explication.

    pour que Delphi puisse charger les classes depuis le DFM il a besoin de connaitre les classes dont il trouve le nom "TLabel" ou "TEdit"...pour cela il y a deux solutions

    1) un appel à RegisterComponents() a été fait pour enregistrer une référence au composant.

    2) un membre "published" de la fiche est de ce type.

    dans le second cas c'est en effet les RTTI qui vont permettre à Delphi de retrouver le composant, et ça ne fonctionne pas avec membres "public", et la visibilité par défaut étant published, Delphi place les déclarations en tout début du composant.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

Discussions similaires

  1. [Lazarus] Exception de class 'External: SIGSEGV'
    Par sebBastien dans le forum Lazarus
    Réponses: 8
    Dernier message: 17/09/2014, 02h33
  2. EClassNotFound Classe TButton non trouvée
    Par James_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/07/2009, 15h07
  3. exception java class terminal
    Par ginos dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 12/05/2008, 21h00
  4. Mapping Exception : component class not found
    Par lion13 dans le forum Hibernate
    Réponses: 2
    Dernier message: 06/05/2008, 14h30
  5. Réponses: 1
    Dernier message: 06/06/2007, 13h40

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