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 :

Existe-t-il une solution pour simplifier ce code Win11 et D6


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 Existe-t-il une solution pour simplifier ce code Win11 et D6
    Bonjour à toutes et à tous,

    En complément du topic concernant l'écart entre 2 dates, j'ai refait une fiche pour modifier les jours de paye chaque année dans le fichier "Dates.txt" dès que l'application est exécutable.

    Pour modifier en une fois l'année c'est ok.

    J'utilise chaque item pour afficher le mois dans un "ImputBox"

    Avec ce code qui fonctionne j'aimerai le simplifié si possible :

    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
     
    procedure TU_Modif.ListBox1DblClick(Sender: TObject);
    var
      lb: TListBox;
      s: string;
    begin
      lb := (Sender as TListBox);
     
      if ((lb = nil) or (lb.ItemIndex < 0)) then
        Exit;
     
      If (Lb.itemindex = 0) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de janvier :',lb.Items[lb.ItemIndex]);
     
      If (Lb.itemindex = 1) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de février :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 2) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de mars :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 3) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de avril :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 4) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de mai :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 5) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de juin :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 6) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de juillet :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 7) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de août :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 8) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de septembre :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 9) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de octobre :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 10) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de novembre :',lb.Items[lb.ItemIndex]);
     
       If (Lb.itemindex = 11) then
     
      s := InputBox('Jours de paye','Modifier le jour de paye de décembre :',lb.Items[lb.ItemIndex]);
     
      lb.Items[lb.ItemIndex] := s; 
     
    end;
    Pas de solution malgré plusieurs tests.

    Merci d'avance.

    @+,

    cincap

  2. #2
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Bon je suis dans les transport et ecris depuis mon tel alors dls mais moi je ferais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var mois : array [0..11] of string;
     
    mois[0]:='janvier'; + les 11 aurtes mois...
     
    for j:=0 to 11 do
    begin
    if Lb.itemindex = j then begin
    s := InputBox('Jours de paye','Modifier le jour de paye de '+mois[0]+'  : ',lb.Items[lb.ItemIndex]);
    break;
    end;

  3. #3
    Rédacteur/Modérateur

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

    Passer par un TMemo serait certainement plus simple que tous ces inputboxs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memo1.Lines.LoadFromFile('dates.txt');
    un bouton ChangerAnnée -> avec demande de l'année variable aa et un process simple genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i:=0 to memo1.lines.count-1 do
     begin
        Memo1.lines[i]:=Copy(Memo1.lines[i],1,6)+aa;
     end;
    un bouton pour sauvegarder les modifications.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Memo1.lines.savetofile('dates.txt')
    Bon, bien sûr, il y a tout intérêt à tester les dates en amont de la sauvegarde (une simple boucle dans le tmemo)

    pour ne pas faire comme la dernière fois, testé avec D3

    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
    75
    76
    77
    78
    79
    80
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Mask, StdCtrls, Buttons;
     
    type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Changer: TButton;
        Annee: TMaskEdit;
        Sauver: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure ChangerClick(Sender: TObject);
        procedure SauverClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    // uses DateUtils;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Annee.text:=FormatDateTime('yyyy',date);
    if FileExists('dates.txt')
     then Memo1.lines.LoadfromFile('dates.txt')
     else Memo1.lines.Clear;
    end;
     
    procedure TForm1.ChangerClick(Sender: TObject);
    var aa,mm,jj : word;
        i : integer;
    begin
    if memo1.lines.count=0 then
     begin
       DecodeDate(date,aa,mm,jj); // annee en cours
       i:= StrToIntDef(annee.text,aa);
       for mm:=1 to 12 do
         Memo1.lines.Add(FormatDateTime('dd/mm/yyyy',EncodeDate(i,mm,21)));
     end
    else begin
      for i:=0 to memo1.lines.count-1 do
        Memo1.lines[i]:=Copy(Memo1.lines[i],1,6)+Annee.text;
    end;
    end;
     
    procedure TForm1.SauverClick(Sender: TObject);
    var i : integer;
        d : Tdate;
        erreurs : boolean;
    begin
    erreurs:=false;
    for i:=0 to memo1.lines.count-1 do
     begin
       try
         d:=StrToDate(Memo1.lines[i]);
       except
         on EConvertError do
          begin
           Erreurs:=Erreurs OR True;
           showmessage(Format('Date mois %d invalide',[i+1]));
           // todo : à ta charge changer pour le nom du mois
          end;
       end;
      end;
    if Not Erreurs then Memo1.lines.Savetofile('dates.txt');
    end;
     
    end.
    design facile à reproduire
    Nom : Capture.PNG
Affichages : 130
Taille : 22,0 Ko

    En l'écrivant, je me suis même dit que tu pourrais plutôt travaillé sur des fichiers du genre dates2024.txt, dates2025.txt, etc. simple modification à faire en chargeant et en sauvegardant
    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 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
    Bonjour à toutes et à tous,

    @ DarwinTheBeagle merci pour ta suggestion, j'ai testé cela ne fonctionne pas !

    @ SergioMaster, merci aussi pour ta suggestion, je vais tester tout cela et te dirai quoi.

    Pour modifier l'année j'avais fait ceci avec 2 Tedit :

    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
      i:Integer;
      annee,mois,jour : word;
    begin
     DecodeDate(now,annee,mois,jour); // inttostr(annee)
     
       ListBox1.Items.LoadFromFile(chappli +'Dates.txt');
     
             For i:=0 to ListBox1.Count-1 do
                begin
                   ListBox1.Items.Strings[i]:=StringReplace(ListBox1.Items.Strings[i],Eddatedebut.text ,EddateFin.text,[rfReplaceAll]);
                end;
     
        ListBox1.Items.SaveToFile('Dates.txt');
     
     end;
    Je suis toujours en phase de test.

    @+,

    cincap

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 695
    Points : 13 133
    Points
    13 133
    Par défaut
    InputQuery à la place de InputBox

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      Days :array[0..11] of string;
      i :integer;
    begin
      for i := 0 to High(Days) do
        Days[i] := lb.Items[i];  // ou vide si pas de valeur par défaut
     
      if InputQuery('Jour de paie en 2025', ['Janvier', 'Février', 'Mars', ...], Days) then
        for i := 0 to High(Days) do
          lb.Items[i] := Days[i];

  6. #6
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Ok

    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
    procedure TU_Modif.ListBox1DblClick(Sender: TObject);
    var 
    mois : array [0..11] of string;
     lb: TListBox;
      s: string;
    begin
     
    lb := (Sender as TListBox);
     
      if ((lb = nil) or (lb.ItemIndex < 0)) then
        Exit;
     
    mois[0]:='janvier'; 
     mois[1]:='fevrier'; etc...
     
    for j:=0 to 11 do
    begin
    if Lb.itemindex = j then begin
    s := InputBox('Jours de paye','Modifier le jour de paye de '+mois[0]+'  : ',lb.Items[lb.ItemIndex]);
    break;
    end;
      lb.Items[lb.ItemIndex] := s; 
     
    end;

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    @darwinthebeagle
    ce qui déconne dans ton code : le break qui interrompt la boucle, l'indice dans mois[0] qui devrait être mois[j]
    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

  8. #8
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Mars 2023
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Creuse (Limousin)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Mars 2023
    Messages : 89
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    @darwinthebeagle
    ce qui déconne dans ton code : le break qui interrompt la boucle, l'indice dans mois[0] qui devrait être mois[j]
    Ha les joies du copier coller

  9. #9
    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
    @ tous, merci pour toutes vos suggestions, @ Andnotor et @ SergioMaster.

    Je vais adopter la solution de SergioMaster avec un Tmemo ce qui rendra mon application plus légère mais les suggestions me permettent d'apprendre encore à mon âge.

    Le Tmemo à la propriété de centrer le texte en standard que le TlistBox il a fallut tricher.

    Je ferme ce topic.

    @+,

    cincap

  10. #10
    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, j'ai testé ton code avec le Tlistbox et à titre d'info, j'obtiens une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if InputQuery('Jour de paie en 2025', ['Janvier', 'Février', 'Mars', ...], Days) //Ici malgré le renseignement des 12 mois
    [Erreur] UModification.pas(249): Type ordinal requis
    [Erreur] UModification.pas(249): Types incompatibles : 'Integer' et 'String'
    @+,

    cincap

  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
    Bonjour à toutes et à tous,

    Merci pour l'aide et en attache le print du logiciel terminé avec la voix et fiche Mère/Esclave.

    @+,

    cincap

    Nom : Fiche modification_2.jpg
Affichages : 70
Taille : 121,8 Ko

  12. #12
    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
    Très beau design !
    A+
    Charly

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par cincap Voir le message
    fiche Mère/Esclave.
    ça faisait longtemps que je n'avais pas lu ces termes !
    Merci pour le voyage photo.

    avec la voix
    tu expliques, avec quel interpréteur et qu'est-ce qui est "lu" ?
    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

  14. #14
    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, Bonjour

    Fiche Mère/Esclave la fiche de calcul en 1er avec la voix et la fiche modification se glisse en dessous de la 1ère mais elle peut se dissocier et se placer dans un autre coin de l'écran, si la fiche Mère bouge d'un mm la fiche esclave est attirée comme un aimant pour se replacer.

    Le voyage photo c'est la capture de mon fond d'écran à l'ouverture de l'application.

    @ Charly910, Bonjour, j'espère que tu vas bien et merci pour le compliment.

    Sinon voici l'interpréteur des sons pour lire les 3 messages.

    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
     
    procedure TU_MainCalcul.BcalculClick(Sender: TObject);
    var
      MonthYear :string;
      Day       :byte;
      Days      :byte;
      Next      :TDate;
     
    Voix      : variant;
     
     LessThanValue, EqualsValue, GreaterThanValue : TDate;
    begin
     
       Voix:=CreateOLEObject('SAPI.SpVoice');
       Voix.Volume := 100;
       Voix.Rate := spvoix.value ; //Régler la vitesse à 0 pour mon Pc (valeur de -10/10)
     
      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
         -1    : Edcalcul.Text := Format('La pension de '+FormatDateTime('MMMM', Date)+' est déjà payée depuis %d jours', [Days]);
          0    : Edcalcul.Text := 'Youpie on touche';
          1    : Edcalcul.Text := Format('On touche la pension de '+FormatDateTime('MMMM', Date)+' dans %d jours', [Days]);
     
     
        end;
      if ckvocal.Checked = true then Voix.speak(Edcalcul.text);
     
      except
        if Day = 0
        then Edcalcul.Text := 'Erreur: fichier incomplet'
        else Edcalcul.Text := 'Erreur: date invalide';
     
      end
     
      end;
    Pour le TListbox mettre le texte au centre c'est connu !

    Bonne fin de journée.

    @+,

    cincap

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

Discussions similaires

  1. [XL-2013] Existe-t-il une solution pour indenter son code ?
    Par DenisHen dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 09/04/2021, 12h43
  2. [Python 2.X] Est ce qu'il existe une solution pour ce problème ?
    Par wissssam dans le forum Général Python
    Réponses: 5
    Dernier message: 17/03/2016, 10h58
  3. Existe-il une solution pour faire du support/ticketing avec openerp?
    Par vince02444 dans le forum Odoo (ex-OpenERP)
    Réponses: 0
    Dernier message: 05/12/2012, 14h16
  4. Réponses: 2
    Dernier message: 29/07/2007, 11h48
  5. Une solution pour migrer de .NET vers MFC
    Par torNAdE dans le forum MFC
    Réponses: 1
    Dernier message: 03/05/2006, 22h23

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