Процедуры есть не только в паскале. Это обособленные операции, которые выполняются часто и к которым производится обращение часто. Чтобы не писать одни и те же команды часто, их закидывают в процедуру и вызывают когда надо.
Ну так вот, а переменная процедурного типа хранит в себе значение соответствующей процедуры.
После описания таких переменых (и соответствующих процедур) можно вызвать процедуры через такие переменные, присваивать друг другу и передавать в качестве параметров переменные, совпадающие по структуре. Подробнее -
здесь.
Процедурный тип нужен для того, чтобы одной процедуре можно было передать ссылку на другую процедуру и та смогла ее вызвать. Я точно не помню, как это делается без расширенного синтаксиса, но по-моему как-то так:
type
TMyProc=procedure (x:integer);
procedure y(x:integer);
begin
writeln(sqr(x));
end;
procedure z(x:integer);
begin
writeln(sqrt(x));
end;
procedure ExecProc(Proc:TMyProc);
begin
Proc(4);
end;
begin
ExecProc(@y);
ExecProc(@z);
end.
Получается эдакий зачаток полиморфизма, который имеет некоторое отношение к следующей части вопроса.
Объектное программирование - программирование на основе объектной модели.