Решил Вашу задачу 2-мя способами, но в консоли (я надеюсь, что не составит труда вывести массив в StringGrid, а не в консоль). И ещё кое что: приучайтесь сразу нумеровать элементы массива с нуля, поскольку в Си-подобных языках нумерация элементов с нуля.
Код:
program Forum2Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
Var // основной и дополнительный массивы
Mas, Mass: Array[0..29] Of Integer;
i, k, N: Byte; // переменные
begin
Repeat
Write('Vvedi razmer (2 <= N <= 30): N = ');
ReadLn(N); // ввод размера
Until ((N >= 2) And (N <= 30)); // проверка границ размера
N:=N-1;
Randomize; // инициализация генератора СЧ
WriteLn('Ishodnii massiv:');
For i:=0 To N Do
Begin // генерация элементов массива и вывод на экран
Mas[i]:=Random(5);
WriteLn(Mas[i]); // так вывод производится в столбик
// Write(Mas[i], '; '); а так - в строчку
End;
WriteLn;
WriteLn('Poluchennii massiv:');
WriteLn;
// этот закоментированный код тоже работает
// этот код использует дополнительный массив
{k:=0; // начальное значение количества ненулевых элементов
For i:=0 To N Do
If (Mas[i]<>0) Then // если элемент ненулевой
Begin
Mass[k]:=Mas[i]; // он попадает в массив
k:=k+1; // индекс массива ненулевых элементов +1
End;
For i:=0 To N Do
Begin // если i меньше кол-ва ненулевых эл-тов
If (i<k) Then
Mas[i]:=Mass[i] // беру элемент из массива
Else // иначе, присваиваю ему нуль
Mas[i]:=0;
WriteLn(Mas[i]); // вывод на экран
End;}
// этот код не использует дополнительный массив
For i:=0 To N-1 Do // мотаю цикл от 0 до кол-ва эл-тов массива -1
For k:=i+1 To N Do // мотаю цикл, который перемещает эл-ты
If ((Mas[i]=0) And (Mas[k]<>0)) Then
Begin // если левый элемент нуль, а правый нет, то:
Mas[i]:=Mas[k]; // левому присвоил значение правого
Mas[k]:=0; // а правому нуль
End;
// для закомментированного метода этот цикл НЕ нужен!
For i:=0 To N Do // просто вывод массива на экран
WriteLn(Mas[i]);
WriteLn;
WriteLn('Press ENTER!');
ReadLn;
end.
З. Ы. Ннаписал в консоли, т. к. рисовать форму мне было неохота!