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 :

Property (Get/set) et assignement de valeur sur propriété de propriété


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 46
    Points
    46
    Par défaut Property (Get/set) et assignement de valeur sur propriété de propriété
    Bonjour,

    Alors rapidement en supposant deux objets de type

    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
     
    type 
     
      TCoordinates : class(TObject)
        public
           X : integer;
           Y : integer;
           Z : integer;
        end;
     
      TNewObjet : class(TObject)
        private
           FPosition : TCoordinates;
           procedure SetPosition(Value : TCoordinates );
           function GetPosition :  TCoordinates ;
        published
           property Position : TCoordinates read GetPosition write SetPosition;
        end;


    Je souhaiterais intercepter une action sur instance, par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      MonObjet : TNewObjet ;
    begin
     
      MonObjet := TNewObjet.Create ;
     
      MonObjet.Position.X := 15; 
     
      MonObjet.Free;
    end;
    comme ici j'accede a l'attribut X de position on a en réalite l'équivalent de
    MonObjet.GetPosition.X := 15;
    or moi je voudrais générer une action entre :

    MonObjet.Position.X := 15 et FPosition.X := 15;


    Quelqu'un sait'il comment faire sa ?

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Mettre aussi des accesseurs sur X, Y et Z dans TCoordinates

    car comme tu l'as mentionné

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjet.Position.X := 15
    cela donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjet.GetPosition.SetX(15);

  3. #3
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    J'ai une petite question tout de même

    Code le merou : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var
      MonObjet : TNewObjet ;
    begin
     
      MonObjet := TNewObjet.Create ;
     
      MonObjet.Position.X := 15; 
     
      MonObjet.Free;
    end;

    Es-tu sur que celà fonctionne car nul part on ne crée l'instance de type TCoordinates ...

    Aussi, je me demande pourquoi 2 objets ... Un simple record ne suffirait pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type 
      TCoordinates = record
           X : integer;
           Y : integer;
           Z : integer;
        end;
    En faite, tu voudrais faire ceci pour l'affectation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObjet.Position.X:=15;
    Et pour lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var a:integer;
    a:=MonObjet.Position.X;
    Merci

    A+

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 46
    Points
    46
    Par défaut
    Ok je détail, je me suis mal expliqué
    Mon problème n'est pas tant cet exemple, il est juste là pour le montrer.

    Je tiens à noter que je ne dois pas modifier TCoordinates donc pas d'ajout d'accesseur.

    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
     
     
    type
     
      TCoordinates = class(TObject)
        public
           X : integer;
           Y : integer;
           Z : integer;
        end;
     
      TNewObjet = class(TObject)
        private
           FPosition : TCoordinates;
           procedure SetPosition(Value : TCoordinates );
           function GetPosition :  TCoordinates ;
        public
          constructor Create;
          destructor Destroy; override;
        published
           property Position : TCoordinates read GetPosition write SetPosition;
        end;
     
    implementation
     
     
    { TNewObjet }
     
    constructor TNewObjet.Create;
    begin
      inherited;
      FPosition := TCoordinates.Create;
    end;
     
    destructor TNewObjet.Destroy;
    begin
      FPosition.Free;
      inherited;
    end;
     
    function TNewObjet.GetPosition: TCoordinates;
    begin
      result := FPosition;
      showmessage('GetPosition');
    end;
     
    procedure TNewObjet.SetPosition(Value: TCoordinates);
    begin
      FPosition := Value;
      showmessage('SetPosition');
    end;

    ensuite dans le code de création d'une fiche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      MonObjet : TNewObjet ;
    begin
      MonObjet := TNewObjet.Create ;
      MonObjet.Position.X := 10; // affiche 'GetPosition'
      MonObjet.Free;
    end;
    Mon objectif est de savoir que la position de l'objet a été modifié en ayant un moyen de le notifier en écrivant juste MonObjet.Position.X := 10;

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 612
    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 612
    Points : 25 303
    Points
    25 303
    Par défaut
    Je tiens à noter que je ne dois pas modifier TCoordinates donc pas d'ajout d'accesseur
    Bon courage alors, ... un timer à la limite pour tester la valeur régulièrment car avec un thread sans section critique sur X, risque de problème de partage (peu problable sur integer)

    Citation Envoyé par ero-sennin
    Es-tu sur que celà fonctionne car nul part on ne crée l'instance de type TCoordinates ...
    La remarque de ero-sennin est pertinente, même si implicitement avec une variable FPosition, semblait naturellement instancié\libré dans le constructeur et destructeur ...

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 38
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message

    La remarque de ero-sennin est pertinente, même si implicitement avec une variable FPosition, semblait naturellement instancié\libré dans le constructeur et destructeur ...
    C'est vrai, c'est pour ça que j'ai réécris le code pour être plus clair.

    Bon sinon c'est bien ce que je pensais ... c'est dommage. Il ne me reste plus qu'a créé des propriétés:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          property X: integer index 0 read GetPosition write SetPosition;
          property Y: integer index 1 read GetPosition  write SetPosition;
          property Z: integer index 2 read GetPosition  write SetPosition;
    et supprimer la proprété position.

    Merci de votre aide.

Discussions similaires

  1. Assigner une valeur sur cellule Datagrid a l'aide d'un clic
    Par Am34000 dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 20/07/2010, 17h14
  2. [VB.NET] Property Get Set
    Par thomaldinho dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/01/2010, 22h46
  3. Problèmes sur Get Set d'une variable.
    Par Mattk dans le forum Windows Forms
    Réponses: 5
    Dernier message: 07/04/2007, 01h43
  4. get set modifier valeur
    Par jcaspar dans le forum Langage
    Réponses: 1
    Dernier message: 11/03/2007, 01h36
  5. [VB6]Property Get/Set avec groupe de contrôles
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/01/2006, 12h09

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