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 :

Passage de paramètre en référence


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 46
    Points : 21
    Points
    21
    Par défaut Passage de paramètre en référence
    Bonjour j'aimerais savoir comment il est possible de passer un paramètre en référence en delphi. De la même façon que l'on utilise "ref" en C#. Car j'aimerais traduire ceci en delphi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj = framescol.item(ref objName);
    "obj" et "objname" sont des Tobject
    "framescol" est de type IHTMLFramesCollection2

  2. #2
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Si "obj" et "objname" sont des Tobject, autrement dit des classes, de toute façon le paramètre est passé par référence, plus exactement son pointeur.

    En C#, tout est objet, les entiers, les chaînes de caractères, les nombres rééls, etc, bref les types de données.

    L'équivalent de ref en C# s'appelle var en Delphi par rapport aux types de données cités, mais ce raisonnement n'est valable pour les classes Delphi.

  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 448
    Points
    28 448
    Par défaut
    l'équivalent du "ref" est "var", mais il n'est indiqué que sur la méthode, pas devant le paramètre lors de l'appel de celle ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure parRef(var p: Integer);
    begin
      p := 2;
    end;
     
    var
      i : integer;
    begin
      i := 1;
      parRef(i);
     // maintenant i = 2
    end.

  4. #4
    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
    Citation Envoyé par chaplin Voir le message
    En C#, tout est objet, les entiers, les chaînes de caractères, les nombres rééls, etc, bref les types de données.
    Pas tout a fait. Les types primitifs ne sont pas des objets. Par contre tu as l'auto-boxing qui les convertis implicitement en objets lorsque tu as besoin de les manipuler comme tel.

    L'équivalent de ref en C# s'appelle var en Delphi par rapport aux types de données cités, mais ce raisonnement n'est valable pour les classes Delphi.
    C'est exactement la même chose entre Delphi et C#. Lorsque tu passes un objet en paramètre à une méthode, tu fournis "par valeur" une référence à l'instance.
    En revanche, tu peux très bien vouloir modifier cette référence, avoir un paramètre de sortie dans une méthode qui retourne une référence sur une instance que tu as créée dans la méthode. Dans ce cas, il te faut un ref (ou un out) en C# et un var en Delphi.

  5. #5
    Membre chevronné Avatar de chaplin
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 215
    Points : 1 819
    Points
    1 819
    Par défaut
    Il y a deux méthodes pour travailler sur des paramètres d'entrés d'une fonction, sur des types de données simples (integer, réel, string, etc):

    1) Passage par valeur

    La valeur de l'expression passée en paramètre est copiée dans une variable locale. C'est cette variable qui est utilisée pour faire les calculs dans la fonction appelée.
    Si l'expression passée en paramètre est une variable, son contenu est copié dans la variable locale. Aucune modification de la variable locale dans la fonction appelée ne modifie la variable passée en paramètre, parce que ces modifications ne s'appliquent qu'à une copie de cette dernière.

    2) Passage par variable

    La deuxième méthodes consiste à passer non plus la valeur des variables comme paramètre, mais à passer les variables elles-mêmes. Il n'y a donc plus de copie, plus de variable locale. Toute modification du paramètre dans la fonction appelée entraîne la modification de la variable passée en paramètre.

    D'où la phrase synthétique de Paul TOTH:
    l'équivalent du "ref" est "var", mais il n'est indiqué que sur la méthode, pas devant le paramètre lors de l'appel de celle ci.
    Car ces méthodes agissent à l'entrée de la procédure, et les expressions ref(C#) et var(Delphi) donnent l'information au compilateur sur la méthode a utilisée.

    Par valeur: ne rien mettre (méthode par défaut).
    Par réference: utiliser ref(C#)/var(Delphi).

    EDIT: si la fonction admet plusieurs variables en entrée, il faut informer le compilateur pour chaque variable, autrement dit, il est possible de mixer les deux techniques dans une fonction.

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Pour les objets, passer par référence - ref(C#)/var(Delphi) - n'a d'intéret que si la procédure appelée doit créer une nouvelle instance de l'objet qui va remplacer celle du programme appellant.

  7. #7
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    Citation Envoyé par Graffito
    Pour les objets, passer par référence - ref(C#)/var(Delphi) - n'a d'intéret que si la procédure appelée doit créer une nouvelle instance de l'objet qui va remplacer celle du programme appellant.
    Il faut savoir que les classes sont déjà des pointeurs meme avec une proterty en lecture seul ont peut modifier ces subclass

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/08/2007, 17h34
  2. Passage de paramètres par référence
    Par margagn dans le forum Framework .NET
    Réponses: 2
    Dernier message: 08/05/2007, 23h08
  3. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  4. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  5. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25

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