System.Defer
1.0.0
تأجيل دلفي
تناظرية لآلية تأخير الإفراج عن الموارد (الكائن أو الذاكرة أو إلغاء إجراء ما) من لغة البرمجة التعريفية.
جوهر الآلية هو أنه بعد بعض الإجراءات ، قم بإنشاء إجراء إلغاء سيتم تنفيذه عندما يخرج الكتلة.
وهذا ، على سبيل المثال ، أنشأنا كائنًا ، بعد الإنشاء ، نكتب كيفية إصداره وسيتم إصداره تلقائيًا بعد الخروج من الكتلة.
الآلية تعمل على أساس الواجهات.
إن إلقاء استثناء في كتلة لا يمنع إطلاق الكائن.
يتم استخدام defer لتنفيذ بيان أثناء الخروج من الكتلة الحالية. يعمل errdefer مثل defer ، ولكن فقط التنفيذ عندما يتم إرجاع الوظيفة من خلال خطأ داخل كتلة Errdefer.
هدف
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 iterationطريقة
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;ذاكرة
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 ;