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

Delphi Discussion :

variables globales et "Release"


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Par défaut variables globales et "Release"
    Bonjour à tous,
    Une petite question d'école :
    En cliquant sur un bouton de la form principale, je créé une form contenu dans une dll.
    Dans cette fiche, je déclare une variable globale que j'initialise à 0.
    Je travail avec cette variable qui s'incrémente, puis, en cliquant sur un bouton de cette form, je détruit celle-ci par "Release".
    Jusque là, tout me semble normal.
    Mais quand je recréé cette même form pour retravailler dedans, sans avoir quitté l'appli, il ne réinitialise pas la variable globale !
    bien que j'ai détruit la form avec "Release" !
    Donc là, je ne comprends plus, il ne réinialise pas les variables globales à la création de la fiche après que celle-ci ait été créée une première fois, même si on détruit cette fiche !
    Il faut donc, initialiser la variable dans l'évènement "OnCreate" de la fiche en question.
    Si cela paraît normal à quelqu'un, pourraît-il m'expliquer, s'il lui plaît ?
    Merc d'avance.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    C'est tout à fait normal!

    tu as l'air de vouloir une variable globale qui se comporterait comme une variable locale.

    Ce n'est pas le cas et dans aucun langage de programmation.

  3. #3
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Par défaut
    ben...
    pour moi, la portée d'une variable locale se limite à la proc ou la fonction dans laquelle elle est déclarée, et la portée d'une variable globale se limite à la fiche dans laquelle elle est déclarée.
    Par conséquent, à partir du moment où la fiche dans laquelle elle a été déclarée est détruite, il me semblerait logique que cette variable ne soit pas conservée en mémoire...

  4. #4
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Salut,

    Citation Envoyé par od.dev
    Il faut donc, initialiser la variable dans l'évènement "OnCreate" de la fiche en question.
    A priori, oui, puisqu'il faut bien initialiser ta variable au départ. Surtout que Delphi ne fixe pas de valeur initiale par défaut aux variables.

    A+.

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 182
    Par défaut portée variable globale
    Initialiser la variable dans le OnCreate donnera sans doute le comportement désiré. Mais attention tout de même: la mémoire allouée quand on déclare une variable globale dans une unité n'a absolument rien à voir avec la fiche qui est éventuellement déclarée dans cette unité. Et par conséquent il n'est pas "logique" de penser que la mémoire est libérée quand la fiche est libérée.

    Bruno
    mon blog - mon site web

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut Hiérachie var locale < var globales à portée de moins en moins localisée
    pour moi, la portée d'une variable locale se limite à la proc ou la fonction dans laquelle elle est déclarée, et la portée d'une variable globale se limite à la fiche dans laquelle elle est déclarée.
    Il ya du vrai et du faux là-dedans. En fait il y a une hiérachie dans les variables globales il y en a qui sont plus globales que d'autres en les classant depuis la plus locale jusqu'aux plus globales on a :

    - var déclarée dans une routine = var la plus locale;

    - var déclarée hors routines mais juste après "implementation et {$R *.DFM}" = var globale utilisable uniquement par toutes les routines situées après "implementation" on pourrait dire que c'est une variable globale à champ d'appel localisé,

    - var déclarée dans la zone comprise entre "implementation" et var Form1 : tForm1 = var qui est non seulement glogale pour l'ensemble des routines de l'unité associée à cette Form1 mais également globale pour toutes les unités dont le uses cite cette unité.(Exemple : si je place ici dans une unité caisse-à-outils la constante cls =#13#10 et que cette unité est déclarée dans tous les uses du projet je peux ensuite utiliser cls n'importe où dans mon projet, et c'est kif-kif que cls désigne une constante, une variable, un type, un object, une fonction ou une procédure)

    - ensuite dans la zone occupée par le type tForm1 : à l'exception d'une var déclarée dans la zone { Déclarations privées } tout est global pour l'ensemble des unités dont le uses cite l'unité de la Form1 ... et une var qui figure parmi les Déclarations privées est comme une variable locale d'usage réservé en principe à l'appel par les procédure déclarées dans le type tForm1.

    - et enfin il y a toutes les variables de plus en plus globales qui sont déclarées dans les unités qui s'affichent automatiquement (ou qu'on ajoute manuellement) dans les uses (à commencer par toutes les var spécifiques à Delphi).

    à partir du moment où la fiche dans laquelle elle [la var] a été déclarée est détruite, il me semblerait logique que cette variable ne soit pas conservée en mémoire
    La destruction d'une fiche ne provoque que la destruction : - des propriétés (du style top,left, etc de cette fiche et de ses composants), - et des var déclarées à l'intérieur du type tForm1 et qui concernent cette même fiche ... et comme la destruction d'une fiche ne signifie pas destruction de l'unité qui gère cette fiche toutes les autres variables globales sont conservées en mémoire y compris celles qu'on a éventuellement remis à zéro dans la routine qui comporte l'instruction de destruction de la fiche.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Inactif
    Homme Profil pro
    Analyste-programmeur Delphi
    Inscrit en
    Décembre 2003
    Messages
    490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-programmeur Delphi

    Informations forums :
    Inscription : Décembre 2003
    Messages : 490
    Par défaut
    Donc si j'ai bien compris :
    1) Les variables globales déclarées dans une fiche n'existent et ne sont, éventuellement, initialisées qu'à la création de la form définie par cette fiche.
    2) Elle ne disparaissent pas avec la destruction de la form, et ne sont pas réinitialisées lors d'une nouvelle construction dynamique de cette form.

    Force est de constater que :

    //
    private

    public

    end;

    var
    Form1: TForm1;
    NumComp: Word = 0;

    implementation
    //

    La variable NumComp est initialisée à 0 lors de la 1ère création dynamique de Form1.
    Elle est incrémentée lors de l'utilisation de Form1, et lors du Release de celle-ci, NumComp vaut 1.
    Lors de la 2e construction dynamique de Form1, NumComp vaut toujours 1.
    Il me faut donc inialiser NumComp à 0 dans FormCreate.
    Je ne trouve pas cela très logique, je pensais que tout était libéré après release.

    J'en prends acte et je vous remercie beaucoup pour vos explications.

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Avril 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 182
    Par défaut
    Dans l'exemple que vous donnez il n'y a aucune relation entre la création de Form1 et de NumComp: la premiere création de Form1 n'a aucune influence sur NumComp (sauf si vous manipulez NumComp dans le OnCreate de la fiche).

    NumComp va être initialisée à 0 lors de l'initialisation de l'unité (je pense), et restera à 0 tant que vous ne la manipulez pas depuis une méthode de la fiche, ou depuis une autre unité d'ailleurs vu que NumComp est déclarée dans l'interface de l'unité.

    Bruno
    mon blog - mon site web

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

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