Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

Exceptions mit Help-Button anzeigen

  Alt 8. Mär 2004, 17:48
Beim Erzeugen einer Exception kann ja optional ein Hilfecontext
mitgegeben werden.

Beispiel mit Hilfecontext 4570:
    raise Exception.CreateHelp('Fehler beim Verbuchen.', 4570); Dieses Feature wird aber in der Praxis nicht verwendet,
da es beim Anzeigen der Exception keinen Unterschied macht.


Dies liegt an der schwachen Implementation der Methode ShowException:
Delphi-Quellcode:
// Delphi 5 (evtl. machen's höhere Delphi-Versionen besser)
procedure TApplication.ShowException(E: Exception);
var
  Msg: string;
begin
  Msg := E.Message;
  if (Msg <> '') and (AnsiLastChar(Msg) > '.') then Msg := Msg + '.';
  MessageBox(PChar(Msg), PChar(GetTitle), MB_OK + MB_ICONSTOP);
end;
Abhilfe schafft folgende Procedure:
Delphi-Quellcode:
procedure ShowExceptionWithHelp(E:Exception; dlgtype: TMsgDlgType);
var
  Msg, helpfile: string;
  buttons : TMsgDlgButtons;
begin
  Msg := E.Message;
  if (Msg <> '') and (AnsiLastChar(Msg) > '.') then Msg := Msg + '.';

  helpfile := Application.HelpFile;

  if IsConsole then
  begin
    Writeln(msg);
    if (helpfile <> '') and (E.HelpContext <> 0) then
      Writeln('see help file ', helpfile, 'context: ', E.HelpContext);
  end else
  begin
    buttons := [mbOK]; // OK button for the dialog box
    if (helpfile <> '') and (E.HelpContext <> 0) then
    begin
      // add a Help button only if a help file was given
      Include(buttons, mbHelp);
    end;
    // display the exception message
    MessageDlgPosHelp(Msg, mtError, buttons, E.HelpContext, -1, -1, helpfile);
  end;
end;

Zum Einbinden in eine Anwendung sind noch folgende Schritte notwendig:

Event-Handler für Application.OnException erstellen.
Delphi-Quellcode:
procedure TForm1.HandleOnException(Sender: TObject; E: Exception);
begin
  // hier ist Gelegenheit, Exception in einer Datei zu protokollieren
  // LogObject.AddMessage(E.Message);

  ShowExceptionWithHelp(E, mtError); // Aufruf anstelle von Application.ShowException
end;
Nun muss unser neuer Exception-Handler nur noch dem Application Objekt
bekannt gemacht werden.
Dies geschieht im OnCreate des Hauptformulars:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnException := Self.HandleOnException;
end;
Nur muss nur noch an jeder Stelle der Anwendung, bei der
eine Exception ausgelöst wird ein gültiger Hilfekontext bereitgestellt
werden und die Hilfedatei mit Erklärungen zu Fehlermeldungen
ausgestattet werden.

[edit=Matze]Code formatiert. Mfg, Matze[/edit]
Andreas
  Mit Zitat antworten Zitat