windows Tarih formatını Değişme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

windows Tarih formatını Değişme

Mesaj gönderen baloglurecep »

Selam ve saygılar arkadaşlar..... Özellikle veri tabanlı projemizde Türkçe dil ayarlarında default olarak tarih formatı gg.aa.yyyy şeklindedir. ancak bazı pc lerde ya ekledikleri başka programlar yada müdahaleler sonucunda tarih formatı aa.gg.yyyy yada aa.gg.yy olabilmektedir. Bu da bizim veri çekme esnasınnda hata vermektedir. ya veriler gelmiyor yada1899 gibi garip bi tarih hatası veriyor. Bu hatalar bi programcıların güvenilirliğini azaltmaktadır. Forumda aradım yalnız sonuca ulaşan bir arkadaşyada çözüm bulamadım. Bulup birlikte paylaşalım. ekleyeceğim kod tarih bileşenleri olan formlarda otomatik olarak tarih formatını gg.aa.yyyy değiştirmesi lazım. shortdateformat:='dd.mm.yyyy' kullanıyorum çözüm olmuyor. Değiştiğimde formlardaki bileşenlerdeki tarih formatı da değişmesi lazım. Çünkü formatı windowsun tarih formatından alıyor.

saygılarımla
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: windows Tarih formatını Değişme

Mesaj gönderen sabanakman »

Ana formun bulunduğu pas dosyasının en altına

Kod: Tümünü seç

initialization
  DateSeparator := '.';
  ShortDateFormat := 'dd.mm.yyyy';
end.
şeklinde bir kod yazarsanız, windows ayarları ne olursa olsun program kendi içinde bu ayarlara göre çalışacaktır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen baloglurecep »

şaban bey ilgi ve alakınıza çok teşekkür ederim. yalnız dediğinizi yapmam rağmen hala windowsun ayarlarını kullanmakta. denem amaçlı bi proje yaptım ana formun en altına verdiğiniz kodu ekledim. derleme yaptım. daha sonra windowsun tarih dil ayarından formatı değiştim. akabinde derleğim projeyi çalıştırıdım. proje içindeki tarih bileşeni hala windowsun formatına göre gösteriyordu. acaba ynlış yaptığım bir yer mi var?

ana formun unitin kodlarını ekliyorum

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls;

type
  TForm1 = class(TForm)
    DateTimePicker1: TDateTimePicker;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

initialization
  DateSeparator := '.';
  ShortDateFormat := 'dd.mm.yyyy';



end.
muhtemelen bi foncion yazıp tüm formlarda onu kullanacam. tarih bileşenlerini formatlayacam. en son çare sanırım bu olacak.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen emin_as »

Hangi veritabanını ve hangi bileşenleri kullanıyorsun.
Yukarıda verilen ayarlar format, formatdate, strToDate gibi delphi fonksiyonlari ve standart bileşenler tarafından kullanılır. Ama firebird ve mysql gibi veritabanları ayrı sistemlerdir. Bunlara parametre degil de string olarak geçilen tarih bilgilerini özel formatta olmalıdır.
Örnegin firebird aşagıdaki gibi bilgileri kabul eder.
http://www.firebirdfaq.org/faq137/
DD.MM.YYYY
MM/DD/YYYY
YYYY-MM-DD
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen baloglurecep »

emin bey selamlar...
yukardaki kodu standart bileşenle yaptım. normalde firebird 2.0 kullanıyorum. aslında kodlarda fark yok sadece byük küçük harf farklılığı var. sizin bi öneriniz var. tüm projede her formda tek tek kod yazmak istemiyorum. ana formun açılışında bi kaç satıt kodla windowsun tarih formatını gün.ay.yıl şeklinde yaparsam hem benim işim hemde bu konua sıkıntı çeken tüm programcıların çözümü olacaktır.

saygılarımla
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen emin_as »

Programlarda tarih formatının nasıl kullanıldıgına karışmıyorum. Kullanıcı neyi seçtiyse onu kullanabilmeli. Tabii dışarıdan bilgi alınıp, bilgi verilecekse bu işleri yapan fonksiyonları düzenliyorum.
Örnegin Merkez bankası döviz kurları gelirken tarih ayıracı . oluyor ve firebird e bilgi yollarken dikkatli olmak gerekiyor.

Doviz kurları alırken, şunu yapıyorum:

Kod: Tümünü seç

  temp_ch:=dateseparator;
  dateseparator:='.';
  try
     ....
  finally
    dateseparator:=temp_ch;
  end;
Firebird e tarih yollacaksam, aşagıdaki gibi bir fonksiyon kullanıyorum.

Kod: Tümünü seç

function fbird_Tarih(dt1: TDateTime):string;
begin
  result:=quotedstr(FormatDateTime('dd.mm.yyyy',dt1));
end;
Bunların dışında veritabanı fonksiyonlarını kullanmak en dogrusu.

Kod: Tümünü seç

stokdb.FieldByName('SATISTARIHI').AsDatetime; // tarih alanını tarih olarak almak için
stokdb.FieldByName('SATISTARIHI').AsString; // tarih alanını string olarak almak için
Sistem ayarlarını değiştirmeyi nedense pek şık bulmuyorum. Sorun çıkaran bölüm tespit edilip, orasının düzeltilmesi en dogru yaklaşım olur.
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen quadr »

proje dosyasına(*.dpr) program format ayarlarını belirterek windows sistem ayarlarını değiştirmeden kullanabilirsin.
böylelikle her sistemde sabit bir çalışma elde edersin.

begin
Application.Initialize;
Application.UpdateFormatSettings := False;
ThousandSeparator := ',';
DecimalSeparator := '.';
DateSeparator := '.';
TimeSeparator := ':';
ShortDateFormat := 'dd.mm.yyyy';
ShortTimeFormat := 'hh:mm';
LongTimeFormat := 'hh:mm';
end;

kolay gelsin...

Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen baloglurecep »

polat kardeşim gönderiğin kodu projenin neresinde kullanmam gerekli ana formda her hangi bir yerdemi yoksa başka bir yerdemi.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen baloglurecep »

şaban bey nezdinde tüm cevaplayan arkadaşlara teşekküer ederim. Şban beyin önerisi ile problem halloldu.
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen csunguray »

Bu şekilde program yazarsanız yazdığınız program zayıf olur. Bence hiç bir zaman tarihin string şekli üzerinden işlem yapılmamalıdır. Ayrıca yazdığınız programlar windowsun bölgesel ayarlarına bağımlı olmamalıdır. Ayrıca programınız windowsun mevcut bölgesel ayarlarını değiştirmemelidir. Tarih işlemleri için ekseriyatla kullanmanız gereken fonksiyonlar aşağıdaki gibi olmalıdır.

Kod: Tümünü seç

Tarih: TDateTime; 
olmak üzere

Belli bir tarih değerini edinme:

Kod: Tümünü seç

Tarih := EncodeDate(2009, 11, 12);
Bir tarihin gün, ay yıl değerlerini belirleme:

Kod: Tümünü seç

DecodeDate(Tarih, Yil, Ay, Gun);
Bir tarihin string şeklini alma (Türk formatı):

Kod: Tümünü seç

FormatDateTime('dd.mm.yyyy', Tarih);
Bir tarihin string şeklini alma (Ansi formatı. SQL sorgularda bu formatı kullanırsanız bir çok sql sunucusunda sorun yaşamazsınız):

Kod: Tümünü seç

FormatDateTime('yyyy-mm-dd', Tarih);
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: windows Tarih formatını Değişme

Mesaj gönderen sabanakman »

Veri tabanı ayrı telden, windows ayrı telden çalarsa büyük olasılıkla normalde sizde çalışan bu kodlar başka biçim ayarlanmış sistemlerde Runtime Error diyerek buhar olabiliyor. Bunu engellemek için projenizin çalıştığı sistemi veritabanına uyarlamanız veya veritabanını çalışan sisteme uyarlamanız gerekmektedir. En kolay ve ideal olanı ise sistem değişkenlerine başta bu değeri vermek olacağından ve sonuçta program için sistem ayarlarına müdahele olmadığından bu şekilde ayar çekmek olacaktır. İşin içinde veritabanı olmasa bu gibi kodlar zaten bir sorun çıkarmamaktadır ama o zaman da bu soru başlığı hiç açılmazdı :mrgreen: .
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
quadr
Üye
Mesajlar: 69
Kayıt: 21 Haz 2003 10:12
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen quadr »

@csunguray
bölgesel ayarları değiştirme söz konusu değilki.program açılışında gerekli format ayarlarını yaptıktan sonra bağımlı kaldığın bir yer olmadığı için işletim sistemi ne ayarda olursa olsun sen kendi formatında çalışıyorsun böylece sabit bir çalışma elde etmiş olursunuz.

örnek:

bt.dpr

Kod: Tümünü seç

program bt;

uses
  SysUtils,
  Forms,
  frmuMain in 'frmuMain.pas' {frmMain},

{$R *.RES}


begin
  Application.Initialize;
  Application.UpdateFormatSettings := False;
  ThousandSeparator := ',';
  DecimalSeparator  := '.';
  DateSeparator     := '.';
  TimeSeparator     := ':';
  ShortDateFormat   := 'dd.mm.yyyy';
  ShortTimeFormat   := 'hh:mm';
  LongTimeFormat    := 'hh:mm';

  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.


Ayakkabıyı sefaletten
Çok sonraları tanıdım
Öyle ufuklarda mı olurmuş Allah'ım
Giyer giyer koşardım
Toprağın dostluğundan
Oyuncaklar yaptım çamurdan
Tenimin rengini aldım topraktan
Sen bakma esmerliğim sonradan...

http://www.tcct.us
Kullanıcı avatarı
csunguray
Üye
Mesajlar: 855
Kayıt: 09 Ara 2006 05:08
Konum: Adana
İletişim:

Re: windows Tarih formatını Değişme

Mesaj gönderen csunguray »

Açıkçası sistem ayarlarını pek kurcalamadığım için Application.UpdateFormatSettings özelliğinden haberim yoktu. Yararlı bir özellik. Programcının işini epeyce kolaylaştırıyor. Yine de şunu savunuyorum. Eğer kullanıcı bölgesel ayarları kendisine göre değiştirmişse bizim programımızın da buna uygun çalışmasını beklemek hakkıdır diye düşünüyorum.
C. Sunguray
csunguray at netbilisim.kom
Net Bilişim Hizmetleri

Sıradan her programcı bilgisayarın anlayabileceği kodlar yazabilir.
Sadece iyi programcılar insanların da anlayabileceği kodlar yazarlar.
Martin Fowler (http://martinfowler.com/)
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: windows Tarih formatını Değişme

Mesaj gönderen sabanakman »

csunguray yazdı:.. Eğer kullanıcı bölgesel ayarları kendisine göre değiştirmişse bizim programımızın da buna uygun çalışmasını beklemek hakkıdır diye düşünüyorum.
Zaten verilen kodlar da bunu sağlamaktadır. Bu kodlar sisteme hiç bir etki yapmamaktadır ve değişik sistemlerde değişik ayarlara ayak uyduran program için gerekli kodlardır. Alt tarafı bir kaç değişkene başlangıçta değer atanmaktadır o kadar. Bunun windows ayarlarına hiç bir etkisi yoktur.
polatkadir yazdı:

Kod: Tümünü seç

program bt;

uses
  SysUtils,
  Forms,
  frmuMain in 'frmuMain.pas' {frmMain},

{$R *.RES}


begin
  Application.Initialize;
  Application.UpdateFormatSettings := False;
  ThousandSeparator := ',';
  DecimalSeparator  := '.';
  DateSeparator     := '.';
  TimeSeparator     := ':';
  ShortDateFormat   := 'dd.mm.yyyy';
  ShortTimeFormat   := 'hh:mm';
  LongTimeFormat    := 'hh:mm';

  Application.CreateForm(TfrmMain, frmMain);
  Application.Run;
end.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla