2012-02-27 28 views
12

Delphi XE2'de TDataset sınıfını ve dize alanlarını inceledim ve AsWideString bir tür UnicodeString döndürdüğünü fark ettim. Ancak, TFIeld.AsAnsiString: AnsiString olarak adlandırılan TField.AsString: String işlevinden değer alır. Bu nedenle, herhangi bir unicode karakteri kaybolacak mı? Ayrıca TDataset.GetFieldData geçirilen tampon Ansihar bir dizi olarak ilan edilir.Delphi XE2 Veri kümesi alan türü TStringField Unicode'u desteklemiyor mu?

Bunu doğru anlıyor muyum?

+1

+1 Bu davranış IMHO olduğundan bir VCL yanlış uygulamasıdır. IMHO yanlış bir adlandırmadır, * geri kalanı VCL/RTL * ile tutarsız ve bir sürü karışıklık/yanlış anlama kaynağı. Sorunun mükemmel anlamda. –

cevap

12

Hayır, Unicode alanları ve Unicode olmayan dizeler için olan TStringField sınıfı için olan TWideStringField sınıfını inceliyor olmalısınız. TField sadece bir temel sınıftır ve TField.GetAsWideString, Unicode farkında olan alt öğeleri tarafından geçersiz kılınan bir düşme uygulamasına sahip sanal bir yöntemdir.

+1

İki dize alan sınıfına sahip olmanın güzel yan etkisi: Unicode'a veritabanı geçişleri, DFM'lerdeki tüm TStringField öğelerinin TWideStringField (ve diğer birçok kaynak kodu değişikliği) ile değiştirilmesini gerektirir; burada geliştiriciler, düzgün bir geçiş – mjn

+3

@mjn bekler. Temel veritabanı alanlarını değiştirmeden uygulamanızda unicode'a geçiş.TWideStringField yıllardır etrafta ve Delphi'nin Unicode'a geçişiyle ilgili değil. Veritabanındaki alan daha önce unicode ise, zaten zaten Delphi 5 de TWideStringField kullanmak zorunda kaldı. Veritabanı alanı yalnızca bir AnsiString ise, TStringField kullanın. Delphi, veri tanımınızı ve verilerinizi otomatik olarak veritabanında değiştirmez. –

+1

(mjn) Aslında, normalde, eğer değer unicode veya değilse, veritabanına bağlı değildir. Yani veritabanınız eski Delphi sürümünde unicode ise, zaten TWideStringField idi. Eğer veritabanı hala unicode yoksa neden daha yeni sürümde olmalı? –

4

EVET, doğru bir şekilde anladınız. Bu, numaralı kırık olan VCL ve belgelerinin numarasıdır. Karışıklıklarınız mükemmel bir anlam ifade ediyor! Delphi 2009+ uygulamada

, sen string=UnicodeString için AnsiString ve AsWideString için AsString özelliğini kullanmak zorunda. Aslında

, As*String özellikler gibi tanımlanmıştır:

yeryüzünde biz AsString bir AnsiString döndüren öğrenmek mümkün olabilir nasıl
property AsString: string read GetAsString write SetAsString; 
property AsWideString: UnicodeString read GetAsWideString write SetAsWideString; 
property AsAnsiString: AnsiString read GetAsAnsiString write SetAsAnsiString; 

? VCL/RTL'nin geri kalanıyla karşılaştırıldığında, hiç de mantıklı değil.

ve TWideStringFieldstring=UnicodeString için TStringField sınıfını kullanan uygulama bozuk. Ayrıca

, documentation is also broken:

Data.DB.TField.AsString

bir dizi (Delphi) veya bir AnsiString (C++) olarak alanın değerini temsil eder.

Bu, Delphi'de string'u temsil etmemektedir, ancak bir AnsiString! Mülkün düz string=UnicodeString türünü kullanması, mükemmel bir şekilde yanıltıcıdır.

Veritabanı bakış açısında, Unicode işlemek veya belirli bir karakter kümesiyle çalışmak DB sürücüsüne kalmış. Ancak VCL bakış açısından, Delphi 2009+ sürümünde sadece string türünü bilmeniz ve AsString: String unicode-ready kullanacağından emin olmalısınız.

İlgili konular