Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Formların bazen create olmaması ve butonların tıklanmaması hakkında
#1
Merhabalar arkadaşlar, 

Hazırladığım bir proje mevcut ve şuan iki yerde kullanılıyor. Fakat işyerinde yoğunluk olduğu zaman program kilitleniyor. Bazen butonlar tıklıyor ama butonun açması gereken ekranlar hiç açılmıyor, sadece butona tıklandığını fark edebiliyoruz. Sorunun kaynağını bir türlü bulamadım. buton altındaki kodlarım o an çalışmıyor. 

Acil desteğe ihtiyacım var. 
NOT: butonların açacağı ekranların kodları örneğin şu şekilde: 

Application.createform(TSatisEkran, SatisEkran); 

SatisEkran.showmodal;
 

Burada sıkıntı olabilir mi?


Bu sorunu sadece bu yazdığım Satış ekranında yaşamıyorum 

Formları create edip show yaptıktan sonra nil yapmam gerekir mi her seferinde?

Application.createform(TSatisEkran, SatisEkran);
SatisEkran.showmodal;
SatisEkran.nil; // ya da ( freeandnil(SatisEkran) gibi )

Şimdiden teşekkürler.
Cevapla
#2
(04-04-2019, Saat: 11:49)smyrna231802 Adlı Kullanıcıdan Alıntı: Merhabalar arkadaşlar, 

Hazırladığım bir proje mevcut ve şuan iki yerde kullanılıyor. Fakat işyerinde yoğunluk olduğu zaman program kilitleniyor. Bazen butonlar tıklıyor ama butonun açması gereken ekranlar hiç açılmıyor, sadece butona tıklandığını fark edebiliyoruz. Sorunun kaynağını bir türlü bulamadım. buton altındaki kodlarım o an çalışmıyor. 

Acil desteğe ihtiyacım var. 
NOT: butonların açacağı ekranların kodları örneğin şu şekilde: 

Application.createform(TSatisEkran, SatisEkran); 
SatisEkran.showmodal; 

Burada sıkıntı olabilir mi?


Bu sorunu sadece bu yazdığım Satış ekranında yaşamıyorum 

Formları create edip show yaptıktan sonra nil yapmam gerekir mi her seferinde?
Application.createform(TSatisEkran, SatisEkran);
SatisEkran.showmodal;
SatisEkran.nil; ya da ( freeandnil(SatisEkran) gibi )

Şimdiden teşekkürler.


İyi günler benzer sorunlar için 

Bu forma yazdığında 
sayın @Tuğrul HELVACI  beyin öneri ile programı inceledim ve inanılmaz hatalar yaptığımı gördüm şu an program daha düzenli çalışıyor.
Programınızı F9 ile derleyin  hata verince 

tuğrul beyin önerisi 'Hata penceresinde iken Break tuşuna basın ve Call Stack'ı inceleyin. Size çok ciddi bir fikir verecektir.' 
uygulayın.
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#3
(04-04-2019, Saat: 12:00)cinarbil Adlı Kullanıcıdan Alıntı:
(04-04-2019, Saat: 11:49)smyrna231802 Adlı Kullanıcıdan Alıntı: Merhabalar arkadaşlar, 

Hazırladığım bir proje mevcut ve şuan iki yerde kullanılıyor. Fakat işyerinde yoğunluk olduğu zaman program kilitleniyor. Bazen butonlar tıklıyor ama butonun açması gereken ekranlar hiç açılmıyor, sadece butona tıklandığını fark edebiliyoruz. Sorunun kaynağını bir türlü bulamadım. buton altındaki kodlarım o an çalışmıyor. 

Acil desteğe ihtiyacım var. 
NOT: butonların açacağı ekranların kodları örneğin şu şekilde: 

Application.createform(TSatisEkran, SatisEkran); 
SatisEkran.showmodal; 

Burada sıkıntı olabilir mi?


Bu sorunu sadece bu yazdığım Satış ekranında yaşamıyorum 

Formları create edip show yaptıktan sonra nil yapmam gerekir mi her seferinde?
Application.createform(TSatisEkran, SatisEkran);
SatisEkran.showmodal;
SatisEkran.nil; ya da ( freeandnil(SatisEkran) gibi )

Şimdiden teşekkürler.


İyi günler benzer sorunlar için 

Bu forma yazdığında 
sayın @Tuğrul HELVACI  beyin öneri ile programı inceledim ve inanılmaz hatalar yaptığımı gördüm şu an program daha düzenli çalışıyor.
Programınızı F9 ile derleyin  hata verince 

tuğrul beyin önerisi 'Hata penceresinde iken Break tuşuna basın ve Call Stack'ı inceleyin. Size çok ciddi bir fikir verecektir.' 
uygulayın.

Cevabınız için teşekkürler ama bir hata mesajı vermiyor ve bu sorunu ne zaman yapacağı da belli olmuyor.
Cevapla
#4
Öncelik Project-Options-Form kısmından Autocreate'den çıkarın

MDI Form Create ederken:
form3 := tform3.Create(application);
Kullanıyorum.

Formu kapatırken de :

OnClose olayına:

 Action := cafree;

 Form38 := Nil;


Yazıyorum.

Eğer bazen açılıyor bazen açılmıyor ise: OnCreate yada OnShow olayında ki kodlarınıza bakmanızı öneririm. Burada Sonsuz döngüye giren birşeyler yada SQL sonucu null gelen birşeyleri create ettiğiniz formda kullanıyorsanız o kilitliyor olabilir.. Bunun yüzlerce parametresi olabilir..
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#5
(04-04-2019, Saat: 12:04)smyrna231802 Adlı Kullanıcıdan Alıntı:
(04-04-2019, Saat: 12:00)cinarbil Adlı Kullanıcıdan Alıntı: İyi günler benzer sorunlar için 

Bu forma yazdığında 
sayın @Tuğrul HELVACI  beyin öneri ile programı inceledim ve inanılmaz hatalar yaptığımı gördüm şu an program daha düzenli çalışıyor.
Programınızı F9 ile derleyin  hata verince 

tuğrul beyin önerisi 'Hata penceresinde iken Break tuşuna basın ve Call Stack'ı inceleyin. Size çok ciddi bir fikir verecektir.' 
uygulayın.

Cevabınız için teşekkürler ama bir hata mesajı vermiyor ve bu sorunu ne zaman yapacağı da belli olmuyor.

Programı sadece F9 ile derleyin.
Program çalışacaktır.
sorun olan ( sadece butona tıklandığını fark edebiliyoruz. Sorunun kaynağını bir türlü bulamadım. buton altındaki kodlarım o an çalışmıyor. ) kısma gelin
işlem yapın. ürün satış ekranı olduğunu varsayarak müşteri yaptığı gibi birden çok işlemi tekrar edin.
 
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#6
Arkadaşların önerdiği gibi programı debug modda çalıştırın ve hataların oluşmasına izin verin. Program içinde try/except blokları var ise ve except bloğunda hata gizlenmiş ise, (raise yok ise) yeniden raise edin. Böylece hataları runtime sırasında da görebilirsiniz.

Örneğin:
var
  A, B, C : Integer;
begin

  try
    B := 10;
    C := 0;
    A := B div C; // Sıfıra bölme hatası 
  except
    ShowMessage('Hata oldu');
  end;

  ShowMessage('Normalde kod bu noktaya ulaşamamalı..!!');

end;

Yukarıdaki gibi görünen tüm blokları aşağıdaki hale getirmelisiniz.

var
  A, B, C : Integer;
begin
  try
    B := 10;
    C := 0;
    A := B div C; // Sıfıra bölme hatası 
  except
    ShowMessage('Hata oldu');

    raise;
  end;

  ShowMessage('Normalde kod bu noktaya ulaşamamalı..!!. (Şimdi bu mesajı görmeyeceksiniz hata olduğunda)');
end;


Ayrıca ben form oluşturma işlemini aşağıdaki gibi yapıyorum:

  try
    frmTest.Show; // Bu form yok ise Access Violation hatası oluşur ve akış except bloğuna geçer; form var ise Show edilmiş olur.
  except
    frmTest := TFrmTest.Create(Application);
    frmTest.Show;
  end;

Tabii ilgili formların OnClose olay yöneticisinde Action := caFree ataması ve OnDestroy olay yöneticisinde ise ilgili TForm türündeki pointer değişkeni de nil'e eşitleme kodum bulunuyor.

procedure TFrmTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TFrmTest.FormDestroy(Sender: TObject);
begin
  frmTest := nil;
end;

Bundan daja fazla yardımı; hata hakkında daha detaylı bilgi verirseniz yapabiliriz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
@Tuğrul HELVACI Bey Merhaba..
Bir'den çok form create yöntemi var.. Bunlar arasında bir fark var mı? yoksa hepsi aynı kapının farklı yolları mı?

frmTest := TFrmTest.Create(Application);
Application.createform(TSatisEkran, SatisEkran);
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#8
(04-04-2019, Saat: 16:57)mcuyan Adlı Kullanıcıdan Alıntı: @Tuğrul HELVACI Bey Merhaba..
Bir'den çok form create yöntemi var.. Bunlar arasında bir fark var mı? yoksa hepsi aynı kapının farklı yolları mı?

frmTest := TFrmTest.Create(Application);
Application.createform(TSatisEkran, SatisEkran);

@mcuyan Merhaba. TApplication'ın CreateForm metoduna birlikte bakalım:

procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
 Instance: TComponent;
begin
 // Set flag that TCustomForm constructor can read, so it knows if it's being
 // created as a main form or not (required when MainFormOnTaskbar is True)
 FCreatingMainForm := (FMainForm = nil) and InstanceClass.InheritsFrom(TForm);
 Instance := nil;
 try
{$IF DEFINED(CLR)}
   Instance := InstanceClass.Create(Self);
   Reference := Instance;
{$ELSE}
   Instance := TComponent(InstanceClass.NewInstance);
   TComponent(Reference) := Instance;
   try
     Instance.Create(Self);
   except
     TComponent(Reference) := nil;
     Instance := nil;
     raise;
   end;
{$ENDIF}

   if (FMainForm = nil) and (Instance is TForm) then
   begin
     TForm(Instance).HandleNeeded;
     FMainForm := TForm(Instance);
     if MainFormOnTaskBar then
       SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE);
     ChangeAppWindow(Handle, not MainFormOnTaskBar, not MainFormOnTaskBar);
   end;
 finally
   if (FMainForm = nil) and (Instance is TForm) then
     TForm(Instance).FCreatingMainForm := False;
 end;
end;

Yukarıda görüldüğü üzere, TApplication'ın CreateForm metodu NewInstance metodunu kullanarak önce ilgili sınıf için hafıza yer tahsisatı yapıyor, ardından Create metodunu çağırarak varsayılan ya da ezdiğimiz yapıcının çağrılmasını sağlıyor. Ancak esas fark ana formu kontrol ettiği yerde. Eğer henüz bir ana form oluşturulmadı ise, oluşturduğunuz ilk formu ana form yapıyor ve gereken stil ayarlamalarını yapıyor.

Kısaca; sorduğunuz sorunun yanıtı ana formu ayarlamak dışında bir fark yok.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#9
Anladım.. Çok teşekkürler..
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#10
(04-04-2019, Saat: 15:57)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: ...
Ayrıca ben form oluşturma işlemini aşağıdaki gibi yapıyorum:

  try
    frmTest.Show; // Bu form yok ise Access Violation hatası oluşur ve akış except bloğuna geçer; form var ise Show edilmiş olur.
  except
    frmTest := TFrmTest.Create(Application);
    frmTest.Show;
  end;
...

Merhaba,

Benim tahminime göre @Tuğrul HELVACI kendi kodlarında buna dikkat ediyordur, ama bu örgüyü kendi projelerinde uygulamak isteyen arkadaşlara ufak bir uyarım var. Eğer frmTest formununun OnShow/OnActivate eventlerinde yazılı kodlar varsa ve o kodlar hata verecek olursa bu kod maalesef sizi yanlış yerlere yönlendirecek, çünkü kod "henüz frmTest nesnesini yaratmadığım için hata oluştu" kabulüne göre yazılmış (@Tuğrul HELVACI da zaten comment'te yazmış).

Bir de çok basit bir If satırı ile yapılabilecek bir kontrolü try/except gibi işlemci ve işletim sistemi açısından maliyeti çok yüksek bir örgüyle kontrol etmek çok iyi bir fikir değil. Bu kodu şu şekilde yazdığınızda işler daha hızlı olacaktır:

if not Assigned(frmTest) then
 frmTest := TfrmTest.Create(Application);
frmTest.Show;

Ama illa try/except kullanacaksanız da except kısmını bu şekilde bırakmayın. En kötü durumda aşağıdaki gibi yazın:

  try
    frmTest.Show; // Bu form yok ise Access Violation hatası oluşur ve akış except bloğuna geçer; form var ise Show edilmiş olur.
  except
    on E: Exception do
    begin    
        {$IFDEF DEBUG}
         // DEBUG modda derlediğinizde hatayı Delphi IDE'sine gönderkin ki, gelen hata gerçekten de sizin beklediğiniz hata mı emin olun.
         OutputDebugString(PChar(E.Message)); 
        {$ENDIF}
        
        frmTest := TFrmTest.Create(Application);
        frmTest.Show;
     end;
  end;

İyi çalışmalar
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  AES Şifreleme Hakkında tmrksmt 18 1.281 14-02-2024, Saat: 10:42
Son Yorum: tmrksmt
  TDictionary kullanımım hakkında yhackup 3 399 09-02-2024, Saat: 15:58
Son Yorum: SimaWB
  TfrxReport Rapor dizaynı hakkında yhackup 2 234 24-01-2024, Saat: 11:35
Son Yorum: yhackup
  EdgeBrowser Hakkında bydelphi 2 511 19-11-2023, Saat: 10:21
Son Yorum: bydelphi
Sad Tabsheet içinde Form Create, Close olayları YILDIRIMBEY 0 220 24-08-2023, Saat: 17:26
Son Yorum: YILDIRIMBEY



Konuyu Okuyanlar: 1 Ziyaretçi