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 :

Comment lister les méthodes d'une Form ?


Sujet :

Langage Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut Comment lister les méthodes d'une Form ?
    Salut tout le monde.

    Dans la FAQ de Delphi, il y a un exemple pour retrouver une méthode ou une procédure en fonction de son nom, mais comment faire pour avoir l'ensemble des méthodes d'une fiche ?
    Est-ce possible ?

    Merci.

  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
    Voici un petit code qui permet de récupérer les methodes propriété etc .. d'un objet.

    Le resulat est mis dans une stringgrid

    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
     
    procedure TForm1.GetObjectInfo(Objet: TObject);
    var
     PData   : PTypeData;
     PListe  : PPropList;
     NbProps,
     I       : Integer;
     Method  : TMethod;
     iPosGrid : integer;
    begin
      PData := GetTypeData(PTypeInfo(Objet.ClassInfo));
      NbProps := PData^.PropCount;
     
      New(PListe);
      GetPropInfos(PTypeInfo(Objet.ClassInfo), PListe);
      SortPropList(PListe,NbProps);
     
      with StringGrid1 do
      begin
        ColCount := 3;
        RowCount := NbProps + 1;
        for i := 0 to RowCount -1 do
          Cells[1,i] := '';
        iPosGrid := 1;
        for I := 0 to NbProps -1 do
        begin
          Cells[0,iPosGrid] := PListe^[I]^.Name;
          Cells[2,IposGrid] := PListe^[I]^.PropType^.Name;
     
           case PListe^[I]^.PropType^.Kind of
                tkInteger: begin
                  if UpperCase(PListe^[I]^.PropType^.Name) = 'TCOLOR' then
                    Cells[1,iPosGrid] := IntToHex(GetOrdProp(Objet, PListe^[I]),6)
                  else
                    Cells[1,iPosGrid] := IntToStr(GetOrdProp(Objet, PListe^[I]));
                end;
     
                tkString,tkWString,tkLString :
                  Cells[1,iPosGrid] := GetStrProp(Objet, PListe^[I]);
     
                tkFloat :
                  Cells[1,iPosGrid] := FormatFloat('0.0000000',GetFloatProp(Objet, PListe^[I]));
                tkEnumeration : begin
                  if UpperCase(PListe^[I]^.PropType^.Name) = 'BOOLEAN' then
                    Case GetOrdProp(Objet, PListe^[I]) of
                      0: Cells[1,iPosGrid] := 'False';
                      1: Cells[1,iPosGrid] := 'True';
                      else
                         Cells[1,iPosGrid] := 'Inconnue';
                    end;
                end;
                tkMethod :
                begin
                  Method := GetMethodProp(Self, PListe^[I]);
                  if Method.Code <> NIL then
                    Cells[1,iPosGrid] := ' (' +
                      TObject(Method.Data).MethodName(Method.Code) + ')';
                end;
                tkUnknown:
                  Cells[1,iPosGrid] := 'Inconnue';
           end; // case
           inc(iPosGrid);
        end;
      end;
     
      Dispose(PListe);
    end;
    Modérateur Delphi

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

  3. #3
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci beaucoup pour ce code, maintenant, va falloir que je revoie mes cours sur les pointeurs.

  4. #4
    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
    La partie qui t'interesse le plus c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     tkMethod :
                begin
                  Method := GetMethodProp(Self, PListe^[I]);
                  if Method.Code <> NIL then
                    Cells[1,iPosGrid] := ' (' +
                      TObject(Method.Data).MethodName(Method.Code) + ')';
                end;
    Tous les autres tkxxxx tu peux les mettres de coté ^^

    Sinon pour les pointeurs, j'ai pas vraiment regardé, j'ai trouvé ce code et l'ai adapté à mes besoins.
    Modérateur Delphi

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

  5. #5
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci pour ton travail d'adaptation, c'est super sympa. :o
    Finalement, je vais garder le reste du code aussi et m'en servir, il est fort utile.

  6. #6
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    J'avance progressivement sur le code, je bute sur un nouveau problème.
    Voici une partie du 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
    var
      ThePropList : TPropList;
      i, NbreTotal : Integer;
      aTypeData : TTypeData;
    begin
    // ... Initialisation de la ThePropList ne contenant que des méthodes
     
      for i := 0 to NbreTotal - 1 do
        if ThePropList[ i ].Name = 'OnDblClick' then
        begin
         aTypeData := ( GetTypeData( ThePropList[ i ].PropType^ ) )^;
         if aTypeData.MethodKind = mkProcedure then
          begin
            // J'essaie de lancer la méthode pointée par GetProc
            ThePropList[ i ].GetProc^ ; // Ne marche pas
          end;
    Je récupère ainsi les infos sur la méthode, ThePropList[ i ] est un TPropInfo, l'aide de Delphi dit que :
    Description

    TPropInfo est l'enregistrement des informations de propriétédécrivant une propriétéen cours d'édition et ses fonctions d'accès.
    GetProc et SetProc sont les pointeurs des méthodes qui lisent et définissent la valeur de propriété.Ces méthodes appartiennent au composant dont la propriétéest en cours d'édition.
    Donc GetProc est un pointeur vers la méthode.

    J'ai essayé de déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TDblClick = procedure( Sender : TObject ) of object;
    Puis d'affecter une variable de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      aProcedure : TDblClick;
    begin
    // ...
           aProcedure := ThePropList[ i ].GetProc^ ;
            aProcedure( aData );
    Mais cela créé une violation d'accés.

    Comment puis-je lancer cette méthode ayant un pointeur sur elle ?

    PS : j'ai mis une simple procédure derrière cette méthode qui va faire un ShowMessage( 'Réussi' );

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    As-tu essayé comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    aProcedure := ThePropList[ i ].GetProc ; // au lieu de GetProc^
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Oui et le compilateur n'est pas content :
    [Erreur] ...pas (444) : Types incompatibles : 'TDblClick' et Pointer'

  9. #9
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    le champs GetProc contient le 'getter' d'une propriété dans le cas d'un gestionnaire d'évenement mieux vaut cette approche :
    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
     
    procedure AfficheDetails(Informations : TPropInfo);
    var
     TypePropriete : String;
     DonneePropriete: PTypeData;
     Method : TMethod;
     Resultat : String;
    ...
                       //Exécute le code associé à la propriété
                      Method := GetMethodProp(UnObjet, Informations.Name);
                      if Method.Code <> NIL then //UnObjet.OnTraitement:=Nil
                       begin
                        Resultat:='';
                        TTraitement(Method)(Resultat);
                        Writeln(Resultat);
                       end;
    La publication d'un tutoriel sur les bases de RTTI est prévue pour vendredi.

  10. #10
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Un tutoriel sur la RTTI n'est pas de trop car l'aide de Delphi est très pauvre sur le sujet et sur internet, on ne trouve quasiment aucune information non plus.

    Par contre, la fonction TTraitment, n'est pas reconnu par Delphi, l'aide de Delphi ne la connait pas non plus, et google ne trouve aucune info dessus.
    Que dois-je en faire ? Ne serait-ce pas une fonction que tu aurrais écrit ?

    PS : je travaille avec Delph 7.

  11. #11
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par WebPac
    Ne serait-ce pas une fonction que tu aurrais écrit ?
    Excuse moi hier soir j'ai fait une recopie rapide.
    On doit transtyper l'instance de type TMethode avec le prototype de la méthode à appeler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
     TTraitement= procedure (S:String) of object;

  12. #12
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Merci pour ton aide, ça marche ainsi.

    J'ai d'autres questions mais vu que je diverge du sujet principal, je vais faire un autre topic.

  13. #13
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par WebPac
    Merci pour ton aide, ça marche ainsi.
    Je te renvoie le remerciement car je me suis aperçus que je ne traitais pas l'appel des getter et setter sous RTTI.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 01/11/2006, 16h04
  2. Comment lister les tables d'une base
    Par pconrad dans le forum C++Builder
    Réponses: 4
    Dernier message: 29/08/2006, 17h03
  3. [Sql] Comment lister les tables d'une base ?
    Par Mynautor dans le forum DB2
    Réponses: 6
    Dernier message: 05/09/2005, 13h21

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