Eski bir VCL örneğine Delphi 5 uyumluluğu eklenirken proje, yeni Delphi sürümlerinde tamamen normal olan bir satırda başarısız oldu. Kod, özel bir tarih desenini doğrudan TDateTimePicker.Format özelliğine atamaya çalışıyordu.
|
1 |
DateTimePicker.Format := 'MM/dd/yyyy'; |
TDateTimePicker, Windows common control için bir VCL wrapper'dır. Yeni Delphi sürümleri kullanışlı bir Format özelliği sunar, ancak Delphi 5 sunmaz. Delphi 5 ve öncesinde control, underlying common-control mesajı doğrudan gönderilmediği sürece genellikle Windows bölgesel tarih ayarlarını izler.
Delphi 5 için common-control API kullanın
Uyumluluk düzeltmesi, yeni derleyiciler için doğrudan property atamasını korurken Delphi 5 için CommCtrl birimindeki DateTime_SetFormat çağrısını kullanmaktır. Delphi 5 branch'i derlenirken uses bölümüne CommCtrl ekleyin.
|
1 2 3 4 5 |
{$IFDEF D5} DateTime_SetFormat(DateTimePicker.Handle, PChar('MM/dd/yyyy')); {$ELSE} DateTimePicker.Format := 'MM/dd/yyyy'; {$ENDIF} |
Pratik notlar
Format string, her Delphi biçimlendirme token'ını değil, Windows date-time picker sözdizimini kullanır. Deseni basit tutun ve uygulama uluslararası dağıtılacaksa farklı bölgesel ayarlara sahip bir makinede test edin.
Delphi 5, Delphi 6 ve modern Delphi sürümleri arasında paylaşılan sample code bakımı yapıyorsanız, bu branch'i D5 gibi bir derleyici sembolünün arkasında izole edin. Bu, modern kodu okunabilir tutarken eski common-control workaround'unu da belgeler.
Uyumluluk kontrol listesi
CommCtrlbirimini yalnızca Delphi 5 branch'iDateTime_SetFormatgerektirdiğinde ekleyin.- Form handle'ını değil, picker handle'ını geçirin.
- Normal bir string literal veya kararlı değişken geçirerek format string'i çağrı süresince canlı tutun.
- Gösterilen tarihi hedef Windows locale içinde doğrulayın.
ShortDateFormat neden yeterli değildir
Delphi'nin global tarih formatı değişkenlerini değiştirmek, Windows common control tarafından desteklenen date-time picker'ı güvenilir biçimde değiştirmez. Picker, control ayarlarına ve aldığı mesajlara göre render eder. Bu yüzden DateTime_SetFormat, Delphi 5 için doğru uyumluluk katmanıdır.
Bu ayrım eski sample projelerde önemlidir, çünkü bunlar genellikle birden fazla Delphi sürümüyle derlenir. Delphi 7 veya Delphi 2009 içinde temiz olan bir satır Delphi 5 içinde mevcut olmayabilir; buna karşın bir Windows common-control mesajı hâlâ kullanılabilir olabilir. Conditional compilation, her derleyicinin en doğal yolu kullanmasını sağlar.
Eski sürüm uyumluluğunu test etme
Workaround uygulandıktan sonra hem gösterilen değeri hem de kaydedilen değeri test edin. Format kullanıcının gördüğünü etkiler; hesaplamalarda kullanılan underlying TDateTime değerini değiştirmemelidir. Bu ayrım, görüntü formatı ile sayısal tarih değerlerinin tutarlı kalması gereken satın alma siparişleri, faturalar ve spreadsheet export işlemlerinde önemlidir.
Window handle yeniden oluşturulduktan sonra formu da kontrol edin. Bazı VCL controls, handle yok edilip yeniden oluşturulursa native-control durumunu kaybedebilir. Uygulamanız runtime sırasında style veya parent değiştiriyorsa, formatı handle kullanılabilir olduktan sonra uygulayın.
Uzun vadeli bakım notu
Bir proje artık Delphi 5 desteğine ihtiyaç duymadığında conditional branch'i kaldırın ve doğrudan Format property atamasını koruyun. O zamana kadar uyumluluk kodunu ilgisiz iş mantığına gizlemek yerine control setup'a yakın tutun. Bu, workaround'un satın alma siparişi hesaplaması için değil, bir VCL control sınırlaması için var olduğunu açık hale getirir.