Valudation (Değer) Kontrolü

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Valudation (Değer) Kontrolü

Mesaj gönderen Ali Erdoğan »

Arkadaşlar veri tabanına bilgi girerken alanların değer kontrollerini yapmanın en kolay yolu nedir?

Beforepost olayına kod yazılabiliyor ancak bu pek pratik olmuyor.

Birde fieldların customconstraint diye bir özelliği var ancak bu da pek bir işe yaramıyor.Sql e dayanmayan kontrolleri yapamıyorsunuz.

Siz hangi yöntemleri kullanıyorsunuz.Örneğin bir parasal alanın boş geçilmemesi için veya bir tarih alanı 2 yıldan daha eski iken parasal değerin 20 den az olamaması vb. durumların kontrolü için ne gibi yollar izliyorsunuz.

Bunu yapmanın en iyi yolu bu kontrolleri veri tabanı kısmında yapmaktır sanırım.Ancak bunda da olumsuzluklar oluyor.Dediğim gibi bir datetimepicker ın vb. kontrolün durumuna göre de kontrol yapmak gerekebiliyor.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

SQL kullanacaksan Database in desteğine göre if yada case olarak veri yi kontrol edebilirsin

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Merhaba,

Eğer standart yöntemlerin dışında bir yöntem arıyorsanız: JVCL içinde JvValidators isimli bileşenler mevcut. Fikir verebileceğini düşünüyorum. .NET'de kullanılanına benzer bir şeyler yapmışlar. Bence gayet güzel.
ertug
Üye
Mesajlar: 82
Kayıt: 10 Ara 2004 05:41

Mesaj gönderen ertug »

Ben veri girişi için DB nesneleri kullanmıyorum. Normal nesneler + Kaydet veya Tamam düğmesi en ideal çözüm. Gerekli kontrolleri de düğmeye basıldığında yapıyorum.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Merhaba.
Bunu veritabanı tarafında değil de exe'de yapmak daha mantıklı fikrimce..Bir proje ne kadar detaylı olursa olsun girilecek formatlar belli bir sınır içinde olacaktır..Bu tür işlemler için genelde bir kontrol uniti tanımlanır ve burada yazılacak fonksiyonlara değerler parametre olarak gönderilir.Dönecek değere göre de gerekli uyarıyı yapabilirsiniz..Birden fazla bileşen için aynı kontrolü yapmanız gerektiğinde de bileşenlerin eventini tek bir procedureye yönlendirmeniz işinizi kolaylaştıracaktır..Bir de bu işlemler için kimi bileşenlerde ekstra bir property oluyor..Ancak dilediğiniz kontrollerin tümüne hakim olmanız tahmininiz üzere manuel olarak yazmaktan geçiyor..
Saygılarımla.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
Kontrol işlemi alana girilecek bilgini tipine ve türüne göre değişkenlik arz eder.
bazı durumlarda kaydet düğmesinde post demeden önce. bazen tablonun beforepost olayında bazen ilgili dbkontrolun change inde bazende vt de triger ve chek lerle.

bu işlem için en iyi yöntm şudur. sürekli şunu kullanın gibi genelleme bence yapılamaz.

sizin yapacağınız en iyi şey ilgili alana ne tür bilgilerin girileceğini ve nasıl kontroller yapılması gerektiğini bilmek(kaydını tutmak) ve gerektiğinde ilgili durum için en uygun kontrolü yapıp kullanıcıyı duruma göre bilgilendirmek.

bence budur.

kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Ali Erdoğan
Kıdemli Üye
Mesajlar: 1026
Kayıt: 11 Şub 2005 02:12
Konum: İstanbul

Mesaj gönderen Ali Erdoğan »

aslangeri yazdı:s.a.
Kontrol işlemi alana girilecek bilgini tipine ve türüne göre değişkenlik arz eder.
bazı durumlarda kaydet düğmesinde post demeden önce. bazen tablonun beforepost olayında bazen ilgili dbkontrolun change inde bazende vt de triger ve chek lerle.

bu işlem için en iyi yöntm şudur. sürekli şunu kullanın gibi genelleme bence yapılamaz.

sizin yapacağınız en iyi şey ilgili alana ne tür bilgilerin girileceğini ve nasıl kontroller yapılması gerektiğini bilmek(kaydını tutmak) ve gerektiğinde ilgili durum için en uygun kontrolü yapıp kullanıcıyı duruma göre bilgilendirmek.

bence budur.

kolay gelsin.
Bu şekilde bir genelleme yapılamıyacağını biliyorum.Ancak en pratik yolu arıyorum.Çünkü programlama aşamasında en çok zamanı bu validation kontrolü alıyor.Formları felan inherit edip pek çok şeyi çok kısa bir zaman sürecine yazabiliyorsunuz.Ancak her defasında bir yığın if-else yazmak bir sürü showmessage kullanmak benim zoruma gidiyor.Bunun yanında tam bir çözümde sağlamıyor.Çünkü veri tabanına farklı bir yolda erişildiğinde de geçersiz bir kaydın girilmemesi lazım veri tutarlılığını tam sağlayabilmek için.

Bir şekilde bu validation kontrolünün de kolay bir yolu olmalı diye düşünüyorum.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Kod: Tümünü seç

procedure TChemPrmForm.ValidateInput(var M: TMessage);
begin
if TTntEdit(M.lParam).Text = '' then
   begin
   MessageDlg('Hatalı Değer!', mtWarning, [mbOk],0);
   TTntEdit(M.lParam).SetFocus;
   end;
end;
gibi birşey olabilir, eğer integer lar sınırlar içinde olacaksa spin edit kullanın, min ve maxlarını belirtin, aynı yöntemi kullanın.

ek: tam yöntemle ilglii bkz: http://community.borland.com/article/0, ... 71,00.html

Kod: Tümünü seç

 Technical Information Database

TI1171D.txt   Validating input in TEdit components
Category   :VCL
Platform    :All
Product    :Delphi  All

Description:
  Q: How can I validate input in my TEdit components?

  A: Assuming you're using regular TEdit components, 
     during OnExit, you will see irregular behavior from
     controls if you attempt to change focus at that time.

     The solution is to post a message to your form in the TEdit's
     OnExit event handler.  This user-defined posted message will
     indicate that the coast is clear to begin validating input.
     Since posted messages are placed at the end of the message
     queue, this gives Windows the opportunity to complete the
     focus change before you attempt to change the focus back to
     another control.

     Attached is a unit and text representation of a DFM (form)
     file which demonstrates this technique.

  { *** BEGIN CODE FOR UNIT5.PAS *** }
  unit Unit5;
  
  interface
  
  uses
    SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
    Controls, Forms, Dialogs, StdCtrls, Mask;
  
  const
    { User-defined message }
    um_ValidateInput = wm_User + 100;
  
  type
    TForm5 = class(TForm)
      Edit1: TEdit;
      Edit2: TEdit;
      Edit3: TEdit;
      Edit4: TEdit;
      Button1: TButton;
      procedure EditExit(Sender: TObject);
      procedure EditEnter(Sender: TObject);
    private
      Refocusing: TObject;
      { User-defined message handler }
      procedure ValidateInput(var M: TMessage); message um_ValidateInput;
    end;
  
  var
    Form5: TForm5;
  
  implementation
  
  {$R *.DFM}
  
  procedure TForm5.ValidateInput(var M: TMessage);
  var
  E : TEdit;
  begin
    { The following line is my validation.  I want to make sure }
    { the first character is a lower case alpha character.  Note }
    { the typecast of lParam to a TEdit. }
    E := TEdit(M.lParam);
    if not (E.Text[1] in ['a'..'z']) then begin
      Refocusing := E;                       { Avoid a loop     }
      ShowMessage('Bad input');              { Yell at the user }
      TEdit(E).SetFocus;                     { Set focus back   }
    end;
  end;
  
  procedure TForm5.EditExit(Sender: TObject);
  begin
    { Post a message to myself which indicates it's time to  }
    { validate the input.  Pass the TEdit instance (Self) as }
    { the message lParam. }
    if Refocusing = nil then
      PostMessage(Handle, um_ValidateInput, 0, longint(Sender));
  end;
  
  procedure TForm5.EditEnter(Sender: TObject);
  begin
  if Refocusing = Sender then
    Refocusing := nil;
  end;
  
  end.
  { *** END CODE FOR UNIT5.PAS *** }
.-.-.-.-.-.-.-. ^_^
Cevapla