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 :

Delphi X Un paramètre implicite / optionnel peut il être bypassé ?


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut Delphi X Un paramètre implicite / optionnel peut il être bypassé ?
    Bonjour à tous,

    Oui je me rends compte que le titre du post n'est pas très parlant alors je vais développer Tout le monde sait qu'un paramètre défini comme implicite ou optionnel dans la déclaration d'une fonction ou procédure peut être omis lors d'un appel... je donne comme exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur = 0; const UneChaine: string = 'test');
    var locale1 : integer; 
         ChaineX : string;
    begin
      blablabla...   
    end;
    Bon... Si je n'ai besoin dans la procédure MachinChose que des paramètres GrosseValeur, et UneChaine, j'aimerais avoir la possibilité d'appeler cette procédure en ne lui fournissant bien entendu les paramètres obligatoires et seulement l'un des paramètres optionnels QUELQUE QUE SOIT son ordre d'apparition dans la liste.... En gros je voudrais pouvoir appeler cette procédure sans être obligé de fournir le paramètre EncoreUneValeur (qui se trouve être le premier des optionnels). Un appel du genre :

    MachinChose(158476, 54293,, 'MaChaine');

    Bien entendu, j'ai déjà testé cette syntaxe et ça ne passe pas. Et dans ma petite logique, je me dis qu'il doit bien y avoir un moyen d'appeler une telle procédure ou fonction sans avoir explicitement besoin de citer un paramètre optionnel puisque par définition il est optionnel avec une valeur par défaut !

    Je pose donc la question aux pros du forum:

    Sous Delphi, peut on appeler une procedure ou fonction dotée de paramètres implicites en omettant un des paramètres optionnels même si ce dernier se trouve au milieu de la liste (des paramètres optionnels bien entendu) ?

    Merci d'avance pour vos réponses.

    Bonne continuation et A+++

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Utilise overload ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut
    Salut GoustiFruit,

    Oui bien sur mais c'est une solution qui t'oblige à définir une nouvelle routine... très proche de la première. J'aimerais justement éviter de rajouter des lignes de code qui font sensiblement les mêmes choses mais plutôt essayer d'optimiser des tâches avec un minimum de lignes de code.

    Mais bon comme effectivement cette solution existe et qu'apparemment les concepteurs de Delphi ont oublié la possibilité de rendre optionnel un paramètre optionnel on va faire avec.

    Merci bien et A+++

  4. #4
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 662
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 662
    Points : 6 943
    Points
    6 943
    Par défaut
    Citation Envoyé par zano972 Voir le message
    Oui bien sur mais c'est une solution qui t'oblige à définir une nouvelle routine... très proche de la première. J'aimerais justement éviter de rajouter des lignes de code qui font sensiblement les mêmes choses
    Justement, overload permet de définir une autre procédure avec des paramètres différents, mais qui ferait appel à la première procédure au final, non ?
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (11.6 - 14.6)

  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
    pour etoffer la réponse de Lung :
    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
     
    interface
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur: integer); overload;
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const UneChaine: string); overload;
     
    implementation
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur: integer; const UneChaine: string); overload;
    var locale1 : integer; 
         ChaineX : string;
    begin
      blablabla...   
    end;
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur);
    begin
      MachinChose(GrosseValeur, AutreValeur, EncoreUneValeur, 'test');
    end;
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const UneChaine: string);
    begin
      MachinChose(GrosseValeur, AutreValeur, 0, UneChaine);
    end;
    [EDIT:] j'ai rajouté les overload que j'avais omis

  6. #6
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 839
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 839
    Points : 11 257
    Points
    11 257
    Billets dans le blog
    6
    Par défaut
    Sous Delphi, peut-on appeler une procédure ou fonction dotée de paramètres implicites en omettant un des paramètres optionnels même si ce dernier se trouve au milieu de la liste (des paramètres optionnels bien entendu) ?
    J'aurais tendance à dire non, mais n'en suis sûr que pour les versions que je connais (jusqu'à D7 !)

    Autre type de solution : passer un record dont seuls les champs pertinents seront initialisés.
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    pour etoffer la réponse de Lung :
    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
     
    interface
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur: integer);
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const UneChaine: string);
     
    implementation
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur: integer; const UneChaine: string);
    var locale1 : integer; 
         ChaineX : string;
    begin
      blablabla...   
    end;
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const EncoreUneValeur);
    begin
      MachinChose(GrosseValeur, AutreValeur, EncoreUneValeur, 'test');
    end;
     
    procedure MachinChose(const GrosseValeur, AutreValeur: integer; const UneChaine: string);
    begin
      MachinChose(GrosseValeur, AutreValeur, 0, UneChaine);
    end;

    attention quand même à ne pas trop overloadé les procédures pour éviter le passage des paramétres.
    ce cas par exemple, est impossible :

    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 MachinChose(const GrosseValeur, AutreValeur: integer;);
    var locale1 : integer; 
         ChaineX : string;
    begin
      blablabla...   
    end;
     
    procedure MachinChose(const GrosseValeur: integer);
    begin
      MachinChose(GrosseValeur, 0, 0, 'test');
    end;
     
    procedure MachinChose(const AutreValeur: integer);
    begin
      MachinChose(0, AutreValeur, 0, 'test');
    end;
    pourquoi ? parce que le compilateur ne sait pas quelle procédure tu veux appeler

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 34
    Points : 37
    Points
    37
    Par défaut
    Salut à tous et merci pour les suggestions et comme toujours la solution la plus simple à laquelle on a n'a pas encore pensé est toujours la meilleure et celle de tourlourou est pas mal pour palier cet inconvénient et peut même être utilisé pour bien d'autres cas de 'passages de paramètres'.

    Merci encore, pour ma part, pb résolu. Bonne continuation et A+++

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 92
    Points : 159
    Points
    159
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    J'aurais tendance à dire non, mais n'en suis sûr que pour les versions que je connais (jusqu'à D7 !)

    Autre type de solution : passer un record dont seuls les champs pertinents seront initialisés.
    attention au vocabulaire

    Autre type de solution : passer un record dont seuls tous les champs pertinents seront initialisés (avec une valeur par défaut), et seuls les champs pertinents seront renseignés.

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 21/10/2013, 21h19
  2. Réponses: 9
    Dernier message: 10/06/2013, 10h24
  3. [Débutant] La valeur ne peut pas être null. Nom du paramètre : objectType
    Par ozthewizard dans le forum VB.NET
    Réponses: 7
    Dernier message: 30/09/2011, 10h06
  4. Réponses: 4
    Dernier message: 09/02/2006, 17h22
  5. [Delphi 2005 + Interbase] Paramétrer le chemin la Database
    Par Vulcanos dans le forum Bases de données
    Réponses: 6
    Dernier message: 08/06/2005, 14h36

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