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 :

Fonction OverLoad dans une Unité


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2019
    Messages : 38
    Points : 17
    Points
    17
    Par défaut Fonction OverLoad dans une Unité
    Bonjour chers amis delphinautes.
    Je voudrais savoir s'il est possible d'utiliser la commande "Overload" lors des déclarations
    des fonctions d'une Unité créee avec delphi 10.
    Quand je tente voici l'erreur envoyée :
    [dcc32 Erreur] Unit_Nbre.pas(16): E2037 La déclaration de 'Ch_en_Nbre' diffère de la déclaration précédente

    Voici le code :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    .
    .
    .
    .
    .
     
    Function Ch_en_Nbre(ST : String ) : Int64; Overload;
    Function Ch_en_Nbre(ST : String ) : Double;  Overload;
    ........
    Function Ch_en_Nbre(ST : String ) : Double; OverLoad;
    Var
     i, Lg, Code : Integer;
     CH : String;
     Begin
      Lg:=Length(ST);
      CH:='';
      For i:=1 To Lg Do
       Begin
        If ST[i] in ['0','1','2'..'9' , ',' , '.'] then
         Begin
          If ST[i]=',' Then ST[i]:='.';
          CH:=CH+ST[i];
         End;//If ST[i] in ['0','1','2'..'9',',','.'] then
       End; // For
       Val(CH,NB1,Code);
       Result:=NB1;
     End;
     
    Function Ch_en_Nbre(ST : String ) : Integer;  OverLoad;
    Var
     i, Lg, Code : Integer;
     CH : String;
     Begin
      Lg:=Length(ST);
      CH:='';
      For i:=1 To Lg Do
       Begin
        If ST[i] in ['0','1','2'..'9' , ',' , '.'] then
         Begin
          If ST[i]=',' Then ST[i]:='.';
          CH:=CH+ST[i];
         End;//If ST[i] in ['0','1','2'..'9',',','.'] then
       End; // For
       Val(CH,NB1,Code);
       Result:=NB1;
     End;
    Merci pour l'assistance.

  2. #2
    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 445
    Points
    28 445
    Par défaut
    il n'est pas possible de faire des overload sur le type de résultat...je le sais car j'ai moi même rencontré ce problème

    une raison évoquée c'est qu'il ne serait pas possible de savoir quelle fonction appeler sur ce code...mais je trouve cela limite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    begin  
      Ch_en_Nbre('12');
    end;
    par contre tu peux faire ceci par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Function Ch_en_Nbre(ST : String; var NB : Int64): Boolean; Overload;
    Function Ch_en_Nbre(ST : String; var NB : Double): Boolean;  Overload;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 084
    Points : 5 604
    Points
    5 604
    Par défaut
    Citation Envoyé par delphiketou Voir le message
    Bonjour chers amis delphinautes.
    Je voudrais savoir s'il est possible d'utiliser la commande "Overload" lors des déclarations
    des fonctions d'une Unité créee avec delphi 10.
    Quand je tente voici l'erreur envoyée :
    [dcc32 Erreur] Unit_Nbre.pas(16): E2037 La déclaration de 'Ch_en_Nbre' diffère de la déclaration précédente

    Voici le code :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    .
    .
    .
    .
    .
     
    Function Ch_en_Nbre(ST : String ) : Int64; Overload;
    Function Ch_en_Nbre(ST : String ) : Double;  Overload;
    ........
    Function Ch_en_Nbre(ST : String ) : Double; OverLoad;
    Var
     i, Lg, Code : Integer;
     CH : String;
     Begin
      Lg:=Length(ST);
      CH:='';
      For i:=1 To Lg Do
       Begin
        If ST[i] in ['0','1','2'..'9' , ',' , '.'] then
         Begin
          If ST[i]=',' Then ST[i]:='.';
          CH:=CH+ST[i];
         End;//If ST[i] in ['0','1','2'..'9',',','.'] then
       End; // For
       Val(CH,NB1,Code);
       Result:=NB1;
     End;
     
    Function Ch_en_Nbre(ST : String ) : Integer;  OverLoad;
    Var
     i, Lg, Code : Integer;
     CH : String;
     Begin
      Lg:=Length(ST);
      CH:='';
      For i:=1 To Lg Do
       Begin
        If ST[i] in ['0','1','2'..'9' , ',' , '.'] then
         Begin
          If ST[i]=',' Then ST[i]:='.';
          CH:=CH+ST[i];
         End;//If ST[i] in ['0','1','2'..'9',',','.'] then
       End; // For
       Val(CH,NB1,Code);
       Result:=NB1;
     End;
    Merci pour l'assistance.
    Pourquoi recoder ce qui existe déjà dans Delphi :

    Les fonctions StrToInt, StrToIntDef, StrToFloat, StrToFloatDef de l'unité SysUtils font déjà tout ça... et sans doute de façon plus optimisée que tes exemples....
    Faut faire appel à l'aide contextuelle dès fois...

  4. #4
    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 445
    Points
    28 445
    Par défaut
    j'ai voulu répondre sur la question et non sur le fond

    mais tu as raison, même si on aurait pu vouloir créer une fonction uniquement Ch_en_Nbre comme point d'entrée...Ce qui peut se faire sans coût supplémentaire avec la directive inline.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function Ch_en_Nbre(const Str: string; var NB: Integer): Boolean; overload; inline;
    begin
      Result := TryStrToInt(Str, NB);
    end;
    avec au passage une chaîne constante pour optimiser l'appel

    après je déteste personnellement les overload et ne les utilise que pour des correctifs...le dernier en date était celui-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function StartTransaction(AMode: TTransactionMode; AReadOnly : Boolean = False): TFBTransaction; overload;
    function StartTransaction(AReadOnly : Boolean = False; AMode: TTransactionMode = TTransactionMode.ReadCommited; ANoWait: Boolean = True): TFBTransaction; overload;
    c'est une fonction que j'utilise pour démarrer une transaction Firebird, la ligne du haut est la fonction telle que je l'ai créée initialement...et je me suis rendu compte par la suite que dans 99% des cas la transaction est en ReadCommited et que c'est plus souvent l'accès ReadOnly que j'active, j'ai donc inversé les paramètres et pour ne pas casser le code existant j'ai créé un overload...au fil du temps, j'ai viré tous les appels dans la première forme et supprimé l'overload.

    d'ailleurs la dernière version de Delphi utilise l'inférence de type pour typer les variables en ligne...mais là il aurait du mal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      var i := StrToInt('12'); // Integer
      var x := Ch_En_NBre('12'); // ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2019
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Merci à tous.

    Pourquoi recoder ce qui existe déjà dans Delphi :

    Les fonctions StrToInt, StrToIntDef, StrToFloat, StrToFloatDef de l'unité SysUtils font déjà tout ça... et sans doute de façon plus optimisée que tes exemples....
    Faut faire appel à l'aide contextuelle dès fois...
    L'idée qui me pousse à recoder ce qui est bien fait déjà est que je veux créer un seul modele de TEdit pour saisir une chaine de caractère, un entier, un reel et même un (TMoney).

    Quel peut être alors la bonne démarche. Je pense même aller loin pour céer un composant perso TmonEdit qui sera à l'image de ce modèle.

    mais tu as raison, même si on aurait pu vouloir créer une fonction uniquement Ch_en_Nbre comme point d'entrée...Ce qui peut se faire sans coût supplémentaire avec la directive inline.
    Merci à Paul Toth. mais je n'ai pas compris l'usage de inline dont tu parles. Bien vouloir m'en donner d'autres exemples simples avec un peu d'explication pour ma compréhension.
    Est-ce que cela peut m'aider dans mon cas présent.

    Une fois encore merci à tous.

  6. #6
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par delphiketou Voir le message
    Merci à Paul Toth. mais je n'ai pas compris l'usage de inline dont tu parles. Bien vouloir m'en donner d'autres exemples simples avec un peu d'explication pour ma compréhension.
    Est-ce que cela peut m'aider dans mon cas présent.
    'inline' est un mot clé qui remplace l'appel à une fonction par une injection du code de la fonction là où elle est appelée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function sum(A, B: integer): Integer; inline;
    begin
      Result := A + B;
    end;
     
    var
      a,b,c: Integer;
    begin
      c := sum(a, b); // équivalent à c := A + B; sans appel de fonction
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    'inline' est un mot clé qui remplace l'appel à une fonction par une injection du code de la fonction là où elle est appelée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function func(A, B: integer): Integer; inline;
    ...
      c := sum(a, b);
    func sum ?

  8. #8
    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 445
    Points
    28 445
    Par défaut
    Citation Envoyé par ALWEBER Voir le message
    func sum ?
    oui, c'est corrigé
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Juillet 2019
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Merci à Paul Toth.
    Je vais faire des recherches pour mieux appréhender ma connaissance sur inline.
    Merci et à bientôt.

Discussions similaires

  1. adresse d'une fonction crée dans une unité
    Par potili2 dans le forum Débuter
    Réponses: 1
    Dernier message: 28/06/2009, 05h59
  2. Regroupage des fonctions et procédures dans une unité
    Par gilardino dans le forum Débuter
    Réponses: 3
    Dernier message: 15/04/2008, 01h58
  3. Fonction MAX dans une condition WHERE
    Par borgfabr dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 16h06
  4. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42
  5. [VBA-E] Fonction sum() dans une cellule
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 16/12/2002, 10h18

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