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 :

[Object] Problèmes avec Assigned


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut [Object] Problèmes avec Assigned
    Je viens de me rendre compte que si on declare en local de procedure un objet, il est possible que le teste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If Assigned(AOject) Then ...
    Soit vrai meme si l'objet n'est pas cree.

    Je suppose que cela viens du fait que les variables locales ne sont pas initialisées a la compilation, et si le residu memoire pointe vers un objet classe, il est considéré comme valide !!

    C'est comme ca que si je teste plusieurs infos de classe de mon Object de type TObject, je me retrouve a avoir les infos d'un Button .....

    Ca implique une toute autre methdoe de conception ! (a savoir : Initialiser les var locales objet a nil !)

    quelqu'un peut confirmier ce probleme ? o eventuelement m'aider a trouver pkoi j'ai ce bug :/
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  2. #2
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Ce n'est pas un bug, et tu as clairement identifier les raisons. Tant que tu n'es pas initialisé, ton objet vaut n'importe quoi, même un autre objet.
    D'ailleurs, Assigned, se contente juste de faire un test sur nil.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    Oui c'est normal puisque la référence sur l'objet est alloué dans la pile et contient n'importe quoi.

  4. #4
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Oui jusque la je comprends bien ... et c'est pour ca que j'ai clairement identifier les problemes .... (merci les cours de compil )

    Parcontre la ou le bat blesse c'est que du coup toutes les procedures que j'ai cree depuis des lustres et pour lequelles j'ai passe du temps a les securisées evec des If Assigned ne servent a rien ?

    Il n'y a aucun moyen de permettre la verification de la bonne creation d'un objet en passant outre ces problemes ?

    Sinon je vous racontent pas le temps de debuggage necessaire avant de trouver la solution d'un tel bug .....
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  5. #5
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Si tes objets ne sont pas initialisés à nil, tes Assigned ne servent à rien.

    Le seul moyen, c'est soit de modifier ton code pour initialiser tous tes objets [à la création et à la suppression] ou alors, un système un peu lourd, mais qui fonctionne, c'est de remplacer tous tes Assigned par un gestionnaire d'exception. Tu tentes d'accéder à une propriété des objets, et si tu as une voliation d'accès, c'est qu'il n'était pas alloué. Comme tu attrapes l'exception, l'utilisateur n'aura pas l'erreur, mais tu pourras la logguer.

    Et oui, j'avais dit que c'était lourd.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  6. #6
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Bonne idee mais cela ne regle pas le probleme :
    1e il faut que cette methode soit specifique a la classe autrement dit il faut developper un "CustAssigned' specifique par classes. Vu que si il est possible que la var objet possede en residu memoire une adresse d'instance d'un objet valide, si la methode n'est pas specifique il est possible qu'elle retourne un succes.

    De meme, si la fonction CustAssigned est specifique la la classe, autrement dit renvoie faux si la methode specifique de la classe n'existe pas , cela n'empechera pas de renvoyer true si le hasard fait que l'instance pointee de maniere residuelle soit vers un objet de meme classe ....

    Je crois qu'il va faloir s'obliger a initialiser a nil tout objet cree en local ...

    Je trouve quand meme etrange que cela ne soit jamais mentionné ....
    en bientot 15 ans de progs, j'ai jamais vu qqun me dire "Attention ton objet n'est pas initialisé" comme si c'etait normal .....

    [Edit] Erf .. en plus l'initialisation dans la declaration locale ne marche pas .. faut passer par une affectation par ligne de code :/
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  7. #7
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Un petit truc me démange depuis tout à l'heure.

    Tu sais ..... normallement ....... quand tu arrives dans une méthode, tu ne devrais pas avoir à te poser la question si ton objet est créé ou pas, tu devrais le savoir ...... si la conception est bonne.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 298
    Points : 318
    Points
    318
    Par défaut
    C'est assez rare de tester l'existence d'un objet dans un procedule locale avant qu'il soit créé, c'est pour cela que l'erreur est peu fréquente, cela arrive surtout dans la gestion des exceptions sinon il y a de forte chance que cela soit un problème de conception.

  9. #9
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Assigned(AObject) then ...
    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if AObject is TMachin then ...
    reste la possibilité que tu évoquais d'un hasard faisant pointer sur une instance de TMachin !
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  10. #10
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    En fait vous avez raison.

    LE fait de tester l'assignation d'un objet dans uen de ses propres methodes releve d'un probleme de conception. mais en allant au dela, le phenomene rends impossible la "securisation" d'une procedure manipulant un parametre type objet.

    Genre je declate un TStringList, que je transmet a une procedure qui me le remplit.

    En interne je fais souvent des if not Assigned Then Exit.


    Sinon l'idee du MonObjet is TMachin est bien mais demeure encore specifique a la classe cad qu'il est impossible de generer une methode generique.
    Genre je manipule mes objets en tant que TObject mais en souhaitant quand meme verifier le fait que cet objet est bien créé.

    Quoi qu'il en soit, la seulle solution pour le moment est de garder en tete ce probleme et surveiller les creation d'objets locaux. J'aurais prefere une affectation dans la declaration genre Var O : TObject = nil;
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

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

Discussions similaires

  1. problème avec"assignment dimension mismatch"
    Par george216 dans le forum MATLAB
    Réponses: 1
    Dernier message: 12/04/2010, 18h24
  2. Problème avec "Assign" et avec le composant "Form"
    Par AlexTaz dans le forum Débuter
    Réponses: 6
    Dernier message: 04/06/2009, 15h57
  3. Problème avec assign
    Par habasque dans le forum R
    Réponses: 0
    Dernier message: 08/04/2009, 12h10
  4. [VBA E] problème avec la commande assignation à worksheets
    Par noir_desir dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/03/2007, 22h45
  5. Problème avec une classe... "without object"
    Par z980x dans le forum C++
    Réponses: 8
    Dernier message: 27/04/2006, 16h00

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