Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
TDateTime Formatlama Sorunsalı
#1
Merhabalar,

Bir müşterimin tüm bilgisayarlarında tarih ile ilgili bir takım sorunlar yaşıyorum,

Bilgisayarın tarih formatını dd.mm.yyyy şeklinde ayarlıyorum,

Database'den aldığım tarih bilgisini,
  • AsString olarak aldığımda dd/mm/yyyy olarak dönüyor.
  • AsDateTime olarak alıp aşağıdaki gibi formatlasam da dd/mm/yyyy olarak dönüyor.
    FormatDateTime('dd.mm.yyyy', Result.ebitis_d);
  • Fakat select cümlemde "DATE_FORMAT(ebitis,"%d.%m.%Y") as ebitis_s" olarak kullanıp AsString olarak alırsam sorun olmuyor.


Bu durumun tam tersi de olabiliyor. Projenin genelinde o bilgisayardaki formatlamadan etkilenmeden nasıl çalışırım, decimalsperator belirtir gibi bir seçenek var mı tarih için ?
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#2
(29-01-2018, Saat: 18:13)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhabalar,

Bir müşterimin tüm bilgisayarlarında tarih ile ilgili bir takım sorunlar yaşıyorum,

Bilgisayarın tarih formatını dd.mm.yyyy şeklinde ayarlıyorum,

Database'den aldığım tarih bilgisini,
  • AsString olarak aldığımda dd/mm/yyyy olarak dönüyor.
  • AsDateTime olarak alıp aşağıdaki gibi formatlasam da dd/mm/yyyy olarak dönüyor.
    FormatDateTime('dd.mm.yyyy', Result.ebitis_d);
  • Fakat select cümlemde "DATE_FORMAT(ebitis,"%d.%m.%Y") as ebitis_s" olarak kullanıp AsString olarak alırsam sorun olmuyor.


Bu durumun tam tersi de olabiliyor. Projenin genelinde o bilgisayardaki formatlamadan etkilenmeden nasıl çalışırım, decimalsperator belirtir gibi bir seçenek var mı tarih için ?

SQL Tarafında 
SET DATEFORMAT YMD
Select * from .......


Delphi tarında aşağıdaki gibi bir yapı kullanabilirsin
procedure prc_SistemAyarlariniDuzenle;
var
 Locale  : LongInt;
 PResult : Pointer;
 dwData : Dword;
begin
  Try
      FormatSettings.CurrencyFormat := 3;
      FormatSettings.NegCurrFormat := 8;
      FormatSettings.ThousandSeparator := '.';
      FormatSettings.DecimalSeparator := ',';
      FormatSettings.CurrencyDecimals := 2;
      FormatSettings.DateSeparator := '/';
      FormatSettings.ShortDateFormat := 'dd/MM/yyyy';
      FormatSettings.TimeSeparator:= ':';
      FormatSettings.ShortTimeFormat := 'hh:mm';
      Locale := 1055;
      SetLocaleInfo(Locale, LOCALE_SSHORTDATE,        PChar(FormatSettings.ShortDateFormat));
      SetLocaleInfo(Locale, LOCALE_SDECIMAL,          PChar(','+chr(0)));
      SetLocaleInfo(Locale, LOCALE_STHOUSAND,         PChar('.'+chr(0)));
      SetLocaleInfo(Locale, LOCALE_SMONDECIMALSEP,    PChar(','+chr(0)));
      SetLocaleInfo(Locale, LOCALE_SMONTHOUSANDSEP,   PChar('.'+chr(0)));
      SetLocaleInfo(Locale, LOCALE_ICURRENCY,        PChar('3'+chr(0)));
      SetLocaleInfo(Locale, LOCALE_INEGCURR,          PChar('8'+chr(0)));}

      SendMessageCallback(HWND_BROADCAST,WM_WININICHANGE,0,0,@PResult,dwData);

  except on e : exception do
     ;
{
   on E: Exception do 
   begin
     Raise(E);
   end;
}
  End;
end;
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
Teşekkürler,
Projede çok fazla SQL kullanımı var hepsine ayar çekmem yıllarımı alır Smile

FormatSettings Xe2'de yokmu ? Orada doğrudan DecimalSeparator yazıyordum ama Seatle'sa sizin yazdığınız gibi FormatSettings ile erişilebiliyor bir çok seçeneğe
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#4
Aynı sorun bir AHBS programında da mevcut idi ama adamlar rahat direkt yapıştırmışlar hata mesajını kullanıcıdan değişmesini istiyorlar Smile
May the force be with you!
Cevapla
#5
(30-01-2018, Saat: 08:47)cinarbil Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(29-01-2018, Saat: 21:23)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlTeşekkürler,
Projede çok fazla SQL kullanımı var hepsine ayar çekmem yıllarımı alır Smile

FormatSettings Xe2'de yokmu ? Orada doğrudan DecimalSeparator yazıyordum ama Seatle'sa sizin yazdığınız gibi FormatSettings ile erişilebiliyor bir çok seçeneğe

Xe2  de çalışır mı denemedim.
Ben aşağıdaki fonksiyonu kullanıyorum.

procedure Bolgesel_Ayar;
var
 r: tregistry;
begin
 r := tregistry.Create;
 try
   r.RootKey := HKEY_CURRENT_USER;
   if r.OpenKey('Control Panel\International', true) then
   begin
     r.WriteString('sDate', '.');
     r.WriteString('sShortDate', 'dd.MM.yyyy');
     r.WriteString('sDecimal', ','); // sayı
     r.WriteString('sThousand', '.'); // sayı
     r.WriteString('sMonThousandSep', '.'); // para birimi
     r.WriteString('sMonDecimalSep', ','); // para birimi
     r.closekey;
   end;
 finally
   r.Free;
 end;
end;

programın ana formunun oncreate olayında kullanıyorum. yukarıdakileri notlarımdan kes yapıştır yaptım yanlış anlaşılmasın 
diye çalışan şekli 

bolgesel_ayar; //  fonksiyonu çağır ve tarih, ondalık ayarlarını yap.
 // windows versiyon veya yetki ayarlarında sorun olur yapamaz ise aşağıda kodlarla
 // kontrol edilerek uyarı veriliyor delphi tarafından değiştiriliyor.
[ars=delphi]  if (formatsettings.ThousandSeparator <> '.') then begin
   Application.MessageBox('Bin ayracı '+'.'+' olmalı. Değiştiriliyor','Uyarı',MB_OK + MB_ICONWARNING);
   formatsettings.ThousandSeparator := '.';
 end;
 if (formatsettings.DecimalSeparator <> ',') then begin
   Application.MessageBox('Ondalık ayracı '+','+' olmalı. Değiştiriliyor','Uyarı',MB_OK + MB_ICONWARNING);
   formatsettings.DecimalSeparator := ',';
   end;

 if (formatsettings.DateSeparator <> '.') then begin
    Application.MessageBox('Tarih ayracı '+'.'+' olmalı. Değiştiriliyor','Uyarı',MB_OK + MB_ICONWARNING);
    formatsettings.DateSeparator := '.';
    end;
// Formatsetting le ilgili diğer ayarlar 
 formatsettings.ShortDateFormat := 'dd.mm.yyyy';
 formatsettings.LongDateFormat := 'dd.mm.yyyy dddd';
 formatsettings.ShortTimeFormat := 'HH:mm';
 formatsettings.LongTimeFormat := 'HH:mm : s s'; // burayı bitişik yazınca üzüntülü ifade ekliyor o nedenle s s ler arası boşluk ekledim
 formatsettings.TimeSeparator := ':';
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#6
Uygulamanın geneline hitap etmiyor formatsettigs, Örneğin datetime alanlarında ki formatı da değiştirirmem gerekiyor.

Bu kod uygulamanın tamamına etki ediyor, fakat bilgisayarın ayarlarını da değiştiriyor. Sadece benim uygulama düzeyimde değiştiremezmiyim.

SetLocaleInfo(Locale, LOCALE_SSHORTDATE,        PChar(FormatSettings.ShortDateFormat));
      SetLocaleInfo(Locale, LOCALE_SDECIMAL,          PChar(','+chr(0)));
     SetLocaleInfo(Locale, LOCALE_STHOUSAND,         PChar('.'+chr(0)));
     SetLocaleInfo(Locale, LOCALE_SMONDECIMALSEP,    PChar(','+chr(0)));
     SetLocaleInfo(Locale, LOCALE_SMONTHOUSANDSEP,   PChar('.'+chr(0)));
     SetLocaleInfo(Locale, LOCALE_ICURRENCY,        PChar('3'+chr(0)));
     SetLocaleInfo(Locale, LOCALE_INEGCURR,          PChar('8'+chr(0)));}
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#7
(30-01-2018, Saat: 09:48)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlUygulamanın geneline hitap etmiyor formatsettigs, Örneğin datetime alanlarında ki formatı da değiştirirmem gerekiyor.

Bu kod uygulamanın tamamına etki ediyor, fakat bilgisayarın ayarlarını da değiştiriyor. Sadece benim uygulama düzeyimde değiştiremezmiyim.

SetLocaleInfo(Locale, LOCALE_SSHORTDATE,        PChar(FormatSettings.ShortDateFormat));
      SetLocaleInfo(Locale, LOCALE_SDECIMAL,          PChar(','+chr(0)));
     SetLocaleInfo(Locale, LOCALE_STHOUSAND,         PChar('.'+chr(0)));
     SetLocaleInfo(Locale, LOCALE_SMONDECIMALSEP,    PChar(','+chr(0)));
     SetLocaleInfo(Locale, LOCALE_SMONTHOUSANDSEP,   PChar('.'+chr(0)));
     SetLocaleInfo(Locale, LOCALE_ICURRENCY,        PChar('3'+chr(0)));
     SetLocaleInfo(Locale, LOCALE_INEGCURR,          PChar('8'+chr(0)));}

Aşağıdaki yapıyı projein ilk açılışına ekle 
bu işlemler tüm formlarında aktif hale gelir
yada ortak bir procedure yapıp bir önceki kullanımını tüm formların create kısmına eklemen gerekir
karar senin


initialization
 Try
     FormatSettings.CurrencyFormat := 3;
     FormatSettings.NegCurrFormat := 8;
     FormatSettings.ThousandSeparator := '.';
     FormatSettings.DecimalSeparator := ',';
     FormatSettings.CurrencyDecimals := 2;
     FormatSettings.DateSeparator := '.';
     FormatSettings.ShortDateFormat := 'MM.dd.yyyy';
     FormatSettings.TimeSeparator := ':';
     FormatSettings.ShortTimeFormat := 'hh:mm';
 Finally

 End;

end.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Exclamation [ÇÖZÜLDÜ] Delphi EXE Resource TR Dil Sorunsalı mrmarman 6 191 12-07-2018, Saat: 11:09
Son Yorum: mrmarman
  Comport read buffer sorunsalı seci20 2 143 06-05-2018, Saat: 23:40
Son Yorum: seci20
  thread form donma sorunsalı seci20 3 281 22-01-2018, Saat: 09:42
Son Yorum: edo



Konuyu Okuyanlar: 1 Ziyaretçi