Enumtostr & strenumtoindex

Description

ce code montre comment afficher la list d'un énumérateur de type genre MyEnum=(Enum1,Enum2) ect... ou de rechercher son Index depuis le nom d'énumérateur compris dans la list, dans nôtre cas si il n'existe pas l'index retourné aura la valeur -1

Source / Exemple :


unit Unit1;

interface
////////////////////////////////////////////////////////////////////////////////
// Author: Shining Freeman                                                    //
// Date  : 08/05/03                                                           //
////////////////////////////////////////////////////////////////////////////////
// Deux Fonctions très Simple                                                 //
// pour lire les Noms des énumérations ou avoir leur Index                    //
////////////////////////////////////////////////////////////////////////////////

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,TypInfo;

type
    MyEnumComPort=(Com1,Com2,Com3,Com4,Options,Quit);// enumération , mettez ce que vous voulez
    TForm1 = class(TForm)
    Cb1: TComboBox;
    Label1: TLabel;
    Button1: TButton;
    txtSearch: TEdit;
    Label2: TLabel;
    procedure Cb1DropDown(Sender: TObject);
    procedure Cb1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Déclarations privées }
    function EnumToStr      (EnumTypeInfo: PTypeInfo; EnumIndex: Integer): String; //renvoie le nom de l'énumération spécifié par l'index
    function StrEnumToIndex (EnumTypeInfo: PTypeInfo; ValueName: String; Min,Max: Integer) : Integer;//renvoie l'index de l'énumération spécifié par le Nom, Nota Min & Max représente la valeur Low et High de l'énumérateur, si il n'existe pas alors Index aura la valeur -1
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.EnumToStr(EnumTypeInfo: PTypeInfo; EnumIndex: Integer): String;
begin
    Result:=GetEnumName(EnumTypeInfo,EnumIndex);
end;

procedure TForm1.Cb1DropDown(Sender: TObject);
var
i:integer;
begin
     Cb1.Clear;//efface tout les items
     for i:=Ord(Low(MyEnumComPort)) to Ord(High(MyEnumComport)) do
     Cb1.Items.Add(EnumToStr(TypeInfo(MyEnumComPort),i));
end;

procedure TForm1.Cb1Click(Sender: TObject);
begin
    if SameText(Cb1.Items.Strings[Cb1.itemIndex],'Quit')
    then
    begin
    if (MessageDlg('êtes vous sur de vouloir Quitter cette Application ??',mtConfirmation,[mbYes,mbNo],0)=mrYes) Then
    Application.Terminate;
    end
    else
    MessageDlg('Vous venez de Cliquez sur ' + Cb1.Items.Strings[Cb1.itemIndex],mtInformation,[mbOk],0)
end;

function TForm1.StrEnumToIndex(EnumTypeInfo: PTypeInfo; ValueName: String; Min,Max: Integer): Integer;
var
i,j:integer;
begin
     j:=-1;// ValueName pas trouvé, par défaut
     For i:=Min To Max do
     if SameText(ValueName,EnumToStr(EnumTypeInfo,i)) Then
     begin
     J:=i;// oui ValueName Trouvé alors J vaut la valeur de son index
     Break;
     end;
     result:=J;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Index:Integer;
begin
     Index:=-1;
     if TxtSearch.Text<>'' Then
     Index:=StrEnumToIndex(TypeInfo(MyEnumComPort),Trim(TxtSearch.Text),Ord(Low(MyEnumComPort)),Ord(High(MyEnumComPort)));
     if Index >-1 Then
     begin
     Cb1DropDown(Self);// Affichage la liste
     Cb1.ItemIndex:=Index;
     MessageDLG(TxtSearch.Text +' à été trouvé a l''index['+IntToStr(Index)+' :)',mtInformation,[mbOk],0);
     end
     else
     MessageDLG('Désoler mais '+TxtSearch.Text +' n''éxiste pas sur la liste :(',mtWarning,[mbOk],0);
end;

end.

Conclusion :


il faut incure TypInfo dans la clause Uses.

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.