web-dev-qa-db-fra.com

Comment convertir une valeur d'énumération en chaîne?

Je sais que j'ai pu le faire avant, il y a longtemps, donc ça doit être possible.

Je voudrais convertir un élément, tel que la propriété d'alignement d'un composant alNone, en une chaîne que je peux enregistrer, afficher, peu importe. Je sais que je peux obtenir la valeur d'octet et trouver mon propre texte, mais je suis sûr qu'il existe un moyen plus direct.

Par exemple, je veux ...

var S:string;
S:= somehow(Form.Align);
ShowMessage(S);

où "en quelque sorte" est cependant, je convertis le paramètre de la propriété align du formulaire en une chaîne telle que "alNone".

16
M610

Vous pouvez le faire en utilisant RTTI:

uses
  RTTI;

procedure TForm40.FormCreate(Sender: TObject);
var
  sAlign: string;
  eAlign: TAlign;
begin
  //Enum to string      
  sAlign := TRttiEnumerationType.GetName(Align);

  //string to enum
  eAlign := TRttiEnumerationType.GetValue<TAlign>(sAlign);
end;
13
Jens Borrisholt

Form.Align n'est pas une valeur de TPersistent. C'est une valeur de TAlign qui est un type d'énumération.

Vous pouvez convertir une valeur d'énumération en chaîne avec ce morceau de code:

type TEnumConverter = class
public
  class function EnumToInt<T>(const EnumValue: T): Integer;
  class function EnumToString<T>(EnumValue: T): string;
end;

class function TEnumConverter.EnumToInt<T>(const EnumValue: T): Integer;
begin
  Result := 0;
  Move(EnumValue, Result, sizeOf(EnumValue));
end;

class function TEnumConverter.EnumToString<T>(EnumValue: T): string;
begin
  Result := GetEnumName(TypeInfo(T), EnumToInt(EnumValue));
end;

Vous devez ajouter System.TypInfo aux usages.

Faites ceci pour obtenir Form.Align en tant que chaîne:

S := TEnumConverter.EnumToString(Form.Align)
11
Wosi