Autor Beitrag
meolus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

Gentoo, Debian, Win7 64-bit, WinXP
Delphi 2006 Prof., Delphi 2005 PE
BeitragVerfasst: Sa 18.12.04 23:37 
Guten Abend zusammen,

ich habe in meinen Programmen schon häufiger einen ExceptionHandler für Application.OnException benutzt. Dieser sieht wie folgt aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TMainForm.ExceptionHandler(Sender: TObject; E: Exception);
begin
  MessageBox(Handle, PChar(Format(
  'Es ist folgender Fehler aufgetreten:%s%s%s'+
  'Fehlertyp:%s%s%sSender:%s%s [%s]',
  [#10#13, E.Message, #13#10#13#10, #10#13, E.ClassName, #10#13#10#13,
  #13#10, TComponent(Sender).Name, Sender.ClassName])),
  PChar('Unvorhergesehener Fehler'), $00000010);
end; (*ExceptionHandler*)


Abgesehen davon, dass er funktioniert habe ich nur ein kleines Problem damit die MessageBox die ich mit der detailierten Fehlermeldung im ExceptionHandler ausgebe sich immer nur auf dem Haupt-Formular befindet. Die jedoch leider auch wenn der Fehler auf einer anderen Form ausgelöst wurde!

Daher nun meine Frage:
Wie bekomme ich das Handle der Form, auf welcher die Komponente liegt, die die Exception ausgelöst hat? Oder wie komme ich an das Handle des "Senders"? Oder von welcher Klasse geht die Eigenschaft Handle aus? (bei TComponent konnte ich sie nit finden...)

MfG Meolus

_________________
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.
herzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 168

WINXP pro, SUSE Linux 9.0
D7 Pers.
BeitragVerfasst: So 19.12.04 00:17 
Nabend :) bzw Morgen

ausblenden Delphi-Quelltext
1:
2:
  if TComponent(Sender).ClassType=TForm then
      TForm(Sender).Handle;


Wenn das Formular direkt den Fehler berursacht hat ansonsten....

ausblenden Delphi-Quelltext
1:
TComponent(Sender).GetParentComponent					
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: So 19.12.04 01:38 
@herzi: Ich bezweifle stark, dass überhaupt einer der Beiden Quelltext-Abschnitte funzt, da ClassType = TForm keine TForm1 findet, sondern nur TForms. Es müsste also Sender is TForm heißen.

Weiterhin würd ich eher folgendes bevorzugen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
If Sender is TComponent Then
Begin
    IF Assigned(TComponent(Sender).Owner) Then
    Begin
        If TComponent(Sender).Owner is TForm Then
            DeinHandle := TForm(TComponent(Sender).Owner).Handle;
    end
    else
    Begin
        If Sender is TForm Then
            DeinHandle := TForm(Sender).Handle;
    end;
end
else
    DeinHandle := INVALID_HANDLE_VALUE;

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
meolus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

Gentoo, Debian, Win7 64-bit, WinXP
Delphi 2006 Prof., Delphi 2005 PE
BeitragVerfasst: So 19.12.04 11:53 
Guten morgen

@herzi: Sorry, deinen Vorschlag habe ich noch gar nicht aus probiert, aber dennoch danke für die Bemühung mir zu antworten!

@BenBE: Ich habe deinen Vorschlag ausprobiert, allerdings bekomme ich dann GAR KEINE MessagaBox mehr!? :(


Ich habe zwischenzeitlich noch einen Tipp in einem anderen Forum bekommen, welcher perfekt funktioniert und auch noch sehr einfach zu realisieren ist:

Ich nehme einfach anstelle meines "Handle" (welches das MainForm.Handle ist) "Application.Handle" und schon macht mir die MessageBox meine Fensteranordnung nicht kaputt und zeigt die MessageBox auf der Form, von der wirklich die Aktion initiert wurde und wodurch der Fehler ausgelöst wurde...
Ich denke die Application.Handle MessageBox operiert einfach als oberstes Handle applicationsweit, so dass es durch diese Überordnung meine Fensterordnung nicht beeinflusst, weil es noch davor/darauf geklatscht wird.

MfG Meolus

_________________
Real programmers don't comment their code;
if it was hard to write, it should be hard to read.