Очень глупый вопрос

procedure ClearNoDigits(var A: string);
var
  i: integer;
begin
  i := 1;
  while length(A)>i do if not (char.IsDigit(A[i])) then delete(A, i, 1) else i += 1;
end;

По идее, принцип работы должен был быть следующий: строка A посимвольно обрабатывается, на выходе мы имеем A, состоящую из цифр. Но на практике именно после реализации процедуры ClearNoDigits основная программа уходит в бесконечный цикл. Проблема в while (или где-то ещё в процедуре) или смотреть надо в основной программе? Спасибо.

У вас условие цикла неверно задано. Нужно >=.

А в остальном она рабочая, только написана очень странно. Кроме IsDigit и += у вас не используется ни чего от PABC.

Ведь гораздо предпочтительней писать A.Length вместо length(A) и A[i].IsDigit вместо char.IsDigit(A[i]), ну и лучше написать A := A.Remove(i-1, 1), ибо мы точно знаем, что делаем.

Итого:

procedure ClearNoDigits(var A: string);
begin
  var i := 1;
  while A.Length >= i do
    if A[i].IsDigit then
      i += 1
    else
      A := A.Remove(i-1, 1);
end;

begin
  var s := 'dfgdfgdfg 123 dfgdfg 456 gdf gd';
  ClearNoDigits(s);
  WriteLn(s);
end.

А если воспользоваться регулярным выражением, то данная процедура вообще не нужна:

WriteLn( Regex.Replace(s, '[^1-9]', '').ToString );

Ещё вариант.

function ClearNoDigits(s: string) := s.where(c -> c.IsDigit).joinintostring('');

begin
  var s := 'a1b2c';
  write(ClearNoDigits(s));  // -> 12
end.