Problème Indentificateur 'self' [Résolu]

Signaler
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
-
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
-
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

Messages postés
718
Date d'inscription
jeudi 19 décembre 2002
Statut
Membre
Dernière intervention
22 novembre 2016
3
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 ~
 > ^ <
Messages postés
63
Date d'inscription
dimanche 16 octobre 2005
Statut
Membre
Dernière intervention
13 novembre 2009
1
Ok, il suffisait de faire :
TSeg := TSegment.Create(Form1);
(j'avais essayé TForm1)
Jean-Michel
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
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)