Also ersteinmal würde ich Fehlermeldungen, die von Funktionen zurückegeben werden, nicht in Delphi verwenden. Dafür gibt es Exceptions, die ganz einfach einen String als Meldung bekommen, so dass du siehst, was passiert.
Aus meiner Erfahrung kann ich sagen, dass Programmierer gerne das Prüfen der Rückgabewerte vergessen und dann merkwürdige Ergebnisse bekommen.
Als Außnahme lasse ich gelten, wenn
- die Funktionen sehr, sehr oft aufgerufen werden soll und genauso oft einen Fehler melden muss (sehr selten). Exceptions verlangsamen den Aufruf nur dann, wenn sie ständig geworfen werden, nicht jedoch, wenn der reguläre Ausführungspfad durchgeführt wird. Siehe Kaptitel Exceptions bei Dr. Bob.
- die Funktionen in eine DLL gepackt werden sollen und damit von anderen Sprachen verwendet werden.
Du kannst von der Klasse
Exception, einfach neue Fehlertypen ableiten, so wie das in der
JWSCL gemacht wird.
EMyException = class(Exception);
Also, falls keine Exceptions verwendet werden sollen, so kannst du eigene Meldungen in einer Ressource, ähnlich der Stringresource, speichern, so dass auch verschiedene Sprachen möglich sind.
Windows verwendet dazu den Resourcentype
MessageTable, den man ins Modul einbindet und mit
FormatMessage und
FORMAT_MESSAGE_FROM_HMODULE.
Dann kannst du eigene Fehlermeldungen z.B. mit SetLastError setzen bzw direkt zurückgeben. Dazu kannst du
HRESULT verwenden, der es ermöglicht etwas flexibler zu sein. Deine Meldungscodes stecken dann im rechten Codefeld drin und können ohne Probleme bei 1 anfangen. Der Facilitycode ist eine ID, die angibt, welcher Bereich einer Software die Meldung erzeugt hat. So kann man dann herausfinden, dass eine Meldung von einem Funktionsaufruf innerhalb der aufgerufenen Methode stammt.
Setze außerdem das Custom Bit auf 1, damit es keine Verwechslung mit möglicherweise im SYSTEM vorhandenen Fehlercodes gibt.
Alle Werte >= 0 sind Erfolgsmeldungen, daher kann man auch extra Meldungen, wie z.B. "Aufruf erfolgreich, aber mehr Daten vorhanden." zurückliefern.
In
ActiveX.pas gibt es einige Funktionen, die dir da helfen können.
Delphi-Quellcode:
function Succeeded(Res: HResult): Boolean; inline;
function Failed(Res: HResult): Boolean; inline;
function ResultCode(Res: HResult): Integer; inline;
function ResultFacility(Res: HResult): Integer; inline;
function ResultSeverity(Res: HResult): Integer; inline;
function MakeResult(Severity, Facility, Code: Integer): HResult; inline;
Leider kann man das Customerbit damit nicht setzen, deshalb so:
Error := Error or $20000000;
Natürlich wäre ich begeistert, wenn du das so machen würdest und diese Idee auf dem
JEDI Blog veröffentlichen würdest (also eine Demoapp). Falls du Interesse hast, dann einfach bei mir melden. Unterstützung ist garantiert.