Tunda untuk Delphi
Analog dari mekanisme pelepasan sumber daya yang tertunda (objek, memori atau pembatalan suatu tindakan) dari bahasa pemrograman zig.
Inti dari mekanisme ini adalah bahwa setelah beberapa tindakan, membuat tindakan pembatalan yang akan dilakukan ketika blok keluar.
Yaitu, misalnya, kami membuat objek, setelah kreasi kami menulis cara merilisnya dan akan dirilis secara otomatis setelah keluar dari blok.
Mekanisme ini bekerja berdasarkan antarmuka.
Melempar pengecualian di blok tidak mencegah pelepasan objek.
defer digunakan untuk menjalankan pernyataan saat keluar dari blok saat ini. errdefer berfungsi seperti defer , tetapi hanya mengeksekusi ketika fungsi dikembalikan dari dengan kesalahan di dalam blok Errdefer.
Obyek
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 iterationMetode
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;Ingatan
var p: Pointer;
GetMem(p, 1024 ); // allocate mem
defer( procedure begin FreeMem(p) end ); // defer action for free mem
// work with p Errdefer
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 ;