Déclaration "Forward" pour les Types ?!? [Résolu]

cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 27 déc. 2008 à 10:57 - Dernière réponse : cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention
- 28 déc. 2008 à 11:11
Bonjour,

   Dans l'unité d'un composant graphique TGrille, je défini plusieurs Type intermédiaires qui sont utilisés
   dans le Type TGrille.
   Dans le principe des déclarations forward de procédures, j'ai voulu déclarer le Type TGrille avant
   les autres type.
   Mais j'obtiens l'erreur : Le Type TGrille n'est pas complètement défini. 
   Si je complète cette première déclaration par TGrille = class(TGraphicControl); L'erreur devient type redéclaré.

    Comment faire? Y a t-il une décaration typeforward pour les Types? 
   
Type
  TGrille = class; // ER : TGrille n'est pas complètement défini

  TColorElementGrille = class(TCollectionItem)
  private
    FGrille    : TGrille;
    ...
  end;
  TColorGrille  = class(TCollection)
  private
    FGrille : TGrille;
    ...
  end;
  TGrille = class(TGraphicControl)
  private
    ...
    FGrilleColor : TColorGrille;
    ...
  end;

Merci de votre éclairage!
Bien à vous
Jean_Jean
Afficher la suite 

7 réponses

Répondre au sujet
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 27 déc. 2008 à 16:06
+3
Utile
J'ai trouvé!
Mille milliards de Saperlipopettes! j'ai trouvé...
L'erreur vient du fait que j'ai mis le mot réservé Type une deuxième fois avant ma deuxième déclaration de TGrille (En rouge)! il faut l'enlever et ça compile Impeccable!
Type
  TGrille = class; // ER : TGrille n'est pas complètement défini


  TColorElementGrille = class(TCollectionItem)
  private
    FGrille    : TGrille;
  end;
  TColorGrille  = class(TCollection)
  private
    FGrille : TGrille;
  end;
<strike>Type
</strike>  TGrille = class(TGraphicControl)
  private
    FGrilleColor : TColorGrille;
  end;
Bien à vous
Jean_Jean
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Jean_Jean
Bacterius 3869 Messages postés samedi 22 décembre 2007Date d'inscription 3 juin 2016 Dernière intervention - 27 déc. 2008 à 13:55
0
Utile
Ben tu déclares deux fois TGrille, d'autant plus qu'à la première déclaration tu ne la fais hériter d'aucune classe ancêtre :

En tout cas, chez moi, j'ai copié dans mon Delphi 6 ton code, et ça marche parfaitement :

_________________________________

unit Unit2;

interface

uses Windows, Controls, Classes, Contnrs, SysUtils, Graphics, Messages;

Type
TGrille = class; // ER : TGrille n'est pas complètement défini

TColorElementGrille = class(TCollectionItem)
private
FGrille : TGrille;
end;
TColorGrille = class(TCollection)
private
FGrille : TGrille;
end;
TGrille = class(TGraphicControl)
private
FGrilleColor : TColorGrille;
end;

implementation

begin

end.

_______________________________


Je ne comprends pas ...
En général quand tu reçois cette erreur c'est que tu tentes d'appeller recursivement un type dans le même type. Regarde, ce code là bug :

type
TMonType=record
Str: String;
MonTypeEnRecursif: TMonType; // Le type TMonType n'est pas encore complètement défini.
MonInt: Integer;
end;


Donc, ton problème vient de ce qu'il y ait un appel récursif de TColorGrille à TGrille :

TColorGrille = class(TCollection)
private
FGrille : TGrille; // Appel de TGrille depuis TColorGrille
...
end;
TGrille = class(TGraphicControl)
private
...
FGrilleColor : TColorGrille; // Appel de TColorGrille depuis TGrille
...
end;

Voilà, il faudrait arranger cela ... mais je ne vois pas encore comment.

Cordialement, Bacterius !
Commenter la réponse de Bacterius
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 27 déc. 2008 à 15:36
0
Utile
Merci Bacterius pour tes reflexions.


Effectivement, si je m'en tiens au code que j'ai posté, il n'y a pas d'erreur à la compilation. La déclaration
 TGrille = class;donnée dans l'aide Delphi est donc valable.
Je pense donc que c'est dans mon code qu'il y a peut-être comme tu dis un appel récursif ou qlq chose qui ne lui plait pas. Je vais essayer d'isoler le code qui plante.

Bien à toi
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Utilisateur anonyme - 27 déc. 2008 à 20:07
0
Utile
Salut JeanJean,

La ligne TGrille = class; // ER : TGrille n'est pas complètement défini est optionnelle : tu n'en as pas besoin ici (Sauf si tu nous as pas tout donné )
Commenter la réponse de Utilisateur anonyme
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 27 déc. 2008 à 20:33
0
Utile
Salut Francky

Ben oui, je n'avais pas tout donné, t'imagines plus de 1000 lignes pour l'instant, je n'en suis qu'au début! TGrille fait appel à la création d'une TCollection : items etc...pour définir des paramètres couleur dans la Grille.
En fait, je passe par une TCollection, mais je suis pas sûr que ce soit la meilleure solution pour mon problème. Mon but étant de mémoriser dans le composant quelques paramètres de définition de grilles utilisables par l'utilisateur avec possibilités pour ce dernier d'en rajouter lui-même des personnalisées (couleurs essentiellement). Je voulais éviter de passer par un fichier!
 Qu'en penses-tu?

Jean_Jean
Commenter la réponse de cs_Jean_Jean
Utilisateur anonyme - 28 déc. 2008 à 10:49
0
Utile
Salut

Pourquoi ne pas utiliser un TObjectList à la place d'une collection ?
Commenter la réponse de Utilisateur anonyme
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 28 déc. 2008 à 11:11
0
Utile
Bj Francky!
Ah ha justement bonne question!
Oui, je me suis posé la question en particulier après avoir vu un comparatif ici qui ne pas permis encore de trancher. J'ai commencé une TCollection car il m'a semblé si mes souvenirs sont bons que le composant offrait un interface de manip plus complet.  
Bien à toi
Jean_Jean
Commenter la réponse de cs_Jean_Jean

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.