Визуальный компонент на самом деле является классом. Чтобы написать класс, вы можете написать его непосредственно в файле *.pas. Но для написания элементов управления необходимо использовать пакеты. Выберите «Создать» в меню «Файл», чтобы создать новый пакет. Это пакет, используемый для хранения и установки элемента управления. Затем нажмите кнопку «Добавить» в окне «Пакет», чтобы добавить компонент (Unit).
Выберите «Новый компонент» в верхней части всплывающего диалогового окна. Поскольку невозможно запрограммировать все свойства, методы и события элемента управления самостоятельно, вам необходимо выбрать класс-предок (или «родительский класс» или «базовый класс»), а затем добавить свои собственные свойства, методы и события к нему. Выберите необходимый класс предка в раскрывающемся списке после Типа предка. Поскольку для написания визуальных элементов управления требуется рисование, в качестве класса-предка выбран TGraphicControl. Затем введите имя нового элемента управления (класса) в поле «Имя класса», обычно начинающееся с «T». Страница палитры используется для выбора имени страницы управления нового элемента управления в окне Delphi, например «Стандарт». Вы можете выбрать это самостоятельно. Добавьте путь и имя нового управляющего файла в поле «Имя файла модуля» и нажмите кнопку «ОК». Добавлены новые элементы управления. Теперь пришло время написать код для элемента управления.
Ниже приводится написание полосы прокрутки, которая может настраивать изображения, в качестве примера, иллюстрирующего метод написания визуальных элементов управления.
Следуйте описанному выше методу, выберите TGraphicControl в качестве класса-предка, а имя нового элемента управления — TPigHorizontalScroller. После выбора пути и имени файла нажмите кнопку «ОК», чтобы начать писать код.
Каждый элемент управления будет создан (Create) и удален (Destroy), поэтому эти два процесса необходимо написать первыми. Для каждой процедуры в элементе управления она должна быть сначала определена, а затем записана позже. Существует три типа определенных процессов или свойств: 1. Те, которые определены после PRivate, используются внутри элемента управления и не видны людям, использующим этот элемент управления. 2. Те, которые определены после защиты, обычно невидимы и могут использоваться другими только тогда, когда; другие используют этот элемент управления. Этот элемент управления виден только при написании других элементов управления как класса-предка. 3. Те, которые определены после public, могут быть вызваны только другими в программе. 4. Те, которые определены после публикации, можно увидеть в окне свойств (Объект); Инспектор). Поскольку процесс создания и удаления не только выполняется автоматически при создании элемента управления в процессе программирования, но также может вызываться, когда элемент управления создается динамически во время работы программы, он определяется после public (1). (Порядковый номер указывает на положение кода подэтапа в приложенной исходной программе, там же, что и ниже) Возможно, вы еще не знаете, что нужно компилировать в этих двух процессах и как это компилировать. Мы поговорим об этом ниже.
Давайте сначала добавим некоторые свойства этому элементу управления. Мы определяем свойство Max для установки или чтения максимального значения полосы прокрутки. Поскольку атрибуты обычно не используются в программах напрямую, необходимо определить переменную, соответствующую атрибуту, и ее значение можно изменить или прочитать. Поскольку он используется только внутри элемента управления, мы определяем его после частного (2). (Обычно переменные, связанные с атрибутами, начинаются с буквы «F», например FMax). После определения переменных определите атрибуты. Это свойство должно быть видимым в окне Инспектора объектов, поэтому определите его и опубликуйте (3). Определенный синтаксис:
свойство <имя свойства>:<тип> read <соответствующая переменная при чтении этого свойства> write <соответствующая переменная или процедура при записи этого свойства>
Другие переменные и атрибуты также определяются аналогичным образом (например, минимальное минимальное значение, текущее значение значения и т. д.). Далее мы определяем несколько свойств и переменных для установки изображения полосы прокрутки (поскольку переменная изображения особенная, мы поговорим о ней отдельно). Мы определяем LeftButtonUpPicture (изображение левой кнопки), LeftButtonDownPicture (изображение нажатия левой кнопки) и т. д. как типы TBitmap (должны быть определены соответствующие переменные).
Вы, должно быть, заметили, что в приложенной исходной программе при определении этих атрибутов переменная, соответствующая читаемому после чтения атрибуту, равна F..., но переменная, соответствующая атрибуту, указанному после записи, является не Variable, а чем-то вроде Set ... Это индивидуальный процесс. Процесс как функция определяется как:
процедура <имя процедуры>(Значение: <тип значения устанавливаемого атрибута>)
Поскольку при написании атрибута этого типа необходимо выполнить и другие действия, вы не можете просто использовать переменную для его обработки, вы должны использовать процесс для его обработки. Этот процесс обычно определяется после защиты. В процедурах этого типа для присвоения значения переменной типа TBitmap используется такой оператор, как ⑷. Это принято, поскольку переменным этого типа нельзя напрямую присвоить значение.
После определения свойств этих переменных типа TBitmap вам необходимо написать код в процессах создания и уничтожения, упомянутых выше. Поскольку TBitmap также является классом, он должен быть создан во время процесса создания (5) и должен быть освобожден (бесплатно) во время процесса уничтожения (6). Оператор inherited, упомянутый здесь в пункте ⑺, используется для указания того, что процесс унаследован от класса-предка. (Это нельзя отбрасывать).
Поскольку мы пишем визуальный элемент управления, нам необходимо нарисовать на нем картинки. Класс-предок нашего элемента управления, TGraphicControl, инкапсулирует объект Canvas (холст), и мы можем использовать его непосредственно для рисования изображений. Если вы еще не знакомы с использованием Canvas, рекомендуется найти книгу и прочитать ее.
Следующее, что нужно сделать, это нарисовать картинку. Как рисовать картинки на элементе управления? В родительском классе TGraphicControl есть событие Paint, которое автоматически запускается, когда элемент управления необходимо перерисовать. Теперь нам нужно написать программу для этого мероприятия. Сначала определите объект Canvas после защиты. Поскольку он уже существует в классе-предке, нет необходимости добавлять какие-либо пояснения⑻. Мы будем использовать этот объект для рисования изображения. Далее вам необходимо определить процесс Paint и написать код для рисования элемента управления. Определите процесс Paint первым после public. Поскольку он запускается классом-предком, а не вызывается пользователем, переопределение необходимо добавить позже. В противном случае элемент управления не станет визуальным элементом управления, поскольку процесс Paint никогда не будет вызван. Далее мы напишем код для процесса Paint⑽.
T_Height и другие переменные в процессе Paint исходной программы, приложенной к этой статье, используются для сохранения размера кнопок, ползунков и т. д. в полосе прокрутки. Эта часть программы мало чем отличается от программы в обычных приложениях. Большинство из них предназначены для работы на холсте, я думаю, все поймут это с первого взгляда. Стоит отметить следующее определение переменной FAutoSize. FAutoSize — это логическая переменная, связанная с атрибутом AutoSize элемента управления. Она используется для установки того, изменяется ли размер элемента управления в зависимости от размера изображения. Обратите внимание, что в коде элемента свойства, как правило, не вызываются напрямую, а используются соответствующие переменные.
На этом этапе программы ваш новый элемент управления наконец-то появился, но он еще не может прокручиваться. Теперь давайте напишем события мыши, которые позволят нам ею манипулировать. Определение процесса события мыши очень похоже на процесс Paint, за исключением того, что в конце необходимо добавить описания параметров. События мыши делятся на три типа: MouseDown, MouseMove и MouseUp должны быть добавлены после определения. Затем напишите его код. Примечание. Событием мыши здесь является Mouse..., а не обычное OnMouse.... Но для чего используется определение ⒀? Все определения событий здесь предназначены для пользователей, то есть, когда элемент управления используется, он будет отображаться на странице «Событие» в Инспекторе объектов.
Код этих событий мыши также очень прост: он определяет координаты мыши, рисует соответствующую картинку на холсте и т. д. и одновременно запускает соответствующее событие. Стоит отметить, что при вызове пользовательского события необходимо сначала использовать оператор, например ⒁, чтобы определить, написал ли пользователь код для события. Это очень важно, иначе произойдет ошибка.
Все заметили, что все только что вызванные события настраиваются, а определяемый метод также очень прост. Он аналогичен определению свойств, за исключением того, что его тип — TNotifyEvent.
TNotifyEvent — это событие по умолчанию, которое определяется как:
TNotifyEvent = процедура (Отправитель: TObject)
Если вы хотите определить другую форму события, вы должны сделать следующее: сначала написать ее, а затем ввести
<имя типа события> = процедура(<параметр>:<тип>)
Например:
TCustomEvent = процедура (a: Integer; b: String);
Затем определите его после public:
<имя события>:<имя типа события>
Например:
AnEvent: TCustomEvent;
Прочитав это, вы должны понять всю процедуру. Если возникают ошибки компиляции или запуска, проверьте следующие пункты:
1. Есть ли унаследованные операторы в процессах создания и уничтожения?
2. Были ли созданы и освобождены переменные типа TBitmap?
3. Есть ли имя элемента управления перед процессом, например: TPigHorizontalScroller.MoseMove
Как определить, входит ли мышь в элемент управления или выходит из него:
Определите следующий процесс:
процедура MouseEnter (вар Msg: TMessage сообщение CM_MOUSEENTER);
процедура MouseLeave (вар Msg: TMessage сообщение CM_MOUSELEAVE);