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.
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.
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;
Merci beaucoup pour ce code, maintenant, va falloir que je revoie mes cours sur les pointeurs.
La partie qui t'interesse le plus c'est
Tous les autres tkxxxx tu peux les mettres de coté ^^
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;
Sinon pour les pointeurs, j'ai pas vraiment regardé, j'ai trouvé ce code et l'ai adapté à mes besoins.
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.
J'avance progressivement sur le code, je bute sur un nouveau problème.
Voici une partie du code :
Je récupère ainsi les infos sur la méthode, ThePropList[ i ] est un TPropInfo, l'aide de Delphi dit que :
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;
Description
Donc GetProc est un pointeur vers la méthode.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.
J'ai essayé de déclarer
Puis d'affecter une variable de cette façon :
Code : Sélectionner tout - Visualiser dans une fenêtre à part TDblClick = procedure( Sender : TObject ) of object;Mais cela créé une violation d'accés.
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 );
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' );
Bonjour,
As-tu essayé comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part aProcedure := ThePropList[ i ].GetProc ; // au lieu de GetProc^
Oui et le compilateur n'est pas content :
[Erreur] ...pas (444) : Types incompatibles : 'TDblClick' et Pointer'
le champs GetProc contient le 'getter' d'une propriété dans le cas d'un gestionnaire d'évenement mieux vaut cette approche :
La publication d'un tutoriel sur les bases de RTTI est prévue pour vendredi.
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;
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.
Excuse moi hier soir j'ai fait une recopie rapide.Envoyé par WebPac
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;
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.
Je te renvoie le remerciement car je me suis aperçus que je ne traitais pas l'appel des getter et setter sous RTTI.Envoyé par WebPac
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager