ÐомпоненÑÑÑ TDateTimePicker полÑÑи ÑвойÑÑвоÑо Format нÑкÑде Ð¼ÐµÐ¶Ð´Ñ Ð²ÐµÑÑии Delphi 5 и Delphi 6. ТоÑнаÑа гÑаниÑа Ð¼ÐµÐ¶Ð´Ñ Ð²ÐµÑÑииÑе ÑÑдко е докÑменÑиÑана по наÑин, на койÑо да Ñе довеÑиÑе, и когаÑо Ñе ÑблÑÑкаÑе Ñ Ñова, компилаÑоÑÑÑ Ð¿ÑоÑÑо ви казва, Ñе иденÑиÑикаÑоÑÑÑ Ð½Ðµ ÑÑÑеÑÑвÑва. РедÑÑ, койÑо Ñе компилиÑа и ÑабоÑи на вÑÑко по-ново Delphi, Ñе пÑÐ¾Ð²Ð°Ð»Ñ ÑиÑ
о или Ñвно на ÑÑаÑаÑа веÑÑиÑ, в завиÑимоÑÑ Ð¾Ñ ÑÑÑÑкÑÑÑаÑа на пÑоекÑа.
ÐазовиÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ðµ ÑÑандаÑÑнаÑа ÑиÑÑемна конÑÑолка на Windows DATETIMEPICK_CLASS Ð¾Ñ comctl32.dll и ÑÑ Ð²Ð¸Ð½Ð°Ð³Ð¸ е пÑиемала низ за ÑоÑмаÑиÑане ÑÑез ÑÑобÑениеÑо DTM_SETFORMAT. VCL библиоÑекаÑа на Delphi обвива Ñова ÑÑобÑение в ÑвойÑÑвоÑо Format в по-новиÑе веÑÑии. ÐÑи Delphi 5 изпÑаÑаÑе ÑÑобÑениеÑо Ñами ÑÑез макÑоÑа обвивка DateTime_SetFormat, деклаÑиÑан в модÑла CommCtrl.
ÐоделÑÑ Ñ ÑÑловна компилаÑиÑ
СÑандаÑÑниÑÑ Ð¿Ð¾Ð´Ñ
од е блок за ÑÑловна компилаÑиÑ, ÑвÑÑзан Ñ Ð´ÐµÑиниÑан Ñимвол за веÑÑиÑ. Delphi 5 деÑиниÑа VER130; можеÑе да го ÑеÑÑваÑе диÑекÑно или да деÑиниÑаÑе ÑобÑÑвен Ñимвол D5 в опÑииÑе на пÑоекÑа, за да напÑавиÑе ÑазклонениеÑо в кода по-ÑеÑливо. РдваÑа ÑлÑÑÐ°Ñ ÐºÐ»Ð¾Ð½ÑÑ Ð·Ð° Delphi 5 извиква DateTime_SetFormat Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлаÑоÑа (handle) на конÑÑолкаÑа; вÑеки дÑÑг клон пÑоÑÑо пÑиÑвоÑва ÑÑойноÑÑ Ð½Ð° ÑвойÑÑвоÑо:
{$IFDEF D5}
DateTime_SetFormat(DateTimePicker1.Handle, PChar('MM/dd/yyyy'));
{$ELSE}
DateTimePicker1.Format := 'MM/dd/yyyy';
{$ENDIF}
ÐобавеÑе CommCtrl кÑм ÑекÑиÑÑа uses на модÑла, койÑо ÑÑдÑÑжа клона за Delphi 5. ÐÑма нÑжда да го добавÑÑе безÑÑловно; ако пÑедпоÑиÑаÑе да запазиÑе завиÑимоÑÑÑа изолиÑана, обвийÑе вноÑа в ÑÑÑаÑа ÑÑловна конÑÑÑÑкÑиÑ:
uses
...,
{$IFDEF D5}
CommCtrl,
{$ENDIF}
...;
СинÑакÑÐ¸Ñ Ð½Ð° низа за ÑоÑмаÑиÑане
ÐизÑÑ Ð·Ð° ÑоÑмаÑиÑане, подаден на DateTime_SetFormat, Ñледва ÑоÑмаÑа на Windows за Ð¸Ð·Ð±Ð¾Ñ Ð½Ð° даÑа и ÑаÑ, а не ознаÑениÑÑа на FormatDateTime в Delphi. ÐваÑа ÑоÑмаÑа Ð¸Ð·Ð³Ð»ÐµÐ¶Ð´Ð°Ñ ÑÑ
одно, но не Ñа взаимозаменÑеми. Windows използва d за ден Ð¾Ñ Ð¼ÐµÑеÑа (без водеÑа нÑла), dd за ден Ñ Ð²Ð¾Ð´ÐµÑа нÑла, M за Ð½Ð¾Ð¼ÐµÑ Ð½Ð° меÑеÑа, MM за меÑÐµÑ Ñ Ð²Ð¾Ð´ÐµÑа нÑла, yy за двÑÑиÑÑена година и yyyy за ÑеÑиÑиÑиÑÑена година. ÐÑемевиÑе полеÑа Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð°Ñ h/hh за 12-ÑаÑов ÑоÑмаÑ, H/HH за 24-ÑаÑов ÑоÑмаÑ, m/mm за минÑÑи, s/ss за ÑекÑнди. ТекÑÑÑÑ Ð² низа Ñе поÑÑÐ°Ð²Ñ Ð² единиÑни кавиÑки, Ñака Ñе 'dd/MM/yyyy' веÑе е коÑекÑно, но за вгÑаждане на лиÑеÑали в низа Ñе Ñе изиÑÐºÐ²Ð°Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸ двойки единиÑни кавиÑки.
Ðа Ñазлика Ð¾Ñ Ñова, ÑÑнкÑиÑÑа FormatDateTime на Delphi използва d/dd/ddd/dddd за ден Ñ ÑазлиÑна ÑеманÑика и m за меÑÐµÑ (а не M). Ðко копиÑаÑе ÑоÑмаÑиÑÐ°Ñ Ð½Ð¸Ð· Ð¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ðµ на FormatDateTime и го подадеÑе диÑекÑно на DateTime_SetFormat, полеÑаÑа за меÑÐµÑ Ð¸ минÑÑа веÑоÑÑно Ñе бÑÐ´Ð°Ñ Ñазменени в изÑ
ода. ÐапиÑеÑе ÑоÑмаÑиÑаÑÐ¸Ñ Ð½Ð¸Ð· на конÑÑолкаÑа Ð¾Ñ Ð½ÑлаÑа ÑÑглаÑно докÑменÑаÑиÑÑа на Windows, вмеÑÑо да го пÑеобÑазÑваÑе Ð¾Ñ ÑоÑÐ¼Ð°Ñ Ð½Ð° Delphi.
Регионални наÑÑÑойки и глобалнаÑа пÑоменлива ShortDateFormat
ÐÑомÑнаÑа на глобалнаÑа пÑоменлива ShortDateFormat на Delphi не влиÑе на веÑе ÑÑздаден ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ TDateTimePicker. ÐзбоÑÑÑ Ð½Ð° даÑа ÑеÑе ÑегионалниÑе наÑÑÑойки Ð¾Ñ Windows пÑи ÑÑздаванеÑо Ñи и Ñлед Ñова Ñе ÑендеÑиÑа ÑпоÑед ÑÑобÑениÑÑа, коиÑо полÑÑава, а не ÑпоÑед глобалниÑе пÑоменливи на Delphi RTL. Това ознаÑава, Ñе задаванеÑо на ShortDateFormat в FormCreate нÑма да пÑомени изгледа на конÑÑолкаÑа. ТÑÑбва да използваÑе DateTime_SetFormat (или ÑвойÑÑвоÑо Format в по-новиÑе веÑÑии), за да пÑезапиÑеÑе ÑоÑмаÑиÑаÑÐ¸Ñ Ð½Ð¸Ð·, Ñлед каÑо нейниÑÑ Ð¼Ð°Ð½Ð¸Ð¿ÑлаÑÐ¾Ñ (handle) веÑе ÑÑÑеÑÑвÑва.
Ðа пÑиложениÑ, коиÑо Ñе ÑазпÑоÑÑÑанÑÐ²Ð°Ñ Ð² ÑазлиÑни ÑÑÑани, ÑеÑÑвайÑе низа за ÑоÑмаÑиÑане на маÑина Ñ Ñегионални наÑÑÑойки, ÑазлиÑни Ð¾Ñ Ñези за СÐЩ. Windows може да замени пÑазен или nil ÑоÑÐ¼Ð°Ñ Ñ Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ð¿Ð¾ подÑазбиÑане, но изÑиÑно зададен не-nil низ Ð·Ð°Ð¼ÐµÐ½Ñ ÑегионалнаÑа наÑÑÑойка изÑÑло. Това обикновено е ÑÑÑÑениÑÑ ÐµÑекÑ, но ознаÑава, Ñе Ñаблон каÑо 'MM/dd/yyyy' Ñе Ñе показва в Ñози Ñи вид доÑи за поÑÑебиÑели, коиÑо по конвенÑÐ¸Ñ Ð¾ÑÐ°ÐºÐ²Ð°Ñ dd/MM/yyyy. Ðко избоÑÑÑ Ð½Ð° даÑа е пÑедназнаÑен за поÑÑебиÑелÑ, а не е пÑоÑÑо поле за вÑвеждане на данни, помиÑлеÑе дали да не оÑÑавиÑе наÑÑÑойкиÑе по подÑазбиÑане (каÑо подадеÑе nil на DateTime_SetFormat), за да Ñледва Ñой авÑомаÑиÑно локала на поÑÑебиÑелÑ.
ÐовÑоÑно ÑÑздаване на манипÑлаÑоÑа (Handle recreation)
ÐаÑÑÑойкаÑа на ÑоÑмаÑа пÑинадлежи на ÑиÑÑÐµÐ¼Ð½Ð¸Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑлаÑÐ¾Ñ (handle) на пÑозоÑеÑа, а не на поле в обекÑа на VCL. Ðко манипÑлаÑоÑÑÑ Ð½Ð° конÑÑолкаÑа бÑде ÑниÑожен и ÑÑздаден наново (коеÑо VCL може да напÑави пÑи ÑмÑна на ÑодиÑелÑÐºÐ¸Ñ ÐºÐ¾Ð½ÑÐµÐ¹Ð½ÐµÑ Ð¸Ð»Ð¸ пÑомÑна на нÑкои ÑвойÑÑва на ÑÑила по вÑеме на ÑабоÑа), ÑоÑмаÑÑÑ Ñе вÑÑÑа кÑм Ñози на Windows по подÑазбиÑане. ÐезопаÑноÑо мÑÑÑо за пÑилагане на DateTime_SetFormat е в пÑоÑедÑÑа, коÑÑо Ñе изпÑлнÑва Ñлед ÑÑздаванеÑо на манипÑлаÑоÑа: пÑепокÑийÑе CreateWnd в наÑледник на клаÑа и го извикайÑе Ñам, или го пÑиложеÑе в ÑÑбиÑиеÑо OnEnter или OnShow, Ñлед каÑо Ñе ÑвеÑиÑе, Ñе манипÑлаÑоÑÑÑ Ðµ акÑивен. ÐадаванеÑо Ð¼Ñ Ð²ÐµÐ´Ð½Ñж в FormCreate ÑеÑÑо е доÑÑаÑÑÑно за пÑоÑÑи ÑоÑми, но не е надеждно пÑи динамиÑна ÑмÑна на ÑÑилове или ÑодиÑелÑки конÑейнеÑи.
СÑÑоÑо огÑаниÑение важи и за ÑвойÑÑвоÑо Format на VCL в по-новиÑе веÑÑии на Delphi; вÑÑÑеÑно Ñо извиква ÑÑÑоÑо ÑÑобÑение на Windows и завиÑи Ð¾Ñ ÑÑÑÐ¸Ñ Ð¶Ð¸Ð·Ð½ÐµÐ½ ÑикÑл на манипÑлаÑоÑа. РазликаÑа е, Ñе меÑодÑÑ Ð·Ð° Ð·Ð°Ð¿Ð¸Ñ Ð½Ð° ÑвойÑÑвоÑо вÑв VCL пÑовеÑÑва дали манипÑлаÑоÑÑÑ Ðµ заделен пÑеди извикванеÑо и авÑомаÑиÑно пÑилага оÑново ÑоÑмаÑа пÑи CreateWnd. ÐиÑекÑноÑо извикване на DateTime_SetFormat нÑма Ñакава заÑиÑа, заÑова ÑазклонениеÑо за Delphi 5 ÑÑÑбва да бÑде изпÑлнÑвано по-внимаÑелно.
ÐÑÐµÐ¼Ð°Ñ Ð²Ð°Ð½Ðµ на заобиколноÑо ÑеÑение
ÐогаÑо пÑоекÑÑÑ Ð¿ÑеÑÑÑанови поддÑÑжкаÑа за Delphi 5, ÑÑловниÑÑ Ð±Ð»Ð¾Ðº ÑÑава излиÑен. ÐÑемаÑ
неÑе ÑазклонениеÑо {$IFDEF D5} и Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ð²Ð½Ð¾Ñ Ð½Ð° CommCtrl, оÑÑавÑйки Ñамо диÑекÑноÑо пÑиÑвоÑване на ÑвойÑÑвоÑо Format. ÐапÑавеÑе Ñова пÑемаÑ
ване в ÑамкиÑе на един commit, за да бÑде леÑно да Ñе иденÑиÑиÑиÑа евенÑÑален неоÑакван богаÑÑÑвен пÑоблем пÑи компилаÑоÑ, койÑо не ÑÑе ÑеÑÑвали. СамиÑÑ Ð½Ð¸Ð· за ÑоÑмаÑиÑане оÑÑава ÑÑÑиÑÑ; пÑÐ¾Ð¼ÐµÐ½Ñ Ñе Ñамо наÑинÑÑ Ð½Ð° неговоÑо подаване.