Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
F9 ile derleme sonrası ortaya çıkan hatalar (Çözüldü)
#1
Delphi Berlin ile yapılan programda
Programı Ctrl+F9 ile derleyince exe oluşuyor ve çalışıyor.
ama sadece F9 ile derleme yapınca resimdeki hata oluşuyor.
test amaçlı showmessage ler ekledim.
Satır1 ve satır2  ekrana yazıyor satır3 yazmadan hataya düşüyor.
exe nin çalıştığına güvenmeli miyim.
Hata aramalı mıyım ?


Ek Dosyalar Resimler
   
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#2
Sizin yerinizde olsam; TKapiFrm sınıfının bir constructor'u var ise oraya ve OnCreate olay yöneticisinde kod var ise oraya bir bakarım. Tüm bunlarda hataya neden olan bir şey yok ise, ilgili formun Loaded olayı var ise onu kontrol ederim, hiç biri yok ise; bu durumda ilgili formun üzerindeki componentlerden birisinde hata oluşuyordur. Kısacası ilgilenmenizi gerektirecek bir hata var; bertaraf etmek için elinizden geleni yapmalısınız.

Not: Hata penceresinde iken Break tuşuna basın ve Call Stack'ı inceleyin. Size çok ciddi bir fikir verecektir.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
(26-03-2019, Saat: 14:56)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Sizin yerinizde olsam; TKapiFrm sınıfının bir constructor'u var ise oraya ve OnCreate olay yöneticisinde kod var ise oraya bir bakarım. Tüm bunlarda hataya neden olan bir şey yok ise, ilgili formun Loaded olayı var ise onu kontrol ederim, hiç biri yok ise; bu durumda ilgili formun üzerindeki componentlerden birisinde hata oluşuyordur. Kısacası ilgilenmenizi gerektirecek bir hata var; bertaraf etmek için elinizden geleni yapmalısınız.

Not: Hata penceresinde iken Break tuşuna basın ve Call Stack'ı inceleyin. Size çok ciddi bir fikir verecektir.

Teşekkür ederim Allah c.c razı olsun adım adım önerilerinizi deneyeceğim.

Not: Hata penceresinde iken Break tuşuna basın ve Call Stack'ı inceleyin. Size çok ciddi bir fikir verecektir.

sayın @Tuğrul HELVACI  nokta atışı cevap için teşekkür ederim.


sorunları tespit ederek düzelttim

sayın @Tuğrul HELVACI 

Öğrenmek için sormak isterim
  //siparisuretim_view.DataController.OnDataChanged := nil;   // Programın kırılmasına sebep olan hata

bu bir hata ise try neden yakalayamadı.



procedure Tkapifrm.siparisuretim_viewDataControllerDataChanged(Sender: TObject);
begin

 try
   //siparisuretim_view.DataController.OnDataChanged := nil;   // Programın kırılmasına sebep olan hata
   try
     siparisuretim_view.Controller.FocusedRecord.Values[6] :=
     StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[3])) *
     StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[5]));
   except
     try
       siparisuretim_view.Controller.FocusedRecord.Values[6] := '';
     except
     end;
   end;
 finally
  siparisuretim_view.DataController.OnDataChanged := siparisuretim_viewDataControllerDataChanged;
 end;

end;


Ek Dosyalar Resimler
   
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#4
Muhtemelen hatayı henüz focused bir kayıt olmadığı için alıyor olmalısınız. Yani muhtemelen FocusedRecord nil'dir. İlla bu olayı kullanmak istiyorsanız biraz daha kontrollü bir kod yazmanızda fayda var. Örneğin;

    
  if Assigned(Controller.FocusedRecord) then
     if Controller.FocusedRecord.IsData then
      ....

Ama ben yine de size TDataSet'in OnBeforePost olayını kullanmanızı öneririm. Elbette tam olarak ne yapmak istediğinizi bilemiyorum. Bu arada, uygulama debug ortamında çalışmaz iken hatayı neden gözlemlemediğiniz de bariz. Çünkü try/except bloğunda hatayı saklamışsınız. Genel manada try/except blokları hatayı yakalamak, loglamak ya da ona benzer bir şeyler yapmak ve hatayı yeniden tetiklemek üzerine kurgulanmalıdır.(raise).

Sizin kodunuzda içteki blokta bir hata oluştuğunda try/except bloğunun except kısmına düşüyor; oraya da bir try/except koymuşsunuz ce except kısmı tamamen boş. Çok hatalı bir yaklaşım bu. Örneğin;

procedure Tkapifrm.siparisuretim_viewDataControllerDataChanged(Sender: TObject);
begin

try
  //siparisuretim_view.DataController.OnDataChanged := nil;   // Programın kırılmasına sebep olan hata
  try
    siparisuretim_view.Controller.FocusedRecord.Values[6] :=
    StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[3])) *
    StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[5]));
  except
    try
      siparisuretim_view.Controller.FocusedRecord.Values[6] := '';
    except
    end;
  end;
finally
 siparisuretim_view.DataController.OnDataChanged := siparisuretim_viewDataControllerDataChanged;
end;

  ShowMessage('Buraya hata oluştuğunda hiç gelmemeliydi');
end;

Yukarıdaki kodda, hata oluşsa dahi en altta benim ilave ettiğim ShowMessage kodu işletilir. Oysa işletilmemesi gerekir hata oluşması durumunda. Bu bağlamda yukarıdaki kodu daha manidar şekilde yazmamız gerekir ise eğer;

procedure Tkapifrm.siparisuretim_viewDataControllerDataChanged(Sender: TObject);
begin
 try
   try
     siparisuretim_view.Controller.FocusedRecord.Values[6] :=
     StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[3])) *
     StrToFloat(VarToStr(siparisuretim_view.Controller.FocusedRecord.Values[5]));
   except
     // Birşeyler yap, ne yapmak isterseniz...
     raise;
   end;
 finally
   // Hata oluşsa da süreç buraya kadar gelir ve bir alt satır işletilir.
   siparisuretim_view.DataController.OnDataChanged := siparisuretim_viewDataControllerDataChanged;
 end;

 // Ancak hata oluşması durumunda süreç buraya kadar gelemez.
end;
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
Ayrıca yeri gelmişken kıymetli bir uyarı ve çözüm paylaşacağım. Bir çok anlamsız görünen hatanın oluşmasının müsebbibi, henüz ilgili olay yöneticisinden çıkmadan (yani olay tamamlanmadan) yapılan bazı işlemledir. Bu tarz sorunların en güzel çözümü olayın tamamlanmasına müteakip sizin kodlarınızın çağrılmasını sağlamaktır. (Yani içinde bulunduğunuz event bittikten sonra, o rutinden çıktıktan sonra).

Bunun için yapılabilecek pek çok şey var ancak en basit iki yöntemden birisi PostMessage API'sini kullanmak ikincisi ise aşağıdaki gibi bir kod kullanmaktır:

procedure QueueCode(const AProc: TProc; const AWaitTime: Cardinal = 0);
begin
 TThread.CreateAnonymousThread(
   procedure
   begin
     if AWaitTime > 0 then
       Sleep(AWaitTime);

     TThread.Queue(
       nil,

       procedure
       begin
         AProc;
       end
     );
   end
 ).Start;
end;

QueueCode ismini verdiğim bu metod sayesinde; içinde bulunduğunuz kodun contex'inin dışında bir kod çalıştırabileceksiniz. Biraz incelemenizi öneririm elbette.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Çözüldü. Fastreport ta çalışma anında dataset atama cinarbil 2 90 11-07-2019, Saat: 17:55
Son Yorum: cinarbil
  Çözüldü-sql kodu dengesiz çalışıyor sadikacar60 4 223 11-07-2019, Saat: 14:28
Son Yorum: mcuyan
  [ÇÖZÜLDÜ] WebDav ile Bulut Sunucuya Dosya Yükleme theSinan 4 316 08-07-2019, Saat: 15:42
Son Yorum: r3n4m3
  Çözüldü - FastReport Pivot ve Group birlikte kullanılabilirmi ? adelphiforumz 5 261 05-07-2019, Saat: 14:20
Son Yorum: adelphiforumz
  [ÇÖZÜLDÜ] Windows Service içerisinden başka uygulama çalışmasını kontrol etme theSinan 2 238 08-06-2019, Saat: 12:17
Son Yorum: elixir84



Konuyu Okuyanlar: 1 Ziyaretçi