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 :

Explication de texte avec une variable globale [D7 mais pas que]


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2021
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Explication de texte avec une variable globale [D7 mais pas que]
    Bonjour,

    La question peut paraître bête mais j'aimerais être sûr.
    En D7, j'ai le bout de code suivant :

    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
    23
     
    unit xxx;
    interface
     
    uses  ...
     
    type
      Txxx = class(TObject)
      private
      public
        ...
      end;
     
    var
      Globalxxx: Txxx;
     
    implementation
     
    uses  ...
     
    begin // ou initialization
      Globalxxx := Txxx.Create;
    end.
    Cette variable Globalxxx sera t'elle « détruite » automatiquement lorsque l'unité ne sera plus utilisée ou devrais-je prévoir une clause finalization dans mon unité (à charge de libérer aussi les objets contenus. Dans mon cas, je n'ai que des string, integer et boolean) ?

    Avec un version récente de Delphi, faudrait-il pas mieux utiliser une class var et initialiser/détruire la variable dans un class constructor/class destructor ?

    Merci pour vos avis !

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Hello

    N'étant associée à aucune classe qui fait elle-même la suppression de ses dépendances, elle ne sera pas supprimée toute seul (sauf à la fermeture du programme).

    Un p'tit coup de finalisation fera le ménage, mais comme de toute façon c'est à la fermeture du programme, s'il n'y a pas de ressources spécifiques qu'elle alloue ou de fichier&co ouverts, tu peux éventuellement passer outre.

  3. #3
    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 : 54
    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 445
    Points
    28 445
    Par défaut
    on ne le répètera jamais assez (?)...sous Delphi les objets ne sont pas libérés automatiquement...mais leur libération peut être automatisée.

    TComponent possède un Owner qui le détruira automatiquement (s'il n'est pas "nil") lors de sa propre destruction
    TControl, s'il possède un Parent, sera détruit automatiquement par celui-ci lors de sa propre destruction
    (TControl peut avoir un Owner et un Parent, il ne sera détruit qu'une seule fois)

    TInterfacedObject est prévu pour s'autodétruire s'il est utilisé en tant qu'Interface et qu'il n'est plus référencé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function GetIntf: IMonInterface; // IMonInterface est une Interface
    begin
      Result := TMonInterface.Create; // TMonInterface est un TInterfacedObject qui implémente IMonInterface 
    end;
     
    procedure test;
    var
      i: IMonInterface;
    begin
      i := GetIntf;
    end;  // l'instance de TMonInterface est détruite car elle n'est plus référencée
    // en fait Delphi appelle la méthode Release de IInterface (après avoir utilisé AddRef)  et TInterfacedObject s'en sert pour s'autodétruire quand RefCount tombe à 0 (autant de Release que de AddRef)
    On peut aussi placer les objets dans un TObjectList pour lequel on appelle la méthode Clear() qui (par défaut) détruit tous les objets qu'il contient

    bref, à chaque fois, c'est un mécanisme bien particulier et délibéré qui va détruire l'objet, ce n'est jamais "magique" (pas de Garbage Collector)
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2021
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2021
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Paul, Patrick c'est bien ce qui me semblait en relisant le book de Marco.
    Mais sous D7 (presque la préhistoire), j'avais un doute.

    Je reviens aussi avec ma question qui suivez, avec un version récente de Delphi, faudrait-il pas mieux « se passer » de ce genre de variable et utiliser une class var puis initialiser/détruire la variable dans un class constructor/class destructor ?

  5. #5
    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 : 54
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par nomi69 Voir le message
    Paul, Patrick c'est bien ce qui me semblait en relisant le book de Marco.
    Mais sous D7 (presque la préhistoire), j'avais un doute.

    Je reviens aussi avec ma question qui suivez, avec un version récente de Delphi, faudrait-il pas mieux « se passer » de ce genre de variable et utiliser une class var puis initialiser/détruire la variable dans un class constructor/class destructor ?
    ah oui c'est cool ça, je n'y avais jamais pensé

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    type
      TAutoCreate = class
        class constructor Create;
        class destructor Destroy;
        procedure Hello;
      end;
     
    var
      Auto: TAutoCreate;
     
    class constructor TAutoCreate.Create;
    begin
      Auto := TAutoCreate.Create;
      ShowMessage('Auto Créé');
    end;
     
    class destructor TAutoCreate.Destroy;
    begin
      Auto.Free;
      ShowMessage('Auto Détruit');
    end;
     
    procedure TAutoCreate.Hello;
    begin
      ShowMessage('Hello');
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Auto.Hello;
    end;
    si on ne fait pas référence à Auto, il n'est pas crée et la classe n'existe probablement pas dans l'exe
    si on appelle Auto.Hello, le class constructor le crée automatiquement et en fin de programme il est détruit automatiquement

    EDIT: ce n'est pas évident dans mon message, le class constructeur n'est pas invoqué quand on appelle Auto.Hello, mais parcequ'on utilise la classe dans le code...il est créé en début de programme comme intialization/finalization, mais il bénéficie de la suppression de code si toute fois on ne l'utilise pas...alors que initialization implique la présence de la classe dans tous les cas
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. [CR XI] Affichage et reset d'une variable globale ne fonctionne pas
    Par totodof dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 06/08/2015, 04h17
  2. Couleur de texte avec une variable
    Par xaltar92 dans le forum Langage
    Réponses: 3
    Dernier message: 27/07/2011, 13h26
  3. problème avec une variable globale(SDL)
    Par rayman77 dans le forum C
    Réponses: 1
    Dernier message: 20/02/2009, 13h20
  4. mise à jour d'un treeCtrl avec une variable globale
    Par lajuve dans le forum wxPython
    Réponses: 6
    Dernier message: 20/10/2008, 09h45
  5. [VBA] Comment valoriser un champ texte avec une variable ?
    Par Jean_Benoit dans le forum Access
    Réponses: 3
    Dernier message: 25/12/2006, 15h55

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