Sunday, April 01, 2007

Ale dost zbytečných řečí,

pojďme na náš příklad. Jak bylo řečeno, při vzniku chyby, která není ošetřena jiným způsobem, zobrazí dialogové okno s upozorněním pro uživatele a zapíše popis do souboru error.log do adresáře s aplikací. Zdrojový kód tedy obsahuje vlastně jen přesměrování výjimek na naši proceduru (to zařídíme v události OnCreate hlavního formuláře) a samotná procedura již jen zobrazí jednoduchý dialog a zapíše data na disk.
.
.
.
public
{ Public declarations }
procedure AppOnException(Sender: TObject; E: Exception);
.
.
.

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := AppOnException;
end;

procedure TForm1.AppOnException(Sender: TObject; E: Exception);
var
ErrFileHandle: THandle;
ErrFileName : String;
ErrMsg, s : String;
T : TComponent;
begin
s := ' -> ';
t := Sender As TComponent;
while (t <> nil) and (t.Owner <> nil) do begin
s := s + ' ' + t.Name;
t := t.Owner;
end;

ErrFileName := ExtractFilePath(Application.ExeName) + 'error.log';
ErrFileHandle := CreateFile(PChar(ErrFileName), GENERIC_WRITE, FILE_SHARE_READ, NIL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if ErrFileHandle <> INVALID_HANDLE_VALUE then
begin
ErrMsg := Format('%s : %s - %s'#13#10, [DateTimeToStr(Now), E.ClassName, E.Message]);
SetFilePointer(ErrFileHandle, 0, nil, soFromEnd);
FileWrite(ErrFileHandle, Pointer(ErrMsg)^, Length(ErrMsg));
CloseHandle(ErrFileHandle);
end;
ShowMessage('Pozor, v programu došlo k nečekané chybě. Doporučujeme uložit všechna data a ukončit aplikaci.');
end;

Labels: