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

Composants VCL Delphi Discussion :

Quesqu'il y a aprés la mort .. d'un composant.


Sujet :

Composants VCL Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut Quesqu'il y a aprés la mort .. d'un composant.
    Que ce passe-t-il aprés la libération du bouton, une erreur bien sûr !
    (sur BT.Caption:='gaga').
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure CreateDestroy;
    var BT:TButton;
    begin
      BT:=TButton.Create(Self);
      BT.Caption:='gogo';
      BT.Free;
      BT.Caption:='gaga';
      BT.Width:=120;
    end;
    et maintenant ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure CreateDestroy;
    var BT:TButton;
    begin
     BT:=TButton.Create(Self);
     BT.Caption:='gogo';
     BT.Free;
     BT:=nil;
     BT.Caption:='gaga';
    end;
    Rien !?

    et avec ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure CreateDestroy;
    var BT:TButton;
    begin
     BT:=TButton.Create(Self);
     BT.Caption:='gogo';
     BT.Free;
     BT:=nil;
     BT.Caption:='gaga';
     BT.Width:=120;
    end;
    Erreur ! (sur BT.Width et non sur BT.Caption)

    Quelle est l'explication ? un objet en générale n'existe pas aprés sa libération, comment peut-on lui affecter une valeur ?

  2. #2
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Il ne fait aucun doute que le comportement anormal et surprenant est l'absence d'erreur sur le Caption. Je crois avoir l'explication, mais je devrai vérifier tout à l'heure dans les sources de la VCL.

    En fait je pense que TControl.SetCaption ne fait strictement rien, c'est sa surcharge dans TButton (ou un de ses ascendants) qui fait qqch. Or l'appel à une méthode de nil ne provoque pas d'erreur en soi, c'est la lecture/modification de la mémoire (donc des champs) qui provoque l'erreur.

    Donc, lorsque BT vaut nil, sa table des méthodes virtuelles (VMT) est vide, et l'appel à SetCaption est redirigé vers TControl.SetCaption, qui ne provoque pas d'erreur. Alors que lorsqu'il n'est pas encore mis à nil, sa VMT, bien que libérée, pointe toujours sur TButton.SetCaption, qui provoque l'erreur. A moins que ce soit directement la lecture de la VMT libérée qui provoque l'erreur. La ça dépasse mes connaissances.

    En revanche, la méthode SetWidth de TControl, elle, fait déjà quelque chose, et modifie la mémoire. Ce qui aboutit inéluctablement, nil ou pas, à une erreur.

    Je viens préciser tout à l'heure dès que j'ai été vérifié mes dires
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    C'est vrai que la propiété "Caption" est déclaré par TButton alors que "Width" sont déclaré par TControl.
    Mais si j'ajoute (BT.Enable) qui est déclaré dans TButton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     procedure CreateDestroy;
    var BT:TButton;
    begin
     BT:=TButton.Create(Self);
     BT.Caption:='gogo';
     BT.Free;
     BT:=nil;
     BT.Caption:='gaga';
     BT.Enable:=false;
     BT.Width:=120;
    end;
    j'ai une une erreur sur (BT.Enable) mais toujours pas sur (BT.Caption).?

  4. #4
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    En fait non Caption n'est pas déclaré dans TButton, mais bien dans TControl, mais protégée.

    Bon, j'y étais plus ou moins. En fait il n'est nulle part question de méthode virtuelle, je me disais bien aussi que la VMT aurait dû poser un problème avec nil, et que donc mon explication ne tenait pas tout à fait.

    Mais il se passe ceci : l'affectation de Caption, appelle SetCaption, qui elle-même appelle GetTextBuf et SetTextBuf. Ces deux-là appellent la méthode Perform. Aucune de toutes ces méthodes n'accèdent, que ce soit en lecture ou en écriture, aux champs du contrôle.
    Et Perform, elle, pour le seul accès à un champ qu'elle fait, protège celui-ci par un Self <> nil.

    Donc j'avais raison sur le gros de l'explication : la modification de SetCaption ne fait accès à aucun champ lorsque l'objet vaut nil.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    En fait non Caption n'est pas déclaré dans TButton, mais bien dans TControl, mais protégée.
    Tout a fait vrai, mais le fait que TButton redéfinisse cette propriété à fait quelque chose que je n'arrive pas a suivre.
    Car avec (BT.Width:=120) la violation d'access est là a tout les coup malgré le (BT:=nil).

    Si sur l'affectation (BT.Caption:="gaga") ton explication tiens la route;
    Pouquoi le deuxieme access au composant (BT.Enable:=false) c'est une violation d'access ?

  6. #6
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par Bejaia-In
    Si sur l'affectation (BT.Caption:="gaga") ton explication tiens la route;
    Pouquoi le deuxieme access au composant (BT.Enable:=false) c'est une violation d'access ?
    Tout simplement parce que SetEnabled, au contraire de SetCaption, accède au champ FEnabled de TControl, que l'instance valle nil ou pas.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

Discussions similaires

  1. [11g] Temps mort après INSERT
    Par Rhodo33 dans le forum SQL
    Réponses: 1
    Dernier message: 31/10/2013, 13h53
  2. Réponses: 19
    Dernier message: 17/09/2013, 09h11
  3. Réponses: 13
    Dernier message: 10/09/2012, 12h22
  4. action APRES chargement complet ...
    Par PinGuy dans le forum Delphi
    Réponses: 7
    Dernier message: 06/07/2006, 17h16
  5. Dijstra est mort, vive Dijstra
    Par mickael.canevet dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 02/09/2002, 10h42

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