2012-12-07 23 views
6

Eğer php ile çalışıyorsanız, php'nin programlama dizisinde ilişkilendirici dizisi (veya dizi genişliği dize anahtarı) olduğunu görebilirsiniz. Örneğin :Delphi'de ilişkisel dizi, dizi anahtarlı dizi mümkün mü?

$server['hostname'] = 'localhost'; 
$server['database'] = 'test'; 
$server['username'] = 'root'; 
$server['password'] = 'password' ;  

// 2d array 
$all['myserver']['hostname'] = 'localhost' ; 

Ama Delphi ilişkisel dizi kullanmak için herhangi bir varsayılan yol bulamıyorum.

Önce herhangi bir çıktı bileşeni veya sınıfı ile varsayılan yolu bulmak istiyorum. İkincisi iç yolla gerçekten bulamıyorum, sadece çıkış sınıflarını seçiyorum.

Delphi XE3'ü kullanıyorum, yardımlarınız için çok teşekkürler.

düzenleme: Burada bir sınıf buldum: http://www.delphipages.com/forum/showthread.php?t=26334 php ile aynı fakat daha iyi bir yol var mı?

+2

Delphi'de İlişkilendirme Dizisinin çok güzel bir uygulaması burada bulunabilir: http://stackoverflow.com/a/15854846/1022219. Bu PHP'nin Assoc Array –

+0

@iPath ile en yakın olanıdır: teşekkürler:) –

cevap

8

Bu amaçla tStrings ve tStringList'i kullanabilirsiniz, ancak 2d dizileri bu bileşenlerin kapsamı dışındadır.

Kullanım; Programın biz AnsiIndexStr fonksiyonlu bir birleştirici dizi olarak const_TypesStr const_TypesChar ve iki dizi sonra

uses StrUtils; ... const const_TypesChar : array [0..4] of String = ( 'I', 'F', 'D', 'S', 'B' ); const const_TypesStr : array [0..4] of String = ( 'Integer', 'Float', 'Datetime', 'String', 'Boolean' ); ... Value := const_TypesStr[ AnsiIndexStr('S', const_TypesChar) ]; // As an example, after execution of this code Value variable will have 'String' value. // 

kullanan

:

var 
    names : TStrings; 
begin 
    ... 
    names := TStringList.Create; 
    ... 
    ... 
    names.values['ABC'] = 'VALUE of ABC' ; 
    ... 
    ... 
end ; 
+1

olmalıdır: = (atama operatörü) değil = iki değeri/nesneyi karşılaştırır –

15

TDictionary<string,string> ürününü Generics.Collections biriminden kullanabilirsiniz.

var 
    Dict: TDictionary<string,string>; 
    myValue: string; 
.... 
Dict := TDictionary<string,string>.Create; 
try 
    Dict.Add('hostname', 'localhost'); 
    Dict.Add('database', 'test'); 
    //etc. 
    myValue := Dict['hostname']; 
finally 
    Dict.Free; 
end; 

Ve benzerleri.

Sözlük içeren bir sözlük istiyorsanız, TDictionary<string, TDictionary<string,string>>'u kullanabilirsiniz. Ancak, bunu yaptığınızda, dış sözlükte bulunan sözlük öğelerinin ömrü boyunca özel dikkat göstermeniz gerekir. Bunu sizin için yönetmeye yardımcı olması için TObjectDictionary<K,V>'u kullanabilirsiniz. Böyle bu nesnelerden birini oluşturmak istiyorum:

TObjectDictionary<string, TDictionary<string,string>>.Create([doOwnsValues]); 

Bu TObjectDictionary<k,V> aynı True için OwnsObjects seti ile geleneksel TObjectList gibiydi çalışır.

+0

burada daha iyi bulmama tam bir yol değil: http://www.delphipages.com/forum/showthread.php?t=26334, ama Ben tam bir sınıf istiyorum ama Teşekkür ederim David :) –

+2

Bu yorumu anlamıyorum. Aradığınız şey, cevabımda anlatılan sınıflar. –

+1

tDictionary yeni Delphi sürümlerinde tanıtıldı. Bu çözüm, tStrings ile verdiğimden çok daha iyi.Çünkü tDictionary uygulaması tStrings'ten daha iyidir. –

0

Basit bir şekilde (örnek) bu sorunu çözülmüş .

Artı, basittir ve dizilerimize eleman eklediğimiz her defasında programdaki farklı yerlerde kodu değiştirmemiz gerekmez.