Создание нового компонента на базе элементов управления из библиотеки ComCtl32
Элемент управления обрабатывает шесть сообщений (см. документацию MSDN), которые сведены в табл. 5.8.
Таблица 5.8. Сообщения, обрабатываемые элементом управления IP Address Control.
Сообщение | Назначение |
---|---|
IPM CLEARADDRESS | Очистить поле адреса |
IPM GETADDRESS | Считать адрес |
IPM_ISBLANK | Проверить, не пустое ли поле адреса |
IPM SETADDRESS | Установить адрес |
IPM_SETFOCUS | Передать фокус заданному полю элемента управления |
IPM_SETRANGE | Установить ограничения на значения в заданном поле |
Кроме перечисленных, IP-редактор извещает приложение об изменениях, произведенных пользователем, путем посылки ему сообщения WM_NOTIFY.
Следует иметь в виду, что IP-редактор не является потомком обычного редактора (TCustomEdit) и не обрабатывает характерные для того сообщения ЕМ_ХХХХ, так что название TCustomipEdit отражает только внешнее сходство.
В создаваемом коде компонента первым делом нужно переписать конструктор Create и метод createParams. Последний метод вызывается перед созданием окна для установки его будущих параметров. Именно здесь нужно инициализировать библиотеку общих элементов управления ComCtl32 и породить новый класс окна.
constructor TIPEditor.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle: = [csCaptureMouse, csClickEvents, csDoubleClicks, csOpaque]; Color: = clBtnFace; Width: = 160; Height: = 25; Align: = alNone; end; procedure TIPEditor.CreateParams(var Params: TCreateParams); begin InitCommonControl(ICC_INTERNET_CLASSES); inherited CreateParams(Params); CreateSubClass(Params, WC_IPADDRESS); end;
После создания свое значение получает дескриптор окна Handle (это свойство унаследовано от TwinControl). Все чтение/запись свойств элемента происходит путем обмена сообщениями с использованием этого дескриптора. Минимально необходимыми для работы являются свойства IP (задает IP-адрес в редакторе), ipstring (отображает его в виде текстовой строки) и процедура clear (очищает редактор).
Реализовано это следующим образом.