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 :

Référence à un objet créé dans un With


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2003
    Messages : 64
    Points : 54
    Points
    54
    Par défaut Référence à un objet créé dans un With
    Bonjour à tous,


    Petite question pas bloquante en soi mais m'intéressant pour la culture générale

    J'ai l'habitude de faire des truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      with TIBSQL.Create(self) do
      begin
        database := dm.db;
        ...
        ... 
      free;
      end;
    Mais est il possible de récupérer l'objet lui même créé sur la ligne With pour par exemple s'en servir comme paramètre dans un appel de fonction, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      with TIBSQL.Create(self) do
      begin
        database := dm.db;
        FonctionQuiVaBien(Mon_Objet_IBSQL_Ici)
        ...
        ... 
      free;
      end;
    Merci d'avance de vos lumières.

    Emmanuel.

    PS : Dur dur de faire une recherche sur le mot clef with dans le forum !

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    non, sauf a utiliser une méthode de l'objet qui retournerait Self, sinon tu es obligé de déclarer une variable que tu reprends dans ton WITH

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    type
     TMyIBSQL=class(TIBSQL)
     public
      function this:TMyIBSQL;
     end;
     
    function TMyIBSQL.this:TMyIBSQL;
    begin
     Result:=Self;
    end;
     
    begin
     with TMyIBSQL.Create(self) do
      begin
        database := dm.db;
        FonctionQuiVaBien(this)
        ...
        ... 
      free;
      end;
    end;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2003
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Merci de ta réponse,

    ça confirme un peu ce que j'imaginais.

    Je vais donc continuer à créer des variables pour les rares fois où j'en ai besoin, mais je retiens cette idée de fonction qui retourne self.

    Emmanuel.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Bonjour,

    Sans avoir recours à l'héritage (la méthode décrite par Paul), on peut étendre une classe en utilisant les "Class Helper".
    Il faut par contre disposer d'une version de Delphi au moins égale à 2005.

    Le but est ici d' étendre la class TObject avec la méthode "this" de la manière suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      thisClassHelper = class Helper for TObject
        function this:TObject;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    implementation
     
    function thisClassHelper.this: TObject;
    begin
      Result := Self;
    end;
    En revanche, il faudra la transtyper lors de son utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     with TMaClasse.Create do
      try
        TMaClasse(this).maMethode;
      finally
        Free;
      end;
    "This" est maintenant accessible à toutes les classes de ton projet étant donné que toute classe descent de TObject.

  5. #5
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Personnellement, je te conseillerais surtout de ne jamais utiliser WITH.

    Ca nuit à la lisibilité du code, surtout quand tu commences à en avoir deux ou trois imbriqués et que le with se trouve 50 lignes plus haut que celle que tu es en train de lire.

    En plus le débogueur est complètement perdu sur les with.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2003
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    @Pascal
    Merci de ces précisions, cette méthode à en effet l'air sympathique.
    Je regarderais surement de plus prés ces Class Helpers dont il est question lorsque (si) je changerai mon D6 pour plus récent.

    @Franck
    Il peut y avoir en effet de problèmes de lisibilité avec un usage immodéré.
    Mais c'est quand même bien pratique quelquefois
    Pour plus de lisibilité, une bonne indentation et un expert IDE comme Castalia font des merveilles cependant.

    Par contre ta remarque sur le compilateur qui se perdrait avec les with est-elle valable même si on ne les imbrique pas ?
    Si oui, j'aimerai bien avoir plus de précisions sur les problèmes potentiels.

    Merci.
    Emmanuel.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Ce n'est pas un problème de compilateur que soulevait Franck mais un problème de déboggeur, en effet en mode debug il est tout simplement impossible d'évaluer les champs ayant attrait à l'objet encapsulé par width ce qui peut s'avérer assez gênant.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2003
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2003
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Pardon, j'avais lu compilateur !
    Comme quoi on devrait relire plusieurs fois les messages.

    Oui, en effet, c'est ce coté gênant avec le with qui ne m'incite pas non plus à l'utiliser très souvent.

    Bon, en tout cas j'ai eu mes réponses concernant la première question. "Problème" Résolu.

    Emmanuel.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 12/09/2005, 10h09
  2. [Vb.net] Indexé un objet crée dans une boucle
    Par picpic dans le forum Windows Forms
    Réponses: 10
    Dernier message: 17/12/2003, 15h37
  3. Réponses: 3
    Dernier message: 09/02/2003, 02h09

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