Différer pour Delphi
Un analogue du mécanisme de la libération retardée des ressources (objet, mémoire ou annulation d'une action) à partir du langage de programmation en zig.
L'essence du mécanisme est qu'après une action, créez une action d'annulation qui sera effectuée lorsque le bloc sortira.
C'est-à-dire, par exemple, nous avons créé un objet, après la création, nous écrivons comment le libérer et il sera publié automatiquement après avoir quitté le bloc.
Le mécanisme fonctionne sur la base des interfaces.
Lancer une exception dans un bloc n'empêche pas la libération de l'objet.
defer est utilisé pour exécuter une instruction lors de la sortie du bloc actuel. errdefer fonctionne comme defer , mais l'exécution uniquement lorsque la fonction est renvoyée avec une erreur à l'intérieur du bloc d'errdefer.
Objet
uses
..., System.Defer;
type
...
TTestList = class (TStringList)
procedure DoRaise ;
destructor Destroy; override;
end ;
...
procedure TForm5.Button1Click (Sender: TObject);
begin
var Test := TTestList.Create;
defer(Test); // defer action
Test.Add( ' 1 ' );
Test.Add( ' 2 ' );
Test.Add( ' 3 ' );
Test.DoRaise; // test raise
Test.Add( ' 4 ' );
end ; // free
{ TTestList }
destructor TTestList.Destroy;
begin
ShowMessage( ' test list destroy ' );
inherited ;
end ;
procedure TTestList.DoRaise ;
begin
raise Exception.Create( ' Error Message ' );
end ;
initialization
ReportMemoryLeaksOnShutdown := True; for var i := 1 to 4 do
begin
var Test := TTestList.Create;
defer(Test);
Test.Add( ' 1 ' );
Test.Add( ' 2 ' );
Test.Add( ' 3 ' );
end ; // free of Test each iterationMéthode
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;Mémoire
var p: Pointer;
GetMem(p, 1024 ); // allocate mem
defer( procedure begin FreeMem(p) end ); // defer action for free mem
// work with p Erreurs
function GetList : TTestList;
begin
var List := TTestList.Create;
errdefer(List);
List.DoRaise;
Result := List;
end ;
procedure TForm5.Button5Click (Sender: TObject);
begin
var List := GetList; // exception, and no leaks
List.Free;
end ;