Собственная ветвь в иерархии классов
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
элементов.
В отличие от полей свойства не имеют адреса в памяти, поэтому к ним запрещено применять операцию. Как следствие, их нельзя передавать в var- и out-параметрах процедур и функций.
2. Методика создания новых классов в Delphi
В этой главе рассматриваются основные этапы создания компонентов для Delphi.
Выбор родительского класса.
Создание модуля для компонента.
Создание свойств, методов и событий.
Тестирование и отладка компонента.
Оформление компонента.
Два первых этапа относительно просты и целиком описываются в этой главе. Три других более подробно рассматриваются в отдельных главах.
В этой главе анализируются все этапы разработки компонента, кроме, возможно, самого главного - этапа вынашивания основной идеи компонента, то есть решения для себя вопроса: чем будет отличаться новый компонент от существующих и будет ли он полезен в других программах или другим программистам. Последнее обстоятельство - возможное тиражирование компонента - очень важно, так как если компонент используется всего один раз или в одной-единственной программе, вряд ли стоит тратить дополнительные усилия на придание ему функциональности именно компонента, скорее всего, задачу с успехом решит специализированный модуль.
Выбор родительского класса
Компонентом может быть практически любой элемент программы, которым вы хотите манипулировать на этапе разработки. Создать компонент - означает создать новый класс, являющийся наследником одного из уже существующих классов. Вы можете создать компонент несколькими путями:
изменением существующих компонентов;
созданием новых оконных компонентов;
созданием новых графических (не оконных) компонентов;
созданием подклассов для элементов управления Windows;
созданием невизульных компонентов.
В табл. 2.1 перечислены компоненты и классы, которые лучше всего брать за основу для каждого подхода.
Таблица 2.1 - Рекомендуемые родительские классы
ЦельРекомендуемые классыИзменить существующий компонентЛюбой существующий компонент (например, TButton или TListBox) или класс TCustomXXXX (например, TCustomListBox)Создать оконный компонентTWinControl или TCustomControlСоздать графический компонентTGraphicControlСоздать подкласс для элемента управленияЛюбой компонент WindowsСоздать невизуальный компонентTComponentМожно также наследовать классы, которые не являются компонентами и не могут быть помещены на форму (например, TRegIniFile и TFont). В этом случае вы должны добавить в класс свойства, позволяющие ему взаимодействовать со средой Delphi на этапе разработки программы, потому что только при этом условии вновь созданный класс будет компонентным классом. Вообще, удачный выбор родительского класса в значительной степени упрощает проблему создания нового компонента. Помните замечательный девиз корпорации Borland: "Не нужно изобретать велосипед - просто наследуйте его!".
Изменение существующих компонентов
Самый простой способ создать компонент - изменить уже существующий. При этом в качестве родительского класса чаще всего используется соответствующий компонентный класс или класс TCustomXXXX. Как уже отмечалось в главе 3, классы TCustomXXXX реализуют основную функциональность соответствующих компонентов, но не публикуют многие их свойства и события. Наследовать от таких классов лучше тогда, когда новый компонент должен отличаться от своего предшественника набором свойств и событий. Пусть, например, создается простой компонент для отображения текущего системного времени. Для вывода текстовых сообщений хорошо подходит метка TLabel. Однако она имеет свойство Caption, которое для наших целей публиковать нельзя (это свойство в новом компоненте предназначено только для вывода системного времени). Выход из положения - наследовать новый компонент от класса TCustomLabel и оставить свойство Caption в секции protected (именно в этой секции свойство Caption объявляется в классе TCustomLabel). Тогда в самом компоненте можно обращаться к этому свойству, но ни в наследниках компонента, ни в работающей программе этого сделать нельзя.
Простой компонент для отображения на форме системного времени.
Он иллюстрирует два момента:
) Сокрытие свойств, которые противоречат функциональности компонента.
) Использование в компоненте уже существующего компонента. ===================================================================} interfaceSysUtils, Classes, Controls, StdCtrls, ExtCtrls; type TFarClock = class(TCustomLabel) private { Private declarations } FTimer: TTimer; protected { Protected declarations } procedure UpdateClock(Sender: TObject); public { Public declarations } constructor Create(AOwner: TComponent); override; published { Published declarations } property Align; // property Caption; Не публикуем это свойство! // Не публикуем также несколько других свойств // (AutoSize, Alignment, BiDiMode и т.п.), которые // не используются в новом компоненте. property Color; property Font; property ParentColor; property ParentFont; property ParentShowHint; property PopupMenu; property ShowHint; property Transparent; property Visible; end; procedure Register; implementation constructor TFarClock.Create(AOwner: TComponent); {В конструкторе создается вложенный компонент FTimer и инициируется его работа } begin inherited Create(AOwner); // Унаследованный конструктор FTimer := TTimer.Create(Self); // Создаем таймер FTimer.OnTimer := UpdateClock; // Его обработчик OnTimer FTimer.Enabled := True // Запускаем таймер end; procedure TFarClock.UpdateClock(Sender: TObject); { Эта процедура - обработчик события OnTimer встроенного таймера. Обновляет отображение времени в компоненте } begin Caption := TimeToStr(Time); // Изменяем надпись Invalidate; // Отрисовываем компонент end; procedure Register; begin RegisterComponents(Far, [TFarClock]); end; end. Вместе со свойством Caption не публикуются многие другие свойства стандартной метки, которые излишни в новом компоненте. Например, значение свойства AutoSize всегда предп?/p>