
- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
Примечание
Файл исходного текста компонента назван DDHNOTH.PAS. Как и имена классов компонентов, так и имена модулей должны также быть уникальными. В результате два различных пакета (используемые в данном проекте) не могут содержать модуль с тем же самым именем. Префикс DDH используется для имен файлов, чтобы избежать коллизий с именами модулей других компонентов, которые могли быть установлены ранее. В Delphi 3, при помещении компонента в пакет, если файл DCR доступен, редактор пакета генерирует в исходном файле пакета соответствующую директиву $R для подключения компонента. Однако это работает не всегда. Если это случилось, попробуйте удалить и вставить в пакет модуль компонента или отредактировать исходный текст пакета вручную (объяснение этого будет представлено в следующей главе).
Совет
Чтобы установить битовый образ компонента, можно просто включить в модуль компонента директиву {$R *.DCR}. Так как файл ресурса обычно имеет то же самое имя, что и файл модуля (хотя это не обязательно), эта директива будет работать для любого написанного вами компонента. Именно этот подход использовался в книге.
Примечание
Важно называть поля, методы доступа и свойства в соответствии со стандартом, определенным фирмой Borland и описанным в руководстве Component Writer's Guide. Основной руководящий принцип: используйте для свойств содержательные имена, добавляйте f к именам полей, соответствующих свойствам, и называйте методы доступа, как Get или Set плюс имя свойства (как В SetStatus И SetColor).
Как только компонент TDdhNothing построен, можно попробовать его использовать. При размещении этого компонента в форме видно, что по умолчанию высота и ширина имеют значение в один пиксель. При простом размещении компонента в среде Delphi сразу возникает проблема. Чтобы устранить проблему, нужно заместить конструктор, устанавливающий размеры компонента, и изменить объявления свойств высоты Height и ширины Width:
type
TDdhNothing = class(TGraphicControl)
public
constructor Create(Owner: TComponent); override;
published
property Width default 50;
property Height default 50;
property Align;
Примечание
He забудьте добавить ключевое слово override в объявление конструктора, иначе библиотека визуальных компонент VCL никогда не вызовет вашу версию конструктора!
Вот реализация конструктора TDdhNothing.
constructor TDdhNothing.Create(Owner: TComponent);
begin
// Сначала вызов конструктора родительского класса
inherited Create(Owner);
// Установка размера
Width := 50;
Height := 50;
end;
Так как значения этих свойств по умолчанию устанавливаются в конструкторе, их нужно отразить при объявлении свойства (повторно определив), добавляя ключевое слово default и определяя значения, используемые в конструкторе.
Delphi не использует значение свойства по умолчанию для автоматической установки. В действительности, Delphi использует это значение только для сохранения свойств в потоке при чтении из потока или первичном создании. В результате, если текущее значение свойства такое же, как значение по умолчанию, компонент вообще не сохранит это свойство в потоке. (Нет смысла инициализировать эти значения, если конструктор все равно в любом случае установит их правильно.) Вообще, за правильную установку значений по умолчанию отвечает конструктор компонента.
Чтобы показать класс компонента TDdhNothing, построен пример, отображающий всплывающие подсказки (не производя других визуальных действий) на пустых областях формы, т.е. подсказку для компонента образа Image и другую подсказку для отдельных областей образа. Чтобы сделать это, компоненты Nothing помещены с обеих сторон образа и над частью изображения, чтобы создать «горячую» зону (область, отображающую различные подсказки и специальные сообщения при ее нажатии).
Вот сокращенное описание формы, показывающее только свойства, связанные с этим примером:
object Form1: TForml
BorderStyle = bsDialog
Caption = 'Nothing component Demo'
ClientHeight = 448
ClientWidth = 632
ShowHint = True
object Imagel: TImage
Left =89
Top = 0
Width = 423
Height = 448
Hint = 'Not a mouse'
Align = alClient
Picture.Data =(...)
OnClick = ImagelClick '
end
object DdhNothingl: TDdhNothing
Left = 0
Top =0
Width =89
Height =448
Hint = 'Move right...'
Align = alLeft end
object DdhNothfng2: TDdhNothing
Left = 512
Top = 0
Width = 120
Height = 448
Hint = 'Move left...'
Align = alRight end
object DdhNothing3: TDdhNothing
Left = 168
Top = 280
Width =313
Height = 169
Hint = 'Mouse ! ! ! '
OnClick = DdhNothingSClick
end
end