12.3 Различие переменных, функций и процедур, включенных и не включенных в
описание класса
Теперь посмотрим, чем различаются константы, переменные, функции и процедуры,
включенные и не включенные в описание класса. В приведенном примере переменная
Ch1 и процедуры F1 и F2 включены в описание класса, а переменные Ch2, Ch3 и
процедуры F3 и F4 объявлены вне класса. В чем будет проявляться различие в их
использовании?
Если в приложении создается только один объект данного класса (в нашем примере —
только один объект формы класса TForm1), то различие в основном чисто внешнее.
Для процедур, объявленных в классе, в их описании в разделе implementation к
имени процедуры должна добавляться ссылка на класс. В нашем примере имена
процедур F1, F2 и Button1CIick в описании этих процедур в разделе implementation
заменяются на TForm1.F1, TForm1.F2 и TForm1.Button1Click. Для процедур F3 и F4,
объявленных вне класса, такой замены не требуется.
Необходимость добавления к именам процедур, описанных в классе, ссылок на класс
объясняется просто. Вы можете вне класса описать другую свою процедуру с тем же
именем (например, F1), что и у процедуры класса. И тогда из процедур, не
описанных в классе, вы сможете ссылаться на обе эти процедуры F1, только на одну
из них непосредственно — по имени F1, а на другую через объект класса —
Form1.F1. Благодаря этому, при описании своих процедур вне класса вы можете даже
не знать имен всех процедур описанных в классе (может быть этот класс описан в
другом модуле, текст которого вы не видели). Никакой путаницы при этом не
возникнет.
Обращение к переменным и процедурам, описанным внутри и вне класса, из процедур,
описанных вне класса, различается. К переменным и процедурам, описанным вне
класса, обращение происходит просто по их именам, а к переменным и процедурам,
описанным в классе, через имя объекта класса. Поэтому в нашем примере в
процедурах я F4 обращение к переменной Form1.Ch1. По той же при
чине и обращение к свойству Caption объекта Label1 в этих процедурах имеет вид
Form1.Label1.Caption. Только через ссылку на объект Form1 внешние по отношению к
классу процедуры могут получить доступ ко всему, объявленному в классе.
Все эти ссылки на объект не требуются в процедурах, объявленных в классе.
Поэтому в процедурах TForm1.F1, TForm1.F2 и TForm1.Button1CIick ссылки на
временную Ch1 и на объект Label1 не содержат дополнительных ссылок на объект
формы.
Если в приложении создается несколько объектов одного класса, например,
несколько форм класса TForm1 (как вы увидите впоследствии, это часто делается :
приложениях с интерфейсом множества документов MDI), то проявляются более
принципиальные различия между переменными, описанными внутри и вне класса.
Переменные вне класса (в нашем примере Ch2 и ChЗ) так и остаются в одном
экземпляре. А переменные, описанные в классе (в нашем примере Ch1), тиражируются
столько раз, сколько объектов данного класса создано. Т.е. в каждом объекте
класса TForm1 будет своя переменная Ch1, и все они друг с другом никак не будут
связаны. Таким образом, в переменную, описанную внутри класса, можно заносить
какую-то информацию, индивидуальную для каждого объекта данного класса. А
переменная, описанная в модуле вне описания класса, может хранить только одно
значение.