const
  newline=#13;  {Newline character}

{************** SumConsec ***************}
function Sum(lo,hi:integer):integer;
{Returns the sum of consecutive integers
 from lo to hi, including lo and hi}
var
  n:integer;
begin
  if lo>hi then {if lo is not smaller, exchange lo and hi}
  begin
    n:=lo; lo:=hi; hi:=n;
  end;
  {The sum of a consecutive set of integers is
  the number of integers: (hi-lo+1)
  times the average integer: (lo+hi) divided by 2 }
  result:= (hi-lo+1)*(lo+hi) div 2;
end;

{**************** SolveButtonClick ****************}
procedure TForm1.SolveButtonClick(Sender: TObject);
var
  nbrRunners,MyNumber:integer;
  maxrunners:integer;
  x:integer;
begin
  NbrRunners:=strtoint(MinNbrEdt.text)+1; {Start NbrRunners at min nbr}
  Maxrunners:=strtoint(MaxNbrEdt.text)-1; {Set stop point at max runners}
 {Loop to check all possible nbrrunners}
  while (NbrRunners<=maxrunners) do
  begin
    MyNumber:=1;
    {Loop to check all possible marathoners nbrs for this nbrrunners}
    while (MyNumber<=NbrRunners) do
    begin
      screen.cursor:=crHourGlass;
      x:=sum(1,MyNumber-1);
      if x=sum(MyNumber+1,NbrRunners) then
      begin
        screen.cursor:=crDefault;
        showmessage('One solution is:'
          +newline + 'Number of runners: '+inttostr(NbrRunners)
          +newline + 'Our runner''s number: '+inttostr(MyNumber)
          +newline + 'Sum of numbers 1:'+inttostr(MyNumber-1)
                   + ' and '+inttostr(MyNumber+1) + ':'
                   + inttostr(NbrRUnners)+' is '+format('%6d',[x])
          );
        {Once we've found a solution,
         force this loop to stop since no bigger values for MyNumber will work}
        MyNumber:=NbrRunners;
      end;
      inc(MyNumber); {add 1 to MyNumber}
    end;
    inc(NbrRunners); {add 1 to NbrRunners}
  end;
  screen.cursor:=crdefault;
  x:=maxrunners+1;
  Showmessage('No more solutions with less than '+format('%6d',[x])+' runners');
end;