tarih alanını formatlamak.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

tarih alanını formatlamak.

Mesaj gönderen y.kulac »

s.a.
firebird 1,5 veritabanı var. tarih alanım var date olarak tanımlı

dbedit1 e 10102006 yazcağım ve onexit olayında tarihi formatlamak istiyorum. onexit olayı çalışınca tarih şu şeklide olacak.araya ben ayrıraç koymayacağım. 10.10.2006. ama burada bir sorun var. bazı bilgisayaralarda tarih ayıracı nokta değil / .
ne yapmalıyım.
iyi çalışmalar.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Öncelikli olarak bilmen gereken önemli bir husus var.

- Eğer TDbEdit kullanarak girişi yaptığın Field tarih alanı (ftDate) ise onExit olayından hemen önce tablonun alan validate işlemi devreye girer ve yanlış girişlerde sana fırsat vermeden ValidateError exceptionu üretir.

- Bunun önüne geçmek için üç değişik yöntem izlenebilir.

1. Tarih alanı girişi TEdit ile yapılır ve işlem OnBeforePost olayında uygun tarih formatında ilgili alana aktarma yapılması sağlanır.

2. Tarih alanı girişi yapılacak TDBEdit; Try Except bloğu içerisine alınır, hata alındığında tarih tamamlama / düzeltme işlemi yapılır ve hata bertaraf edilerek yola devam edilmesi sağlanır.

3. TDBEdit için kendisinden yeni bir bilşen türetilerek bu işlemin bileşen tarafından otomatik yapılması sağlanabilir. (bileşen için örnek link)


- Bunların ışığında ek olarak sorunun cevabı olarak şunu bildirebilirim, tarih alanı girişi sırasında Enter, Escape, Backspace, '0'..'9' gibi kabul edilebilecek karakter ve kontroller dışındaki girişlerde basılan tuş ne olursa olsun onun yerine system tarih ayracını koydurabilirsin.

- DateSeparator kelimesi sistemin dil seçeneklerindeki tarih ayracı içeren sabitidir. Bunun benzeri sabitler ThousandSeparator, DecimalSeparator, DateSeparator, TimeSeparator olarak sıralanabilir. SysUtils uniti içerisinde bulunan fonksiyonlardır ve ilgili sabiti sistemden bulup bize sunarlar.

Kod: Tümünü seç

procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);
Const
  KabulEdilen = ['0'..'9', #13, #8, #27];
begin
  If NOT (Key in KabulEdilen) then Key := DateSeparator;
end;
.. gibi bir örnek soruna cevap olacaktır.

- Başarılar...
Resim
Resim ....Resim
erdoganturkmen

Mesaj gönderen erdoganturkmen »

Kod: Tümünü seç

procedure TForm1.DBEdit1KeyPress(Sender: TObject; var Key: Char);
Const
  KabulEdilen = ['0'..'9', #13, #8, #27];
begin
  If NOT (Key in KabulEdilen) then Key := DateSeparator;
end;
.. gibi bir örnek soruna cevap olacaktır.

Peki hocam ben bişe sormak istiyorum. Girmiş olduğumuz dbedit nesnesinin içine sadece rakam giriliyo ancak bunun formatını tarih formatı gibi almasını nasıl sağlayabiliriz :?: Yani maskedit gibi nasıl yapabilirz. Bildiğim kadarıyla DBmaskeEdit nesnesi yok..
Şimdiden Teşekkürler..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@erdoganturkmen

- Bu sorunun da iki yolu var. İlki TDbEdit'in evet EditMask'ı yok ama bağlı olduğu veritabanındaki alana ait EditMask özelliği var. TMaskEdit ile aynı özelliklere sahiptir.


- Veritabanı active edildikten sonra aşağıdaki tanımları yaparsan hem EditMask değerini hem de ekranda gösterilecek formu dilediğin şekle getirmiş olursun.

Kod: Tümünü seç

  AdoQuery1.FieldByName('Tarih').EditMask := '!99/99/00;1;_';
  TDateTimeField( AdoQuery1.FieldByName('Tarih') ).DisplayFormat := 'dd/mm/yy';
- İkinci yolu ise her girilen karakter ile string operasyon yapıp ilgili şekle getirirsin.

- Unutmadan ekleyim bilmeyenler olabilir... Burada mask verirken / (bölüm) işareti kullanıyoruz ama aslında dateseparator ile kendiliğinden değişecektir. tarih ayracı sistemde nokta ise bu bölüm işaretleri kendiliğinden nokta olarak görüntülenir... :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
y.kulac
Üye
Mesajlar: 276
Kayıt: 08 Kas 2003 12:03
Konum: serdivan/sakarya

Mesaj gönderen y.kulac »

mrmarman kardeşim açıklayıcı bilgilerin için teşekkür ederim.
erdoganturkmen

Mesaj gönderen erdoganturkmen »

İlginize teşekkür ederim. Çok sağolun. İİ günler
Cevapla