![]() |
Globale Exceptions
Hi Leute,
das hier ist eine Newbie Frage, wahrscheinlich liegt es nur an einer Compiler-Einstellung. :angle2: Ich will verschiedene Exceptions in der ganzen Application abfangen und gleich behandeln. Deshalb habe ich eine Unit gemacht, in der steht folgendes :
Code:
In der Hauptform steht :
PROCEDURE ExceptGerMeldung (Sender : Tobject;E : Exception);
BEGIN MessageDLG (' Fehler : ' + E.Message+#10#13+ ' Fehlertyp : ' + E.Classname+#10#13+ ' Sender : ' + Sender.Classname,mtError,[mbOK],0); END;
Code:
Jetzt kommt die Fehlermeldung : "Incompatible Types: method Pointer and regular Procedure". Waskann das sein?
procedure TForm1.FormCreate(Sender: TObject);
begin Application.OnException := ExceptGerMeldung; end; Gruß Hansa |
Moin Hansa,
an der von Dir genannten Stelle erwartet der Compiler eine Methode. Da Du aber eine Prozedure übergibts... Saubere Lösung: Du fügst die Prozedure als Methode in Deinem Hauptformular ein. Eine "schmutzige Lösung" hab' ich auch noch. Die hab ich jetzt noch nicht ausprobiert, sollte allerdings funktionieren. (Eventuell im OnDestroy die Methode Application.OnException := nil setzen, damit nicht versucht wird eine gar nicht vorhandene Methode wieder freizugeben)
Code:
Nachtrag für die "schmutzige" Lösung:
[color=#000080]// Die saubere Lösung[/color]
[b]type[/b] TForm1 = [b]class[/b](TForm) [b]procedure[/b] FormCreate(Sender: TObject); [b]private[/b] [color=#000080]{ Private-Deklarationen }[/color] [b]public[/b] [color=#000080]{ Public-Deklarationen }[/color] [b]PROCEDURE[/b] ExceptGerMeldung (Sender : Tobject;E : Exception); [b]end[/b]; [b]var[/b] Form1: TForm1; [b]implementation[/b] [color=#000080]{$R *.DFM}[/color] [b]PROCEDURE[/b] TForm1.ExceptGerMeldung (Sender : Tobject;E : Exception); [b]BEGIN[/b] MessageDLG (' Fehler : ' + E.Message+#10#13+ ' Fehlertyp : ' + E.Classname+#10#13+ ' Sender : ' + Sender.Classname,mtError,[mbOK],0); [b]END[/b]; [b]procedure[/b] TForm1.FormCreate(Sender: TObject); [b]begin[/b] Application.OnException := ExceptGerMeldung; [b]end[/b]; [color=#000080]// ... und die schmutzige...[/color] [b]PROCEDURE[/b] ExceptGerMeldung (Sender : Tobject;E : Exception); [b]var[/b] Form1: TForm1; [b]implementation[/b] [color=#000080]{$R *.DFM}[/color] [b]PROCEDURE[/b] ExceptGerMeldung (Sender : Tobject;E : Exception); [b]BEGIN[/b] MessageDLG (' Fehler : ' + E.Message+#10#13+ ' Fehlertyp : ' + E.Classname+#10#13+ ' Sender : ' + Sender.Classname,mtError,[mbOK],0); [b]END[/b]; [b]procedure[/b] TForm1.FormCreate(Sender: TObject); [b]var[/b] p : ^TExceptionEvent; [b]begin[/b] p := @ExceptGerMeldung; Application.OnException := p^; [b]end[/b]; (so geht's auch)
Code:
[b]procedure[/b] TForm1.FormCreate(Sender: TObject);
[b]begin[/b] @Application.OnException := @ExceptGerMeldung; [b]end[/b]; |
Hallo Christian,
das scheint ja doch keine knallharte Newbie Frage zu sein, stehe trotzdem aufm Schlauch. Sehe keinen Unterschied zwischen meinem Code
Code:
type
TForm1 = class(TForm) KuSource: TDataSource; Database: TpFIBDatabase; Transaction: TpFIBTransaction; Button1: TButton; KgMemo: TMemo; KuDatenSatz: TpFIBDataSet; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
Code:
und Deinem sauberen. Die andere Methode ist anscheinend die von Hand-Pointer-Verbiegerei, wieso geht die saubere nicht? :firejump:
procedure TForm1.FormCreate(Sender: TObject);
begin Application.OnException := ExceptGerMeldung; end; Gruß Hansa |
:hi:
Christian meinte offenbar, Du musst die Deklaration Deiner Prozedur als Methode in Dein Formular einfügen, d.h. sie gehört in den Public-Teil Deiner Form-Deklaration. Dann ist es keine eigenständige prozedur mehr, sondern eine Methode Deines Formulars. :coder: |
Moin Alfons,
*soisses* ;-) |
Ja Moin,
Mehr sag ich nicht. :dancer: Nur noch etwas : In der IDE verhält sich das ganze anders, als wenn man das Programm über Windows startet. Gruß Hansa |
Moin Hansa,
Zitat:
|
ganz einfach,
"Mein Reich ist nicht von dieser Welt" :witch: |
Moin Hansa,
das Telepolis Rätsel hab' ich knacken können, aber mit Deinen Aussagen komm' ich im Moment irgendwie nicht so ganz klar :mrgreen: |
Re: Globale Exceptions
ich hab dazu mal ne frage.. ne wirkliche newbie frage :)
also muss man die procedure per hand in den public teil einschreiben? mein lehrer droht nämlich, mir eine 6 zu geben, wenn ich jemals oberhalb des implementation teils was eintippe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz