| 
   
Создание объектных переменных
  
В новостной группе я несколько раз встречал вопросы подобного плана, 
указывающие на недостаток понимания работы экземпляра объекта. Я понимаю, что 
данный вопрос могут задать скорее новички в программировании, поэтому свой 
рассказ я начну издалека - с организации классов в Delphi. Я надеюсь, что моя 
"попытка" ликбеза по крайней мере объяснит суть предмета.
 Во всяком случае, рекомендую данный материал для всех, кто хоть раз 
сталкивался с ошибками указателей, исключительными ситуациями и GPF.
 Когда вы объявляете переменную некоторого типа класса, как например... 
 
....всех вас интересует: что делает в этом случае компилятор и достаточно ли 
распределено памяти, чтобы хранить указатель на экземпляр данного класса в куче 
памяти. Знайте же: вы не распределили память для данного класа, вы только что 
распределили память для указателя. Компилятор всегда инициализирует этот 
указатель в $FFFFFFFF, а это значит, что распределенный блок памяти пуст. Во 
всяком случае этого достаточно, чтобы сказать что указатель *не* указывает на 
верную "позицию" памяти и ваш класс *не* содержит никаких данных.
 Delphi распределит и заполнит память за вас, но и вы должны немного 
потрудиться. Когда вы используете один из классов Delphi или свой собственный, 
вы должны создать его экземпляр. Что это значит: вы должны распределить память и 
установить на распределенный блок памяти указатель. В некоторых языках это 
выглядит безобразно, в Delphi же это выглядит так... 
 
MyVar := TMyClass.Create; 
 
 |  
  
Это действительно просто, поскольку метод конструктора Create класса TMyClass 
является классовым методом - он работает в классе, а не в отдельном объекте. 
Когда вы вызываете конструктор, Delphi распределяет память и возвращает значение 
указателя. Присмотритесь: не похоже ли это на вызов функции? Хорошо, если вы 
раньше не знали, что возвращалось при вызове, то теперь вы это знаете. Вызов 
TMyClass.Create возвращает указатель на объект типа TMyClass.
 В конце концов то, что вам действительно нужно помнить, это... 
 
 
- Объявление объектной переменной некоторого типа. 
 - Создание объекта вызовом метода конструктора класса. 
 - Использование объекта по назначению. 
 - Освобождение объекта. 
  
 
procedure Example;
var
  MyObj: TMyClass;   // класс, который вы создаете
  MyList: TList;     // встроенный класс
begin
  MyObj := TMyClass.Create;
  // теперь MyObj содержит адрес блока памяти,
  // распределенной для экземпляра вашего класса
  MyList := TList.Create;
  // Код для работы с MyList
  // ....
  // здесь что-то делаем с объектом
  // ....
  MyList.Free;
  // Ресурсы MyList удаляются из кучи
  MyObj.Free;
  // тоже самое для MyObj
end;
 
      
 |  
  
           |