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

Langage Delphi Discussion :

Créer un opérateur de comparaison de 2 objets


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 102
    Points
    102
    Par défaut Créer un opérateur de comparaison de 2 objets
    Bonjour,

    Est-ce que qqu'un aurait un exemple de code Delphi 10.3 dans lequel on définit un opérateur de comparaison =, ou <=.
    L'idée est de comparer les objets A, et B avec une syntaxe naturelle :

    if (A = b) then
    begin
    ….
    end;

    A et B sont bien sur des objets complexes, de même nature.
    Exemple : A et B peuvent être des type de base de données, avec des propriétés : Nom, serveur, port, login et mdp.
    A et B seront égaux, si le nom et le login sont égaux.

    Cordialement

    Carmichael

  2. #2
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    Bonjour

    en rusant un peu on peut y arriver

    L'exemple est sur des TEdit dont la propriété Text est comparé
    mais tu fais ce que tu veux
    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
    unit UMain;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
       // ceci ne fonctionne pas
      //TEditHelper = class helper for TEdit
      //public
      //class operator EQUAL(a: TEdit; b: TEdit): boolean;
      //end;
     
      // par contre ceci oui
      TCrossEdit = record
        Data: TEdit;
      public
        class operator Implicit(a: TEdit): TCrossEdit;
        class operator Equal(a: TCrossEdit; b: TCrossEdit): Boolean;
      End;
     
      TForm27 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form27: TForm27;
     
    implementation
     
    {$R *.dfm}
     
    class operator TCrossEdit.Implicit(a: TEdit): TCrossEdit;
    begin
      Result.Data := a;
    end;
     
    class operator TCrossEdit.Equal(a: TCrossEdit; b: TCrossEdit): Boolean;
    begin
      Result := a.Data.Text = b.Data.Text;
    end;
     
    procedure TForm27.Button1Click(Sender: TObject);
    begin
      if TCrossEdit(Edit1) = TCrossEdit(Edit2) then
        ShowMessage('Identiques')
      else
        ShowMessage('Différents');
    end;
     
    end.
    ce code fonctionne à partir de Delphi 2009

    le "Implicit" est là pour que compilateur comprenne : "TCrossEdit(Edit1)"
    et "Equal" pour la comparaison "TCrossEdit(Edit1) = TCrossEdit(Edit2)".

    Cordialement,

    @+

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Carmichael Voir le message
    Bonjour,

    Est-ce que qqu'un aurait un exemple de code Delphi 10.3 dans lequel on définit un opérateur de comparaison =, ou <=.
    L'idée est de comparer les objets A, et B avec une syntaxe naturelle :

    if (A = b) then
    begin
    ….
    end;

    A et B sont bien sur des objets complexes, de même nature.
    Exemple : A et B peuvent être des type de base de données, avec des propriétés : Nom, serveur, port, login et mdp.
    A et B seront égaux, si le nom et le login sont égaux.

    Cordialement

    Carmichael
    mes 2 cents, pour moi "if A = B then" veux dire que les variables A et B pointent sur la même instance d'objet, utiliser une surcharge d'opérateur pour changer cela rendra dingue n'importe quel type qui reprendra le code par la suite. D'autant que TObject.Equals() est là pour faire un test d'égalité des propriétés.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 102
    Points
    102
    Par défaut
    Bonjour,

    Merci à Cirec pour sa réponse que je vais examiner avec soin.

    Pour Paul : Je ne partage pas votre point de vue. Vous dites que si A = B alors A et B pointent vers le même objet. Non, pas du tout.
    Voici un exemple : Dans un jeu, A et B sont 2 villes. Chaque ville possède x propriétés dont le nom, coord GPS, et la population.
    Je déclare que A = B si les populations sont égales. Il s'agit pourtant bien de 2 villes différentes, donc de 2 objets différents.
    Je peux également vouloir tester si A > B, etc.

    Cordialement

    Carmichael

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 871
    Points : 11 361
    Points
    11 361
    Billets dans le blog
    6
    Par défaut
    Je partage l'avis de Paul.
    Peut-on imaginer la lisibilité si dans 2 codes, if A = B représente tantôt ce qu'on pourrait exprimer par if A.NbHabitants = B.NbHabitants et tantôt par if A.Localisation = B.Localisation ?
    Surtout, cela ne permet qu'une modalité de comparaison par code ; on pourrait donc comparer leurs tailles de population avec l'opérateur "=" mais serait réduit à utiliser une autre syntaxe pour comparer une autre de leurs propriétés : quel mince avantage !

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par Carmichael Voir le message
    Bonjour,

    Merci à Cirec pour sa réponse que je vais examiner avec soin.

    Pour Paul : Je ne partage pas votre point de vue. Vous dites que si A = B alors A et B pointent vers le même objet. Non, pas du tout.
    Voici un exemple : Dans un jeu, A et B sont 2 villes. Chaque ville possède x propriétés dont le nom, coord GPS, et la population.
    Je déclare que A = B si les populations sont égales. Il s'agit pourtant bien de 2 villes différentes, donc de 2 objets différents.
    Je peux également vouloir tester si A > B, etc.

    Cordialement

    Carmichael
    ah mais j'ai parfaitement compris ce que vous vouliez faire, mais autant je trouve cela élégant sur par exemple TVector3D avec des surcharges d'opérateurs qui existent de fait pour les vecteurs en mathématiques, autant pour une ville, l'opérateur "égal" n'a pas de sens évident. Est-ce que "Lille = Lyon" ? Est-ce que "Mario = Link" ? On peut très bien définir un opérateur de comparaison, mais il me semble plus logique de dire "Lille.Population = Lyon.Population" ou encore "Lille.SameSizeThen(Lyon)" ou "Mario.AsPowerfulThen(Link)" car cela permet de savoir ce que l'on compare.

  7. #7
    Membre éprouvé
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Points : 1 073
    Points
    1 073
    Par défaut
    je vous rassure, il n'y a pas de confusion possible à la lecture du code.

    La comparaison: if (a = b) reste inchangée puisque l'astuce que je propose
    demande un transtypage: if (TCompareEdit(a) = TCompareEdit(b) ...
    en lisant cela on sait ce qu'on fait !
    vous l'aurez remarqué j'ai changé le nom du record en "TCompareEdit" pour plus de lisibilité
    et j'ai ajouté au code les deux autres comparaisons afin de bien voir qu'il n'y a pas de confusions (enfin pour moi )
    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
    type
      TEdit = class(StdCtrls.TEdit)
       function Equals(Obj: TObject): Boolean; override;
      end;
       // ceci ne fonctionne pas
      //TEditHelper = class helper for TEdit
      //public
      //class operator EQUAL(a: TEdit; b: TEdit): boolean;
      //end;
     
      // par contre ceci oui
      TCompareEdit = record
        Data: TEdit;
      public
        class operator Implicit(a: TEdit): TCompareEdit;
        class operator Equal(a: TCompareEdit; b: TCompareEdit): Boolean;
      end;
     
     
      TForm27 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form27: TForm27;
     
    implementation
     
    {$R *.dfm}
      { TEdit }
    function TEdit.Equals(Obj: TObject): Boolean;
    begin
      Result := False;
      if Obj is TEdit then
        Result := Text = TEdit(Obj).Text;
    end;
      { TCompareEdit }
    class operator TCompareEdit.Implicit(a: TEdit): TCompareEdit;
    begin
      Result.Data := a;
    end;
     
    class operator TCompareEdit.Equal(a: TCompareEdit; b: TCompareEdit): Boolean;
    begin
      Result := a.Data.Text = b.Data.Text;
    end;
     
    procedure TForm27.Button1Click(Sender: TObject);
    begin
      if TCompareEdit(Edit1) = TCompareEdit(Edit2) then
        MessageBox(Handle, 'Identiques', 'TCompareEdit(Edit1) = TCompareEdit(Edit2)', MB_OK)
      else
        MessageBox(Handle, 'Différents', 'TCompareEdit(Edit1) = TCompareEdit(Edit2)', MB_OK);
     
      if Edit1.Equals(Edit2) then
        MessageBox(Handle, 'Identiques', 'Edit1.Equals(Edit2)', MB_OK)
      else
        MessageBox(Handle, 'Différents', 'Edit1.Equals(Edit2)', MB_OK);
     
      if Edit1 = Edit2 then
        MessageBox(Handle, 'Identiques', 'Edit1 = Edit2', MB_OK)
      else
        MessageBox(Handle, 'Différents', 'Edit1 = Edit2', MB_OK);
    end;
     
    end.
    Quand à l'utilité d'un tel code on pourrais en discuter
    mais le but était de fournir une réponse aussi proche
    que possible de la demande initiale

    Cordialement,

    @+

  8. #8
    Futur Membre du Club
    Homme Profil pro
    un site qui demande d'info perso ça m'énerve
    Inscrit en
    Mars 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : un site qui demande d'info perso ça m'énerve

    Informations forums :
    Inscription : Mars 2017
    Messages : 3
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Carmichael Voir le message
    Bonjour,

    if (A = b) then
    begin
    ….
    end;


    Carmichael
    Bonjour,

    Sur ce lien tu trouveras un exemple du surcharge d'opérateur avec une liste des opérateurs surchargeables, l'opérateur = est surchargeable en implémentant la méthode Equal.

    Reste à définir dans l'implémentation, les propriétés de l'objet à prendre en compte pour affirmer l'égalité

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

Discussions similaires

  1. LIKE et opérateurs de comparaison
    Par celeamas dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/10/2006, 14h01
  2. Pb avec l'opérateur de comparaison IN
    Par petitnuage dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 16h13
  3. implémentation des opérateurs de comparaison
    Par niko8181 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/04/2005, 11h58
  4. Réponses: 15
    Dernier message: 25/01/2005, 16h51
  5. [C#] Créer un fichier Xml à partir d'un objet
    Par Troopers dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/09/2004, 13h23

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