سؤال

والنظر في قانون باسكال دلفي التالية:

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 - رمز في سيظل أعدم في نهاية المطاف

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top