Компонент записи, часть 2

Компонент записи, часть 2


в этой статье мы рассмотрим как записать дополнительные свойства, как писать пользовательские потокового этих свойств и подсвойств.


и<р класса="step_content "><границы таблицы="1"><тр><тд>

эта статья первоначально появилась в Delphi Разработчик



Авторское право шедевре издание, Инк. Все права защищены.
<р класса="step_content ">





<и>эта статья является частью двух из трех частей статьи на компоненты. Часть первая охватывает основные создания компонентов, часть вторая будет охватывать как написать дополнительные свойства, как писать пользовательские потокового этих свойств и подсвойств. Заключительная часть будет охватывать собственность / редакторы компонент, как написать специальную редакцию для компонент / свойство, и как пишут "скрытые" компоненты.



довольно часто приходится писать компоненты, которые выполняют более продвинутыми функциями. Эти компоненты часто приходится либо ссылаться на другие компоненты, пользовательские данные свойства форматы, или есть свойство, которое имеет список значений, а не одно значение. В этой части мы рассмотрим различные примеры, охватывающие эти самые субъекты, начиная с самых простых.



компонент ссылается на то,

некоторые компоненты должны ссылаться на другие компоненты. Например названия имеет "FocusControl" собственность. Когда вы включаете амперсанд в "подпись" собственность это подчеркивает следующая буква (...Привет будет Привет), нажав сочетание клавиш Alt-H на клавиатуре будет инициировать событие в вашей этикетке. Если "FocusControl" собственность был установлен фокус будет передан в управление указано.



и есть такое свойство в свой собственный компонент достаточно прост. Все, что вам сделать, это объявить новое свойство, и установить Тип помещения до самого низкого базового класса, что она может принять (TWinControl позволит любой потомок TWinControl, чтобы быть использованы), но есть последствия.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TSimpleExample = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FFocusControl: TWinControl

& евро & евро и защищен

& евро & евро & евро & евро и процедура в SetFocusControl(<Б>константный значение: TWinControl) <Б>виртуальные

& евро & евро и общие

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в FocusControl: TWinControl читать FFocusControl писать SetFocusControl

& евро & евро и конец



<Б>процедура
на TSimpleExample.SetFocusControl(<Б>константный значение: TWinControl)

<Б>начать

& евро & евро FFocusControl := Значение

<Б>конец

& евро & евро & евро & евро







бери выше примере. Это довольно простой пример (отсюда и название компонента) как написать компонент, который ссылается на другой компонент. Если у вас есть такое свойство в компонент Инспекторе объектов появится комбобокс со списком компонентов, которые соответствуют критериям (все компоненты произошли от TWinControl).



наш компонент, может сделать что-то вроде



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>ипроцедура на TSimpleExample.Сделать

<Б>начать

& покупка & покупка при (присвоенный(FocusControl)) и

& евро & евро & евро & евро & евро (FocusControl.Включена) <Б>тогда

& евро & евро & евро & евро FocusControl.Метода setfocus

<Б>конец

& евро & евро & евро & евро







сначала мы проверяем, если собственность была присвоена, если да то установить фокус на него, но бывают ситуации, когда собственность еще не Nil компонент, на который он указывает уже не действует. Это часто происходит, когда свойство ссылается на компонент, который был разрушен.



к счастью, Delphi дает нам решение. Всякий раз, когда компонент разрушается она сообщает своему владельцу (наша форма), что он разрушается. На данный момент каждый компонент принадлежит той же формы, это тоже будет сообщено об этом событии. Чтобы поймать это событие, мы должны переопределить стандартный метод TComponent называется "уведомление".



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TSimpleExample = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FFocusControl: TWinControl

& евро & евро и защищен

& евро & евро & евро & евро и процедура уведомление(как acomponent: TComponent

& евро & евро & евро & евро & евро & евро операция: TOperation) <Б>переопределить

& евро & евро & евро & евро и процедура в SetFocusControl(<Б>константный значение: TWinControl) <Б>виртуальные

& евро & евро и общие

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в FocusControl: TWinControl читать FFocusControl писать SetFocusControl

& евро & евро и конец



<Б>процедура
на TSimpleExample.SetFocusControl(<Б>константный значение: TWinControl)

<Б>начать

& евро & евро FFocusControl := значение

<Б>конец



<Б>процедура
, и TSimpleExample.Уведомление(как acomponent :TComponent

& евро & евро операция : TOperation)

<Б>начать

& евро & евро <Б>наследство <я>//никогда не забывайте называть это

& покупка & покупка при (операция = opRemove) и

& евро & евро & евро & евро & евро (производства = FocusControl) и тогда

& евро & евро & евро & евро FFocusControl := <Б>Нил

<Б>конец

& евро & евро & евро & евро & евро & евро







теперь, когда наш компонент разрушается, мы уведомлены, в какой момент мы можем установить нашу ссылку на Нил. Заметим, однако, что я сказал <я>"каждый компонент принадлежит той же форме уведомляется об этом событии тоже"



это знакомит нас с еще одной проблемой. Мы не только уведомление о том, что компонент разрушается, если он принадлежит той же форме. Можно иметь свою точку собственность на компоненты на другие формы (или даже без рук вообще), и когда эти компоненты будут уничтожены, мы не будет. Но опять-таки это решение.



TComponent вводит так называемый метод "FreeNotification". Цель FreeNotification рассказать компонент (FocusControl), чтобы держать нас в виду, когда он будет уничтожен.



реализация будет выглядеть следующим образом



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TSimpleExample = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FFocusControl: TWinControl

& евро & евро и защищен

& евро & евро & евро & евро и процедура уведомление(как acomponent: TComponent

& евро & евро & евро & евро & евро & евро операция: TOperation) <Б>переопределить

& евро & евро & евро & евро и процедура в SetFocusControl(<Б>константный значение: TWinControl) <Б>виртуальные

& евро & евро и общие

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в FocusControl: TWinControl читать FFocusControl писать SetFocusControl

& евро & евро и конец



<Б>процедура
на TSimpleExample.SetFocusControl(<Б>константный значение: TWinControl)

<Б>начать

& покупка & покупка при значение <> FFocusControl <б>тогда

& евро & евро <б>начать

& евро & евро & евро & евро при назначена(FFocusControl) <Б>тогда

& евро & евро & евро & евро & евро & евро FFocusControl.RemoveFreeNotification(Самовыдвижение)



& евро & евро & евро & евро FFocusControl := значение



& евро & евро & евро & евро при назначена(FFocusControl) и тогда

& евро & евро & евро & евро & евро & евро FFocusControl.FreeNotification(Самовыдвижение)

& фитоэстрогены & мочекаменная конце

<Б>конец



<Б>процедура
на TSimpleExample.Уведомление(как acomponent: TComponent

& евро & евро операция : TOperation)

<Б>начать

& покупка & покупка при (операция = opRemove) и

& евро & евро & евро & евро & евро (производства = FocusControl) <Б>тогда

& евро & евро & евро & евро FFocusControl := <Б>Нил

<Б>конец

& евро & евро & евро & евро







При установке наши свойство FocusControl мы сначала проверяем, если он уже установлен компонент. Если он уже установлен, нам нужно рассказать исходного компонента, что нам больше не нужно знать, когда он будет уничтожен. Как только наша собственность была установлена на новое значение сообщаем новый компонент, который мы требуем уведомление, когда он освобождается. Остальную часть кода остается таким же, как указанный компонент до сих пор называет наш метод уведомления.



наборы

этот раздел действительно довольно простая и не займет много времени, чтобы покрыть. Я не сомневаюсь, что вы уже знакомы с созданием собственных порядковых типов.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TComponentOption = (coDrawLines,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро coDrawSolid,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная coDrawBackground)

& евро & евро & евро & евро







свойства этого типа будет показывать выпадающий список с перечнем всех возможных значений, но иногда необходимо установить совокупность многих (или всех) из этих значений. Это были наборы приходят в игру



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& евро & евро TComponentOption = (coDrawLines,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро coDrawSolid,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная coDrawBackground)

& покупка & покупка TComponentOptions = В наборе на TComponentOption

& евро & евро & евро & евро







издание свойства Тип TComponentOptions повлечет за собой [ ] появляется рядом с именем свойства. Когда вы нажмите, чтобы развернуть свойство вы увидите список вариантов. Для каждого элемента в TComponentOption вы увидите логическое свойство, вы можете включить / исключить элементы из набора, установив для него значение True или false.



это просто, чтобы проверить / изменить элементы в наборе из нашего компонента вроде так.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД>при coDrawLines В OurComponentOptions

& евро & евро и тогда DrawTheLines

& евро & евро & евро & евро







или



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТD>ипроцедура на TSomeComponent.SetOurComponentOptions(<Б>константный значение: TComponentOptions)

<Б>начать

& евро & евро при (coDrawSolid в значение) и

& евро & евро (coDrawBackground в стоимость) <Б>тогда

& евро & евро & евро & евро {вызвать исключение}



& покупка & покупка FOurComponentOptions := Значение

& покупка & покупка недействительным

<Б>конец

& евро & евро & евро & евро







Двоичные свойства

Иногда надо писать свой собственный потоковый процедуры для чтения и записи пользовательских типов свойств (это как Делфи читает / пишет Top и left свойства, не видимые компоненты, без публикации этих свойств в инспекторе объектов)<.бр />


например, я однажды написал компонент для построения формы на основе растрового изображения. Мой код на время для преобразования растрового изображения в окно-регион был крайне медленным и не может быть никакой пользы во время выполнения. Мое решение для преобразования данных во время разработки, и поток двоичных данных в результате преобразования. Чтобы создать двоичный свойства в три этапа.



1. Написать метод для записи данных.

2. Написать метод для чтения данных.

3. Скажите Делфи, что у нас есть двоичное свойство, и передать наши методы чтения и записи.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TBinaryComponent = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FBinaryData : указатель

& евро & евро & евро & евро FBinaryDataSize : DWORD с

& евро & евро & евро & евро и процедура, и WriteData(с : TStream)

& евро & евро & евро & евро и процедура ReadData(с : TStream)

& евро & евро и защищен

& евро & евро & евро & евро и процедура в DefineProperties(filer и : TFiler) <Б>переопределить

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent) <Б>переопределить

& евро & евро и конец

& евро & евро & евро & евро







DefineProperties называется Делфи, когда он нуждается в потоке компонента. Все, что нам нужно сделать, это переопределить этот метод, и добавить свойство, используя либо TFiler.DefineProperty или TFiler.DefineBinaryProperty.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>ипроцедура на TFiler.DefineBinaryProperty(<Б>константный Название: на строку

& покупка & покупка ReadData, WriteData: TStreamProc HasData: логическое)



<Б>конструктор TBinaryComponent.Создать(AOwner: TComponent)

<Б>начать

& евро & евро <Б>наследство

& покупка & покупка FBinaryDataSize := 0

<Б>конец



<Б>процедура
на TBinaryComponent.DefineProperties(filer и: TFiler)

<Б>вар

& покупка & покупка HasData : логическое

<Б>начать

& евро & евро <Б>наследство

& покупка & покупка HasData := FBinaryDataSize <> 0

& евро & евро-Файлер.DefineBinaryProperty('Двоичные',ReadData,

& евро & евро & евро & евро WriteData, HasData )

<Б>конец



<Б>процедура
на TBinaryComponent.ReadData(с: TStream)

<Б>начать

& мочекаменная & Джон С. читать(FBinaryDataSize, оператор sizeof(Тип DWORD))

& покупка & покупка при FBinaryDataSize > 0 и тогда <Б>начать

& евро & евро & евро & евро GetMem(FBinaryData, FBinaryDataSize)

& евро & евро & евро & Джон С. читать(FBinaryData^, FBinaryDataSize)

& покупка & покупка и конец

<Б>конец



<Б>процедура
на TBinaryComponent.WriteData(с: TStream)

<Б>начать

& евро & евро <я>//это не назовешь, если FBinaryDataSize = 0



& евро & евро С. писал(FBinaryDataSize, оператор sizeof(Тип DWORD))

& фитоэстрогены & мочекаменная С. писал(FBinaryData^, FBinaryDataSize)

<Б>конец

& евро & евро & евро & евро







во-первых, мы переопределить DefineProperties. Как только мы сделали это, мы определяем двоичный свойств со значениями -



& евро & евро -Двоичные : невидимый название свойства<.бр />
& евро & евро -ReadData : процедура отвечает за чтение данных.

& евро & евро -WriteData : процедура отвечает за запись данных.

& евро & евро -HasData : если это значение false, то процедура WriteData даже не назовешь.



настойчивость

краткое описание настойчивость в того, как мы будем ссылаться на это в следующих разделах. Настойчивость-это то, что делает его возможным для Делфи для чтения и записи свойства всех его компонентов. TComponent является производным от класса называется компонент. Компонент-это просто класс, Делфи, способные оказать своим свойствам читал и писал на Делфи, которая означает, что все потомки компонент тоже есть такая же возможность<.бр />


коллекции с

как мы продвигаемся в этой статье мы рассмотрим свойства компонентов усложнения. Коллекции-это одна из самых сложных "стандарт" Делфи типы недвижимости. Если вы уроните TDBGrid на форму и посмотреть на его свойства в Инспекторе объектов, вы увидите свойство "колонки".



Столбцы-это свойство коллекции, когда вы нажимаете на кнопку [..] Вы увидите небольшое всплывающее окно. Это окно является стандартным редактор свойств для TCollection свойства (и потомки TCollection).



<ИМГ alt="колонки редактора" граница="0" срц="/howtodo/htdt/computers-internet/programming/component_writing_part_2_0.jpg" />



всякий раз, когда вы нажмите кнопку "Создать" кнопку, Вы увидите новый пункт добавлен (а TColumn пункт), нажав на этот пункт будет выбрать его в Инспекторе объектов, так что вы можете изменить его свойства / события. Как это сделать ?


<див класс='embed_block_0'> <див ИД="блок-google_admanager-1" класса="блок блок-google_admanager области-другие области-количество-1 Количество-1 блок-Без названия "> <див класс="блок-топ"> <див класс="блок-внутренний"> <див класс="содержание"> <див класс="блок-дно"> <див класс='embed_block_1'><див>
Столбцы собственность спускается от TCollection. TCollection похож на массив, который содержит список TCollectionItem по. Потому что TCollection произошел из компонент его имеет возможность транслировать этот список предметов, точно так же, TCollectionItem тоже сошел с компонент, а также может передавать свои свойства. Итак, что мы имеем массив-как элемент, способный потокового все его элементы и их свойства.



первое, что нужно сделать при создании собственной структуры на основе TCollection / TCollectionItem, чтобы определить наши CollectionItem.



<я>(см. OurCollection.па)



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TOurCollectionItem = <Б>класс(TCollectionItem)

& евро & евро и частные

& евро & евро & евро & евро FSomeValue : <Б>строка

& евро & евро и защищен

& евро & евро & евро & евро и функции в GetDisplayName : И строка <Б>переопределить

& евро & евро и общие

& евро & евро & евро & евро и процедура уступать(Источник: компонент) <Б>переопределить

& евро & евро <Б>опубликован

& евро & евро & евро & евро и свойства значение : <Б>строка

& евро & евро & евро & евро & евро & евро читать FSomeValue

& евро & евро & евро & евро & евро & евро пишите FSomeValue

& евро & евро и конец

& евро & евро & евро & евро







что мы сделали здесь, чтобы создать потомка TCollectionItem. Мы добавили свойство маркера под названием "значение", переопределяется функция GetDisplayName (изменять текст, который отображается в редакторе по умолчанию), и, наконец, переопределить метод assign для того, чтобы TOurCollectionItem быть назначен другой TOurCollectionItem. Если опустить последний шаг, то метод assign класса Коллекция не работает !



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>ипроцедура на TOurCollectionItem.Назначить(Источник: компонент)

<Б>начать

& евро & евро при Источник если TOurCollectionItem <Б>тогда

& евро & евро & евро & евро значение := TOurCollectionItem(Источник).Значение

& евро & евро и еще

& евро & евро & евро & евро <Б>наследство <я>//вызывает исключение

<Б>конец



<Б>функции
в TOurCollectionItem.GetDisplayName: <Б>строка

<Б>начать

& евро & евро результат := Формат('элемент на %D',[Индекс])

<Б>конец

& евро & евро & евро & евро







реализация TOurCollection намного сложнее, и требует, чтобы мы сделали довольно много работы.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД> TOurCollection = <Б>класс(TCollection)

& евро & евро и частные

& евро & евро & евро & евро FOwner : TComponent

& евро & евро и защищен

& евро & евро & евро & евро и функции GetOwner : Компонент <Б>переопределить

& евро & евро & евро & евро и функции метод getitem(Индекс: целое число): TOurCollectionItem

& евро & евро & евро & евро и процедура setitem класса(индекса: целое значение:

& евро & евро & евро & евро & евро & евро TOurCollectionItem)

& евро & евро & евро & евро и процедура обновление(пункт: TOurCollectionItem)

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent)



& евро & евро & евро & евро и функции на Добавить : TOurCollectionItem

& евро & евро & евро & евро и функции Вставить(Индекс: целое число): TOurCollectionItem



& евро & евро & евро & евро и свойства элементы[Индекс: целое]: TOurCollectionItem

& евро & евро & евро & евро & евро & евро читать метод getitem

& евро & евро & евро & евро & евро & евро пишите setitem класса

& евро & евро и конец

& евро & евро & евро & евро


есть




существует целый ряд пунктов, основываясь на выше объявления класса, поэтому мы начнем сверху и покрыть каждый в свою очередь.



<Б>GetOwner
является виртуальный метод введен в компонент. Это должен быть переопределен как код по умолчанию этот метод возвращает Nil. В нашей реализации мы изменим конструктор для получения только одного параметра (AOwner : TComponent). Мы храним этот параметр в FOwner, который затем передается в результате GetOwner (поэтому TComponent спускается из компонент, поэтому является допустимым типом результата).



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД><Б>конструктор TOurCollection.Создать(AOwner: TComponent)

<Б>начать

& евро & евро <Б>наследство создать(TOurCollectionItem)

& евро & евро FOwner := AOwner

<Б>конец



<Б>функции TOurCollection.GetOwner: компонент

<Б>начать

& фитоэстрогены & мочекаменная результат := FOwner

<Б>конец

& евро & евро & евро & евро







не только создать магазин хозяин (который требуется для объекта инспектор работать правильно), он также говорит, что Делфи класс наш CollectionItem можно, позвонив по телефону "унаследовал создать(TOurCollectionItem)".



<Б>метод getitem / setitem класса
, и объявляются точно так же, как они в TCollection, но вместо того, чтобы работать на TCollectionItem они работают на наших новых TOurCollectionItem класс. Они используются в нашей "предметы" собственность позже.



<Б>обновление
, и как указано выше является прямой заменой оригинала, работает на нашем новом CollectionItem класса.



<Б>Добавить / Вставить
, и оба отвечают за добавление элементов в список, они оба были заменены, чтобы возвращать объекты соответствующего класса.



наконец, "предметы" свойство введено для замены оригинальных имущества, снова так, что мы вернулись в результате TOurCollectionItem, а не TCollectionItem сэкономив нам ненужные проблемы типажей результат каждый раз.



наконец пример вживления этот тип свойства в компоненте нашей собственной.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД>TCollectionComponent = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FOurCollection : TOurCollection

& евро & евро & евро & евро и процедура в SetOurCollection(<Б>константный значение:

& евро & евро & евро & евро & евро & евро TOurCollection)

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent) <Б>переопределить

& евро & евро & евро & евро <Б>деструктор уничтожить <Б>переопределить

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в OurCollection : TOurCollection

& евро & евро & евро & евро & евро & евро читать FOurCollection

& евро & евро & евро & евро & евро & евро пишите SetOurCollection

& евро & евро и конец

& евро & евро & евро & евро


есть




это так просто. Однажды наш класс TCollection написано все тяжелая работа. Наш конструктор создает класс коллекции, деструктор уничтожает его, и SetOurCollection это.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД><Б>конструктор TCollectionComponent.Создать(AOwner: TComponent)

<Б>начать

& евро & евро <Б>наследство

& покупка & покупка FOurCollection := TOurCollection.Создать(Самовыдвижение)

<Б>конец



<Б>деструктор TCollectionComponent.Уничтожить

<Б>начать

& покупка & покупка FOurCollection.Бесплатные

и & евро & евро <Б>наследство

<Б>конец



<Б>процедура
в TCollectionComponent.SetOurCollection(

& евро & евро <Б>константный значение: TOurCollection)

<Б>начать

& покупка & покупка FOurCollection.Назначение(значение)

<Б>конец

& евро & евро & евро & евро







как уже говорилось, (Самовыдвижение) перешло к TOurCollectionItem.Создать хранится в переменной FOwner TOurCollection, который передается в результате GetOwner. Сразу отмечу еще один момент заключается в том, что в SetOurCollection мы не ставим FOurCollection := значение, как вы заменяете объект (объекты просто указатели), мы приписываем наши свойства значение.



в более поздних версиях Дельфи сделать это еще проще. Вместо того, чтобы переопределить GetOwner в наш класс, мы теперь можем вывести нашу коллекцию от TOwnedCollection вместо. TOwnedCollection является оболочкой для TCollection с этой работы для нас.



подсвойства

ранее в этой статье мы увидели, как можно создавать расширяемые собственность. Ограничение ранее техника была в том, что каждый пункт появился как логическое свойство. В следующем разделе будет показано, как создавать расширяемые свойства, которые могут содержать любой тип недвижимости<.бр />


если компонент требует имущество, которое является типом записи, это вполне может быть реализовано путем воздействия каждого из свойств отдельно. Однако, если наш компонент должен представить два или более свойств одного и того же комплекса типа нашего объекта вид инспектор вдруг становится очень сложной.



ответ заключается в создании сложной структуры (так, чтобы запись или объект) и опубликовать эту структуру в качестве имущества, когда это необходимо. Очевидная проблема заключается в том, что Делфи не знаю, как отобразить это свойство, если мы говорим ему. Создавая полномасштабный редактор свойств (с диалогами и т. д.) был бы перебор, так что, к счастью Делфи предоставил решение. Как упоминалось ранее, внутренняя потокового Делфи базируется на классе компонент. Первый шаг поэтому получить нашу сложную структуру из этого класса.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TExpandingRecord = <Б>класс(компонент)

& евро & евро и частные

& евро & евро & евро & евро FIntegerProp : число

& евро & евро & евро & евро FStringProp : <Б>строка

& евро & евро & евро & евро FCollectionProp : TOurCollection

& евро & евро & евро & евро и процедура в SetCollectionProp(<Б>константный значение:

& евро & евро & евро & евро & евро & евро TOurCollection)

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent)

& евро & евро & евро & евро <Б>деструктор уничтожить <Б>переопределить



& евро & евро & евро & евро и процедура уступать(Источник : компонент) <Б>переопределить

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в IntegerProp : Целое число

& евро & евро & евро & евро & евро & евро читать FIntegerProp

& евро & евро & евро & евро & евро & евро пишите FIntegerProp

& евро & евро & евро & евро и недвижимости на StringProp : И строка

& евро & евро & евро & евро & евро & евро читать FStringProp

& евро & евро & евро & евро & евро & евро пишите FStringProp

& фитоэстрогены & мочекаменная __








Компонент записи, часть 2


Компонент записи, часть 2 : Несколько тысяч советов, которые сделают вашу жизнь проще.


в этой статье мы рассмотрим как записать дополнительные свойства, как писать пользовательские потокового этих свойств и подсвойств.


и<р класса="step_content "><границы таблицы="1"><тр><тд>

эта статья первоначально появилась в Delphi Разработчик



Авторское право шедевре издание, Инк. Все права защищены.
<р класса="step_content ">





<и>эта статья является частью двух из трех частей статьи на компоненты. Часть первая охватывает основные создания компонентов, часть вторая будет охватывать как написать дополнительные свойства, как писать пользовательские потокового этих свойств и подсвойств. Заключительная часть будет охватывать собственность / редакторы компонент, как написать специальную редакцию для компонент / свойство, и как пишут "скрытые" компоненты.



довольно часто приходится писать компоненты, которые выполняют более продвинутыми функциями. Эти компоненты часто приходится либо ссылаться на другие компоненты, пользовательские данные свойства форматы, или есть свойство, которое имеет список значений, а не одно значение. В этой части мы рассмотрим различные примеры, охватывающие эти самые субъекты, начиная с самых простых.



компонент ссылается на то,

некоторые компоненты должны ссылаться на другие компоненты. Например названия имеет "FocusControl" собственность. Когда вы включаете амперсанд в "подпись" собственность это подчеркивает следующая буква (...Привет будет Привет), нажав сочетание клавиш Alt-H на клавиатуре будет инициировать событие в вашей этикетке. Если "FocusControl" собственность был установлен фокус будет передан в управление указано.



и есть такое свойство в свой собственный компонент достаточно прост. Все, что вам сделать, это объявить новое свойство, и установить Тип помещения до самого низкого базового класса, что она может принять (TWinControl позволит любой потомок TWinControl, чтобы быть использованы), но есть последствия.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TSimpleExample = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FFocusControl: TWinControl

& евро & евро и защищен

& евро & евро & евро & евро и процедура в SetFocusControl(<Б>константный значение: TWinControl) <Б>виртуальные

& евро & евро и общие

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в FocusControl: TWinControl читать FFocusControl писать SetFocusControl

& евро & евро и конец



<Б>процедура
на TSimpleExample.SetFocusControl(<Б>константный значение: TWinControl)

<Б>начать

& евро & евро FFocusControl := Значение

<Б>конец

& евро & евро & евро & евро







бери выше примере. Это довольно простой пример (отсюда и название компонента) как написать компонент, который ссылается на другой компонент. Если у вас есть такое свойство в компонент Инспекторе объектов появится комбобокс со списком компонентов, которые соответствуют критериям (все компоненты произошли от TWinControl).



наш компонент, может сделать что-то вроде



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>ипроцедура на TSimpleExample.Сделать

<Б>начать

& покупка & покупка при (присвоенный(FocusControl)) и

& евро & евро & евро & евро & евро (FocusControl.Включена) <Б>тогда

& евро & евро & евро & евро FocusControl.Метода setfocus

<Б>конец

& евро & евро & евро & евро







сначала мы проверяем, если собственность была присвоена, если да то установить фокус на него, но бывают ситуации, когда собственность еще не Nil компонент, на который он указывает уже не действует. Это часто происходит, когда свойство ссылается на компонент, который был разрушен.



к счастью, Delphi дает нам решение. Всякий раз, когда компонент разрушается она сообщает своему владельцу (наша форма), что он разрушается. На данный момент каждый компонент принадлежит той же формы, это тоже будет сообщено об этом событии. Чтобы поймать это событие, мы должны переопределить стандартный метод TComponent называется "уведомление".



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TSimpleExample = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FFocusControl: TWinControl

& евро & евро и защищен

& евро & евро & евро & евро и процедура уведомление(как acomponent: TComponent

& евро & евро & евро & евро & евро & евро операция: TOperation) <Б>переопределить

& евро & евро & евро & евро и процедура в SetFocusControl(<Б>константный значение: TWinControl) <Б>виртуальные

& евро & евро и общие

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в FocusControl: TWinControl читать FFocusControl писать SetFocusControl

& евро & евро и конец



<Б>процедура
на TSimpleExample.SetFocusControl(<Б>константный значение: TWinControl)

<Б>начать

& евро & евро FFocusControl := значение

<Б>конец



<Б>процедура
, и TSimpleExample.Уведомление(как acomponent :TComponent

& евро & евро операция : TOperation)

<Б>начать

& евро & евро <Б>наследство <я>//никогда не забывайте называть это

& покупка & покупка при (операция = opRemove) и

& евро & евро & евро & евро & евро (производства = FocusControl) и тогда

& евро & евро & евро & евро FFocusControl := <Б>Нил

<Б>конец

& евро & евро & евро & евро & евро & евро







теперь, когда наш компонент разрушается, мы уведомлены, в какой момент мы можем установить нашу ссылку на Нил. Заметим, однако, что я сказал <я>"каждый компонент принадлежит той же форме уведомляется об этом событии тоже"



это знакомит нас с еще одной проблемой. Мы не только уведомление о том, что компонент разрушается, если он принадлежит той же форме. Можно иметь свою точку собственность на компоненты на другие формы (или даже без рук вообще), и когда эти компоненты будут уничтожены, мы не будет. Но опять-таки это решение.



TComponent вводит так называемый метод "FreeNotification". Цель FreeNotification рассказать компонент (FocusControl), чтобы держать нас в виду, когда он будет уничтожен.



реализация будет выглядеть следующим образом



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TSimpleExample = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FFocusControl: TWinControl

& евро & евро и защищен

& евро & евро & евро & евро и процедура уведомление(как acomponent: TComponent

& евро & евро & евро & евро & евро & евро операция: TOperation) <Б>переопределить

& евро & евро & евро & евро и процедура в SetFocusControl(<Б>константный значение: TWinControl) <Б>виртуальные

& евро & евро и общие

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в FocusControl: TWinControl читать FFocusControl писать SetFocusControl

& евро & евро и конец



<Б>процедура
на TSimpleExample.SetFocusControl(<Б>константный значение: TWinControl)

<Б>начать

& покупка & покупка при значение <> FFocusControl <б>тогда

& евро & евро <б>начать

& евро & евро & евро & евро при назначена(FFocusControl) <Б>тогда

& евро & евро & евро & евро & евро & евро FFocusControl.RemoveFreeNotification(Самовыдвижение)



& евро & евро & евро & евро FFocusControl := значение



& евро & евро & евро & евро при назначена(FFocusControl) и тогда

& евро & евро & евро & евро & евро & евро FFocusControl.FreeNotification(Самовыдвижение)

& фитоэстрогены & мочекаменная конце

<Б>конец



<Б>процедура
на TSimpleExample.Уведомление(как acomponent: TComponent

& евро & евро операция : TOperation)

<Б>начать

& покупка & покупка при (операция = opRemove) и

& евро & евро & евро & евро & евро (производства = FocusControl) <Б>тогда

& евро & евро & евро & евро FFocusControl := <Б>Нил

<Б>конец

& евро & евро & евро & евро







При установке наши свойство FocusControl мы сначала проверяем, если он уже установлен компонент. Если он уже установлен, нам нужно рассказать исходного компонента, что нам больше не нужно знать, когда он будет уничтожен. Как только наша собственность была установлена на новое значение сообщаем новый компонент, который мы требуем уведомление, когда он освобождается. Остальную часть кода остается таким же, как указанный компонент до сих пор называет наш метод уведомления.



наборы

этот раздел действительно довольно простая и не займет много времени, чтобы покрыть. Я не сомневаюсь, что вы уже знакомы с созданием собственных порядковых типов.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TComponentOption = (coDrawLines,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро coDrawSolid,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная coDrawBackground)

& евро & евро & евро & евро







свойства этого типа будет показывать выпадающий список с перечнем всех возможных значений, но иногда необходимо установить совокупность многих (или всех) из этих значений. Это были наборы приходят в игру



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& евро & евро TComponentOption = (coDrawLines,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро coDrawSolid,

& евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & евро & мочекаменная coDrawBackground)

& покупка & покупка TComponentOptions = В наборе на TComponentOption

& евро & евро & евро & евро







издание свойства Тип TComponentOptions повлечет за собой [ ] появляется рядом с именем свойства. Когда вы нажмите, чтобы развернуть свойство вы увидите список вариантов. Для каждого элемента в TComponentOption вы увидите логическое свойство, вы можете включить / исключить элементы из набора, установив для него значение True или false.



это просто, чтобы проверить / изменить элементы в наборе из нашего компонента вроде так.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД>при coDrawLines В OurComponentOptions

& евро & евро и тогда DrawTheLines

& евро & евро & евро & евро







или



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТD>ипроцедура на TSomeComponent.SetOurComponentOptions(<Б>константный значение: TComponentOptions)

<Б>начать

& евро & евро при (coDrawSolid в значение) и

& евро & евро (coDrawBackground в стоимость) <Б>тогда

& евро & евро & евро & евро {вызвать исключение}



& покупка & покупка FOurComponentOptions := Значение

& покупка & покупка недействительным

<Б>конец

& евро & евро & евро & евро







Двоичные свойства

Иногда надо писать свой собственный потоковый процедуры для чтения и записи пользовательских типов свойств (это как Делфи читает / пишет Top и left свойства, не видимые компоненты, без публикации этих свойств в инспекторе объектов)<.бр />


например, я однажды написал компонент для построения формы на основе растрового изображения. Мой код на время для преобразования растрового изображения в окно-регион был крайне медленным и не может быть никакой пользы во время выполнения. Мое решение для преобразования данных во время разработки, и поток двоичных данных в результате преобразования. Чтобы создать двоичный свойства в три этапа.



1. Написать метод для записи данных.

2. Написать метод для чтения данных.

3. Скажите Делфи, что у нас есть двоичное свойство, и передать наши методы чтения и записи.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TBinaryComponent = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FBinaryData : указатель

& евро & евро & евро & евро FBinaryDataSize : DWORD с

& евро & евро & евро & евро и процедура, и WriteData(с : TStream)

& евро & евро & евро & евро и процедура ReadData(с : TStream)

& евро & евро и защищен

& евро & евро & евро & евро и процедура в DefineProperties(filer и : TFiler) <Б>переопределить

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent) <Б>переопределить

& евро & евро и конец

& евро & евро & евро & евро







DefineProperties называется Делфи, когда он нуждается в потоке компонента. Все, что нам нужно сделать, это переопределить этот метод, и добавить свойство, используя либо TFiler.DefineProperty или TFiler.DefineBinaryProperty.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>ипроцедура на TFiler.DefineBinaryProperty(<Б>константный Название: на строку

& покупка & покупка ReadData, WriteData: TStreamProc HasData: логическое)



<Б>конструктор TBinaryComponent.Создать(AOwner: TComponent)

<Б>начать

& евро & евро <Б>наследство

& покупка & покупка FBinaryDataSize := 0

<Б>конец



<Б>процедура
на TBinaryComponent.DefineProperties(filer и: TFiler)

<Б>вар

& покупка & покупка HasData : логическое

<Б>начать

& евро & евро <Б>наследство

& покупка & покупка HasData := FBinaryDataSize <> 0

& евро & евро-Файлер.DefineBinaryProperty('Двоичные',ReadData,

& евро & евро & евро & евро WriteData, HasData )

<Б>конец



<Б>процедура
на TBinaryComponent.ReadData(с: TStream)

<Б>начать

& мочекаменная & Джон С. читать(FBinaryDataSize, оператор sizeof(Тип DWORD))

& покупка & покупка при FBinaryDataSize > 0 и тогда <Б>начать

& евро & евро & евро & евро GetMem(FBinaryData, FBinaryDataSize)

& евро & евро & евро & Джон С. читать(FBinaryData^, FBinaryDataSize)

& покупка & покупка и конец

<Б>конец



<Б>процедура
на TBinaryComponent.WriteData(с: TStream)

<Б>начать

& евро & евро <я>//это не назовешь, если FBinaryDataSize = 0



& евро & евро С. писал(FBinaryDataSize, оператор sizeof(Тип DWORD))

& фитоэстрогены & мочекаменная С. писал(FBinaryData^, FBinaryDataSize)

<Б>конец

& евро & евро & евро & евро







во-первых, мы переопределить DefineProperties. Как только мы сделали это, мы определяем двоичный свойств со значениями -



& евро & евро -Двоичные : невидимый название свойства<.бр />
& евро & евро -ReadData : процедура отвечает за чтение данных.

& евро & евро -WriteData : процедура отвечает за запись данных.

& евро & евро -HasData : если это значение false, то процедура WriteData даже не назовешь.



настойчивость

краткое описание настойчивость в того, как мы будем ссылаться на это в следующих разделах. Настойчивость-это то, что делает его возможным для Делфи для чтения и записи свойства всех его компонентов. TComponent является производным от класса называется компонент. Компонент-это просто класс, Делфи, способные оказать своим свойствам читал и писал на Делфи, которая означает, что все потомки компонент тоже есть такая же возможность<.бр />


коллекции с

как мы продвигаемся в этой статье мы рассмотрим свойства компонентов усложнения. Коллекции-это одна из самых сложных "стандарт" Делфи типы недвижимости. Если вы уроните TDBGrid на форму и посмотреть на его свойства в Инспекторе объектов, вы увидите свойство "колонки".



Столбцы-это свойство коллекции, когда вы нажимаете на кнопку [..] Вы увидите небольшое всплывающее окно. Это окно является стандартным редактор свойств для TCollection свойства (и потомки TCollection).



<ИМГ alt="колонки редактора" граница="0" срц="/howtodo/htdt/computers-internet/programming/component_writing_part_2_0.jpg" />



всякий раз, когда вы нажмите кнопку "Создать" кнопку, Вы увидите новый пункт добавлен (а TColumn пункт), нажав на этот пункт будет выбрать его в Инспекторе объектов, так что вы можете изменить его свойства / события. Как это сделать ?


<див класс='embed_block_0'> <див ИД="блок-google_admanager-1" класса="блок блок-google_admanager области-другие области-количество-1 Количество-1 блок-Без названия "> <див класс="блок-топ"> <див класс="блок-внутренний"> <див класс="содержание"> <див класс="блок-дно"> <див класс='embed_block_1'><див>
Столбцы собственность спускается от TCollection. TCollection похож на массив, который содержит список TCollectionItem по. Потому что TCollection произошел из компонент его имеет возможность транслировать этот список предметов, точно так же, TCollectionItem тоже сошел с компонент, а также может передавать свои свойства. Итак, что мы имеем массив-как элемент, способный потокового все его элементы и их свойства.



первое, что нужно сделать при создании собственной структуры на основе TCollection / TCollectionItem, чтобы определить наши CollectionItem.



<я>(см. OurCollection.па)



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TOurCollectionItem = <Б>класс(TCollectionItem)

& евро & евро и частные

& евро & евро & евро & евро FSomeValue : <Б>строка

& евро & евро и защищен

& евро & евро & евро & евро и функции в GetDisplayName : И строка <Б>переопределить

& евро & евро и общие

& евро & евро & евро & евро и процедура уступать(Источник: компонент) <Б>переопределить

& евро & евро <Б>опубликован

& евро & евро & евро & евро и свойства значение : <Б>строка

& евро & евро & евро & евро & евро & евро читать FSomeValue

& евро & евро & евро & евро & евро & евро пишите FSomeValue

& евро & евро и конец

& евро & евро & евро & евро







что мы сделали здесь, чтобы создать потомка TCollectionItem. Мы добавили свойство маркера под названием "значение", переопределяется функция GetDisplayName (изменять текст, который отображается в редакторе по умолчанию), и, наконец, переопределить метод assign для того, чтобы TOurCollectionItem быть назначен другой TOurCollectionItem. Если опустить последний шаг, то метод assign класса Коллекция не работает !



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>ипроцедура на TOurCollectionItem.Назначить(Источник: компонент)

<Б>начать

& евро & евро при Источник если TOurCollectionItem <Б>тогда

& евро & евро & евро & евро значение := TOurCollectionItem(Источник).Значение

& евро & евро и еще

& евро & евро & евро & евро <Б>наследство <я>//вызывает исключение

<Б>конец



<Б>функции
в TOurCollectionItem.GetDisplayName: <Б>строка

<Б>начать

& евро & евро результат := Формат('элемент на %D',[Индекс])

<Б>конец

& евро & евро & евро & евро







реализация TOurCollection намного сложнее, и требует, чтобы мы сделали довольно много работы.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД> TOurCollection = <Б>класс(TCollection)

& евро & евро и частные

& евро & евро & евро & евро FOwner : TComponent

& евро & евро и защищен

& евро & евро & евро & евро и функции GetOwner : Компонент <Б>переопределить

& евро & евро & евро & евро и функции метод getitem(Индекс: целое число): TOurCollectionItem

& евро & евро & евро & евро и процедура setitem класса(индекса: целое значение:

& евро & евро & евро & евро & евро & евро TOurCollectionItem)

& евро & евро & евро & евро и процедура обновление(пункт: TOurCollectionItem)

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent)



& евро & евро & евро & евро и функции на Добавить : TOurCollectionItem

& евро & евро & евро & евро и функции Вставить(Индекс: целое число): TOurCollectionItem



& евро & евро & евро & евро и свойства элементы[Индекс: целое]: TOurCollectionItem

& евро & евро & евро & евро & евро & евро читать метод getitem

& евро & евро & евро & евро & евро & евро пишите setitem класса

& евро & евро и конец

& евро & евро & евро & евро


есть




существует целый ряд пунктов, основываясь на выше объявления класса, поэтому мы начнем сверху и покрыть каждый в свою очередь.



<Б>GetOwner
является виртуальный метод введен в компонент. Это должен быть переопределен как код по умолчанию этот метод возвращает Nil. В нашей реализации мы изменим конструктор для получения только одного параметра (AOwner : TComponent). Мы храним этот параметр в FOwner, который затем передается в результате GetOwner (поэтому TComponent спускается из компонент, поэтому является допустимым типом результата).



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД><Б>конструктор TOurCollection.Создать(AOwner: TComponent)

<Б>начать

& евро & евро <Б>наследство создать(TOurCollectionItem)

& евро & евро FOwner := AOwner

<Б>конец



<Б>функции TOurCollection.GetOwner: компонент

<Б>начать

& фитоэстрогены & мочекаменная результат := FOwner

<Б>конец

& евро & евро & евро & евро







не только создать магазин хозяин (который требуется для объекта инспектор работать правильно), он также говорит, что Делфи класс наш CollectionItem можно, позвонив по телефону "унаследовал создать(TOurCollectionItem)".



<Б>метод getitem / setitem класса
, и объявляются точно так же, как они в TCollection, но вместо того, чтобы работать на TCollectionItem они работают на наших новых TOurCollectionItem класс. Они используются в нашей "предметы" собственность позже.



<Б>обновление
, и как указано выше является прямой заменой оригинала, работает на нашем новом CollectionItem класса.



<Б>Добавить / Вставить
, и оба отвечают за добавление элементов в список, они оба были заменены, чтобы возвращать объекты соответствующего класса.



наконец, "предметы" свойство введено для замены оригинальных имущества, снова так, что мы вернулись в результате TOurCollectionItem, а не TCollectionItem сэкономив нам ненужные проблемы типажей результат каждый раз.



наконец пример вживления этот тип свойства в компоненте нашей собственной.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД>TCollectionComponent = <Б>класс(TComponent)

& евро & евро и частные

& евро & евро & евро & евро FOurCollection : TOurCollection

& евро & евро & евро & евро и процедура в SetOurCollection(<Б>константный значение:

& евро & евро & евро & евро & евро & евро TOurCollection)

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent) <Б>переопределить

& евро & евро & евро & евро <Б>деструктор уничтожить <Б>переопределить

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в OurCollection : TOurCollection

& евро & евро & евро & евро & евро & евро читать FOurCollection

& евро & евро & евро & евро & евро & евро пишите SetOurCollection

& евро & евро и конец

& евро & евро & евро & евро


есть




это так просто. Однажды наш класс TCollection написано все тяжелая работа. Наш конструктор создает класс коллекции, деструктор уничтожает его, и SetOurCollection это.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <ТД><Б>конструктор TCollectionComponent.Создать(AOwner: TComponent)

<Б>начать

& евро & евро <Б>наследство

& покупка & покупка FOurCollection := TOurCollection.Создать(Самовыдвижение)

<Б>конец



<Б>деструктор TCollectionComponent.Уничтожить

<Б>начать

& покупка & покупка FOurCollection.Бесплатные

и & евро & евро <Б>наследство

<Б>конец



<Б>процедура
в TCollectionComponent.SetOurCollection(

& евро & евро <Б>константный значение: TOurCollection)

<Б>начать

& покупка & покупка FOurCollection.Назначение(значение)

<Б>конец

& евро & евро & евро & евро







как уже говорилось, (Самовыдвижение) перешло к TOurCollectionItem.Создать хранится в переменной FOwner TOurCollection, который передается в результате GetOwner. Сразу отмечу еще один момент заключается в том, что в SetOurCollection мы не ставим FOurCollection := значение, как вы заменяете объект (объекты просто указатели), мы приписываем наши свойства значение.



в более поздних версиях Дельфи сделать это еще проще. Вместо того, чтобы переопределить GetOwner в наш класс, мы теперь можем вывести нашу коллекцию от TOwnedCollection вместо. TOwnedCollection является оболочкой для TCollection с этой работы для нас.



подсвойства

ранее в этой статье мы увидели, как можно создавать расширяемые собственность. Ограничение ранее техника была в том, что каждый пункт появился как логическое свойство. В следующем разделе будет показано, как создавать расширяемые свойства, которые могут содержать любой тип недвижимости<.бр />


если компонент требует имущество, которое является типом записи, это вполне может быть реализовано путем воздействия каждого из свойств отдельно. Однако, если наш компонент должен представить два или более свойств одного и того же комплекса типа нашего объекта вид инспектор вдруг становится очень сложной.



ответ заключается в создании сложной структуры (так, чтобы запись или объект) и опубликовать эту структуру в качестве имущества, когда это необходимо. Очевидная проблема заключается в том, что Делфи не знаю, как отобразить это свойство, если мы говорим ему. Создавая полномасштабный редактор свойств (с диалогами и т. д.) был бы перебор, так что, к счастью Делфи предоставил решение. Как упоминалось ранее, внутренняя потокового Делфи базируется на классе компонент. Первый шаг поэтому получить нашу сложную структуру из этого класса.



<стол для bgcolor="#ffffcc" границы="1" Ширина="100%">

<ТР>

& евро & евро & евро & евро <тд>иТип

& покупка & покупка TExpandingRecord = <Б>класс(компонент)

& евро & евро и частные

& евро & евро & евро & евро FIntegerProp : число

& евро & евро & евро & евро FStringProp : <Б>строка

& евро & евро & евро & евро FCollectionProp : TOurCollection

& евро & евро & евро & евро и процедура в SetCollectionProp(<Б>константный значение:

& евро & евро & евро & евро & евро & евро TOurCollection)

& евро & евро и общие

& евро & евро & евро & евро <Б>конструктор создать(AOwner : TComponent)

& евро & евро & евро & евро <Б>деструктор уничтожить <Б>переопределить



& евро & евро & евро & евро и процедура уступать(Источник : компонент) <Б>переопределить

& евро & евро <Б>опубликован

& евро & евро & евро & евро и недвижимости в IntegerProp : Целое число

& евро & евро & евро & евро & евро & евро читать FIntegerProp

& евро & евро & евро & евро & евро & евро пишите FIntegerProp

& евро & евро & евро & евро и недвижимости на StringProp : И строка

& евро & евро & евро & евро & евро & евро читать FStringProp

& евро & евро & евро & евро & евро & евро пишите FStringProp

& фитоэстрогены & мочекаменная __

Компонент записи, часть 2

Компонент записи, часть 2 : Несколько тысяч советов, которые сделают вашу жизнь проще.
рекомендовать друзьям
  • gplus
  • pinterest

Комментарий

Оставить комментарий

Оценивать