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 :

Rendre un paramètre facultatif


Sujet :

Delphi

  1. #1
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut Rendre un paramètre facultatif
    Salut tout le monde,

    J'ai une procédure qui renvoi trois valeurs en sortie, et je voudrais que l'utilisateur ne soit pas obligé a chaque fois de récupèrer les trois valeurs, comment puis je rendre un des paramètres de sortie facultatif ?

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Une solution est l'overload:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure MaFonction( var v1, v2, v3: Integer ); overload;
    begin
      // C'est la fonction principale de traitement
    end;
     
    procedure MaFonction( var v1, v2: Integer ); overload;
    var
      vDummy: Integer; // elle sert à rien
    begin
      MaFonction( v1, v2, vDumy );
    end;
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  3. #3
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Oui c 'est la solution que j'ai utilisé, mais je pensais qu'il y avait peut etre un moyen "plus simple"

  4. #4
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 381
    Points : 471
    Points
    471
    Par défaut
    Salut
    L'autre solution est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure MaFonction( var v1: Integer; v2: Integer = 0; v3: Integer = 0);
    Par contre, tu n'as pas de moyen de savoir si la fonction a été appelée sans les paramêtres ou si, par hasard, les paramêtres v2 et v3 ont la même valeur que celle par défaut.

    PS: en plus je ne suis pas sûr que ça marche avec des paramêtres en VAR

  5. #5
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Oui y'a plus simple : les valeurs... par défaut!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure MaFonction(v1, v2: Integer; v3: Integer = 0);
    begin
      //Ici les variables v1 et v2 sont obligatoires.  
      //Si l'utilisateur ne précise rien, v3 va être initialisée à 0
    end;

    [EDIT]
    rbh a été plus rapide
    -Slimjoe

  6. #6
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par rbh
    Par contre, tu n'as pas de moyen de savoir si la fonction a été appelée sans les paramêtres ou si, par hasard, les paramêtres v2 et v3 ont la même valeur que celle par défaut.
    Si l'objectif du programmeur est de savoir si un paramètre a été initialisé ou non, effectivement, c'est la surcharge (overload) qui devrait être utilisée.

    Citation Envoyé par rbh
    en plus je ne suis pas sûr que ça marche avec des paramêtres en VAR
    C'est certain que ça ne fonctionne pas avec des paramètre passés par référence parce que justement si l'utilisateur ne précise pas de paramètre, il ne passe pas de référence! Et si on veut vraiment avoir un paramètre par référence, je ne vois pas pour quelle raison il pourrait être optionel.

    -Slimjoe

  7. #7
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 152
    Points
    10 152
    Par défaut
    Pour des paramètres var, c'est en effet non seulement impossible (d'utiliser des par défaut) mais aussi abérant !

    En revanche, des paramètres de sorties s'utilisent avec out. Et là, bien qu'il soit toujours impossible d'utiliser des par défaut, c'est moins bizarre. Dans ce cas, la solution de l'overload est la meilleure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure MaProc(out Out1, Out2, Out3 : integer); overload;
    begin
      // Code la procédure
    end;
     
    procedure MaProc(out Out1, Out2 : integer); overload;
    var Out3 : integer;
    begin
      MaProc(Out1, Out2, Out3);
    end;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Autre
    Inscrit en
    Octobre 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Octobre 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous,

    En effectuant une recherche sur le site, je suis tombé par hasard sur cette question. Même si la réponse est (très) tardive, j'espère qu'elle pourra servir à d'autres personnes.

    Le plus élégant (je crois) serait d'écrire la procédure comme ceci :
    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
     
    procedure MaProcedure(Out1, Out2, Out3: PInteger);
    begin
      {...}
      if Out1 <> nil then Out1^ := {...}
      if Out2 <> nil then Out2^ := {...}
      if Out3 <> nil then Out3^ := {...}
    end;
     
    procedure Appel;
    var I1, I2, I3: Integer;
    begin
      //par exemple
      MaProcedure(@I1, nil, nil);
      //ou
      MaProcedure(@I1, @I2, nil);
      //ou
      MaProcedure(@I1, @I2, @I3);
     //et même, pourquoi pas,
      MaProcedure(nil, nil, @I3);
    end;

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 421
    Points : 24 776
    Points
    24 776
    Par défaut
    Même si je ne suis pas un partisan de l'exhumation de Post

    On peut pousser ta proposition qui très inspiré du C++ ( PInteger étant plus proche du Integer* que le var/out)
    Je le fais aussi de temps en temps pour omettre un paramètre de Sortie au lieu de passer par une variable Dummy

    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
     
    procedure MaProcedure(Out1: PInteger = nil; Out2: PInteger = nil; Out3: PInteger = nil);
    begin
      {...}
      if Out1 <> nil then Out1^ := {...}
      if Out2 <> nil then Out2^ := {...}
      if Out3 <> nil then Out3^ := {...}
    end;
     
    procedure Appel;
    var I1, I2, I3: Integer;
    begin
      //par exemple
      MaProcedure(@I1); // Encore mieux !
      //ou
      MaProcedure(@I1, @I2); // Encore mieux !
      //ou
      MaProcedure(@I1, @I2, @I3);
     //et même, pourquoi pas,
      MaProcedure(nil, nil, @I3);
    end;
    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

Discussions similaires

  1. [SQL/Access] Comment rendre un paramètre moins contraignant ?
    Par soforever dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/04/2007, 18h09
  2. [Web Service][SOAP] nusoap : définir paramètres facultatif
    Par Florent08800 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 11/01/2007, 17h21
  3. Paramètres facultatifs dans une fonction
    Par eric41 dans le forum Langage
    Réponses: 3
    Dernier message: 19/07/2006, 14h54
  4. [VB6]Paramètre facultatif pour un objet Command
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/04/2006, 02h40
  5. [Sybase] paramètre facultatif pour procédure stockée
    Par MashiMaro dans le forum Sybase
    Réponses: 6
    Dernier message: 15/12/2004, 16h14

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