Problème Indentificateur 'self'

Résolu
jnmchl Messages postés 63 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 13 novembre 2009 - 26 août 2006 à 21:52
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 29 août 2006 à 04:31
Bonjour,
Excusez-moi si ce post apparaît deux fois, j'ai eu un plantage au moment de poster ma question.
Voilà donc : j'ai un projet ou dans la form principale je crée dynamiquement un objet personnel : TSegment qui dérive de TCustomControl.
Je déclare :
var TSeg : TSegment;
puis je crée :
TSeg := TSegment.Create(self);
et ça marche admirablement bien.
Pour plus de lisibilité de mon source, j'ai déplacé la procédure qui crée le TSegment dans une autre unité et là j'obtiens l'erreur : Identificateur non déclaré : 'self'

J'ai essayé plusieurs choses, déplacé mes déclaration, utilisé sender, aowner etc ... j'ai pas trouvé !
Seul TSeg := TSegment.Create(nil);
fonctionne partiellement : des méthodes ne fonctionnent pas !!!
Merci d'avance,

Jean-Michel

3 réponses

elguevel Messages postés 718 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 22 novembre 2016 3
27 août 2006 à 07:07
Dans ta form principal, "self" représentais l'objet TForm1 (si tu ne l'a pas renommé) alors que dans une autre unité où il n'y à pas d'objet, self ne représente rien !

<!-- blocPrincipal -->
 /\_/\
( o.o ) ~ ElGuevel ~
 > ^ <
3
jnmchl Messages postés 63 Date d'inscription dimanche 16 octobre 2005 Statut Membre Dernière intervention 13 novembre 2009 1
27 août 2006 à 10:06
Ok, il suffisait de faire :
TSeg := TSegment.Create(Form1);
(j'avais essayé TForm1)
Jean-Michel
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
29 août 2006 à 04:31
correction de l'explication d'elguevel :

Self correspond a l'instance de l'objet dans lequel il est declaré, en l'occurence quand on appel Self dans une fiche, Self fait reference a l'instance de l'objet TForm (Form1, Form2 ect...).

C'est pour cela que Self n'existe pas en dehors d'un objet.

Il faut egalement faire attention a la classe des objets que l'on declare dans les constructeurs. parfois ce sont de TObject, TComponent, TPersistent, TControl, TWinControl etc...
Il faut donc bien verifier que l'objet qu'on transmet est ou est derivé de cette derniere.

Ensuite il faut faire trés attention quand on transmets Nil a un constructeur, cela peut provoquer des erreurs et ne fonctionne la plupart du temps qu'avec des constructeur ne demandant pas de Owner plus haut que TObject, TPersistent et composants non visuel ou encore quand le Owner n'est pas utilisé implicitement dans la classe.

Le mieux etant aussi de lire le guide du concepteur de composants pour se familiariser avec les constructeurs et destructeurs, en sachant comment les objets sont construit on comprend mieux comment on doit s'en servir.

Si la classe TSegment est de toi, tu peu faire une verification sur le owner avec la fonction Assigned.
cela permet de verifier si owner est nil ou non.

<hr size="2" width="100%" />Croc (click me)
0
Rejoignez-nous