Hallo
Die, die sich schon mit
Indy beschäftigt haben, wissen sicher um diese doofen Fehlermeldungen, die
Indy immer bringt statt ein OnError - Event auszulösen. Ich hab mich mal damit beschäftigt und das Problem gelöst. Ich will euch nun erklären, wie ihr einen
Indy-Fehler zu einem OnError-Ereignis macht.
(Die Anleitung geht von D7 und dem dort vorinstallierten
Indy aus. Es kann sein dass das bei euch etwas abweicht)
Voraussetzung:
Indy ist installiert
- Schritt 1: Sicherheitskopie der IdException.pas anlegen (evtl. auch IdException.dcu)
- Schritt 2: IdException.pas öffnen
- Schritt 3: Den Code wie folgt erweitern:
- Rot: Code muss neu hinzugefügt werden
- Blau: Code muss überschriben werden. Der Ursprüngliche Code steht als Kommentar in Grün dahinter
Code:
unit IdException;
interface
uses
SysUtils;
[color=#FF0000]const
IdErrorUnknown = 0;[/color]
type
[color=#FF0000]TErrorType = Integer;[/color]
[color=#0000FF]EIdException = class(
Exception)
public
constructor Create(const Msg: string);Overload; [/color][color=#00CA00]{EIdException = class(
Exception);}[/color][color=#0000FF]
end;[/color]
[color=#FF0000]TOnError = procedure(fErrorType: TErrorType;fErrorMsg: String) of object;
TIndyException = class
private
LOnError: TOnError;
public
LastErrorMsg: String;
property OnError: TOnError read LOnError write LOnError;
end;[/color]
TClassIdException = class of EIdException;
// You can add EIdSilentException to the list of ignored exceptions to reduce debugger "trapping"
// of "normal" exceptions
EIdSilentException = class(
Exception)
public
constructor Create(const Msg: string);Overload; {EIdException = class(
Exception);}
end;
...
{Icmp exceptions}
EIdIcmpException = class(EIdException);
EIdSetSizeExceeded = class(EIdException);
[color=#FF0000]var vIndyException: TIndyException;[/color]
implementation
{ EIdProtocolReplyError }
[color=#FF0000]constructor EIdException.Create(const Msg: string);
begin
if Assigned(vIndyException) then if Assigned(vIndyException.OnError) then
begin
vIndyException.OnError(IdErrorUnknown,Msg);
Abort;
exit;
end;
raise
Exception.Create(Msg);
end;
constructor EIdSilentException.Create(const Msg: string);
begin
// Nichts tun!
end;[/color]
...
- Schritt 4: So, das ganze compillieren.
- Schritt 5: Nun wollen wir uns anschauen wie wir das ganze nun benutzen. Falls ihr die Exceptions wie gehabt wollten könnte ihr das hier einfach auslassen :
- Schritt a) In der betreffenden Unit die Ueses mit IdException erweitern:
- Schritt b) In das OnCreate-Ereignis kommt nun folgendes (Den Funtkionsnamen könnt ihr natürlich ändern; Lediglich die Variable vIndyException muss so bleiben):
Delphi-Quellcode:
vIndyException:=TIndyException.Create;
vIndyException.OnError:=IndyError;
- Schritt c) Nun brauchen wir natürlich noch die IndyError-Funktion. Hier ein Beispiel:
Delphi-Quellcode:
procedure TfMain.IndyError(fErrorType: TErrorType;fErrorMsg:
String);
begin
MessageBox(
Handle,PChar('
In Indy ist folgender Fehler aufgetrteten: '+#10#13+fErrorMsg),'
Indy-Fehler',MB_OK
or MB_ICONSTOP);
end;
- Schritt d) Fertig. Nun könnt ihr mit dem Fehler gemütlich umgehen.
- Schritt 6: Ok, ihr habt das jetzt installiert.
Ok, vielleicht fragt ihr euch jetzt, für was denn fErrorType in der Funktion IndyError ist. Im Moment gibt es da nur den Wert
IdErrorUnknown, ich werde mich jedoch in nächster Zeit etwas ausführlicher damit beschäftigen und evtl. mehr Fehlercodes einbauen, und wenn wer von euch Lust drauf hat, kann er das auch gerne einbauen. Da man im EIdException - Event nicht mehr erkennen kann, warum der Fehler ausgelöst wird ist die einzige Möglichkeit, die Fehler anhand der Fehlermeldung auszuwerten. Die ganzen Meldungen stehen in der
Unit IdResourceStrings, ich hab sie auch mal angehängt. Wenn wer von euch mir die Mühe abnehmen will (Hehe) darf er das gerne auswerten
In dne Anhängen ist auch noch ein kleines Beispiel von mir.
Ich hoffe, ich hab euch mit dem Tutorial weitergeholfen. Für Verbesserungsvorschläge und Fehler bin ich natürlich offen!
Gruß
Euer moritz
Anhänge:- Anhang 1: ZIP-Datei mit Beispiel (Executable & Source) und fertiger IdException.pas; Geschrieben in Delphi 7 Pro
- Anhang 2: Datei IdResourceStrings.pas mit allen Fehlermeldungen
[edit=sakura] Wir tun alles Mfg, sakura[/edit]
[edit=flomei]Wir tun wirklich alles... - Text und Anhang aktualisiert - MfG, flomei[/edit]
"Optimistisch ist diejenige Weltanschauung, die das Sein höher als das Nichts stellt und so die Welt und das Leben als etwas an sich Wertvolles bejaht."
Albert Schweitzer