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 :

Liste de record et lecture des valeurs


Sujet :

Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Liste de record et lecture des valeurs
    J'ai un jeu de simulation de baseball et je voudrais me faire une application qui va concevoir des cédules pour un nombre d'équipes déterminé par l'utilisateur (moi, en l'occurrence, alors je n'ai pas à le faire à l'épreuve des imbéciles). Pour l'algorithme, ça va.
    J'ai pensé avoir un formulaire avec un mémo, un MonthCalendar et un bouton. Dans le mémo, l'utilisateur inscrit ses équipes, une par ligne. Il choisit aussi la date du début de la saison et appuie sur le bouton qui conçoit la cédule et affiche sur le mémo les parties de la première journée. En changeant de date dans le calendrier, l'utilisateur peut voir les parties correspondant à cette date.

    Lorsque le bouton est cliqué, les équipes inscrites dans le Mémo sont ajoutées à une StringList nommée Équipes. Par la suite, une liste nommée Parties est générée à partir de cette StringList, chaque partie étant composée d'un visiteur et d'un hôte. Ces parties sont par la suite inscrites dans des Jour composées d'une date et d'une liste de Partie. La Cédule est la liste de ces jours. La déclaration de mes types et variables donne ceci:

    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
    type
      TPartie = record
        Visiteur, Hote: string;
      end;
      TJour = record
        Jour: TDate;
        Parties: TList;
      end;
      TForm1 = class(TForm)
        Memo1: TMemo;
        MonthCalendar1: TMonthCalendar;
        BitBtn1: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      Equipes: TStringList;
      Cedule, Parties: TList;
    Le problème est que je me perds facilement avec les pointeurs. J'aimerais un exemple de code pour ajouter des Jour à ma Cedule, une Date et des Partie à mes Jour et comment je peux lire les dates et parties une fois cela fait. Merci de votre attention

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    oublie le TMemo, utilise une TListBox
    Ensuite, au lieu de record fait des objets et tu pourras utiliser la propriété Items.Objects[]

    Reviens avec un code et l'on te le corrigera
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Le memo n'est pas le problème. J'ai réussi, je crois, à comprendre comment manœuvrer avec des pointeurs mais ça donne une erreur « Index de liste hors limites » dans l'événement BitBtn1Click et je n'arrive pas à trouver où ça cloche à part que c'est après la ligne 84. Peut-être que quelqu'un avec un cerveau moins fatigué y arriverait:


    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    unit UCedule;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Buttons;
     
    type
      TPartie = record
        Visiteur, Hote: string;
      end;
      pPartie = ^TPartie;
      TJour = record
        Jour: TDate;
        Parties: TList;
      end;
      pJour = ^TJour;
      TForm1 = class(TForm)
        Memo1: TMemo;
        MonthCalendar1: TMonthCalendar;
        BitBtn1: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure MonthCalendar1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
      Cedule, Parties: TList;
      pP: pPartie;
      pJ: pJour;
      Bingo: Boolean;
      ds, fs: TDate;
     
    implementation
     
    {$R *.dfm}
     
     
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
    var
      i, p, ev, eh, jr: Cardinal;
      j, k: Integer;
      CT: TList;
      Equipes: TStringList;
      Possible: Boolean;
      pPJ: pPartie;
    begin
      if Memo1.Lines[0]='' then
      begin
        ShowMessage('Inscrivez des équipes');
        Exit
      end;
      Equipes:=TStringList.Create;
      Equipes.Assign(Memo1.Lines);
      Memo1.Clear;
      for i:=1 to Pred(Equipes.Count) do
      begin
        eh:=0;
        while (eh+i)<Equipes.Count do
        begin
          New(pP);
          pP.Visiteur:=Equipes[eh+i];
          pP.Hote:=Equipes[eh];
          Parties.Add(pP);
          Inc(eh);
        end;
      end;
      Equipes.Free;
      CT:=TList.Create;
      New(pJ);
      pJ.Parties:=TList.Create;
      ds:=MonthCalendar1.Date;
      pJ.Jour:=ds;
      fs:=ds;
      CT.Add(pJ);
      for i:=0 to Pred(Parties.Count) do
      begin
        New(pP);
        pP:=Parties[i];
        jr:=0;
        Possible:=False;
        while not Possible do
        begin
        {Vérifier si le visiteur joue ce jour-là}
          Possible:=True;
          if pJ.Parties.Count>0 then
          begin
            for j:=0 to Pred(pJ.Parties.Count) do
            begin
              pPJ:=pJ.Parties[j];
              if pP.Visiteur=pPJ.Visiteur then
              begin
                Possible:=False;
                Break;
              end;
              if pP.Visiteur=pPJ.Hote then
              begin
                Possible:=False;
                Break;
              end;
            end;
            if Possible then
            {Vérifier si l'hôte joue}
            begin
              eh:=0;
              for j:=0 to Pred(pJ.Parties.Count) do
              begin
                pPJ:=pj.Parties[j];
                if pP.Hote=pPJ.Visiteur then
                begin
                  Possible:=False;
                  Break;
                end;
                if pP.Hote=pPJ.Hote then
                begin
                  Inc(eh);
                  if eh=2 then
                  begin
                    Possible:=False;
                    Break;
                  end;
                end;
              end;
            end;
          end;
          {Vérifier le nombre de parties en quatre jours}
          if Possible then
            for j:=(jr-3) to jr do
            begin
              if not Possible then
                Break;
              ev:=0;
              eh:=0;
              for k:=j to (j+3) do
                if (k>-1)and(k<CT.Count)then
                begin
                  pJ:=CT[k];
                  if pJ.Parties.Count>0 then
                    for p:=0 to Pred(pJ.Parties.Count) do
                    begin
                      pPJ:=pJ.Parties[p];
                      if pP.Visiteur=pPJ.Visiteur then
                      begin
                        Inc(ev);
                        Break;
                      end;
                      if pP.Visiteur=pPJ.Hote then
                        Inc(ev);
                      if pP.Hote=pPJ.Visiteur then
                      begin
                        Inc(eh);
                        Break;
                      end;
                      if pP.Hote=pPJ.Hote then
                        Inc(eh);
                    end;
                  if (ev>3)or(eh>3)then
                  begin
                    Possible:=False;
                    Break;
                  end;
                end;
            end;
          if not Possible then
          begin
            Inc(jr);
            New(pJ);
            if jr<CT.Count then
              pJ:=CT[jr]
            else
            begin
              pJ.Parties:=TList.Create;
              fs:=fs+1;
              pJ.Jour:=fs;
              CT.Add(pJ);
            end
          end;
        end;
        New(pJ);
        pJ:=CT[jr];
        pJ.Parties.Add(pP);
      end;
      for i:=Trunc(fs-ds)to 0 do
      begin
        pJ:=CT[i];
        Cedule.Add(pJ);
      end;
      CT.Free;
      pJ:=Cedule[0];
      for i:=0 to Pred(pJ.Parties.Count) do
      begin
        pP:=pJ.Parties[i];
        Memo1.Lines.Add(pP.Visiteur+' @ '+pP.Hote);
      end;
      Caption:=FormatDateTime('d mmmm yyyy', MonthCalendar1.Date);
      Bingo:=True;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Cedule:=TList.Create;
      Parties:=TList.Create;
      Bingo:=False;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Parties.Free;
      Cedule.Free;
    end;
     
    procedure TForm1.MonthCalendar1Click(Sender: TObject);
    var
      i: Cardinal;
    begin
      Caption:=FormatDateTime('d mmmm yyyy', MonthCalendar1.Date);
      if Bingo then
      begin
        Memo1.Clear;
        if MonthCalendar1.Date<ds then
          Memo1.Text:='La saison commence le '+FormatDateTime('d mmmm yyyy', ds)
        else
          if MonthCalendar1.Date>fs then
            Memo1.Text:='La saison est terminée depuis le '+FormatDateTime('d mmmm yyyy', fs)
          else
          begin
            pJ:=Cedule[Trunc(MonthCalendar1.Date-ds)];
            if pJ.Parties.Count=0 then
              Memo1.Text:='Pas de partie aujourd''hui'
            else
              for i:=0 to Pred(pJ.Parties.Count) do
              begin
                pP:=pJ.Parties[i];
                Memo1.Lines.Add(pP.Visiteur+' @ '+pP.Hote);
              end;
          end;
      end;
    end;
     
    end.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Le TMemo risque avec le WordWrap de poser problème et je ne sais si Objects[] est implémenté
    Vous avez raté la notion importante de ma proposition : Faire de la POO

    sinon le premier contrôle est faux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if Memo1.Lines.Count <= 0  then
      begin
        ShowMessage('Inscrivez des équipes');
        Exit
      end;
    Vous devriez découper l'algo en plusieurs sous fonction pour créer la combinatoire des parties puis le planning des parties, toutes ces boucles imbriquées cela me semblent bien trop compliqué
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Déjà l'initialisation, on peut avoir un code plus harmonieux
    Aucune variable globale, ça c'est une très mauvaise pratique
    Grace à la TObjectList on gère les libérations (tu as fais un plein de New et totalement oublier les Dispose, tu as des fuites mémoires aussi sur la TList dans le record)
    Je ne sais pas comment tu as fait mais ton code fait buggé une boucle for, signe que la mémoire doit être dans un sale état
    En isolant le code de chaque étape, on facilite la lecteur et cela garanti un code bien moins fragile

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    type
      // forward
      TEquipe = class;
      TEquipes = class;
      TMatch = class;
      TMatches = class;
     
      TEquipe = class(TObject)
      private
        FName: string;
        FMatches: TMatches;
        function GetMatches: TMatches;
      public
        destructor Destroy(); override;
     
        property Name: string read FName write FName;
        property Matches: TMatches read GetMatches;
     
      end;
      TEquipes = class(System.Generics.Collections.TObjectList<TEquipe>)
      public
        function AddEquipe(const AName: string): TEquipe;
      end;
      TMatch = class(TObject)
      private
        FHost: TEquipe;
        FVisitor: TEquipe;
      public
        property Host: TEquipe read FHost write FHost;
        property Visitor: TEquipe read FVisitor write FVisitor;
      end;
      TMatches = class(System.Generics.Collections.TObjectList<TMatch>)
      public
        function AddMatch(AHost, AVisitor: TEquipe): TMatch;
      end;
     
    { TEquipe }
     
    destructor TEquipe.Destroy();
    begin
      FreeAndNil(FMatches);
     
      inherited Destroy();
    end;
     
    function TEquipe.GetMatches(): TMatches;
    begin
      if not Assigned(FMatches) then
        FMatches := TMatches.Create(False);
     
      Result := FMatches;
    end;
     
    { TEquipes }
     
    function TEquipes.AddEquipe(const AName: string): TEquipe;
    begin
      Result := TEquipe.Create();
      Add(Result);
      Result.Name := AName;
    end;
     
    { TMatches }
     
    function TMatches.AddMatch(AHost, AVisitor: TEquipe): TMatch;
    begin
      Result := TMatch.Create();
      Add(Result);
      Result.Host := AHost;
      Result.Visitor := AVisitor;
    end;
     
    procedure TFom1.Button2Click(Sender: TObject);
     
      function CreateEquipes(): TEquipes;
      var
        I: Integer;
      begin
        Result := TEquipes.Create(True);
        for I := 0 to MemoEquipes.Lines.Count - 1 do
          Result.AddEquipe(MemoEquipes.Lines[I]);
      end;
     
      function CreateMatches(AEquipes: TEquipes; AAllerEtRetour: Boolean): TMatches;
      var
        I, J: Integer;
      begin
        Result := TMatches.Create(True);
        for I := 0 to AEquipes.Count - 1 do
          for J := IfThen(AAllerEtRetour, 0, I + 1) to AEquipes.Count - 1 do
            if not AAllerEtRetour or (AEquipes[I] <> AEquipes[J]) then
              Result.AddMatch(AEquipes[I], AEquipes[J]);
      end;
     
    var
      Equipes: TEquipes;
      Matches: TMatches;
        I: Integer;
    begin
      Equipes := CreateEquipes();
      Matches := CreateMatches(Equipes, False);
      MemoMatches.Lines.Clear();
      for I := 0 to Matches.Count - 1 do
        MemoMatches.Lines.Add(Format('%s vs %s', [Matches[I].Host.Name, Matches[I].Visitor.Name]));
    end;
    Code dfm : 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
     
    object MemoEquipes: TMemo
      Left = 348
      Top = 5
      Width = 185
      Height = 224
      Lines.Strings = (
        'ABCDE')
      TabOrder = 6
      WordWrap = False
    end
    object MemoMatches: TMemo
      Left = 539
      Top = 5
      Width = 185
      Height = 224
      Lines.Strings = (
        'MemoMatches')
      TabOrder = 5
      WordWrap = False
    end
    object Button2: TButton
      Left = 429
      Top = 235
      Width = 75
      Height = 25
      Caption = 'Button2'
      TabOrder = 4
      OnClick = Button2Click
    end

    Après le reste, faut savoir, Est-ce qu'il y a un temps minimum entre deux match d'une équipe, combien de match maximum par jour, le code est trop confu pour le comprendre
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 420
    Points : 5 819
    Points
    5 819
    Par défaut
    salut

    effectivement c'est un code plutot brouillon
    tou ce qu'a dis ShaiLeTroll est coherent

    quand au premier test plutot que faire
    Citation Envoyé par ShaiLeTroll Voir le message
    Le TMemo risque avec le WordWrap de poser problème et je ne sais si Objects[] est implémenté
    Vous avez raté la notion importante de ma proposition : Faire de la POO

    sinon le premier contrôle est faux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if Memo1.Lines.Count <= 0  then
      begin
        ShowMessage('Inscrivez des équipes');
        Exit
      end;
    Vous devriez découper l'algo en plusieurs sous fonction pour créer la combinatoire des parties puis le planning des parties, toutes ces boucles imbriquées cela me semblent bien trop compliqué
    il aurais été préférable de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Function TestMemoVide(Memo : Tmemo;MessErr : String) : Boolean;
    begin
      Result := true;
      if assigned(Memo) Then 
      begin
        Result := False;
        if trim(Memo.Lines.text) = ''  Then
          Result := true;
      end;
      if result = true then 
         ShowMessage(MessErr); 
    end;
    tu l'utilise comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if TestMemoVide(Memo1,'Inscrivez des équipes')= False Then 
      begin
        // je continue le traitement sinon on sort
      end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  7. #7
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Violation d'accès en quittant
    Tout d'abord, je tiens à vous remercier du temps et de l'énergie que vous m'avez consacré, c'est très apprécié. J'ai un code et il fonctionne parfaitement
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
     
    unit UCedule;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
      System.Generics.Collections, System.Math, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Buttons;
     
    type
      TPartie = class(TObject)
      private
        FVisiteur: String;
        FHote: String;
      public
        property Visiteur: String read FVisiteur write FVisiteur;
        property Hote: String read FHote write FHote;
      end;
     
      TParties = class(TObjectList<TPartie>)
      public
        function AjouterPartie(UnVisiteur, UnHote: String): TPartie;
      end;
     
      TJour = class(TObject)
      private
        FDate: TDate;
        FParties: TParties;
      public
        property Date: TDate read FDate write FDate;
        property Parties: TParties read FParties write FParties;
      end;
     
      TCedule = class(TObjectList<TJour>)
      public
        function AjouterJour: TJour;
      end;
     
      TForm1 = class(TForm)
        Memo1: TMemo;
        MonthCalendar1: TMonthCalendar;
        BitBtn1: TBitBtn;
        procedure BitBtn1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure MonthCalendar1Click(Sender: TObject);
    {    procedure MonthCalendar1Click(Sender: TObject);}
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
     
     
    var
      Form1: TForm1;
      Cedule: TCedule;
      Bingo: Boolean;
      DebutSaison, FinSaison: TDate;
     
    implementation
     
    {$R *.dfm}
     
    function TParties.AjouterPartie(UnVisiteur, UnHote: String): TPartie;
    begin
      Result:=TPartie.Create;
      Result.Visiteur := UnVisiteur;
      Result.Hote := UnHote;
      Add(Result);
    end;
     
    function TCedule.AjouterJour: TJour;
    begin
      Result := TJour.Create;
      Add(Result);
    end;
     
     
     
    procedure TForm1.BitBtn1Click(Sender: TObject);
      function CreerDesParties(DesEquipes: TStrings): TParties;
      var
        i, j: Cardinal;
      begin
        Result:=TParties.Create;
        for i:=1 to Pred(DesEquipes.Count) do
        begin
          j:=0;
          while (j+i)<DesEquipes.Count do
          begin
            Result.AjouterPartie(DesEquipes[j+i], DesEquipes[j]);
            Inc(j);
          end;
        end;
      end;
      function VerifDispo(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i: Cardinal;
      begin
        Result:=True;
        for i:=0 to Pred(UnJour.Parties.Count) do
          if (UnJour.Parties[i].Visiteur=UneEquipe)or(UnJour.Parties[i].Hote=UneEquipe) then
          begin
            Result:=False;
            Break
          end;
      end;
      function VerifDispoEx(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i: Cardinal;
      begin
        Result:=True;
        for i:=0 to Pred(UnJour.Parties.Count) do
          if (UnJour.Parties[i].Visiteur=UneEquipe) then
          begin
            Result:=False;
            Break
          end;
      end;
      function VerifDispoDom(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i, j: Cardinal;
      begin
        Result:=True;
        j:=0;
        for i:=0 to Pred(UnJour.Parties.Count) do
          if (UnJour.Parties[i].Hote=UneEquipe) then
          begin
            Inc(j);
            if j=2 then
            begin
              Result:=False;
              Break
            end;
          end;
      end;
      function VerifQuatre(UnePartie: TPartie; UneCedule: TCedule; UnJour: Cardinal): Boolean;
      var i, j, EV, EH: Cardinal;
      begin
        Result:=True;
        EV:=0;
        EH:=0;
        for i:=UnJour to Min(Pred(UneCedule.Count), UnJour+3) do
        begin
          if Assigned(UneCedule[i].Parties) then
            for j:=0 to Pred(UneCedule[i].Parties.Count) do
            begin
              if (UneCedule[i].Parties[j].Visiteur=UnePartie.Visiteur) or (UneCedule[i].Parties[j].Hote=UnePartie.Visiteur) then
                Inc(EV);
              if (UneCedule[i].Parties[j].Visiteur=UnePartie.Hote) or (UneCedule[i].Parties[j].Hote=UnePartie.Hote) then
                Inc(EH);
              if (EV>3)or(EH>3)then
                Break;
            end;
          if (EV>3)or(EH>3)then
          begin
            Result:=False;
            Break;
          end;
        end;
      end;
    var
      i: Cardinal;
      j, JourTentatif: Integer;
      Parties: TParties;
      CeduleTemp: TCedule;
      Possible: Boolean;
    begin
      if Memo1.Lines.Count<2 then
      begin
        ShowMessage('Inscrivez au moins deux équipes');
        Exit
      end;
      Parties:=CreerDesParties(Memo1.Lines);
      Memo1.Clear;
      CeduleTemp:=TCedule.Create;
      DebutSaison:=MonthCalendar1.Date;
      CeduleTemp.AjouterJour;
      for i:=0 to Pred(Parties.Count) do
      begin
        JourTentatif:=0;
        Possible:=False;
        while not Possible do
        begin
          Possible:=True;
    {Vérifier si le visiteur joue la veille, ce jour-là ou le lendemain}
          for j:=Max(Pred(JourTentatif), 0) to Min(Pred(CeduleTemp.Count), Succ(JourTentatif)) do
          begin
            if Assigned(CeduleTemp[j].Parties) then
            begin
              Possible:=VerifDispo(Parties[i].Visiteur, CeduleTemp[j]);
              if not Possible then
                Break;
            end;
          end;
          if Possible then
    {Vérifier si l'hôte joue à l'extérieur, la veille, ce jour-là ou le lendemain}
            for j:=Max(Pred(JourTentatif), 0) to Min(Pred(CeduleTemp.Count), Succ(JourTentatif)) do
            begin
              if Assigned(CeduleTemp[j].Parties) then
              begin
                Possible:=VerifDispoEx(Parties[i].Hote, CeduleTemp[j]);
                if not Possible then
                  Break;
              end;
            end;
          if Possible and Assigned(CeduleTemp[JourTentatif].Parties) then
    {Vérifier si l'hôte joue plus d'une partie ce jour-là}
            if CeduleTemp[JourTentatif].Parties.Count>1 then
              Possible:=VerifDispoDom(Parties[i].Hote, CeduleTemp[JourTentatif]);
    {Vérifier le nombre de parties en quatre jours}
          if Possible then
            for j:=Max(0, JourTentatif-3) to JourTentatif do
              if VerifQuatre(Parties[i], CeduleTemp, j)=False then
              begin
                Possible:=False;
                break;
              end;
          if not Possible then
          begin
            if JourTentatif=Pred(CeduleTemp.Count) then
              CeduleTemp.AjouterJour;
            Inc(JourTentatif);
          end;
        end;
        if not Assigned(CeduleTemp[JourTentatif].Parties)then
          CeduleTemp[JourTentatif].Parties:=TParties.Create;
        CeduleTemp[JourTentatif].Parties.AjouterPartie(Parties[i].Visiteur, Parties[i].Hote);
      end;
      Parties.Free;
      j:=0;
      for i:=Pred(CeduleTemp.Count)downto 0 do
      begin
        Cedule.AjouterJour;
        Cedule[j]:=CeduleTemp[i];
        Cedule[j].Date:=DebutSaison+j;
        Inc(j);
      end;
      FinSaison:=DebutSaison+j;
      CeduleTemp.Free;
      for i:=0 to Pred(Cedule[0].Parties.Count) do
        Memo1.Lines.Add(Cedule[0].Parties[i].Visiteur+' @ '+Cedule[0].Parties[i].Hote);
      Caption:=FormatDateTime('d mmmm yyyy', Cedule[0].Date);
      Bingo:=True;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Cedule:=TCedule.Create;
      Bingo:=False;
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Cedule.Free;
    end;
     
    procedure TForm1.MonthCalendar1Click(Sender: TObject);
    var
      i: Cardinal;
    begin
      Caption:=FormatDateTime('d mmmm yyyy', MonthCalendar1.Date);
      if Bingo then
      begin
        Memo1.Clear;
        if MonthCalendar1.Date<DebutSaison then
          Memo1.Text:='La saison commence le '+FormatDateTime('d mmmm yyyy', DebutSaison)
        else
          if MonthCalendar1.Date>=FinSaison then
            Memo1.Text:='La saison est terminée depuis le '+FormatDateTime('d mmmm yyyy', FinSaison-1)
          else
            if not Assigned(Cedule[Trunc(MonthCalendar1.Date-DebutSaison)].Parties)then
              Memo1.Text:='Pas de partie aujourd''hui'
            else
              for i:=0 to Pred(Cedule[Trunc(MonthCalendar1.Date-DebutSaison)].Parties.Count) do
                Memo1.Lines.Add(Cedule[Trunc(MonthCalendar1.Date-DebutSaison)].Parties[i].Visiteur+' @ '+Cedule[Trunc(MonthCalendar1.Date-DebutSaison)].Parties[i].Hote);
      end;
    end;
     
    end.
    Le seul problème est que ça me donne un message de violation d'accès quand je ferme l'appli. Ça ne le faisait pas
    quand j'ai testé la partie qui créait la banque de matchs, alors, je suppose que ça a à voir avec la création de la cédule (à partir de la ligne 179) mais je n'arrive pas à voir comment

  8. #8
    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,
    Citation Envoyé par Gilbert Gélinas Voir le message
    je suppose que ça a à voir avec la création de la cédule (à partir de la ligne 179) mais je n'arrive pas à voir comment
    Non, cela a plutôt à voir avec la destruction de l'objet Cedule, soit cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Cedule.Free;
    end;
    il va falloir maintenant travailler sur les libérations de vos différents objets car le code , que je n'ai fait que survoler, sent les fuites de mémoires

    un petit ReportMemoryLeaksOnShutdown:=true; dans le source du projet sera édifiant
    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

  9. #9
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je veux bien mais pourquoi est-ce que ça ne donne pas ce genre de message à CeduleTemp.Free à la ligne 240?

  10. #10
    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
    Je n'ai fat que survoler le source donc je n'en suis pas sûr à 100%, peut être que Cedule est déjà "libéré" ailleurs

    un If Assigned(Cedule) then Cedule.Free; au lieu d'un simple Cedule.Free; lèvera certainement l'erreur
    mais pas les fuites
    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

  11. #11
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 420
    Points : 5 819
    Points
    5 819
    Par défaut
    salut


    dans ton code j'ai comme un doute la ?
    deja je ne suis pas partisant des variable global
    Cedule,Bingo,debutSaison et FinSaison
    met les dans la partie private de ta form cela devrais le faire

    un autre truc jamais tu dis à la Tobjectlist de libérer tout les object accumulé
    dans mon souvenir il y a une propriete pour faire ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Cedule :=TCedule.Create;
       Cedule.ownsobjects := true;
    ...
       CeduleTemp:=TCedule.Create;
       CeduleTemp.ownsobjects := true;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        Result:=TParties.Create;
        Result.ownsobjects := true;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Cedule faut le mettre en membre privé de la fenêtre, comme anapurna, il faut éviter les globales

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     private
        { Déclarations privées }
        Cedule: TCedule;
        Bingo: Boolean;
        DebutSaison, FinSaison: TDate;
    Ne sous-estime pas cette remarque, si tu as plusieurs fois la même fenêtre affichée, tu as ainsi ton planning pour chacune des fenêtres



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FreeAndNil(Cedule);
    end;
    Le Free protège contre la libération d'un objet à nil mais pour cela faut bien affecter nil après le Free ou utiliser FreeAndNil

    Citation Envoyé par aide
    la différence de Destroy, Free réussit même si l'objet est à nil, de sorte que la méthode Free ne provoque pas d'erreur, même pour un objet qui n'a jamais été initialisé
    La TObjectList est par défaut propriétaire des objets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CeduleTemp := TCedule.Create(False);
    Je n'ai pas tout lu mais n'ajoute pas d'objet partagé entre CeduleTemp et Cedule, seuls Cedule peut libérer les objets, CeduleTemp ne doit pas en avoir la possession


    Tu as d'autres choses à simplifier par exemple

    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
     
      function VerifDispo(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i: Cardinal;
      begin
        Result:=True;
        for i:=0 to Pred(UnJour.Parties.Count) do
          if (UnJour.Parties[i].Visiteur=UneEquipe)or(UnJour.Parties[i].Hote=UneEquipe) then
          begin
            Result:=False;
            Break
          end;
      end;
      function VerifDispoEx(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i: Cardinal;
      begin
        Result:=True;
        for i:=0 to Pred(UnJour.Parties.Count) do
          if (UnJour.Parties[i].Visiteur=UneEquipe) then
          begin
            Result:=False;
            Break
          end;
      end;
      function VerifDispoDom(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i, j: Cardinal;
      begin
        Result:=True;
        j:=0;
        for i:=0 to Pred(UnJour.Parties.Count) do
          if (UnJour.Parties[i].Hote=UneEquipe) then
          begin
            Inc(j);
            if j=2 then
            begin
              Result:=False;
              Break
            end;
          end;
      end;
      function VerifQuatre(UnePartie: TPartie; UneCedule: TCedule; UnJour: Cardinal): Boolean;
      var i, j, EV, EH: Cardinal;
      begin
        Result:=True;
        EV:=0;
        EH:=0;
        for i:=UnJour to Min(Pred(UneCedule.Count), UnJour+3) do
        begin
          if Assigned(UneCedule[i].Parties) then
            for j:=0 to Pred(UneCedule[i].Parties.Count) do
            begin
              if (UneCedule[i].Parties[j].Visiteur=UnePartie.Visiteur) or (UneCedule[i].Parties[j].Hote=UnePartie.Visiteur) then
                Inc(EV);
              if (UneCedule[i].Parties[j].Visiteur=UnePartie.Hote) or (UneCedule[i].Parties[j].Hote=UnePartie.Hote) then
                Inc(EH);
              if (EV>3)or(EH>3)then
                Break;
            end;
          if (EV>3)or(EH>3)then
          begin
            Result:=False;
            Break;
          end;
        end;
      end;
    Voici comme l'écrire plus court et surtout aère un peu plus ton code, il est tout tassé ce qui le rend difficile à lire
    Ajoute des espaces, des sauts de ligne
    Utilise Exit au lieu de Break
    Pred, Succ ... je préfère de loin -1/+1 c'est pour moi plus lisible

    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
     
      function VerifDispo(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i: Cardinal;
      begin
        for i := 0 to UnJour.Parties.Count -1 do
          if (UnJour.Parties[i].Visiteur = UneEquipe) or (UnJour.Parties[i].Hote = UneEquipe) then
            Exit(False);
     
        Result := True;
      end;
     
      function VerifDispoEx(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i: Cardinal;
      begin
        for i := 0 to UnJour.Parties.Count - 1 do
          if UnJour.Parties[i].Visiteur = UneEquipe then
            Exit(False);
     
        Result :=True;
      end;
     
      function VerifDispoDom(UneEquipe: String; UnJour: TJour): Boolean;
      var
        i, j: Cardinal;
      begin
        j := 0;
        for i := 0 to UnJour.Parties.Count - 1 do
          if UnJour.Parties[i].Hote = UneEquipe then
          begin
            Inc(j);
            if j = 2 then
              Exit(False);
          end;
     
        Result := True;
      end;
     
      function VerifQuatre(UnePartie: TPartie; UneCedule: TCedule; UnJour: Cardinal): Boolean;
      var i, j, EV, EH: Cardinal;
      begin
        EV := 0;
        EH :=0;
        for i := UnJour to Min(UneCedule.Count - 1, UnJour+3) do
        begin
          if Assigned(UneCedule[i].Parties) then
            for j := 0 to UneCedule[i].Parties.Count - 1 do
            begin
              if (UneCedule[i].Parties[j].Visiteur = UnePartie.Visiteur) or (UneCedule[i].Parties[j].Hote = UnePartie.Visiteur) then
                Inc(EV);
              if (UneCedule[i].Parties[j].Visiteur = UnePartie.Hote) or (UneCedule[i].Parties[j].Hote = UnePartie.Hote) then
                Inc(EH);
              if (EV > 3) or (EH > 3) then
                Exit(False);
            end;
        end;
        Result := True;
      end;
    Ce code ne va pas !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     if not Assigned(CeduleTemp[JourTentatif].Parties)then
          CeduleTemp[JourTentatif].Parties:=TParties.Create;
        CeduleTemp[JourTentatif].Parties.AjouterPartie(Parties[i].Visiteur, Parties[i].Hote);
    Il faut que ce soit une property qui gère l'allocation, ce n'est pas au code appelant de faire ce genre de chose mais à l'objet d'être prêt à l'emploi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      TJour = class(TObject)
      private
        FDate: TDate;
        FParties: TParties;
     
        function GetParties(): TParties;
      public
        destructor Destroy(); override;
     
        property Date: TDate read FDate write FDate;
        property Parties: TParties read GetParties;
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    destructor TJour.Destroy(); 
    begin
      FreeAndNil(FParties);
     
      inherited Destroy(); 
    end;
     
    function TJour.GetParties(): TParties;
    begin
      if not Assigned(FParties)
        FParties := TParties.Create();
     
      Result := FParties;
    end;

    Ton code est encore bien trop confus et pas assez découpé, trop de boucle dans tous les sens
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Merci
    J'ai été malade et ça m'a pris du temps à m'y remettre mais, grâce à vos conseils, mon logiciel fonctionne maintenant à merveille. Merci à tous

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

Discussions similaires

  1. Lecture des valeurs JTable
    Par monalise dans le forum Composants
    Réponses: 4
    Dernier message: 16/09/2009, 16h09
  2. [aSense] Lecture des valeurs
    Par zehle dans le forum Autres architectures
    Réponses: 1
    Dernier message: 07/05/2008, 16h14
  3. Réponses: 4
    Dernier message: 09/06/2007, 19h15
  4. Prob de lecture des valeurs de l'objet map
    Par micanti dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 12/07/2006, 20h38
  5. Prob de lecture des valeurs de l'objet map
    Par micanti dans le forum Struts 1
    Réponses: 12
    Dernier message: 12/07/2006, 17h12

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