Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Hata Mesajı Penceresi Yönetimi
#1
Merhaba,

Low level'e mi girer bilemiyorum fakat;

Sistem seviyesinde özelleştirilmiş diyalog formlarımı bir exception veya raise esnasında nasıl "varsayılan olarak" kullanabilirim? Bir hata oluştuğunda işletim sisteminin sunduğu hata mesajı penceresi yerine, kendi hazırladığım hata mesajı penceresini kendi uygulamamda nasıl varsayılan hata penceresi olarak tanımlayabilirim?

Şimdi diyeceksiniz ki, "hatanın gerçekleşme olasılığının olduğu yerlere kendi hata pencerenizi create ettirebilirsiniz". Elbette, bu hatanın nereden çıkacağını beklediğimiz yerlerde kullanışlı olur fakat hata beklemediğimiz bir yerde gerçekleşirse bu tekniği kullanamayız.

Bu konunun peşine düşmemdeki asıl amaç ise; İşletim sisteminin kullandığı hata mesajı pencerelerinin yetersiz kalması. Ben mesela istiyorum ki, son kullanıcı hata mesajı penceresindeki bir butona basarak hata mesajını eposta ile yazılımcıya gönderebilsin. Veya hata mesajı penceresinde bir memo nesnesi olsun ve orada ilgili hata ile ilgili daha geniş bilgi verilebilsin. Veya "bu pencereyi bir daha gösterme" gibi bir seçenek olabilsin, ya da enini boyunu ayarlayabileyim gibi...

Buna SQL Server'in hata mesajı pencereleri örnek verilebilir,

Yani burada sorduğum soru, hata penceresinin tasarımından ziyade, o pencerenin varsayılan bir hata penceresi olmasını nasıl ayarlayabiliriz şeklindedir. Bu nasıl yapılabilir?


Ek Dosyalar Resimler
   
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#2
Application.OnException ile genel bir hata yakalama seçeneğiniz mevcut.
There's no place like 127.0.0.1
WWW
Cevapla
#3
.dpr kodunda uygulayabileceğimiz bir çözüm var mı?
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#4
dpr içinde zaten Application mevcut. Orada bunu neden uygulayamayalım?
There's no place like 127.0.0.1
WWW
Cevapla
#5
Denemelerimi önce ana forma bir TApplicationEvens nesnesi ekleyip onun OnException olayına ilgili kodu yazarak yaptığımda doğal olarak login formundaki hataları yakalayamadığını gözlemledim.

Ayrı bir bileşen olarak yazdığım ve Ana form create edilir edilmez hemen devreye giren bir login formum var. Bu form devreye girerken WM_AFTER_CREATE   API'sini kullanıyor ve ana form'dan önce bu form devreye giriyor. Bu noktada bir sıkıntı çıkar mı emin olamadığım için DPR'da uygulanabilir bir çözüm var mı diye sormuştum. 

Testlerimde bir sıkıntı çıkmadığını gördüm, sanırım çözümü burada paylaşsam eksiği gediği nedir daha iyi anlaşılır.

Sizce böyle bir kullanımın ne gibi handikapları olabilir?

...
uses
  Vcl.Forms,                                                    //  TApplication
  ...
  ...
  System.SysUtils                                                    //  Exception
  ;

{$R *.res}

type
  TAppExcept = class
    class procedure HataGosterici(Sender: TObject; E: Exception);    // Hata işleyici
  end;

{ TAppExcept }

class procedure TAppExcept.HataGosterici(Sender: TObject; E: Exception);
begin
  Show_Error( E.Message, _TR('Hata') );    // Bu benim kendime özel hazırladığım bir hata mesajı formu
  // Bu noktada bir log bilgisi de tutulabilir...
end;

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.OnException := TAppExcept.HataGosterici;       // Hata yakalayıcımızı atamış olduk...
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TAna, Ana);
  Application.Run;
end.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#6
TAppExcept sınıfına gerek yok gibi gözüküyor. Direkt olarak "özel hazırladığınız form"un Show_Error'ını class procedure olarak tanımlayabilirsiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#7
Madem bu tarz bir işe girişiyorsunuz, bu durumda Call Stack'a da erişmeniz gerekecektir. Bu durumda, konu Low Level sınırlarında yüzmeye başlar Wink
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#8
(13-11-2017, Saat: 17:58)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMadem bu tarz bir işe girişiyorsunuz, bu durumda Call Stack'a da erişmeniz gerekecektir. Bu durumda, konu Low Level sınırlarında yüzmeye başlar Wink


460 puan sonra inşallah Smile
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#9
Merhaba bunu yapabilmen için hook atman lazım.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
kütüphanesi ile yapabilirsiniz
Hata mesajları için yapmadım ama windows onay mesajlarına hook atmıştım.
Size örnek olması açısından paylaşıyorum.

uses
 DDetours;

type
 TTrampolineMessageDlg = function(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;

var
 TrampolineMessageDlgPtr: TTrampolineMessageDlg = nil;
 TrampolineMessageDlg: TTrampolineMessageDlg = nil;

begin

function InterceptMessageDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer;
begin
burada kendi penceenizi creare edip kullanıcıya göstereceksiniz.
 if TForm(Application.MainFormHandle).MsgConfirmation(Msg) then
   Result := mrOk
 else
   Result := mrNo;
end;

procedure TFrmMain.FormCreate(Sender: TObject);
begin
 TrampolineMessageDlgPtr := MessageDlg;
 if not Assigned(TrampolineMessageDlg) then
   @TrampolineMessageDlg := InterceptCreate(@TrampolineMessageDlgPtr, @InterceptMessageDlg);
end;

end.
Cevapla
#10
Selamlar

ReportMemoryLeaksOnShutdown yapısında program kapanırken aldığımız hataları hangi unitlerde veya hangi sırada/aşamada aldığımızı anlaşılır bir şekilde loglama yapmamız mümkünüdür.

Teşekkürler
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
Exclamation Bir Türlü Kuramadım (HATA) keceonurr 3 146 12-09-2018, Saat: 14:50
Son Yorum: ihalilcoban
  IDHttp error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure hata burakb44 12 369 02-09-2018, Saat: 23:37
Son Yorum: burakb44
  Format atinca hata verdi arsl01 9 285 27-07-2018, Saat: 19:09
Son Yorum: arsl01
  FastReport TeeChart Hata elixir84 2 184 14-06-2018, Saat: 11:55
Son Yorum: elixir84
  Uzak masaüstünde çalışan program, bağlantı kesildiğinde hata veriyor canbir 0 270 16-03-2018, Saat: 18:50
Son Yorum: canbir



Konuyu Okuyanlar: 1 Ziyaretçi