Question d'un degrée de difficulté un peu élevé, qui est capable de répondre?

cbonus2000 Messages postés 32 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 2 décembre 2009 - 13 mai 2004 à 22:39
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 - 14 mai 2004 à 22:00
Question d'un degrée de difficulté un peu élevé:

Est-ce qu'il y a moyen d'aller chercher toutes les propriétés de type string d'une classe (Classe descendant de TComponent)?

Par exemple, la classe TFORM, aller chercher au RunTime ces propriétés de type string tel que: Caption, Hint, Name, etc...

_______
Bonus

9 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
13 mai 2004 à 23:17
En raclant les fonds de tiroir, je viens de retrouver quelque chose qui devrait répondre à ta question :

procedure GetProperties(Objet: TObject; Items: TStrings);
var
 iI : integer;
 PropList : TPropList;
 Scope, AName : string;
begin
  AName := GetPropInfo(Objet, 'Name')^.Name;
  iI := 0;
  GetPropList(Objet.ClassInfo, tkProperties + [tkMethod], @PropList);
  Items.Add( AName +' Class : '+ Objet.ClassName);
  Items.Add('----------------------');
  while ((nil <> PropList[iI]) and (iI < High(PropList))) do
  begin
    Scope := IfThen(IsPublishedProp(Objet, PropList[iI].Name), ' (Published)');
    Scope := Scope + Ifthen(IsStoredProp(Objet, PropList[iI].Name), ' (Stored)');

    Items.Add(PropList[iI].Name + ' : ' + PropList[iI].PropType^.Name + Scope);
    inc(iI);
  end;
end;


En fournissant à cette procédure les deux arguments demandés, on obtient les infos sur chaque propriété d'un objet.
Exemple d'utilisation :
procedure TForm1.btnGetInfosClick(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.BeginUpdate;
  GetProperties(Memo1, Memo1.Lines);
  Memo1.Lines.EndUpdate;
end;

Extrait de ce qui apparait dans le memo :
Name Class : TMemo
----------------------
Align : TAlign (Published) (Stored)
Alignment : TAlignment (Published) (Stored)
Anchors : TAnchors (Published)
BevelEdges : TBevelEdges (Published) (Stored)
BevelInner : TBevelCut (Published) (Stored)
BevelKind : TBevelKind (Published) (Stored)

En aménageant un peu le code plus haut, tu devrais pouvoir obtenir ce que tu cherches.
May Delphi be with you
0
TheShAmAn Messages postés 148 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 1 février 2006
14 mai 2004 à 10:37
MOi je dis BJ DelphiProg... trop fort :big)
0
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
14 mai 2004 à 10:45
Deux précisions :
1- les bases du code ne sont pas de moi. J'ai apporté quelques modifications en fonction de mes besoins

2- ne pas oublier d'ajouter TypInfo dans une des clauses uses de l'unité.

Pour ceux que le sujet intéresse, faites une recherche sur delphi et RTTI.
May Delphi be with you
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 mai 2004 à 11:08
Vraiment intéressant.
Je viens de passer une heure sur ce code, et je n'ai pas perdu mon temps !

Dans la rubrique "ça ne marche pas chez moi":
- ne pas oublier d'appeler TypInfo.pas ;)
- sous D4pro, les fonctions "IsPublishedProp" et "IsStoredProp" ne sont pas disponibles dans TypInfo.pas. Il faudra donc s'en passer et rester dans une cruelle incertitude quand à la publication et au stockage du composant :dissapprove)
- la fonction "IfThen" est-elle une fonction personnelle, ou apparue avec D7 ? Elle a l'air bien pratique. J'ai du également m'en passer en alourdissant le code...

Bien pratiques les procedures "BeginUpdate" et "EndUpdate" appliquées aux TStrings (je ne connaissais pas).

Merci beaucoup, Delphi"prof" ;)

Bonne prog' à toutes et à tous :-p
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
14 mai 2004 à 12:17
La fonction IfThen avait déjà fait l'objet d'une discussion suite à un code source publié par Bestiol réalisant des fonctionnalités équivalentes.
Pour information, elle est disponible dans l'unité StrUtils ou Math (je cite l'aide en ligne). Celle utilisée ici est celle déclarée dans StrUtils.

Quant aux méthodes BeginUpdate et EndUpdate, elles permettent d'éviter l'actualisation de l'affichage à chaque fois qu'on modifie un composant gérant des listes de chaînes.
Essaie sans l'appel de ces méthodes et tu pourras constater un écart substantiel dans le temps de traitement. Il n'y a même pas besoin de se munir d'un chronomètre pour mesurer les écarts. :)

Et merci à Japee pour la précision concernant Delphi 4 pro.
May Delphi be with you
0
cbonus2000 Messages postés 32 Date d'inscription vendredi 14 février 2003 Statut Membre Dernière intervention 2 décembre 2009
14 mai 2004 à 14:04
J'avais déjà trouver un code similaire un moment donné, je savais que sa pouvait se faire et que sa existait, mais j'avais perdu ce code.... cette fois-ci je ne le perdrai plus ;).

Je croyais que ma question serait un peu plus dur et longue a répondre, mais bon, je suis content de la réponse, de la rapidité et efficacité surtout. Et surtout, que c'Est une réponse qui semble en intéresser plus que un.

Donc, Delphiprog, pour conclure, seulement deux mots:

Merci beaucoup!!

_______
Bonus
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
14 mai 2004 à 14:33
Ben dit donc, mon pauvre Japee, il nous en manque des trucs dans Delphi 4 Pro
Pas de IfThen, pas de IsPublishedProp ou de IsStoredProp !
En plus t'as du remarquer que la fonction GetPropInfo n'a pas les mêmes paramètres : en Delphi 4 il faur écrire
AName := GetPropInfo(Objet.ClassInfo, 'Name')^.Name;

...sans parler de tous les autres petits problèmes de compatibilité avec les sources des versions supérieures ...

Bon courage aux Delphi4mens !

Kenavo

Code, Code, Codec !
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 mai 2004 à 21:54
Mon pauvre Kenavo, on est mal barrés ;)
Aurais-tu toi aussi, par le plus grand des hasards, acheté Delphi4 Pro en soldes chez un commerçant alsacien renommé dont je tairai le nom (je ne suis pas payé pour faire de la pub pour Pearl) mais c'était "Presque Offert" ?
Ouais, le plus pénible, c'est de devoir copier/coller etc... recompiler pas mal des sources disponibles sur le site...
Encore que je triche un peu, disposant d'une version de D6 Entreprise à portée de main ;)
Le plus cruel étant de ne pas disposer des magnifiques ShellTreeView, ShellListView et ShellComboBox, et de se limiter à l'horrible DirectoryListBox de l'onglet Win 3.1... :(
Mais je l'aime, mon Delphi 4 pro, c'est comme ça. :kisses)

Pour en revenir au principal :
- l'unité Math est disponible pour D4, mais pas StrUtils;
- manque de pot, en plus et de toute manière, pas de fonction "IfThen" dans Math sous D4;

Delphiprog, les fonctions "BeginUpdate" et "EndUpdate" sont bluffantes de rapidité. :(

Et voici pour les pauvres "Delphistes Quattre" un code trouvé je ne sais plus où sur Internet, similaire à celui de DelphiProg, et légèrement retouché par mes soins. Je ne sais pas si ça ajoute grand chose, mais bon...

Donc, ne pas oublier de déclarer "uses TypInfo;", puis dans l'implémentation :

procedure GetPropertiesD4(Objet: TObject; Items: TStrings);
var
  PropList: PPropList;
  i: integer;
  AName: String;
begin
  PropList := AllocMem(SizeOf(PropList^));
  AName := GetPropInfo(Objet.ClassInfo, 'Name')^.Name;
  i := 0;
  try
    GetPropList(Objet.ClassInfo, tkProperties + [tkMethod], PropList);
    Items.Add( AName +' Class : '+ Objet.ClassName);
    Items.Add('----------------------');
    while (PropList^[i] <> Nil) and (i < High(PropList^)) do
    begin
      Items.Add(PropList^[i].Name + ': '  +
        PropList^[i].PropType^.Name);
      Inc(i);
    end;
  finally
    FreeMem(PropList);
  end;
end;


qu'on peut utiliser ainsi :

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  Memo1.Lines.BeginUpdate;
  GetPropertiesD4(Memo1, Memo1.Lines);
  Memo1.Lines.EndUpdate;
end;


Bonne prog' :-p
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 mai 2004 à 22:00
Je me suis précédemment trompé de smiley et voulais exprimer :

Delphiprog, les fonctions "BeginUpdate" et "EndUpdate" sont bluffantes de rapidité. :shock)
0
Rejoignez-nous