Stack overflow hatası ... yardım

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Stack overflow hatası ... yardım

Mesaj gönderen adnansirca »

Merhaba dostlar.... Projemde Adosql kullanıyorum...
Hesaplama fonksiyonuna aşağıdaki kodu ekledim ve stack overflow hatası veriyor.. Önerisi olan var mı.... Yanlışlık nerede.

Not: FieldKind fkCalculated yaptım.....

Kod:
procedure Tveriler.MasisSQLCalcFields(DataSet: TDataSet);
var
i : Integer;
masraftoplami : Double;
begin
try
//application.ProcessMessages;
masraftoplami := 0;
if veriler.MasisSQL.Eof then
Begin
Exit;
End
Else
Begin
veriler.MasisSQL.First;
For i:= 0 To veriler.MasisSQL.RecordCount-1 Do
Begin
veriler.MasisSQLmastopla.AsCurrency := veriler.MasisSQLmastopla.AsCurrency +
veriler.MasisSQLmasrafi.AsCurrency;
veriler.MasisSQL.Next;
End;
End;
//veriler.AnaSQL.Edit;
//veriler.AnaSQLd_masraf.AsCurrency := veriler.AnaSQLkf_mas.AsCurrency +
// veriler.AnaSQLkf_uc.AsCurrency +
// veriler.MasisSQLmastopla.AsCurrency;

except
ShowMessage('Hesap Yapılamadı');
end;

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

Re: Stack overflow hatası ... yardım

Mesaj gönderen sabanakman »

adnansirca yazdı:procedure Tveriler.MasisSQLCalcFields(DataSet: TDataSet);
.
.
.
veriler.MasisSQL.First;
.
.
veriler.MasisSQL.Next;
.
.
.
end;
Burada kayıt hareketi yaptığın (First, Next vs.) için MasisSQLCalcFields prosedürü içinde MasisSQLCalcFields prosedürü (kendisi) tekrar çalışmakta ve iç içe sonsuz kere çağrılmaktadır. Tabi sonsuza kadar sürmesi engellendiği için belirttiğin hata geliyor. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

@sabanakman ın dediği gibi MasisSQLCalcFields ya da OnCalcFields yordamı kayıt göstergeci dosya açıldığında veya başka bir kayıtda konumlandığında tetiklenir. Dolaysıyla procedure içindeki veriler.MasisSQL.First; veriler.MasisSQL.Next; ile bu tetiklenmektedir.

Çözümü:

Kod: Tümünü seç

procedure Tveriler.MasisSQLCalcFields(DataSet: TDataSet);
var
i : Integer;
masraftoplami : Double;
begin
try
//application.ProcessMessages;
masraftoplami := 0;
if veriler.MasisSQL.Eof then
Begin
Exit;
End
Else
Begin
  Veriler.OnCalcFields := nil;
veriler.MasisSQL.First;
For i:= 0 To veriler.MasisSQL.RecordCount-1 Do
Begin
veriler.MasisSQLmastopla.AsCurrency := veriler.MasisSQLmastopla.AsCurrency +
veriler.MasisSQLmasrafi.AsCurrency;
veriler.MasisSQL.Next;
End;
  Veriler.OnCalcFields := MasisSQLCalcFields;
End;
//veriler.AnaSQL.Edit;
//veriler.AnaSQLd_masraf.AsCurrency := veriler.AnaSQLkf_mas.AsCurrency +
// veriler.AnaSQLkf_uc.AsCurrency +
// veriler.MasisSQLmastopla.AsCurrency;

except
ShowMessage('Hesap Yapılamadı');
end;

end;
şeklinde çözülebilir.. acele yazdım kontrol etmek lazım :roll:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
adnansirca
Üye
Mesajlar: 135
Kayıt: 14 Kas 2005 12:24

Mesaj gönderen adnansirca »

sağolun hocam...
onCalcField olayında olmuyor..
Ben de butonun onCilck olayına aldım ve verdiğiniz şekilde oldu....
Saygılar
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Aklınızda bulunsun StackOverflow hatası almak demek, muhtemelen sonsuz bir döngü içinde bir rutin çağrılıyor demektir.

Öyle bir durumda hemen aklınıza, ben ne yapıyorumda milyonlarca kez bir Rutin çağrılıyor, diye bir soru gelmeli.

Ondan sonrasını çözersiniz.

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla