Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Globale Exceptions (https://www.delphipraxis.net/1177-globale-exceptions.html)

Hansa 28. Okt 2002 16:57


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:
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;
In der Hauptform steht :

Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := ExceptGerMeldung;
end;
Jetzt kommt die Fehlermeldung : "Incompatible Types: method Pointer and regular Procedure". Waskann das sein?

Gruß
Hansa

Christian Seehase 28. Okt 2002 17:08

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:
[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];
Nachtrag für die "schmutzige" Lösung:
(so geht's auch)

Code:
[b]procedure[/b] TForm1.FormCreate(Sender: TObject);
[b]begin[/b]
  @Application.OnException := @ExceptGerMeldung;
[b]end[/b];

Hansa 28. Okt 2002 19:32

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:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := ExceptGerMeldung;
end;
und Deinem sauberen. Die andere Methode ist anscheinend die von Hand-Pointer-Verbiegerei, wieso geht die saubere nicht? :firejump:

Gruß
Hansa

Alfons_G 28. Okt 2002 21:19

: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:

Christian Seehase 28. Okt 2002 22:24

Moin Alfons,

*soisses* ;-)

Hansa 29. Okt 2002 10:35

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

Christian Seehase 29. Okt 2002 10:40

Moin Hansa,

Zitat:

In der IDE verhält sich das ganze anders, als wenn man das Programm über Windows startet.
Was wollen uns diese Deine Worte sagen? :mrgreen:

Hansa 29. Okt 2002 11:31

ganz einfach,

"Mein Reich ist nicht von dieser Welt" :witch:

Christian Seehase 29. Okt 2002 13:08

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:

Rianna 4. Sep 2005 11:46

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.

Christian Seehase 4. Sep 2005 12:00

Re: Globale Exceptions
 
Moin Rianna,

Zitat:

Zitat von Rianna
...wenn ich jemals oberhalb des implementation teils was eintippe.

:shock:

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.

SirThornberry 4. Sep 2005 13:16

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.

tommie-lie 4. Sep 2005 13:27

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.

Christian Seehase 4. Sep 2005 13:28

Re: Globale Exceptions
 
Moin SirThornberry,

Zitat:

Zitat von SirThornberry
...und eventuell lieber mit globalen funktionen arbeitet.

die müsste er dann ja auch oberhalb von Implementation manuell hinzufügen ;-)

SirThornberry 4. Sep 2005 13:29

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

Christian Seehase 4. Sep 2005 13:36

Re: Globale Exceptions
 
Moin SirThornberry,

das ist natürlich richtig, und wer solche Forderungen stellt, wird seine Programm eh' nicht in verschiedene Units aufteilen ;-)

Olli 4. Sep 2005 13:40

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 23:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz