function toplam_bul(tablo : TAdoQuery; field_name : string) : double;
var
bookmark : pointer;
sonuc : double;
begin
Bookmark := tablo.GetBookmark;
tablo.DisableControls;
sonuc := 0;
try
tablo.First;
while (not tablo.Eof) do
begin
try
sonuc := sonuc + tablo.FieldByName(field_name).Value;
except
on E:EVariantTypeCastError do
begin
sonuc := sonuc + 0;
end;
end;
tablo.Next;
end;
finally
tablo.GotoBookmark(Bookmark);
tablo.FreeBookmark(Bookmark);
tablo.EnableControls;
end;
result := sonuc;
end;
kodda EVariantTypeCastError ile bu hatayı yakalayıp bu hata mesajını kullanıcya göstermek istemiyorum ama hatayı yakalayacağı yere girmeden hata mesajını veriyor. bu hatayıda tutar alanı null ken yapıyor ve null veriyi double çeviremediği söylüyor.
bu kod doğrumu yada başka nasıl yapabilirim bu işi.
procedure TDTM_PARAMETRE.TBL_PARAMETREDeleteError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
EDIT_ERROR(E.message);
// Abort;
end;
procedure EDIT_ERROR(MESAJ : string);
begin
if POS('Gelen Hata Mesajı', MESAJ)>0 then
begin
MessageDlg(MESAJ,mtError, [mbOK],0);
end;
Exception'lar eğer Delphi'nin ayarında açıksa zaten gösterilecektir. Uygulama Delphi dışında çalıştığında bu exception yine gözükecek demek değildir.
Delphi içinde Exception izlemeyi kapatmak için, Menuden Tools->Debugger Options'a girin, Language Exceptions sekmesindeki Stop on Delphi Exceptions checkbox'unun tık'ını kaldırın. Delphi, artık bir exception yakalarsa ve siz bu exception'u aslında try except bloğu içinde gizlemişseniz, hata vermeyecektir.
try except bloğu arasına koymaktansa, değerin null olup olmadığının kontrolünü yapmak daha kolaydır:
if not tablo.FieldByName(field_name).IsNull then
sonuc := sonuc + tablo.FieldByName(field_name).Value;
şeklinde kullanmak daha mantıklıdır. ancak try except bloğu içinde kullanmak istiyorsanız exception'u kesin belirtmekten kaçının. Sadece o exception olduğundan eminseniz kullanın.
try
except on EVariant.....
yerine
try
except
end
şeklinde daha generic exception tuzakları hazırlamaya çalışın.