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 :

petit question de debutant sur les compossant cree dynamiquement


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 12
    Points
    12
    Par défaut petit question de debutant sur les compossant cree dynamiquement
    Bonsoir,
    Je me demandai pourquoi quand on crée un composant de manière dynamique on a pas besoin de « var » mais pour le supprimer il en faut un ??
    Je m’explique :

    Si j’ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    montype : array[0..5] of Tedit ;
     
    Procedure cree(tableau :montype)
    var i:integer;
    Begin
    for i:=0 to 5 do
        tableau[I]:=Tedit.creat(tableau[I]);
    end;
    la sa fonctionne

    mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure sup(tableau :montype)
    var i:integer;
    Begin
    for i:=0 to 5 do
        tableau[I].free;
    end;
    sa fonctionne pas

    il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure sup(var tableau :montype)
    var i:integer;
    Begin
    for i:=0 to 5 do
        tableau[I].free;
    end;
    pour que sa fonctionne;

    merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Mettre var devant un parametre permet de dire que le parametre doit etre modifié par la procedure. Exemple

    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
    procedure MyProc (i : integer);
    begin
      inc(i);
    end;
     
    procedure MyProcV (var i : integer);
    begin
      inc(i);
    end;
     
    ...
     
    i:=1;
    MyProc(i);
    ShowMessage(IntToStr(i));       //affiche 1
    MyProcV(i);
    ShowMessage(IntToStr(i));       //affiche 2
    Donc si tu veux supprimer ton tableau, tu dois donc le modifier, donc le var est nécéssaire ^^

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 674
    Points : 5 259
    Points
    5 259
    Par défaut
    Par contre essaie de faire toujours en sorte que la procédure qui créé un objet se charge elle même de sa libération.

    Ca évite pas mal d'erreur !

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    oui je c que var permet de de dire que le paramètre doit être modifier. Mais je je veux pas supprimer mon tableau juste les éléments à l'intérieur et quand je les crées je le modifie mais le var n'est pas nécessaire

    je peut pas faire la libération dans la même procédure que la création car je crée des Tedit et c'est quand on appuis sur entrer du dernière Tedit qu'une action se produit puis la libération des TEdit

  5. #5
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    montype : array[0..5] of Tedit ;
     
    Procedure cree(tableau :montype)
    var i:integer;
    Begin
    for i:=0 to 5 do
        tableau[I]:=Tedit.creat(tableau[I]);
    end;
    apres l'appel de ta procedure, tableau est inchangé (il contient la meme chose qu'avant l'appel), car il n'est pas var


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure sup(tableau :montype)
    var i:integer;
    Begin
    for i:=0 to 5 do
        tableau[I].free;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Procedure sup(var tableau :montype)
    var i:integer;
    Begin
    for i:=0 to 5 do
        tableau[I].free;
    end;
    Si tu as mis en var le tableau dans "creer", alors ton tableau est correcte, et les 2 procedures fonctionnent. En effet, tu ne modifie pas les valeurs contenues dans ton tableau a l'interieur de ta procedure sup (un free ne modifie pas le pointeur). par contre, si tu fais un freeAndNil, il faut que tableau soit en var dans sup pour que les pointeurs qu'il contient puissent etre reinitialisés.
    En tout cas, il n'y a aucune raison pour que l'un des 2 sup marche et pas l'autre !

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    C'est horrible !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[I]:=Tedit.create(tableau[I]);
    Que contient Tableau[I] avant l'affectation ?
    0 si tu as fait un ZeroMemroy mais sinon, une déclaration en variable locale à de grand risque de fournir un tableau avec un contenu aléatoire en fonction du contenu de la mémoire !
    Si c'est un membre d'un objet, le tableau est initializé à zéro !
    C'est TRES risqué !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[I]:=Tedit.create(nil);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[I]:=Tedit.create(self);
    dans la seconde forme, self se changera de la libération, même pas besoin de faire les Free explicite !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Dans les deux cas, var est obligatoire pour modifier un tableau statique. Sans var, c'est la copie local (à la fonction) du tableau qui est modifiée.

    S'il s'agissait d'un tableau dynamique, var ne serait pas nécessaire puisque le paramètre ne serait plus le tableau, mais un pointeur sur le tableau.

Discussions similaires

  1. [Python 2.X] Petite question d'optimisation sur les tableaux
    Par Sve@r dans le forum Général Python
    Réponses: 17
    Dernier message: 01/02/2015, 22h57
  2. petite question toute simple sur les boucles
    Par elmcherqui dans le forum C++
    Réponses: 7
    Dernier message: 21/05/2008, 10h15
  3. Petite question de débutant sur les lumières
    Par Clad3 dans le forum OpenGL
    Réponses: 12
    Dernier message: 05/11/2007, 22h22
  4. Question de debutant sur les Imports
    Par gibea00 dans le forum Framework .NET
    Réponses: 1
    Dernier message: 04/12/2006, 15h33
  5. question de debutant sur les applets et la securité
    Par Invité dans le forum Applets
    Réponses: 2
    Dernier message: 27/01/2006, 14h10

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