Soweit ich das gesehen habe, ist das ganze (in Delphi 7) nicht sauber umgesetzt, da es - nicht wie bei EOutOfMemory - keine Methode gibt, die das gleiche für die EOutOfResources-Exceptions macht (habe keine gefunden).
Erstmal grundlegend:
EHeapException hat eine private Boolean-Variable namens "AllowFree". Wenn diese True ist, wird die Instanz wirklich aus dem Speicher gelöscht, ansonsten nicht. Zur Prüfung dieser Variable überschreibt EHeapException die virtuelle TObject-Methode "FreeInstance" und baut dort die Prüfung ein (siehe SysUtils.pas -> EHeapException.FreeInstance).
Um das zu umgehen, hab ich eben eine Quick-and-Dirty-Lösung zusammengebaut
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var delta: cardinal;
begin
try
raise EOutOfResources.Create('
Out of resources');
except
on e: EOutOfResources
do
begin
delta := cardinal(EHeapException.ClassParent.InstanceSize);
// den Offset zur Boolean-Variable auslesen
PBoolean(cardinal(e) + delta)^ := True;
// "AllowFree" auf "True" setzen (Offset + Instance-Pointer = Heap Pointer)
end;
// <-- hier wird die Exception dann automatisch freigegeben (siehe auch: AcquireExceptionObject, etc.)
end;
end;
Das ganze muss natürlich etwas angepasst werden, falls in neueren Delphi-Versionen die Klasse "EHeapException" noch weitere Variablen hat.