DELPHI: كيفية استخدام "كسر" خارج حلقة أو الحالة؟
سؤال
والنظر في قانون باسكال دلفي التالية:
var
tc: TComponent
begin
{ do something to get tc }
repeat
if(tc is TDBEdit)then begin
if(check_something_about_edit(tc))then break;
do_something_else_edit(tc);
break;
end else if(tc is TBMemo) then begin
if(check_something_about_memo(tc))then break;
do_something_else_memo(tc);
break;
end;
raise exception.create('invalid component type');
until(true); {single iteration look required to use break }
وأنا أعلم أن هناك ربما بعض الاشياء متعدد الأشكال التي يمكن أن أفعله مع TComponent، ولكن هذا ليس سؤالي. أنا أتساءل إذا كان هناك طريقة للتخلص من التكرار واحد تكرار، حتى بيان. دون ذلك، وأنا لا يمكن استخدام العبارة كسر في أي مكان في كتلة التجهيز، وأنا بحاجة إلى ذلك لوقف المعالجة في أي وقت.
المحلول
وحزمة قبل أن تتحول إلى وظيفة واستخدام الخروج إلى القفز مرة أخرى. إذا كان هناك المزيد من التعليمات البرمجية لمتابعة البيان تكرار، واستخدام وظيفة / الإجراءات المحلية، شيء من هذا القبيل:
procedure ...
procedure testsomething(tc: TComponent);
begin
if(tc is TDBEdit)then begin
if(check_something_about_edit(tc))then exit;
do_something_else_edit(tc);
exit;
end else if(tc is TBMemo) then begin
if(check_something_about_memo(tc))then exit;
do_something_else_memo(tc);
exit;
end;
raise exception.create('invalid component type');
end;
var
tc: TComponent;
begin
{ do something to get tc }
try
TestSomething(tc);
{ do something more }
except
...
end;
end;
نصائح أخرى
وهناك طريقة أخرى سهلة للذهاب:
if(tc is TDBEdit)then begin
if not (check_something_about_edit(tc)) then
do_something_else_edit(tc);
end else if(tc is TBMemo) then begin
if not (check_something_about_memo(tc)) then
do_something_else_memo(tc);
end else
raise exception.create('invalid component type');
end;
وماذا كنت تفعل في الواقع تستخدم استراحة باعتباره غوتو. اقتراح رالف لاستخدام وظيفة ونطاق هو فكرة جيدة. لكن على خلاف ذلك قد يكون كذلك صادقة واستخدام "غوتو انتهى. وسوف تخسر تكرار جعله أكثر قابلية للقراءة الواقع.
وماذا كنت تريد استخدام كسر بدلا من الخروج؟ كسر في دلفي ليست هي نفسها كما "كسر" في اللغات متعرج.
var
tc: TComponent
begin
{ do something to get tc }
if (tc is TDBEdit) then
begin
if not (check_something_about_edit(tc)) then
do_something_else_edit(tc);
Exit;
end;
if (tc is TBMemo) then
begin
if not (check_something_about_memo(tc)) then
do_something_else_memo(tc);
Exit;
end;
raise exception.create('invalid component type');
end;
وهناك نقطة حول التخطيط. إذا لم محاولة للحد من المسافات كثيرا لذلك قد لا اتخاذ "آخر ساعة للتأكد من كل ما عندي لو-آخر اصطف مرتفعا بشكل صحيح" كما قلت في تعليق سابق.
إذا كان لديك التعليمات البرمجية التي تريد تنفيذ بعد ذلك، إما استخدام اقتراح رالف لإجراء المحلي، أو التفاف في try..finally - رمز في سيظل أعدم في نهاية المطاف