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 :

Comment détecter le pluriel d'un nombre d'une date D6 et Win11 64 bits !


Sujet :

Delphi

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 437
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 437
    Points : 1 328
    Points
    1 328
    Par défaut Comment détecter le pluriel d'un nombre d'une date D6 et Win11 64 bits !
    Bonjour à toutes et à tous,

    Avec ce code je suis obligé de mettre le pluriel entre parenthèse lors du résultat, je me demandais si il était possible lorsque le résultat est de - 1 jour = singulier et plus 1 jour = pluriel.

    Exemple avec le mois de mai.

    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
     
    var
     
    DateActuelle: TDateTime;
     
    Jour, Mois, Annee: Word;
     
    Day, Days      :byte;
     
    begin
     
    DateActuelle := Now;
     
       //pour le mois de mai Mois = 5
    DecodeDate(Dateactuelle, Annee, Mois, Jour);
     
    if (Mois =5) then ed.caption := Format('Paiement de ma prime et de mes congés payés dans %d jour(s)', [Days]) else
     
    ed.caption := Format('Paiement de ma prime dans %d jour(s)', [Days]) ;
    J'avais pensé à une deuxième condition avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (Days <= 1) then Format('Paiement de ma prime et de mes congés payés dans %d jour', [Days]) else Format('Paiement de ma prime et de mes congés payés dans %d jours', [Days]);
    Mais je pédale car ce résultat doit être affiché uniquement si c'est le mois de mai et je n'arrive pas à combiner les deux conditions.

    Merci si quelqu'un avait une solution.

    @+,

    cincap

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 431
    Points : 3 068
    Points
    3 068
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      S: string;
      Days, Mois: Integer;
    begin
      Days := 2;
      Mois := 5;
      S := Format('Paiement de ma prime et de mes congés payés dans %d jour%s', [Days, IfThen((Days <= 1) and (Mois = 5), '', 's')]);
      ShowMessage(S);
    J-L aka Papy pour les amis

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 090
    Points : 41 061
    Points
    41 061
    Billets dans le blog
    62
    Par défaut
    @Papy IfThen existait déjà en D6 ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 431
    Points : 3 068
    Points
    3 068
    Par défaut
    Je pense que oui ... ça date ce truc là dans Strutils

    et puis bon, au pire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function MyIfThen(Condition: Boolean; ChaineVrai, ChaineFaux: string): string;
    begin
      if Condition then
        Result := ChaineVrai
      else
        Result := ChaineFaux;
    end;



    D'ailleurs on peut même faciliter l'emploi de plusieurs conditions

    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
    function MyIfThen(Conditions: array of Boolean; ChaineVrai, ChaineFaux: string): string;
    var
      I: Integer;
      B: Boolean;
    begin
      if Length(Conditions) = 0 then
        Exit('');
      B := Conditions[Low(Conditions)];
      for I := Succ(Low(Conditions)) to High(Conditions) do
        B := B and Conditions[I];
      if B then
        Result := ChaineVrai
      else
        Result := ChaineFaux;
    end;
     
    procedure TForm4.Button1Click(Sender: TObject);
    var
      S: string;
      Days, Mois: Integer;
    begin
      Days := 0;
      Mois := 5;
      S := Format('Paiement de ma prime et de mes congés payés dans %d jour%s', [Days, MyIfThen([Days <= 1, Mois = 5], '', 's')]);
      ShowMessage(S);
    end;
    J-L aka Papy pour les amis

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 437
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 437
    Points : 1 328
    Points
    1 328
    Par défaut
    @ Papy214, merci de ta suggestion qui fonctionne parfaitement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm4.Button1Click(Sender: TObject);
    var
      S: string;
      Days, Mois: Integer;
    begin
      Days := 0;
      Mois := 5;
      S := Format('Paiement de ma prime et de mes congés payés dans %d jour%s', [Days, MyIfThen([Days <= 1, Mois = 5], '', 's')]);
      ShowMessage(S);
    end;
    Un grand merci à tous.

    @+,

    cincap

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 437
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 437
    Points : 1 328
    Points
    1 328
    Par défaut
    Bonjour à toutes et à tous,

    @ Papy214, bonjour, je me demandais si avec ta solution singulier/pluriel et mois de mai (prime et congés payés) on pourrait indiquer un autre message pour les autres mois de l'année ?

    par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (Mois = 5) then Ed.Caption :=  Format('Paiement de ma prime et de mes congés payés dans %d jour%s', [Days, MyIfThen([Days <= 1, Mois = 5], '', 's')]) else
                 Ed.Caption :=  Format('Paiement de ma prime dans %d jour%s', [Days, MyIfThen([Days <= 1], '', 's')]);
    Qu'en penses tu ?

    Merci,

    @+,

    cincap

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 663
    Points : 3 636
    Points
    3 636
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    La solution proposée par Papy214 ressemble à ce que je fais dans des fonctions utilitaires que j'utilise dans mes projets. Mon objectif était d'obtenir quelque chose de similaire à l'opérateur ternaire que l'on trouve dans certains langages (JS, Java...). Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maVariable = unNombre > 5 ? "supérieur à 5" : "inférieur ou égale à 5";
    La variable maVariable contiendra la string "supérieur à 5" lorsque unNombre > 5, sinon elle contiendra la string "inférieur ou égale à 5".

    Partant de là, j'ai cherché à faire une fonction générique qui fonctionne quelque soit le type de retour. J'ai aussi eu l'idée de prendre un tableau de boolean pour gérer plusieurs conditions et, enfin, pour être encore plus complet, j'ai fait plusieurs méthodes qui testent si toutes les conditions sont réunies, si une seule seulement est vraie ou si au moins une condition est vraie.

    Cela donne le code suivant (il faudra ajouter les uses Generics.Collections et system.Generics.Defaults) :

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    type
      TCheckType = (all, atLeastOne, OnlyOne);
      Test<T> = record
        private
          datas : T;
          function check(aCheckType : TCheckType; conditions: TArray<boolean>; ifTrue, ifFalse : T):T;
        public
          constructor Create(const source : T);
          function AllAreTrue(conditions: TArray<boolean>; ifTrue, ifFalse : T): T;
          function AtLeastOneIsTrue(conditions: TArray<boolean>; ifTrue, ifFalse : T): T;
          function OnlyOneIsTrue(conditions: TArray<boolean>; ifTrue, ifFalse : T): T;
      end;
     
    implementation
     
    {$R *.fmx}
     
    constructor Test<T>.Create(const source : T);
    begin
      inherited;
      datas := source;
    end;
     
    function Test<T>.AllAreTrue(conditions: TArray<boolean>; ifTrue, ifFalse: T): T;
    begin
      result := check(TCheckType.all, conditions, ifTrue, ifFalse);
    end;
     
    function Test<T>.AtLeastOneIsTrue(conditions: TArray<boolean>; ifTrue, ifFalse: T): T;
    begin
      result := check(TCheckType.atLeastOne, conditions, ifTrue, ifFalse);
    end;
     
    function Test<T>.OnlyOneIsTrue(conditions: TArray<boolean>; ifTrue, ifFalse: T): T;
    begin
      result := check(TCheckType.OnlyOne, conditions, ifTrue, ifFalse);
    end;
     
    function Test<T>.check(aCheckType: TCheckType; conditions: TArray<boolean>; ifTrue, ifFalse : T): T;
    begin
      if length(conditions) = 0 then exit(Default(T));
      var isOk := true;
      var count := 0;
      for var aCondition in conditions do begin
        case aCheckType of
          TCheckType.all: begin
                            if not(aCondition) then begin
                              isOk := false;
                              break;
                            end;
                          end;
          TCheckType.atLeastOne: begin
                                   if aCondition then begin
                                     isOk := true;
                                     break;
                                   end else isOk := false;
                                 end;
          TCheckType.OnlyOne: begin
                                if aCondition then begin
                                  inc(count);
                                  if count > 1 then isOk := false;
                                end;
                              end;
        end;
      end;
     
      if isOk then result := ifTrue
      else result := ifFalse;
    end;
    Un cas d'utilisation en reprenant l'exemple de Papy214 (c'est très similaire mais un plus plus long à écrre...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    var Days := 22;
    var Mois := 5;
    var s := Format('Paiement de ma prime et de mes congés payés dans %d jour%s', [Days, Test<String>.create(EmptyStr).AllAreTrue([Days <= 1, Mois = 5], '', 's')]);
    showmessage(s);
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 738
    Points : 13 278
    Points
    13 278
    Par défaut
    Pas très logique de mettre au pluriel uniquement le mois de mai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    NDays := Format('%d jour%s', [Days, IfThen(Days > 1, 's')]);
     
    if Mois = 5
    then ed.caption := 'Paiement de ma prime et de mes congés payés dans ' +NDays
    else ed.caption := 'Paiement de ma prime dans ' +NDays;

  9. #9
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 78
    Points : 136
    Points
    136
    Par défaut
    J'ai l'impression que ce message n'est affiché que pour le mois de mai
    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
    var
     DateActuelle: TDateTime;
     Jour, Mois, Annee: Word;
     Msg: string;
    begin
     
      DateActuelle := Now;
         //pour le mois de mai Mois = 5
      DecodeDate(Dateactuelle, Annee, Mois, Jour);
      Msg := '';
      if (Mois = 5) then
      begin
        Msg := Format('Paiement de ma prime et de mes congés payés dans %d jour', [Jour]);
        if Jour > 1 then
           Msg := Msg +'s';
      end;
      ed.caption := Msg;
    end;

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 437
    Détails du profil
    Informations personnelles :
    Âge : 71
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 437
    Points : 1 328
    Points
    1 328
    Par défaut
    @ Volid, tu as tout à fait raison, les autres mois de l'année c'est uniquement la prime et le mois de mai uniquement les congés payés (en tant que pensionné).

    @ Andnotor, le membre Volid à raison et c'est aussi grâce à toi (solution du 26/02/2024) que je perfectionne la réponse pour le mois de mai et tu proposes encore une autre solution que je testerai.

    @ gebegreg, merci de ta suggestion, j'ai D6 et pour ne pas modifier de trop l'application principale, je dois rester dans la solution du membre Andnotor.

    J'ai testé ma proposition en modifiant la date système du Pc et cela à l'air de fonctionner (les messages) pour le singulier/pluriel, pour le mois de mai et pour le reste de l'année.

    On verra en temps réel.

    Merci à tous et merci pour votre temps à aider les membres de ce forum.

    @+,

    cincap

  11. #11
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Mai 2024
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Mai 2024
    Messages : 78
    Points : 136
    Points
    136
    Par défaut
    Si tu souhaites afficher un message particulier pour chaque mois il est possible d'utiliser l'instruction case ...of

    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
     
    case Mois of
      1: begin 
     
      end;
      2: begin
     
      end;
      3: begin
     
      end;
      4: begin
     
      end;
      5: begin
           //code pour le mois de mai 
      end;
      6: begin
     
      end;
      7: begin
     
      end;
      8: begin
     
      end;
      9: begin
     
      end;
      10: begin
     
      end;
      11: begin
     
      end;
      12: begin
     
      end;
    end;

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

Discussions similaires

  1. Comment insérer un nombre et une date ?
    Par edophie dans le forum InfoPath
    Réponses: 3
    Dernier message: 15/07/2008, 15h02
  2. Réponses: 1
    Dernier message: 29/01/2008, 16h30
  3. Réponses: 6
    Dernier message: 09/01/2008, 21h33
  4. [XSLT] Comment ajouter 1 minute ou 1 jour à une date
    Par crazzino dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 09/07/2006, 12h19
  5. [DATE] d'un nombre à une date ?
    Par Fritzoune dans le forum Access
    Réponses: 3
    Dernier message: 15/02/2006, 14h25

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