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 :

Fichier texte extérieur pour une procédure W11 64 bits


Sujet :

Delphi

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut Fichier texte extérieur pour une procédure W11 64 bits
    Bonjour à toutes et à tous,

    Petite question constructive, j'ai une application qui utilise une procédure créée avec ce 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
     
    private
        { Déclarations privées }
        procedure InitializeDatesLimite ; 
    public
        { Déclarations publiques }
         DatesLimite: array [1..12] of TDateTime;
      end;
     
     
    procedure TForm1.InitializeDatesLimite;
    begin
     
    //Recopier dans le fichier Dateslimite.txt
     
      {DatesLimite[1] := EncodeDate(2024, 1, 24);
      DatesLimite[2] := EncodeDate(2024, 2, 22);
      DatesLimite[3] := EncodeDate(2024, 3, 21);
      DatesLimite[4] := EncodeDate(2024, 4, 23);
      DatesLimite[5] := EncodeDate(2024, 5, 23);
      DatesLimite[6] := EncodeDate(2024, 6, 21);
      DatesLimite[7] := EncodeDate(2024, 7, 24);
      DatesLimite[8] := EncodeDate(2024, 8, 23);
      DatesLimite[9] := EncodeDate(2024, 9, 23);
      DatesLimite[10] := EncodeDate(2024, 10, 24);
      DatesLimite[11] := EncodeDate(2024, 11, 22);
      DatesLimite[12] := EncodeDate(2024, 12, 20);}
     
    memo1.lines.loadfromfile(pchar('Dateslimite.txt'));
     
    end;
    J'ai recopié ce code dans un fichier texte "Dateslimite.txt" en me disant que ce serait plus facile de le modifier étant donné que suivant l'année le jour peut varier de +1 ou -1 au lieu de recompiler l'application.

    Pour ce faire j'utilise un Tmemo pour afficher le même code dans cette procédure et j'obtiens un faux calcul.

    Quelle serait la raison peut-être le formatage du fichier texte ?

    Merci de l'information si une raison existe.

    @+,

    cincap

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 675
    Points : 5 260
    Points
    5 260
    Par défaut
    Qu'est-ce que tu stockes ?
    Sous quel format ?
    Quel calcul tu fais ?
    Pour obtenir quel résultat ?
    Quel résultat tu obtiens à la place ?

    Tu devrais avoir l'habitude maintenant.
    Il est dommage de devoir encore te rappeler d'être précis dans ta demande.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ popo, merci de ta réponse,

    Qu'est-ce que tu stockes ?
    Sous quel format ?
    Je l'ai bien indiqué dans le code "//Recopier dans le fichier Dateslimite.txt" c'est le code entre les accolades.

    Le format du fichier est un fichier .txt en Ansi

    Le calcul c'est l'écart entre deux dates date du jour et date finale que je connais à l'avance, ce mois c'est le 22.

    Ce jour je dois obtenir 1 avant le 22 et j'obtiens 45344 en utilisant le memo.

    @+,

    cincap

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    Bonjour Cincap,

    pourrais tu mettre en ligne le fichier txt et une copie du contenu de ton mémo, pour voir comment sont affichées les dates ?

    A+
    Charly

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Charly910, Bonjour et merci de ton message.

    Voici le code pour l'écart entres deux dates pour le payement de ma pension (cela me change les idées !).

    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
     
    private
        { Déclarations privées }
        procedure InitializeDatesLimite ; 
    public
        { Déclarations publiques }
         DatesLimite: array [1..12] of TDateTime;
      end;
     
     
    procedure TForm1.InitializeDatesLimite;
    begin
     
      DatesLimite[1] := EncodeDate(2024, 1, 24);
      DatesLimite[2] := EncodeDate(2024, 2, 22);
      DatesLimite[3] := EncodeDate(2024, 3, 21);
      DatesLimite[4] := EncodeDate(2024, 4, 23);
      DatesLimite[5] := EncodeDate(2024, 5, 23);
      DatesLimite[6] := EncodeDate(2024, 6, 21);
      DatesLimite[7] := EncodeDate(2024, 7, 24);
      DatesLimite[8] := EncodeDate(2024, 8, 23);
      DatesLimite[9] := EncodeDate(2024, 9, 23);
      DatesLimite[10] := EncodeDate(2024, 10, 24);
      DatesLimite[11] := EncodeDate(2024, 11, 22);
      DatesLimite[12] := EncodeDate(2024, 12, 20);
     
    //memo1.lines.loadfromfile(pchar('Dateslimite.txt'));
     
    end;
     
    procedure TForm1.BCalculClick(Sender: TObject);
    var
      MoisEnCours: Integer;
      JoursRestants: Integer;
     
    ligne:string;
    begin
     
      MoisEnCours := MonthOf(Now);
     
      if (MoisEnCours >= 1) and (MoisEnCours <= 12) then
      begin
        JoursRestants := DaysBetween(Now, DatesLimite[MoisEnCours]);
     
        //afficher le nomre de jours restants dans  Edit1 :
        Edit1.Text := intToStr(JoursRestants)  ;
     
        Memo1.Lines.Add(Format('Plus que %d jours avant de toucher ta pension', [JoursRestants, DateToStr(DatesLimite[MoisEnCours])])); // ''au %s.
     
      end
      else
      begin
        Edit1.Text :=('Le mois en cours n''est pas valide.');
     
     end;
    end;
    A l'exécution de l'application, mon Tmemo est vide et je charge le fichier "Dateslimite.txt".

    Ce fichier contient les lignes :

    DatesLimite[1] := EncodeDate(2024, 1, 24);
    DatesLimite[2] := EncodeDate(2024, 2, 22);
    DatesLimite[3] := EncodeDate(2024, 3, 21);
    DatesLimite[4] := EncodeDate(2024, 4, 23);
    DatesLimite[5] := EncodeDate(2024, 5, 23);
    DatesLimite[6] := EncodeDate(2024, 6, 21);
    DatesLimite[7] := EncodeDate(2024, 7, 24);
    DatesLimite[8] := EncodeDate(2024, 8, 23);
    DatesLimite[9] := EncodeDate(2024, 9, 23);
    DatesLimite[10] := EncodeDate(2024, 10, 24);
    DatesLimite[11] := EncodeDate(2024, 11, 22);
    DatesLimite[12] := EncodeDate(2024, 12, 20);
    Sans Tmemo cela fonctionne correctement mais cela m'obligera en 2025 de modifier la date du jour de payement.

    Je suppose que c'est le formatage du fichier Texte qui est en cause ?

    @+,

    cincap

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 141
    Points
    13 141
    Par défaut
    Et donc tu charges un texte dans un mémo et tu aimerais que par magie le tableau DatesLimite soit correctement rempli ; tu es un doux rêveur !

    Au plus simple ce serait un fichier ini sous cette forme :
    Code ini : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [2024]
    1=24
    2=22
    3=21
    4=23
    5=23
    ...
     
    [2025]
    1=24
    ...

    Tu récupères le jour en fonction de la date courante, incrémente le mois si le date est passée, et ensuite seulement calcule le nombre de jours restants.

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Andnotor, Merci de ta réponse,

    pour te dire la vérité je n'ai jamais utilisé un fichier .txt extérieur pour une procédure c'est pour cela que je demandais une explication.

    Maintenant c'est vrai je n'ai plus l'esprit que j'avais à 20 ans et Delphi c'est vraiment pour me changer les idées.

    J'ai donc au moins une explication entre écrire le texte dans la procédure et le remplacer par le même texte depuis un fichier.

    @+,

    cincap

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 141
    Points
    13 141
    Par défaut
    Un script Pascal n'est pas impossible à exécuter mais ça demande un interpréteur tel que celui de RemObjects.

  9. #9
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 675
    Points : 5 260
    Points
    5 260
    Par défaut
    Comme l'a suggéré Andnotor, tu te compliques la vie pour pas grand choses.

    Pourquoi vouloir écrire dans un fichier du code Delphi que tu devras lire correctement, interpréter et exécuter ?
    Alors qu'en stockant simplement dans ce fichier les dates dans un format connu, une simple boucle remplira ton tableau.

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 346
    Points : 3 124
    Points
    3 124
    Par défaut
    C'est vrai, pourquoi tu ne créé pas ton fichier txt comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    24/01/2024
    22/02/2024
    21/03/2024
    23/04/2024
    23/05/2024
    21/06/2024
    ...
    puis pour remplir ton tableau :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    Var
      DatesLimite: array [1..12] of TDateTime ;
      Liste : TStringList ;
      i : Integer ;
    begin
      Liste := TStringList.Create ;
      Liste.LoadFromFile('DatesLimite.txt');
      Memo1.Clear ;
      For i := 0 to Liste.Count-1 Do
        Begin
          DatesLimite[i+1] := StrToDate(Liste[i]) ;
          // si tu veux afficher
          Memo1.Lines.Add('DatesLimite['+IntToStr(i+1)+'] := '+DateToStr(DatesLimite[i+1])) ;
          // ou
    //      Memo1.Lines.Add('DatesLimite['+IntToStr(i+1)+'] := '+Liste[i]) ;
     
        End ;
      Liste.Free ;
    end;
    A+
    Charly

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    Bonsoir à toutes et à tous,

    Merci à Charly910 de m'avoir mis sur la voie.

    Voila après mes soins je suis à nouveau dispo et j'ai remanié mon application en chargeant un fichier .txt contenant les dates de payement.

    Fichier Dates.txt :

    24/01/2024
    22/02/2024
    21/03/2024
    23/04/2024
    23/05/2024
    21/06/2024
    24/07/2024
    23/08/2024
    23/09/2024
    24/10/2024
    22/11/2024
    20/12/2024

    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
     
    procedure TForm1.ChargerDatesDepuisFichier(const NomFichier: string);
    var
      Fichier: TStringList;
      i: Integer;
    begin
      Fichier := TStringList.Create;
      try
        Fichier.LoadFromFile(NomFichier);
        for i := 0 to Fichier.Count - 1 do
        begin
          try
            DatesLimite[i + 1] := StrToDate(Fichier[i]);
          except
            on E: Exception do
            begin
              ShowMessage(Format('Erreur de conversion de date à la ligne %d : %s', [i + 1, E.Message]));
            end;
          end;
        end;
      finally
        Fichier.Free;
      end;
    end;
     
    procedure TForm1.BcalculClick(Sender: TObject);
    var
      MoisEnCours: Integer;
      JoursRestants: Integer;
     
    begin
     
      // Charger les dates depuis le fichier
      ChargerDatesDepuisFichier(chappli + 'dates.txt'); //
     
      MoisEnCours := MonthOf(Now);
     
      if (MoisEnCours >= 1) and (MoisEnCours <= 12) then
      begin
     
        JoursRestants := DaysBetween(Now, DatesLimite[MoisEnCours])+1;
     
        Edcalcul.Text := (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, DateToStr(DatesLimite[MoisEnCours])]));
     
        end
      else
      begin
        Edcalcul.Text := ('Le mois en cours n''est pas valide.');
      end;
      end;
    Cela fonctionne bien pour les jours (restant) donc antérieur à la date du payement et j'aurai bien voulu ajouter deux messages.

    un pour le jour de payement et un pour le dépassement du jour de payement.

    Si quelqu'un avait une idée merci d'avance.

    @+,

    cincap

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 048
    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 048
    Points : 40 968
    Points
    40 968
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    une remarque

    si MoisEnCours := MonthOf(Now); alors le test if (MoisEnCours >= 1) and (MoisEnCours <= 12) then est à mon avis inutile (toujours vrai).

    Je propose quelque chose comme ça

    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
    var d : TDateTime;
         moisencours, md : integer; 
    begin
    moisencours:=MonthOf(Now);
    for d in Datelimites do 
     begin
       if monthOf(d)>=moisencours then 
        begin
          JoursRestants := DaysBetween(Now, d);
          if  JoursRestants=0 
             then Edcalcul.Text := 'Jour de paiement'  
             else  Edcalcul.Text := (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, Datelimites[moisencours]]));   
        end
        else Edcalcul.Text := 'Paiement échu';   
     end;
    //.... suite
    sous réserve que for d in Datelimites do soit une syntaxe acceptée sinon il faudra utiliser une boucle for plus classique
    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
    var d : TDateTime;
         moisencours, md : integer; 
    begin
    moisencours:=MonthOf(Now);
    for i:=1 to 12 do 
     begin
       d:=Datelimites[i];
       if monthOf(d)>=moisencours then 
        begin
          JoursRestants := DaysBetween(Now, d);
          if  JoursRestants=0 
             then Edcalcul.Text := 'Jour de paiement'  
             else  Edcalcul.Text := (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, Datelimites[moisencours]]));   
        end
        else Edcalcul.Text := 'Paiement échu';   
     end;
    //.... suite
    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

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut D6 et Win 11 64bits
    @ SergioMaster, bonjour et merci de ta suggestion, je viens de tester et après de petites corrections comme i:integer, pas de md ou dateslimite.

    J'ai du choisir la méthode de la boucle cela se compile mais erreur lors du calcul car "%s" format incorrect ou incompatible avec l'argument.

    Voila, je regarde aussi le pourquoi mais comme j'avais déjà testé sans résultat.

    @+,

    cincap

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 048
    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 048
    Points : 40 968
    Points
    40 968
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par cincap Voir le message
    J'ai dû choisir la méthode de la boucle cela se compile mais erreur lors du calcul car "%s" format incorrect ou incompatible avec l'argument.
    Bon oui, D6 impliquait automatiquement la boucle for i:=1 to 12 et pas de variable inline (que j'utilise de plus en plus)

    pour (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, Datelimites[moisencours]]));Oui, désolé, j'ai fait ça à la va-vite, et sans ouvrir Delphi j'y avais pourtant pensé au formatdatetime mais j'ai posté trop vite
    je voulais écrire (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, FormatDateTime('dd/mm/yyyy',Datelimites[moisencours]])));
    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

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 700
    Points : 13 141
    Points
    13 141
    Par défaut
    Remplir un tableau est juste une complication inutile. Pourquoi ne pas formater ce fichier d'une façon directement utilisable ; même avec une stringlist ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    01.2024=24
    02.2024=22
    03.2024=21
    04.2024=23
    05.2024=23
    06.2024=21
    07.2024=24
    08.2024=23
    09.2024=23
    10.2024=24
    11.2024=22
    12.2024=20
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DateList := TStringList.Create;
      DateList.LoadFromFile(...);
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MonthYear :string;
      Day       :byte;
      Days      :byte;
      Next      :TDate;
    begin
      MonthYear := FormatDateTime('MM"."YYYY', Date);
      Day       := StrToIntDef(DateList.Values[MonthYear], 0);
     
      try
        Next := RecodeDay(Date, Day);
        Days := DaysBetween(Next, Date);
     
        case CompareDate(Next, Date) of
          LessThanValue    : Edcalcul.Text := Format('Paiement échu depuis %d jour(s)', [Days]);
          EqualsValue      : Edcalcul.Text := 'Paiement aujoud''hui';
          GreaterThanValue : Edcalcul.Text := Format('Paiement dans %d jour(s)', [Days]);
        end;
      except
        if Day = 0
        then Edcalcul.Text := 'Erreur: fichier incomplet'
        else Edcalcul.Text := 'Erreur: date invalide';
      end
    end;
    Et attention à la façon dont vous utilisez DaysBetween. Cette fonction renvoie le nombre de jours entiers entre deux TDateTime. S'il manque une minute, c'est moins un jour.
    Cincap ajoute +1 ce qui ne joue pas pour un paiement le jour-même et Sergio n'en tient pas compte, un paiement demain affichera 0 jour.

    Il ne faut pas utiliser Now qui contient date et heure mais Today ou plus simplement Date, sans notion d'heure (comme le fichier).

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ Andnotor, bonjour et merci pour ta solution.

    Remplir un tableau est juste une complication inutile
    Chaque année le jour de payement change pour chaque mois et vu que l'application sera compilée je pensais à un fichier texte extérieur facile à modifier.

    J'ai recommencé une application de test et j'obtiens des erreurs alors est ce que j'ai bien utilisé ton code ou c'est D6.

    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
    71
    72
    73
    74
     
     private
        { Déclarations privées }
      procedure ChargerDatesDepuisFichier(const NomFichier: string);
      public
        { Déclarations publiques }
     
      DatesLimite: array [1..12] of TDateTime;
      end;
     
    var
      Form1: TForm1;
      Datelist: TStringList;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.ChargerDatesDepuisFichier(const NomFichier: string);
    var
      Fichier: TStringList;
      i: Integer;
    begin
      Fichier := TStringList.Create;
      try
        Fichier.LoadFromFile(NomFichier);
        for i := 0 to Fichier.Count - 1 do
        begin
          try
            DatesLimite[i + 1] := StrToDate(Fichier[i]);
          except
            on E: Exception do
            begin
              ShowMessage(Format('Erreur de conversion de date à la ligne %d : %s', [i + 1, E.Message]));
            end;
          end;
        end;
      finally
        Fichier.Free;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      DateList := TStringList.Create;
      DateList.LoadFromFile('\Dates.txt');
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MonthYear :string;
      Day       :byte;
      Days      :byte;
      Next      :TDate;
    begin
      MonthYear := FormatDateTime('MM"."YYYY', Date);
      Day       := StrToIntDef(DateList.Values[MonthYear], 0);
     
      try
        Next := RecodeDay(Date, Day);
        Days := DaysBetween(Next, Date);
     
        case CompareDate(Next, Date) of
          LessThanValue    : Edcalcul.Text := Format('Paiement échu depuis %d jour(s)', [Days]);
          EqualsValue      : Edcalcul.Text := 'Paiement aujoud''hui';
          GreaterThanValue : Edcalcul.Text := Format('Paiement dans %d jour(s)', [Days]);
        end;
      except
        if Day = 0
        then Edcalcul.Text := 'Erreur: fichier incomplet'
        else Edcalcul.Text := 'Erreur: date invalide';
      end
     
    end;
    @ SergioMaster, j'ai encore une erreur sur cette ligne, pourtant les crochets et parenthèse sont en place :

    (Format('Il reste %d jours jusqu''au %s.', [JoursRestants, FormatDateTime('dd/mm/yyyy',Datelimites[moisencours]])));
    En tous les cas merci pour l'aide.

    @+,

    cincap

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 048
    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 048
    Points : 40 968
    Points
    40 968
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par cincap Voir le message
    @ SergioMaster, j'ai encore une erreur sur cette ligne, pourtant les crochets et parenthèse sont en place :
    un crochet mal placé car j'ai trop collé à ton code et perdu le compte des parenthèses
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Edcalcul.Text := Format('Il reste %d jours jusqu''au %s.', [JoursRestants, FormatDateTime('dd/mm/yyyy',Datelimites[moisencours])]);
    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

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ SergioMaster, cela compile mais le résultat est, à la date d'aujourd'hui et pour la date de payement en utilisant mon 1er fichier "Dates.txt" j'obtiens "Il reste 297 jours jusqu'au 22/02/2024".

    En ajoutant le tien sur un autre Tbutton.

    Décidément avec D6 on est limité.

    @+,

    cincap

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ SergioMaster, voici l'unité remaniée avec ta suggestion :

    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
     
    private
        { Déclarations privées }
     
        procedure ChargerDatesDepuisFichier(const NomFichier: string);
     
     public
        { Déclarations publiques }
        DatesLimite: array [1..12] of TDateTime;
     
      end;
     
    var
      Form1: TForm1;
      chappli : string;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.ChargerDatesDepuisFichier(const NomFichier: string);
    var
      Fichier: TStringList;
      i: Integer;
    begin
      Fichier := TStringList.Create;
      try
        Fichier.LoadFromFile(NomFichier);
        for i := 0 to Fichier.Count - 1 do
        begin
          try
            DatesLimite[i + 1] := StrToDate(Fichier[i]);
          except
            on E: Exception do
            begin
              ShowMessage(Format('Erreur de conversion de date à la ligne %d : %s', [i + 1, E.Message]));
            end;
          end;
        end;
      finally
        Fichier.Free;
      end;
    end;
     
    procedure TForm1.BSergio1Click(Sender: TObject);
    var d : TDateTime;
         moisencours, i, JoursRestants : integer;
    begin
    // Charger les dates depuis le fichier
      ChargerDatesDepuisFichier(chappli + 'dates.txt');
     
    moisencours:=MonthOf(Now);
    for i:=1 to 12 do
     begin
       d:=Dateslimite[i];
       if monthOf(d)>=moisencours then
        begin
          JoursRestants := DaysBetween(Now, d);
          if  JoursRestants=0 
             then Edcalcul.Text := 'Jour de paiement'
             else  Edcalcul.Text := Format('Il reste %d jours jusqu''au %s.', [JoursRestants, FormatDateTime('dd/mm/yyyy',Dateslimite[moisencours])]);
        end
        else Edcalcul.Text := 'Paiement échu';   
     end;
    end;
    Mon fichier Dates.txt :

    24/01/2024
    22/02/2024
    21/03/2024
    23/04/2024
    23/05/2024
    21/06/2024
    24/07/2024
    23/08/2024
    23/09/2024
    24/10/2024
    22/11/2024
    20/12/2024
    C'est au niveau du calcul ce résultat.

    @+,

    cincap

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 427
    Points : 1 326
    Points
    1 326
    Par défaut
    @ SergioMaster, voici mon test :

    Résultat en réglant la date au 20/02/2024 = 303 jours jusqu'au 22/02/2024.

    En réglant la date au 22/02/2024 = 301 jours jusqu'au 22/02/2024.

    En réglant la date au 28/02/2024 = 295 jours jusqu'au 22/02/2024.
    @+,

    cincap

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2009, 13h32
  2. Réponses: 4
    Dernier message: 24/11/2006, 17h03
  3. Réponses: 2
    Dernier message: 19/08/2006, 12h47
  4. Réponses: 7
    Dernier message: 23/03/2005, 22h23
  5. Réponses: 2
    Dernier message: 16/12/2004, 15h33

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