Как объединить процедуры с одинаковым кодом в Delphi?
Например так:type
  TArrayHelper<T> = class
    class procedure CoolProc(var arr: TArray<T>); // Ваша процедура
  end;

…

implementation

class procedure TArrayHelper<T>.CoolProc(var arr: TArray<T>); // Реализация Вашей процедуры
var
  Tmp: T;
begin
    Tmp := arr[0];
    arr[0] := arr[4];
    arr[4] := Tmp;
end;

procedure TForm1.Button1Click(Sender: TObject); // Проверка работы
var
  i: integer;
  iarr: TArray<Integer>;
  sarr: TArray<String>;
begin
  iarr := TArray<Integer>.Create(1, 2, 3, 4, 5);
  sarr := TArray<String>.Create('one', 'two', 'three', 'four', 'five');
  TArrayHelper<Integer>.CoolProc(iarr); // Вызов для целых чисел
  TArrayHelper<String>.CoolProc(sarr); // Вызов для строк
  for I := 0 to 4 do
  begin
    memo1.Lines.Add(IntToStr(iarr[i]));
    memo2.Lines.Add(sarr[i]);
  end;
end;
Как вариант можно оставить одну процедуру например str, а перед вызовом преобразовывать массив int в массив str.
А что у вас делает абсолютно одинаковый код внутри блока?