Bonjour à tous,
Actuellement, je suis sur un petit projet et je suis confronté à un petit souci.
J'ai une classe produit que voici (elle est simplifiée pour expliquer mon souci).
J'ai une "collection" de produits dont voici la classe :
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 unit UProduit; interface type TProduit = class private FRefProduit : integer; FNomProduit : string; FStockProduit : integer; FPrixUnitaireProduit : double; public constructor Create(aRefProduit : integer; aNomProduit : string; aStockProduit : integer; aPrixUnitaireProduit : double); end; implementation { TProduit } constructor TProduit.Create(aRefProduit: integer; aNomProduit: string; aStockProduit: integer; aPrixUnitaireProduit: double); begin FRefProduit := aRefProduit; FNomProduit := aNomProduit; FStockProduit := aStockProduit; FPrixUnitaireProduit := aPrixUnitaireProduit; end; end.
Et voici là où ça bloque. Je fais un indexOf pour savoir si un produit P existe dans la collection, mais ça ne fonctionne pas.
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 unit CollectionDeProduits; interface uses Contnrs, UProduit; type TCollectionDeProduits = class(TObjectList) private function GetItem(Index: integer): TProduit; procedure SetItem(Index: integer; const Value: TProduit); public function Add(leProduit: TProduit): integer; function Remove(leProduit: TProduit): integer; function IndexOf(leProduit: TProduit): integer; procedure Delete(Index: integer); property Items[Index: integer]: TProduit Read GetItem Write SetItem; default; end; {----------------------------------------------------------------} { } { }IMPLEMENTATION{ } { } {----------------------------------------------------------------} function TCollectionDeProduits.Remove(leProduit: TProduit): integer; begin Result := inherited Remove(leProduit); end; function TCollectionDeProduits.IndexOf(leProduit: TProduit): integer; begin Result := inherited IndexOf(leProduit); end; function TCollectionDeProduits.Add(leProduit: TProduit): integer; begin Result := inherited Add(leProduit); end; function TCollectionDeProduits.GetItem(Index: integer): TProduit; begin Result := TProduit(inherited GetItem(index)); end; procedure TCollectionDeProduits.SetItem(Index: integer; const Value: TProduit); begin inherited setItem(index, Value); end; procedure TCollectionDeProduits.Delete(index: integer); begin inherited Delete(index); end; end.
Le souci, c'est qu'IndexOf me renvoie toujours -1. J'ai essayé de chercher comment redéfinir la méthode pour dire la comparaison soit faite sur les attributs de ma classe produit, mais je ne parviens pas à implémenter la méthode. D'après ce que j'ai pu lire, il faut définir l'interface de comparaison ICompare, ainsi qu'Equals ... Est-ce exact ?
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 unit UPrincipale; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls, CollectionDeProduits; type TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Déclarations privées } tabProduit : TCollectionDeProduits; public { Déclarations publiques } end; var Form1: TForm1; implementation uses UProduit; {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var produit : TProduit; index : integer; begin produit := TProduit.Create(1, 'test', 1, 12); index := tabProduit.IndexOf(produit); if(index = -1)then tabProduit.Add(produit) else ShowMessage(IntToStr(index)); end; procedure TForm1.FormCreate(Sender: TObject); begin tabProduit := TCollectionDeProduits.Create; end; end.
Pouvez-vous m'indiquer comment résoudre mon souci avec un exemple ?
Merci
Partager