begin process at 2010 02 09 18:40:35
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > CONSERVER LES NOMS DE DÉFINITION D'UN TYPE ÉNUMÉRÉ

CONSERVER LES NOMS DE DÉFINITION D'UN TYPE ÉNUMÉRÉ


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Classé sous :getenumname, getenumvalue, type, énuméré, exécutable Niveau :Débutant Date de création :21/01/2003 Date de mise à jour :03/05/2003 02:21:53 Vu / téléchargé :3 804 / 115

Auteur : Nono40

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

C'est un truc tout simple pour afficher les nom de constante utilisés dans un type énuméré. Il permet aussi de déterminer l'indice dans le type en ne connaissant que le nom.

Par exemple si on définit un type enuméré du style TMonTypeEnum=(mtUN,mtDEUX,mtTROIS), Delphi traite les variables de ce type comme des variables de type ordinal. Il n'est pas directement possible d'en afficher le nom comme on affiche un entier avec IntToStr. Le plus souvent on utilise un Case Of pour donner les noms :
Var t:TmonTypeEnum;
...
Case t Of
mtUn:LeNom:='mtUN';
mtDeux:LeNom:='mtDEUX';
mtT rois:LeNom:='mtTROIS';
End;

Or il est possible de demander à Delphi de conserver les noms dans le .EXE et de les obtenir. Je ne savais pas du tout que c'était possible, c'est donc pour cela que je poste ce truc. Je n'était peut-être pas le seul à ne pas le savoir.

Dans l'exemple ci dessus il suffit de faire
LeNom:=GetEnumName(TypeInfo(TMonTypeEnum),In teger(t));

GetEnumName n'est pas documentée dans l'aide de Delphi 6. Il est vrai que son utilisation est plutôt rare...  

Source

  • Uses TypInfo;
  • type
  • // Défintion d'un type personnalisé tout simple
  • Type TChiffre=(Zero,Un,Deux,Trois,Quatre,Cinq,Six,Sept,Huit,Neuf);
  • procedure TForm1.Button1Click(Sender: TObject);
  • begin
  • // Affichage du nom de la constante définie dans le type énuméré
  • ShowMessage(GetEnumName(TypeInfo(TChiffre),SpinEdit1.Value));
  • end;
  • procedure TForm1.Button2Click(Sender: TObject);
  • Var i:Integer;
  • begin
  • // Obtention de l'indice de la constante
  • i := GetEnumValue(TypeInfo(TChiffre),Edit1.Text);
  • if i<0 Then Label2.Caption:='<inconnu>'
  • Else Label2.Caption:=IntToStr(i);
  • end;
Uses TypInfo;

type
// Défintion d'un type personnalisé tout simple
Type TChiffre=(Zero,Un,Deux,Trois,Quatre,Cinq,Six,Sept,Huit,Neuf);

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Affichage du nom de la constante définie dans le type énuméré
  ShowMessage(GetEnumName(TypeInfo(TChiffre),SpinEdit1.Value));
end;

procedure TForm1.Button2Click(Sender: TObject);
Var i:Integer;
begin
  // Obtention de l'indice de la constante
  i := GetEnumValue(TypeInfo(TChiffre),Edit1.Text);
  if i<0 Then Label2.Caption:='<inconnu>'
         Else Label2.Caption:=IntToStr(i);
end;
 

 Conclusion

La directive $M à été supprimée du source, après le commentaire de Delphiprog.

Cette source et quelques autres sur : http://nono40.developpez.com

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec une capture TAUX D'OCCUPATION DU PROCESSEUR
Source avec Zip SYNCHRONISER DEUX LISTBOX
Source avec Zip Source avec une capture SUPPRIMER LE SCINTILLEMENT AVEC DOUBLEBUFFERED
SETFOCUS SUR UN BOUTON D'UN RADIOGROUP
Source avec Zip DESSINER DANS LE SYSTRAY AVEC CREATEICON

 Sources de la même categorie

Source avec Zip NEXTGENS -> UNITÉS DE TYPES ÉVOLUÉS NOUVELLE GÉNÉRATION (DE... par f0xi
Source avec Zip Source avec une capture AUTO-COMPLÉTION D'UN CONTRÔLE DE SAISIE par Bacterius
Source avec Zip CARDS GAME SDK 1.0.0.0 par f0xi
Source avec Zip Source avec une capture TRAYICON - VOTRE ICONE DANS LA BARRE DES TACHES par Bacterius
Source avec Zip Source avec une capture WINHIDER _ CACHER UN PROGRAMME DE L'ÉCRAN ET DE LA BARRE DE ... par soldier8514

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture UN PETIT GÉNÉRATEUR DE FACTURES par ROCABDEL
Source avec Zip TABLEAU DE TYPE DYNAMIQUE SANS VARIANT par DevNul
Source avec Zip MISE À JOUR AUTOMATIQUE D'UNE APPLICATION CLIENT/SERVEUR par cantador
CONNAITRE LE TYPE D'UN FICHIER TEXTE BRUT (ANSI, UTF8, UNICO... par f0xi

Commentaires et avis

Commentaire de Delphiprog le 21/01/2003 23:02:08 administrateur CS

Si GetEnumName renvoie une valeur littérale, il y a aussi la réciproque : GetEnumValue. Ci-après une démonstration :

uses
  TypInfo;
type
  TTestEnum =(Un, Deux, Trois, Quatre, Cinq, Six, Sept, Huit, Neuf);
const
  TabTestEnum : array[TTestEnum] of String=
  ('Un','Deux','Trois','Quatre','Cinq','Six','Sept','Huit','Neuf');

procedure TForm1.Button1Click(Sender: TObject);
begin
  TrackBar1.Position := GetEnumValue(TypeInfo(TTestEnum), Edit1.Text);
  Edit1.SelectAll;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  TrackBar1.Max := Ord(High(TTestEnum));
  TrackBar1.Min := Ord(Low(TTestEnum));
end;

GetEnumValue admet deux paramètres :
1- un pointeur sur une type énuméré
2- l'équivalent en chaîne de la valeur recherchée
et renvoie un integer indiquant la valeur ordinale dans le type énuméré ou zéro s'il n'a rien trouvé.

L'utilisation de la directive $M n'est pas indispensable ici. Je ne l'ai jamais utilisée et Borland me rassure en écrivant "Une application utilise directement l'indicateur $M de compilation très rarement, si ce n'est jamais".

Commentaire de Nono40 le 21/01/2003 23:30:42

Très bonne remarque, je vais de ce pas modifier le source.

Juste un détail, GetEnumValeu retourne -1 si le nom n'est pas trouvé.

Je suis d'accord que ce n'est pas très utile, mais il y a un cas qui va me servir. J'utilise régulièrement les type énumérés et pour des besoin d'affichage j'avais recours à un Case ou un tableau de chaine constant. Mais dans les deux cas il fallait maintenir le case ou le tableau quand le type énuméré était modifié. Avec cette astuce ce n'est plus nécessaire.

Il est vrai que cela fonctionne aussi sans la directive $M, cela me semblait nécessaire dans ce cas... Je décourve le sujet...

Commentaire de Delphiprog le 21/01/2003 23:59:13 administrateur CS

GetEnumValue ne retourne pas toujours -1. Celà dépend du type de données examinées.

D'autre part, j'ai oublié de préciser que GetEnumValue n'est pas sensible à la casse en ce qui concerne le deuxième paramètre.

Pour info : ces routines existent depuis Delphi 2. Seulement, Borland ne semble pas avoir jugé utile de documenter l'unité TypInfo.Pas.
Et pourtant, ils font souvent allusion aux RTTI (RunTime Type Information) dans leur manuels.

Commentaire de Nono40 le 22/01/2003 00:14:14

Ben quand on regarde le source de GetEnumValue il semble que si. GetEnumValue appelle la fonction GetEnumNameValue qui retourne -1 si la chaine n'est pas trouvée :
...
        {       we haven't found the thing - return -1  }
@notFound:
        OR      EAX,-1

@exit:
        POP     EDI
        POP     ESI
        POP     EBX
end;

Par contre -1 peut aussi être retourné pour la valeur True des type LongBool WordBool ou ByteBool.

Commentaire de cbonus2000 le 13/05/2004 22:36:40

Question:
  Est-ce qu'il y a moyen d'aller chercher toutes les propriétés de type string d'une classe?
Par exemple, la classe TFORM, aller chercher au RunTime ces propriétés de type string tel que: Caption, Hint, Name, etc...

Je ne crois pas que ma question est directement lié à cette source mais....peut-être que quelqu'un avec votre bagage d'expérience....

Commentaire de randry2004 le 24/03/2006 11:49:32

Bonjour, j'aimerai créer une fonction du genre
function TypeToStr( ValeurLittDuTypeEnum : [?]): String;
en travaillant sur le GetEnumValue et le GetEnumName, le soucis c'est que je ne sais pas récuperer le type , En fait ce que je veux c'est mettre en paramètre la valeur enumerée et avoir en sortie le String correspondant, pouvez vous m'aider!
merci

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Affectation avec un type énuméré [ par EddiTheHead ] Voici un exemple : &nbsp; Type TypeCouleur = (Rouge, Vert, Bleu);&nbsp; Var Couleur : TypeCouleur; Chaque &#233;l&#233;ment &#224; un N&#176; d'ordre type ENUM sauvegarde et restauration dans un fichier texte [ par EmKa69 ] Bonjour à tous, je sauvegarde des variables de type enum dans un fichier texte en les convertissant en chaine. avec le code suivant: procedure Save(No subreport [ par Hamitouche ] bonjour j'ai probleme dans un etat fastreport , j'ai utiliser plusieurs subreports sur une bande masterdata et chaque subreport et relier a un query DBgrid [ par nraloux ] Salut à tous, j'ai un problème de rafraichissement de la DBgrid et je sais pas d'ou viens le problème.Je me connecte a la base de donnée par programma Graphe boursier [ par nicola40 ] Bonjour à tous, et très bonne année 2010[^^clinoeil1] je ne suis pas au top en delphi,mais je progresse .... lentement avec beaucoup de questions ! [ Composants Rave - Delphi 8 - WinForm [ par Taoz ] Bonjour,Je d&#233;bute avec Delphi8 et Rave Report.&nbsp;Le probl&#232;me est que j'ai install&#233; les composants de Rave Report et chaque fois que Créer un exécutable [ par timisan ] Bonjour , je voudrais savoir comment faire pour cr&#233;er un ex&#233;cutable qui soit "lisible" par n'importe quel ordinateur qui n'ait pas fonction qui renvoie un type? [ par kalagool ] Bonjour &#224; toutes et &#224; tous, Je voulais savoir s'il existe une fonction qui renvoie le type d'un invariant. Par exemple, je dois v&#233;rif PSingle [ par FleX2009 ] Bonjour, Je doit lire un buffer de type PSingle (c'est &#224; dire ^Single) qui contient 512 valeurs r&#233;elles (de type single), or je ne voit pas obtenir un type a partir d'un string [ par kalagool ] Bonjour &#224; toutes et &#224; tous, Je dois faire un module d'importation de fichier ASCII ( ou csv). Je dois verifier chacun de mes champs import&


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales