Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:44 Uhr.
Seite 1 von 2  1 2      

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