2015-10-30 31 views
5

Bunu daha önce yapabildiğimi biliyorum, uzun zaman önce, bu mümkün olmalı.Enum değerini bir dizeye dönüştürme nasıl yapılır?

Bir bileşenin align özelliği alNone gibi bir öğeyi, kaydedebileceğim, görüntüleyebileceğim, gösterebileceğim bir dizeye dönüştürmek istiyorum. Biliyorum, bayt değeri ve kendi metnimle gelebiliyorum ama eminim ki daha doğrudan bir yol var. İstiyorum Örneğin

...

var S:string; 
S:= somehow(Form.Align); 
ShowMessage(S); 
"bir şekilde" ben böyle "alNone' gibi bir dizeye formun hizalama özelliği için ayar dönüştürmek olduğunu ancak olduğunu

.

+1

Veya sadece, 'S: = TRttiEnumerationType.GetName (Form.Align) – Graymatter

+0

@Graymatter evet aynı soru, ama cevabın da yanlış olduğunu düşünüyorum çünkü –

+0

@Graymatter tekerleği tam olarak benim cevabım. Hangi biri beğenmiyor –

cevap

6

Form.AlignTPersistent bir değeri değil Bu bir numaralandırma türüdür TAlign bir değerdir

Sen bu kod parçası ile bir dizeye bir numaralandırma değeri dönüştürebilir.:.

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; 

Kullanımlara System.TypInfo eklemeniz gerekir.

dize olarak Form.Align almak için bunu yapın:

S := TEnumConverter.EnumToString(Form.Align) 
+0

Doğal takip sorusu, dizgiyi enum değerine geri dönüştürmek olacaktır. Bunu da TEnumConverter'de de dahil edebilirsiniz. –

+0

Bu yalnızca D2009 ve üstü için geçerlidir. D2007 ve aşağıdakiler için uygun tipinfo (TEnumtype)) ile TipInfo.GetEnumName() öğesini çağırmalısınız –

+0

Bu * kod zaten zaten, @Ritsaert. Jenerikler sadece uygun bir sarıcı sağlar. Cevabın özü, 'GetEnumName' sözcüğünü, Delphi sürümünüzün izin verdiği şekilde çağırmaktır. –

5

Sen RTTI kullanarak da yapabilirsiniz: sizin durumunuzda

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; 
İlgili konular