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 :

Modifier la valeur des propriétés


Sujet :

Langage Delphi

  1. #1
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut Modifier la valeur des propriétés
    Je suis en D7 et j'ai besoin de modifier la valeur d'une propriété d'un objet.
    J'utilise donc le RTTI mais étrangement quand je vais lire une propriété je la trouve bien mais le IsPublishedProp renvoie toujours False.
    Exemple (voir la ligne 55 IsPublishedProp) de mon code :
    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
     
    unit Unit1;
    interface
    uses
      Classes, Controls, Forms,
      StdCtrls,TypInfo;
     
    type
      TForm1 = class(TForm)
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
      private
        FsTest: string;
        procedure SetsTest(const Value: string);
        { Déclarations privées }
      public
        { Déclarations publiques }
      published
        property sTest: string  read FsTest write SetsTest;
      end;
     
     TOClient = class(TObject)
      private
        FCL_ABOID: integer;
        procedure SetCL_ABOID(const Value: integer);
         { Déclarations privées }
      protected
        { Déclarations protégées }
      public
        { Déclarations publiques }
      published
     
        property CL_ABOID: integer  read FCL_ABOID write SetCL_ABOID;
      end;
    var
      Form1: TForm1;
      OCl : TOClient;
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.btn1Click(Sender: TObject);
    var iBcl,iNb : Integer;
      ListeProprietes: TPropList;
      sNameTemp : string;
      DonneePropriete: TPropInfo;
     
    begin
      OCL := TOClient.Create;
      iNb := GetPropList(TypeInfo(TOClient), tkAny, @ListeProprietes);
      for iBcl := 0 to iNb-1 do
      begin
        DonneePropriete := ListeProprietes[iBcl]^;
        sNameTemp := DonneePropriete.Name;
        if Pos('CL_ABOID',sNameTemp)>0 then
          if IsPublishedProp(OCL,sNameTemp) then
            SetOrdProp(OCL,sNameTemp,Longint(0)) ;
      end;
    end;
     
    procedure TForm1.SetsTest(const Value: string);
    begin
      FsTest := Value;
    end;
    { TOClient }
    procedure TOClient.SetCL_ABOID(const Value: integer);
    begin
      FCL_ABOID := Value;
    end;
    end.
    Une idée ??
    Fichiers attachés Fichiers attachés

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Est ce que la liste ne te renverrait pas la liste des propriétés avec des trucs en plus ?
    Est ce que dans sNameTemp tu as bien seulement CL_ABOID ?

    As tu testé en mettant directement CL_ABOID dans IsPublishedProp ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    @Rayek
    Merci pour ta réponse.
    A priori ma liste renvoie bien la bonne valeur.
    J'ai seulement CL_ABOID dans sNameTemp et j'ai testé (sans plus de succès !) en mettant 'CL_ABOID' en 'dur' dans IsPublishedProp.
    Ce qui est étonnant c'est que pour un autre objet (par exemple Form1 dans mon exemple) ça fonctionne bien...
    J'ai l'impression que je passe à côté d'un truc mais..lequel ?

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En effet, tu passes à coté d'un truc. Mais faut le savoir, donc tu es pardonné

    En fait, le compilateur Delphi ne stocke pas les RTTI complètes pour toutes les classes. Historiquement, c'est une question de ne pas surcharger l'exécutable. Aujourd'hui, je n'en vois plus l'intérêt, mais bon, je ne suis pas développeur du compilateur Delphi non plus

    Pour qu'une classe ait ses RTTI complètes, il faut qu'elle ait été déclarée sous la directive de compilation {$M+}, ou être descendante d'une classe qui l'a été. Typiquement, seule la classe TPersistent est déclarée sous cette directive. On dit donc souvent (à presque raison) que seules les classes descendant de TPersistent ont des RTTI complètes.

    Donc tu as deux solutions. Soit tu fais hériter TOClient de TPersistent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TOClient = class(TPersistent)
        ...
      end;
    Soit tu l'entoures de {$M+} et {$M-} :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {$M+}
     
    type
      TOClient = class(TObject)
        ...
      end;
     
    {$M-}
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Membre chevronné Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 552
    Points : 1 780
    Points
    1 780
    Par défaut
    Merci Sjrd !!
    ça marche maintenant !
    Pourtant j'avais cherché avant de poster.

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

Discussions similaires

  1. Modifier les valeurs des propriétés d'un sélecteur
    Par marcel marie dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 02/03/2015, 19h19
  2. Réponses: 5
    Dernier message: 06/08/2008, 16h24
  3. rafraichir les valeurs des propriétés inserées
    Par akkeri dans le forum VBA Word
    Réponses: 1
    Dernier message: 14/12/2007, 23h58
  4. Lire un fichier Excel pour modifier les valeurs des cellules
    Par Paloma dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 31/10/2006, 15h13
  5. Réponses: 2
    Dernier message: 31/05/2005, 07h04

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