Konuyu Oyla:
  • Derecelendirme: 5/5 - 4 oy
  • 1
  • 2
  • 3
  • 4
  • 5
String üzerinden enum değeri çağırma
#11
Merhabalar. Ben forumunuzu takip etmeye başlayalı çok olmadı. Fakat Delphi dilini ve bu dil ile kod yazmayı çok sevdiğim için, bu forumdaki değerli çalışmalar ve kod paylaşımlarını, çok bilgili ve değerli hocalarımızın katkısıyla birlikte ilgiyle takip ediyorum.

Enumerate tipler konusunda yazılan kodları ben de naçizane yapabilmekle birlikte, yapmayı istediğim şey aslında daha genel birşey.

Açıklamak gerekirse, Örneğin:

Delphi'de yazılmış hazır helper'lar mevcut. "String, Integer, ShortInt vs..." Bu "helper" ları barındıran unit'i eklediğinizde, bu tiplerden herhangi bir değişken tanımlayıp, içerisine atamasını yaptıktan sonra ".ToString, .ToInteger vs..." şeklinde kullanabiliyorsunuz. Çünkü; Delphi'de "TStringHelper = Record Helper For String" şeklinde, her string değişken tanımlaması ve içeriğinde kullanılabiliyor. Bu benim Delphi dosyalarında gördüğüm 'Uses ile yüklediğimiz' helper tanımlama örneklerinden bir tanesi.

Ben de herhangi bir enumerate tip tanımladıktan sonra var bloğu ile bu enumerate tipten değişkenimi tanımlayınca, yukarıdaki gibi "EnumDeğişkenAdi.ToString veya EnumDeğişkenAdi.ToInteger vs..." diyebilmeliyim enumerate tipi ve içeriğini, yazdığımız helper bilmese bile.

Tüm bu anlamaya ve anlatmaya çalıştığım yapılar eşliğinde 'Enumerate' tipler için de genel bir helper yazmak nasıl mümkün olabilir?
"TStringHelper = Record Helper For String"  ifadesindeki en son 'String' yerine ne yazmalıyız ki hedefimize ulaşabilelim. Tabii ki en baştaki 'TStringHelper' ifadesindeki <?String*> kelimesi de aynı şekilde değişecek.

İnşallah doğru ve düzgün bir şekilde anlatabilmişimdir.

İlgilenenlere şimdiden teşekkür ederim.
Cevapla
#12
program diller;

{$APPTYPE CONSOLE}

{$R *.res}

//
// veteran
// 24-08-2023
//

uses
 System.TypInfo,
 System.SysUtils;

type
 TDil = (TR, EN, AR, RU);

const
 Diller : array[ TDil ] of string = ('TR','EN','AR','RU');

type
 TDilHelper = record helper for TDil
   // System
   class function Yap( const inDil : string ) : TDil; overload; static;
   class function Yap( const inDil : Integer ) : TDil; overload; inline; static;
   function ToString() : string; inline;
   function ToInt() : Integer; inline;
   // System.TypInfo
   class function Create( const inDil : string ) : TDil; overload; static;
   function AsString() : string; inline;
 end;

{$REGION ' TDilHelper | System.TypInfo '}

class function TDilHelper.Create( const inDil : string ) : TDil;
begin
 Result := TDil(GetEnumValue( TypeInfo(TDil), inDil ));
end;

function TDilHelper.AsString() : string;
begin
 Result := GetEnumName( TypeInfo( TDil ), Ord(Self) );
end;

{$ENDREGION}

{$REGION ' TDilHelper | System '}

function TDilHelper.ToInt() : Integer;
begin
 Result := Ord(Self);
end;

function TDilHelper.ToString() : string;
begin
 Result := Diller[ Self ];
end;

class function TDilHelper.Yap( const inDil : string ) : TDil;
var
 l_enmDil : TDil;
begin
 for l_enmDil in [ EN..RU ] do
   if (l_enmDil.ToString() = inDil) then
     Exit(l_enmDil);

 Result := TR;
end;

class function TDilHelper.Yap( const inDil : Integer ) : TDil;
begin
 Result := TDil(inDil);
end;

{$ENDREGION}

var
 D_ : TDil;

begin
 try
   D_ := TDil.Yap( 'EN' );
   WriteLn( D_.ToString(), #9, D_.ToInt() );

   D_ := TDil.Create( 'AR' );
   WriteLn( D_.ToString(), #9, D_.ToInt() );

   D_ := TDil.Yap( 1 );
   WriteLn( D_.ToString(), #9, D_.ToInt() );

   D_ := TDil.Yap( 'RU' );
   WriteLn( D_.ToString(), #9, D_.ToInt() );
 except
   on l_objException : Exception do
     WriteLn( l_objException.ClassName(), ': ', l_objException.Message);
 end;

 ReadLn;
end.
.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [+10 Puan] String Manipülasyon İşlemleri Abdullah ILGAZ 16 12.536 20-04-2019, Saat: 00:48
Son Yorum: onurcan1977
  Array of Const to String (Çözüldü) uparlayan 14 10.986 19-09-2017, Saat: 11:44
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi