die Try-Except-Verschachtelungen wurden ja nurn schon geklärt, aber nun noch was zur Verschachtelung von Try-Finally, bzw. des Resourcen-Schutzblocks:
Zitat:
Delphi-Quellcode:
tPNG := TPngObject.Create;
tJPG := TJPEGImage.Create; // 1
tBMP := TBitmap.Create;
Try
...
Finally
tPNG.Free;
tJPG.Free;
tBMP.Free;
End;
1: Hier eine
Exception (z.B. OutOfMemory und Co.) und schon wird tPNG nicht freigegeben.
Also eigentlich sollte es so aussehn, damit alles korrekt freigegeben würde:
Delphi-Quellcode:
tPNG := TPngObject.Create;
Try
tJPG := TJPEGImage.Create;
Try
tBMP := TBitmap.Create;
Try
...
Finally
tBMP.Free;
End;
Finally
tJPG.Free;
End;
Finally
tPNG.Free;
End;
Eventuell geht auch Folgendes.
Dieses geht aber nur, wenn man davon ausgehn kann, daß es beim Freigeben (hier in .Free) keine Probleme auftreten können.
(OK, Fehler, welche sowieso den nachfolgenden Programmfluß irreversibel schädigen, kann man gern ignorieren, da dann sowieso alles Egal ist )
Delphi-Quellcode:
tPNG := nil;
tJPG := nil;
tBMP := nil;
Try
tPNG := TPngObject.Create;
tJPG := TJPEGImage.Create;
tBMP := TBitmap.Create;
...
Finally
tPNG.Free;
tJPG.Free;
tBMP.Free;
End;
bzw. "verkürzt":
Delphi-Quellcode:
tJPG := nil;
tBMP := nil;
tPNG := TPngObject.Create;
Try
tJPG := TJPEGImage.Create;
tBMP := TBitmap.Create;
...
Finally
tPNG.Free;
tJPG.Free;
tBMP.Free;
End;