Napisałeś funkcję, która pobiera dane, sprawdza jakiś warunek, po czym znów wywołuje sama siebie, z takimi samymi parametrami.
Takie coś nie ma końca, a że nic nie jest tam liczone (do reszty kodu nigdy nie dojdzie), to nie dziwota, że nie udało Ci się jej działania ograniczyć.
var // globalne
Suma: Integer;
Ilosc: Byte;
procedure Bo;
var
a: Integer;
begin
Readln(a);
case (a mod 3) of
0: begin
Inc(Suma, a);
Inc(Ilosc);
end;
end;
if not ((Suma >= 300) or (Suma <= -300)) then
Bo
else
Writeln('Osiagnieto limit. Suma = ', Suma ,', Ilosc = ', Ilosc);
end;
Nie testowałem, ale powinno działać. To jest bardziej pod Pascala, zadziała w Console Application. W przypadku okienkowej wersji zmienne Suma i Ilosc umiesc w sekcji private, a Writeln zamień na coś innego, np. wstaw tekst do jakiegoś labela.