Jak można uzyskać od systemu odmienioną nazwę miesiąca na potrzeby formatowania daty, np 'marca' zamiast LongMonthNames[3] = 'marzec'?
Np:
FormatDateTime('mmmm',EncodeDate(2000,MonthNr,1));
No nie bardzo...
Nie bardzo co? http://ideone.com/fIBHgG
To, że funkcja korzysta z LongMonthNames, gdzie miesiące w języku polskim nie są odmienione do użycia w datach.
Może ktoś wie?
Chodzi o to, jak na obrazie:
Sprawdziłem i taki kod, jak poniżej - pokazuje mi w tytule formatki słowo marzec
. Używam Windows 7 Ultimate 64 bit PL. Być może jeśli u Ciebie jest inaczej, to ma to związek z ustawieniami języka lub regionów. Zresztą dla innego dnia - na przykład podając 13
zamiast 1
, też mam marzec
.
Caption := FormatDateTime('MMMMM', EncodeDate(2013, 3, 1));
Bo jeżeli chodzi Tobie o wypisywania słów w stylu marca
, to musiał być sobie do tego zrobić odpowiednią funkcję sprawdzającą miesiąć i zakreś dni, po czym zwracająca odpowiedni string. Chociaż ze screena wynika, że zależy Ci na wyświetleniu miesiąca w postaci marzec
.
Nie, chodzi o 'marca', tak jak w dacie na górze. Jak wstawisz TDateTimePicker to tam właśnie będzie jak w oknie na screenie. Tylko nie widzę skąd komponent bierze ten string :(
TDateTimePicker
na pewno nie napisze Tobie "marca". Chyba, że używasz jakiegoś nowszsego Delphi niż 7. Kontrolka na której widnieje napis "marca" jest klasy DirectUIHWND
. Także pewnie to jakiś dopieszczony Label. Na lewo poniżej znajduje się faktycznie kontrolka o klasie SysMonthCal32
, więc wychodziło by że to dostępna pod WinAPI kontrolka o nazwie "MonthView". Dlatego według mnie jeżeli zakładasz, że Twój program ma się z użytkownikiem komunikować po polsku i potrzebujesz ustalić tekst miesiąca, jako na przykład "marca" zamiast "marzec", to polecam taką prostą funkcję, jak poniżej. Chociaż może ktoś tutaj doradzi Ci coś lepszego.
function PolishMonthText(AMonth : Byte) : string;
const
Pl_Months_Arr : array[1..12] of string =
('stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca',
'sierpnia', 'września', 'pażdziernika', 'listopada', 'grudnia');
begin
Result := '';
if AMonth in [1..12] then
begin
Result := Pl_Months_Arr[AMonth];
end;
end;
D2010:
Jako, że Delphi nie jest przeznaczony na polski rynek (brak lokalizacji produktu), stąd całe to pytanie, bo ten string bierze z systemu... Tylko nie wiem skąd :(
BTW: na prawdę ktoś jeszcze używa D7, przecież to anachronizm (podobnie jak mój D2010) :D
bcode napisał(a):
BTW: na prawdę ktoś jeszcze używa D7, przecież to anachronizm (podobnie jak mój D2010) :D
Tak, za pewne nie tylko ja. Lazarusa też używam, ale dla aplikacji 64 bitowych. A taką napisałem w sumie tylko jedną - plugin do 64 bitowego AQQ - na swoje potrzeby. W Delphi 7 generowane są stosunkowo małe exeki, nawet przez UPX'owaniem. Dodatkowo są osobne moduły przydatne do pisania w WinAPI, które pozwalają tworzyć jak najmniejszy exek, a to mnie interesuje, bo często zdarza mi się pisać właśnie w WinAPI. Każdy używa co potrzebuje. Lepsze to niż Turbo Pascal czy Dev-Pascal, to jest dopiero przestarzałość.
Nie wiem czy jest coś gotowego w Delphi ale można skorzystać z funkcji WinApi GetDateFormat
var
iSize: Integer;
sBuff: string;
st: _SYSTEMTIME;
begin
DateTimeToSystemTime(Date, st);
iSize:= GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, 'dd MMMM yyyy', nil, 0);
SetLength(sBuff, iSize);
GetDateFormat(LOCALE_USER_DEFAULT, 0, @st, 'dd MMMM yyyy', PAnsiChar(sBuff), iSize);
Label1.Caption:= sBuff; //26 marca 2013
end;