![]() |
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. |
Re: Globale Exceptions
Moin Rianna,
Zitat:
da wäre ich aber mal auf die Begründung gespannt. Wenn Du das Formular um eigene Methoden erweitern willst/musst wirst Du kaum drum herum kommen dort etwas manuell einzufügen. Beispiele: Abfangen einer Windowsmessage, die sich durch die fest definierten Ereignisroutinen nicht abfangen lässt (ggf. auch durch Überschreiben der WndProc) Erweitern der Formularmethoden um eine eigene, wenn diese sich logisch dem Formular zuordnen lässt (Stichwort: Objektorientierung) Dies gilt dann auch für Daten (Felder), um globale Variablen zu vermeiden. Veröffentlichen von eigenen Prozeduren/Funktionen damit diese aus anderen Units heraus erreichbar sind. |
Re: Globale Exceptions
@Rianna: Das wird dann wohl daran liegen das dein Lehrer nicht sehr bewandert ist mit der Programmiersprache und eventuell lieber mit globalen funktionen arbeitet. Vielleicht denkt er auch das Application.OnException per Doppelklick im Objectinspektor verfügbar ist.
Ich würde es an deiner Stelle drauf anlegen die 6 zu bekommen und dann Beschwerde einreichen weil es die ordentlichste Variante ist die in der Praxis nun mal so gehandhabt wird. |
Re: Globale Exceptions
@Christian: Hansa meint vielleicht das übliche Verhalten des Debuggers bei Exceptions, daß er trotzdem rausspringt und die Stelle der Exception anzeigt, während ohne den Debugger nichts passiert und einfach nur Hansas Exception-Handler aufgerufen wird.
|
Re: Globale Exceptions
Moin SirThornberry,
Zitat:
|
Re: Globale Exceptions
wenn er mit einer globalen funktion arbeiten muss sie doch nicht oberhalb von "impelementation" auftauchen, dort gehört sie nur hinn wenn die Funktion aus anderen Units auch sichtbar sein soll. Ansonsten reicht es die globalen Funktionen über allen anderen Methoden zu definieren und schon wird sie von jeder Methode innerhalb der unit auch gefunden
|
Re: Globale Exceptions
Moin SirThornberry,
das ist natürlich richtig, und wer solche Forderungen stellt, wird seine Programm eh' nicht in verschiedene Units aufteilen ;-) |
Re: Globale Exceptions
Da jede Anwendung einen Exceptionhandler hat, könnte man doch diesen überschreiben!
Ist zwar mit etwas Aufwand verbunden, weil dies geschehen muß, bevor die Units geladen werden, aber machbar ist es. Hier ist madExcept wohl ein gutes Beispiel. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 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