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

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


первый в серии из трех частей, охватывающих компонента письменной форме в Delphi.


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

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



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





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



первые две вещи, спросите себя, почему вы должны использовать компонент письменной форме, и когда вам нужно написать компонент. Первый вопрос легко ответить, на самом деле, он имеет много ответов.
и<р класса="step_content ">


  • простота в использовании: Инкапсулированный код означает, что вы можете просто удалить один и тот же компонент на различных формах снова и снова без написания единой строчки кода.

  • отладки: централизованный код позволяет легко восстановить все приложение (или набор приложений), фиксируя ошибки в одном компоненте, и перекомпиляции.

  • деньги: есть много компаний, которые с радостью платят за возможность не изобретать колесо.

  • В
<Р класса="step_content ">

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



как компоненты создаются в

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



(Нажмите для полного просмотра)



Нажмите, чтобы посмотреть в полный размер



В случае метода а и метода Б предполагаю, что компонент в вопрос Тметь.

<стол для bgcolor="#808080" граница="0" cellpadding="2" cellspacing="1">

<ТР>

& евро & евро & евро & евро <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>способ

& евро & евро & евро & мочекаменная <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>решение


<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">аи<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от Тметь<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">Би<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от TCustomMemo<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">си<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от TCustomControl<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">ди<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от TGraphicControl<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">Е<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">наследовать от TComponentи<класс p="step_content ">

<р класса="step_content ">

<р класса="step_content ">



это может показаться немного сложным, поэтому позвольте мне объяснить процесс.



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



<Б>: иногда требуется не только чтобы добавить функциональности, но вы должны удалить его в то же время. Стандартная практика при написании компонента является первым, чтобы написать компонент TCustomXXXXX, где все свойства, события и методы, объявленные в секции protected компонента. Фактический компонент производный от этого базового класса. Таким образом, хитрость не скрывают функциональность, но, чтобы получить свой компонент от "заказной" версии компонента и публикуют только свойства, которые вы хотите сохранить (эффективного удаления нежелательных свойств / событий)<.бр />


<Б>С: любой компонент, который должен получить фокус нужен дескриптор окна. TWinControl, где эта ручка впервые. TCustomControl-это просто TWinControl с собственного имущества холст.



<Б>Д: TGraphicControl не имеет оконной ручки и, следовательно, не может получать фокус. Компоненты, такие как названия являются производными от этого базового класса.



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



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



<ИМГ alt="Новый компонент" граница="0" срц='/howtodo/htdt/computers-internet/programming/component_writing_part_1_1.jpg' />



<стол для bgcolor="#808080" граница="0" cellpadding="2" cellspacing="1">
<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF"><б>Тип предка<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">это базовый Тип, что мы должны спуститься с<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF"><Б>класса<класс p="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">это класс имя нашего нового компонента

(начинаться с буквы "Т")и<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF"><б>палитра страницыи<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">это который на вкладке палитры компонентов вы хотите, чтобы ваш

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

В Делфи, что вы хотите новую вкладку создали. и<р класса="step_content ">

<р класса="step_content ">



написание кода

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



прежде всего, выберите компонент в главном меню Delphi и затем выберите Новый компонент. Введите TComponent в качестве "предка" и TFirstComponent в качестве имени компонента. Далее нажимаем кнопку "установить".



В этот момент вы можете либо установить новый компонент в существующий пакет (пакет содержит набор компонентов) или установить новый пакет. Нажмите кнопку "в новой упаковке" и нажмите кнопку "искать кнопку".



<ИМГ alt="Установка компонентов" граница="0" срц='/howtodo/htdt/computers-internet/programming/component_writing_part_1_2.jpg' />



как только вы выбрали путь и имя для вашего нового пакета и введено описание нажмите кнопку "ОК". В следующем диалоговом окне (с просьбой, если вы хотите перекомпилировать пакет) нажмите кнопку "Да". Как только пакет будет скомпилирован и установлен, сохранить свой пакет и блок.



В данный момент мы уточнили наш базовый класс, а также Наше новое имя класса. Мы создали новый пакет для хранения компонентов и были представлены с каркасной конструкцией класса по Делфи.



если вы посмотрите на исходный код в Delphi вы увидите Частный, защищенный, общественных и опубликованы разделы.



заключение

Инкапсуляция-это простая концепция, но чрезвычайно важным компонентом письменной форме. Инкапсуляция реализуется с использованием четырех зарезервированных слов: <я>Частная, <Я>защищены, <Я>общественные, и <я>опубликован, Вы увидите Делфи и включил эти разделы автоматически в исходный код нового компонента.

<стол для bgcolor="#808080" граница="0" cellpadding="2" cellspacing="1">

<ТР>

& евро & евро & евро & евро <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>разделе

& евро & евро & евро & мочекаменная <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>доступность



<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">Частная

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">методы, свойства и события, описанные в этом разделе только

доступ к устройству компонент содержится в

внутри. Компоненты в одном корпусе может открыть личные вещи каждого и

и другие.

<р класса="step_content ">

<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">защищенные

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">методы, Свойства и события, описанные в этом разделе, также как

в доступной для любого класс происходит от этого класса.

<р класса="step_content ">

<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">общественного

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">методы, Свойства и события, описанные здесь доступны из любой точки мира.и<р класса="step_content ">

<р класса="step_content ">

<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">опубликован

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">в этом разделе можно объявить свойства / события, которые появятся в течение

и инспектор объектов. Эти параметры проектирования значения

которые сохраняются в вашем проекте. (Не все типы

поддержал, массивы, например, нет).и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">





Начинаем писать наш компонент в

В Делфи теперь должен знать все о наших новых компонент. Введите следующий код в исходный код компонента.

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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>Частная

& евро & евро <я><шрифта цвет="синий">{ частные объявления }

& покупка & покупка FStartTime,

& покупка & покупка FStopTime :DWORD с

<Б>защищены

& евро & евро <я><шрифта цвет="синий">{ защищенный объявления }

& евро & евро и функции в GetElapsedTime: строку <Б>виртуальные

<Б>общественные

& евро & евро <я><шрифта цвет="синий">{ публичных заявлений }

& евро & евро и процедура в начало <Б>виртуальные

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



& евро & евро и недвижимости, и начала:Типа DWORD и ознакомиться на FStartTime

& евро & евро и недвижимости, и StopTime:DWORD С и ознакомиться в FStopTime

& евро & евро и недвижимости на истекшее время: строки и ознакомиться в GetElapsedTime

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

& евро & евро <я><шрифта цвет="синий">{ опубликованные объявления }

<Б>конец

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

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



что мы сделали здесь добавляется двумя переменными FStartTime и FStopTime (это стандартная предшествовать переменным имена с буквой F). Существует два метода для контроля этих переменных, запуск и остановка. Мы добавили функцию GetElapsedTime, который вернется FStopTime - FStartTime как струна. Наконец, мы добавили три свойства только для чтения.



нажмите Shift вместо Ctrl-C и Delphi автоматически завершить код для вашего класса (или щелкните правой кнопкой мыши и выбираем "завершить классе на курсор"). Далее введите следующий код для каждого соответствующего метода.



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

<ТР>

& евро & евро & евро & евро <ТД>

<и><шрифта цвет="синий">{ TFirstComponent }

<Б>функции в TFirstComponent.GetElapsedTime: строку

<Б>начать

& евро & евро результат := IntToStr(FStopTime - FStartTime)

<Б>конец



<Б>процедура в TFirstComponent.Старт

<Б>начать

& покупка & покупка FStartTime := GetTickCount

<Б>конец



<Б>процедура, и TFirstComponent.Остановить

<Б>начать

& покупка & покупка FStopTime := GetTickCount

<Б>конец



<Б>конец.

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



Тест-драйв

спасти ваше устройство, и открыть пакет (файл, открыть проект из меню, и выберите "Делфи" пакет для типа файла), после того, как ваш пакет открыт нажмите кнопку "компилировать" кнопку. Вы также можете открыть свой пакет, выбрав компонент из главном меню, а затем установить пакеты. Выберите пакет и нажмите кнопку "Редактировать".



теперь вы можете оставить TFirstComponent на форму, на самом деле, вы можете оставить столько, сколько вам нравится. Добавить две кнопки (btnStart и btnStop) и добавьте следующий код в вашу форму, а затем запустить тест приложение.



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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>процедура TForm1.btnStartClick(Отправитель: TObject)

<Б>начать

& покупка & покупка FirstComponent1.Старт

<Б>конец



<Б>процедура TForm1.btnStopClick(Отправитель: TObject)

<Б>начать

& покупка & покупка FirstComponent1.Остановить

и & фитоэстрогены & мочекаменная надпись := FirstComponent1.Истекшее время

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



при нажатии на кнопку "Пуск" будет отмечать время начала (по WinAPI GetTickCount-это команда, которая возвращает количество миллисекунд с момента запуска Windows).



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


виртуальные, динамические, абстрактные и Переопределить в

Вы, наверное, заметили в виртуальные декларацию после запуска, остановки и GetElapsedTime. Следующее упражнение будет объяснить их использует.



создать новый компонент, извлечь этот компонент из TFirstComponent (имя его TSecondComponent) и установить его.


<див класс='embed_block_0'> <див ИД="блок-google_admanager-1" класса="блок блок-google_admanager области-другие области-количество-1 Количество-1 блок-Без названия "> <див класс="блок-топ"> <див класс="блок-внутренний"> <див класс="содержание"> <див класс="блок-дно"> <див класс='embed_block_1'><див>
виртуальные и динамические идентификаторы компонент писателя, рассказывающие о Дельфи, метод может быть заменен потомку класса. Если мы Переопределить метод в классе, наш новый код будет выполняться вместо оригинального кода<.бр />


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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>защищены

& евро & евро <я><шрифта цвет="синий">{ Защищен объявления }

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

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



затем мы реализуем приведенный выше код следующим образом.



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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>функции
на TSecondComponent.GetElapsedTime: строку

<Б>вар

& евро & евро с: строка

<Б>начать

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

& евро & евро результат := Ы <шрифта цвет="синий">' миллисекунд или '

& евро & евро & евро & евро Формат(<шрифта цвет="синий">'%.2ф секунд,

& евро & евро & евро & евро & евро & евро [(StopTime - параметр starttime) / 1000])

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



наш новый код теперь называется замена первоначального GetElapsedTime, даже вызовы реализованы в TFirstComponent в GetElapsed время звоните прямо сейчас наш новый код (если мы создали экземпляр TSecondComponent то есть). Исходный код вызывается за счет использования унаследовал команду.



Примечание : если Вы не "перекроет" базовый метод (потому что база не была заявлена как виртуальные или потому что вы забыли). TSecondComponent буду называть ваш новый код, а код, встроенный в TFirstComponent будет по-прежнему продолжают называть исходный код TFirstComponent.



абстрактный идентификатор рассказывает Делфи не ожидать какой-либо код для именованного метода. Вы не должны создать экземпляр объекта с помощью абстрактных методов (таких как TStrings). Стандартная практика, чтобы создать потомок такого класса и переопределить все абстрактные методы (например, TStringList делает).



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



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



создать новый компонент, спускаются из TSecondComponent и имя его TThirdComponent. Сохранить агрегат, установить ваш компонент, и добавьте следующий код.

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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>Тип

& евро & евро такт = (stStarted, stStopped)

& покупка & покупка TStateChangeEvent = и процедура Отправитель : TObject состояние : такт) и для <Б>объект



& евро & евро TThirdComponent = <Б>класс(TSecondComponent)

& покупка & покупка и частные

& евро & евро & евро & евро <я><шрифта цвет="синий">{ частные объявления }

& евро & евро & евро & евро FState: такт

& евро & евро & евро & евро FOnStart,

& евро & евро & евро & евро FOnStop: TNotifyEvent

& евро & евро & евро & евро FOnStateChange: TStateChangeEvent

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

& евро & евро & евро & евро <я><шрифта цвет="синий">{ защищенный объявления }

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

& евро & евро & евро & евро <я><шрифта цвет="синий">{ публичных заявлений }

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

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

& евро & евро & евро & евро и процедура в начало <Б>переопределить

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

& евро & евро & евро & евро и недвижимости, его состояние: такт и ознакомиться в FState

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

& евро & евро & евро & евро <я><шрифта цвет="синий">{ опубликованные объявления }

& евро & евро & евро & евро и недвижимости в функции onstart: TNotifyEvent и ознакомиться в FOnStart <б>пишут FOnStart

& евро & евро & евро & евро и недвижимости в OnStateChange: TStateChangeEvent и ознакомиться в FOnStateChange

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

& евро & евро & евро & евро и недвижимости в то onstop: TNotifyEvent и ознакомиться в FOnStop <б>пишут FOnStop

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

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

и<р класса="step_content "><р класса="step_content ">



события не просто процедуры или функции (редко), которые относятся к классу (отсюда и "объекта" п. вы видите в TStateChangeEvent). Например, TNotifyEvent стандартная Тип события реализованы на Delphi, которая просто передает объект, который инициировал событие, это всегда хорошо, чтобы отправить "я" (Отправитель : TObject) в качестве первого параметра в любом случае одно и то же событие код может быть использован для нескольких компонентов.



TNotifyEvent определяется как

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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>Тип

& фитоэстрогены & мочекаменная TNotifyEvent = и процедура (Отправитель: TObject) <Б>объекта

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



чтобы вызвать событие из компонент просто при проверке, если событие было назначено и, если да, то называя его. Я переопределил методы запуска и остановки TSecondComponent для того, чтобы вызвать эти события, так как<.бр />


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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>процедура
на TThirdComponent.Старт

<Б>начать

& евро & евро <Б>наследство <я><шрифта цвет="синий">//это требует TSecondComponent.Старт

& покупка & покупка FState := stStarted

& евро & евро при, и назначена(начала) и тут в функции onstart(Самовыдвижение)

& евро & евро при назначена(OnStateChange) и тут в OnStateChange(личности, государства)

<Б>конец



<Б>процедура TThirdComponent.Остановить

<Б>начать

& евро & евро <Б>наследство <я><шрифта цвет="синий">//это требует TSecondComponent.Стоп

& покупка & покупка FState := stStopped

& евро & евро при назначены(то onstop) и тут в то onstop(Самовыдвижение)

& евро & евро при назначена(OnStateChange) и тут в OnStateChange(личности, государства)

<Б>конец



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

<Б>начать

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

& евро & евро <я><шрифта цвет="синий">//это ты инициализации свойства, и создать

& евро & евро <я><шрифта цвет="синий">//и объектов компонента могут использовать внутренне

& покупка & покупка FState := stStopped

<Б>конец



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

<Б>начать

& евро & евро <я><шрифта цвет="синий">//это где вы хотели уничтожить

& покупка & покупка //любые созданные объекты

& евро & евро унаследовал

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



Перекомпилировать пакет (не забудьте сохранить пакет в любое время вы добавляете новый компонент). После высаживания свой новый компонент на форму, Вы заметите, что есть три события. <Я>начала, <я>то onstop, и <я>OnStateChange. Если вы посмотрите на Demo3 вы увидите, как я использовал эти события.



<и>начала задает Заголовок для "начала"

в то onstop как показывает прошедшее время

в OnStateChange включает / выключает соответствующие кнопка старт / стоп



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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>процедура TForm1.ThirdComponent1Start(Отправитель: TObject)

<Б>начать

& покупка & покупка титр := <шрифта цвет="синий"> "начало"

<Б>конец



<Б>процедура TForm1.ThirdComponent1Stop(Отправитель: TObject)

<Б>начать

& покупка & покупка Заголовок := ThirdComponent1.Истекшее время

<Б>конец



<Б>процедура TForm1.ThirdComponent1StateChange(Отправитель: TObject состояние: такт)

<Б>начать

& евро & евро btnStart.Включено := ThirdComponent1.Состояние = stStopped

& фитоэстрогены & мочекаменная btnStop.Включено := ThirdComponent1.Состояние = stStarted

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



стандарты компонента письменной форме

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



<б><я>Создание и разрушение компонента:

объекты создаются с помощью конструктора и уничтожены с помощью деструктора. Цель главенствующего конструктора состоит из трех
и<р класса="step_content ">

  1. чтобы создать любые объекты, которые он содержит в себе (вложенные объекты)
  2. <р класса="step_content ">
    и<р класса="step_content ">
  3. для инициализации значений класса (свойства и т. д.)
  4. <р класса="step_content ">
    и<р класса="step_content ">
  5. чтобы вызвать исключение и остановить класса.
  6. <р класса="step_content ">
    и<р класса="step_content ">

    <р класса="step_content ">

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



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


    Стандартный составных частей:

    <и>краски: и

    Вы можете переопределить этот метод, чтобы предоставить свой собственный чертеж компонента.



    <и>загружается: и

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



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



    в ComponentState: это свойство очень полезно, когда вам нужно проверить, если компонент существует в настоящее время при проектировании/время выполнения, или, если его свойства являются на данный момент читается потокового процесса.



    Инкапсуляция компонентов правильно

    это стандартная написать свой компонент как TCustomMyClass а затем вывести компонент из этого базового класса. "Пользовательский" компонент вы пишете будет иметь большинство (если не все) его свойства / методы, объявленные в рамках своего участка.



    когда вы спускаетесь от вашего "пользовательского" класса вы просто переопределить свойства в Государственном или опубликовано в разделах.



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

    <ТР>

    & евро & евро & евро & евро <ТД>

    <Б>Тип

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

    & покупка & покупка и частные

    & евро & евро & евро & евро FSomeString: И строка

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

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

    & евро & евро & евро & евро и недвижимости на SomeString: строки и ознакомиться в FSomeString <б>пишут SetSomeString

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



    & покупка & покупка TMyClass = <Б>класс(TCustomMyClass)

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

    & евро & евро & евро & евро и недвижимости в SomeString

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

    & евро & евро & евро & евро и<р класса="step_content ">
    есть
    <р класса="step_content ">

    <р класса="step_content "><р класса="step_content ">



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



    обратите внимание, как SetSomeString была объявлена как виртуальная в пределах защищаемой зоны. Это также хороший этикет, так как позволяет спустился классы реагировать на изменения значения свойства путем переопределения процедура, которая устанавливает их. Это также применяется к событиям, где вы видите событие OnStateChange вы часто найдете способ DoStateChange, например:



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

    <ТР>

    & евро & евро <ТД>

    <Б>Тип

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

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

    & евро & евро & евро & евро FOnStateChange: TStateChangeEvent

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








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


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


первый в серии из трех частей, охватывающих компонента письменной форме в Delphi.


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

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



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





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



первые две вещи, спросите себя, почему вы должны использовать компонент письменной форме, и когда вам нужно написать компонент. Первый вопрос легко ответить, на самом деле, он имеет много ответов.
и<р класса="step_content ">


  • простота в использовании: Инкапсулированный код означает, что вы можете просто удалить один и тот же компонент на различных формах снова и снова без написания единой строчки кода.

  • отладки: централизованный код позволяет легко восстановить все приложение (или набор приложений), фиксируя ошибки в одном компоненте, и перекомпиляции.

  • деньги: есть много компаний, которые с радостью платят за возможность не изобретать колесо.

  • В
<Р класса="step_content ">

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



как компоненты создаются в

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



(Нажмите для полного просмотра)



Нажмите, чтобы посмотреть в полный размер



В случае метода а и метода Б предполагаю, что компонент в вопрос Тметь.

<стол для bgcolor="#808080" граница="0" cellpadding="2" cellspacing="1">

<ТР>

& евро & евро & евро & евро <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>способ

& евро & евро & евро & мочекаменная <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>решение


<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">аи<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от Тметь<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">Би<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от TCustomMemo<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">си<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от TCustomControl<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">ди<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">производная от TGraphicControl<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">Е<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">наследовать от TComponentи<класс p="step_content ">

<р класса="step_content ">

<р класса="step_content ">



это может показаться немного сложным, поэтому позвольте мне объяснить процесс.



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



<Б>: иногда требуется не только чтобы добавить функциональности, но вы должны удалить его в то же время. Стандартная практика при написании компонента является первым, чтобы написать компонент TCustomXXXXX, где все свойства, события и методы, объявленные в секции protected компонента. Фактический компонент производный от этого базового класса. Таким образом, хитрость не скрывают функциональность, но, чтобы получить свой компонент от "заказной" версии компонента и публикуют только свойства, которые вы хотите сохранить (эффективного удаления нежелательных свойств / событий)<.бр />


<Б>С: любой компонент, который должен получить фокус нужен дескриптор окна. TWinControl, где эта ручка впервые. TCustomControl-это просто TWinControl с собственного имущества холст.



<Б>Д: TGraphicControl не имеет оконной ручки и, следовательно, не может получать фокус. Компоненты, такие как названия являются производными от этого базового класса.



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



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



<ИМГ alt="Новый компонент" граница="0" срц='/howtodo/htdt/computers-internet/programming/component_writing_part_1_1.jpg' />



<стол для bgcolor="#808080" граница="0" cellpadding="2" cellspacing="1">
<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF"><б>Тип предка<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">это базовый Тип, что мы должны спуститься с<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF"><Б>класса<класс p="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">это класс имя нашего нового компонента

(начинаться с буквы "Т")и<р класса="step_content ">

<р класса="step_content ">
и<р класса="step_content "><тр>

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF"><б>палитра страницыи<р класса="step_content ">

& евро & евро & евро & евро
<тd для bgcolor="#FFFFFF">это который на вкладке палитры компонентов вы хотите, чтобы ваш

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

В Делфи, что вы хотите новую вкладку создали. и<р класса="step_content ">

<р класса="step_content ">



написание кода

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



прежде всего, выберите компонент в главном меню Delphi и затем выберите Новый компонент. Введите TComponent в качестве "предка" и TFirstComponent в качестве имени компонента. Далее нажимаем кнопку "установить".



В этот момент вы можете либо установить новый компонент в существующий пакет (пакет содержит набор компонентов) или установить новый пакет. Нажмите кнопку "в новой упаковке" и нажмите кнопку "искать кнопку".



<ИМГ alt="Установка компонентов" граница="0" срц='/howtodo/htdt/computers-internet/programming/component_writing_part_1_2.jpg' />



как только вы выбрали путь и имя для вашего нового пакета и введено описание нажмите кнопку "ОК". В следующем диалоговом окне (с просьбой, если вы хотите перекомпилировать пакет) нажмите кнопку "Да". Как только пакет будет скомпилирован и установлен, сохранить свой пакет и блок.



В данный момент мы уточнили наш базовый класс, а также Наше новое имя класса. Мы создали новый пакет для хранения компонентов и были представлены с каркасной конструкцией класса по Делфи.



если вы посмотрите на исходный код в Delphi вы увидите Частный, защищенный, общественных и опубликованы разделы.



заключение

Инкапсуляция-это простая концепция, но чрезвычайно важным компонентом письменной форме. Инкапсуляция реализуется с использованием четырех зарезервированных слов: <я>Частная, <Я>защищены, <Я>общественные
, и <я>опубликован, Вы увидите Делфи и включил эти разделы автоматически в исходный код нового компонента.

<стол для bgcolor="#808080" граница="0" cellpadding="2" cellspacing="1">

<ТР>

& евро & евро & евро & евро <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>разделе

& евро & евро & евро & мочекаменная <ТД присоединяются="левой" для bgcolor="#cccccc"><Б>доступность



<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">Частная

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">методы, свойства и события, описанные в этом разделе только

доступ к устройству компонент содержится в

внутри. Компоненты в одном корпусе может открыть личные вещи каждого и

и другие.

<р класса="step_content ">

<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">защищенные

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">методы, Свойства и события, описанные в этом разделе, также как

в доступной для любого класс происходит от этого класса.

<р класса="step_content ">

<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">общественного

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">методы, Свойства и события, описанные здесь доступны из любой точки мира.и<р класса="step_content ">

<р класса="step_content ">

<ТР>

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">опубликован

& евро & евро & евро & евро <ТД для bgcolor="#ffffff">в этом разделе можно объявить свойства / события, которые появятся в течение

и инспектор объектов. Эти параметры проектирования значения

которые сохраняются в вашем проекте. (Не все типы

поддержал, массивы, например, нет).и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">





Начинаем писать наш компонент в

В Делфи теперь должен знать все о наших новых компонент. Введите следующий код в исходный код компонента.

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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>Частная

& евро & евро <я><шрифта цвет="синий">{ частные объявления }

& покупка & покупка FStartTime,

& покупка & покупка FStopTime :DWORD с

<Б>защищены

& евро & евро <я><шрифта цвет="синий">{ защищенный объявления }

& евро & евро и функции в GetElapsedTime: строку <Б>виртуальные

<Б>общественные

& евро & евро <я><шрифта цвет="синий">{ публичных заявлений }

& евро & евро и процедура в начало <Б>виртуальные

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



& евро & евро и недвижимости, и начала:Типа DWORD и ознакомиться на FStartTime

& евро & евро и недвижимости, и StopTime:DWORD С и ознакомиться в FStopTime

& евро & евро и недвижимости на истекшее время: строки и ознакомиться в GetElapsedTime

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

& евро & евро <я><шрифта цвет="синий">{ опубликованные объявления }

<Б>конец

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

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



что мы сделали здесь добавляется двумя переменными FStartTime и FStopTime (это стандартная предшествовать переменным имена с буквой F). Существует два метода для контроля этих переменных, запуск и остановка. Мы добавили функцию GetElapsedTime, который вернется FStopTime - FStartTime как струна. Наконец, мы добавили три свойства только для чтения.



нажмите Shift вместо Ctrl-C и Delphi автоматически завершить код для вашего класса (или щелкните правой кнопкой мыши и выбираем "завершить классе на курсор"). Далее введите следующий код для каждого соответствующего метода.



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

<ТР>

& евро & евро & евро & евро <ТД>

<и><шрифта цвет="синий">{ TFirstComponent }

<Б>функции
в TFirstComponent.GetElapsedTime: строку

<Б>начать

& евро & евро результат := IntToStr(FStopTime - FStartTime)

<Б>конец



<Б>процедура
в TFirstComponent.Старт

<Б>начать

& покупка & покупка FStartTime := GetTickCount

<Б>конец



<Б>процедура, и TFirstComponent.Остановить

<Б>начать

& покупка & покупка FStopTime := GetTickCount

<Б>конец



<Б>конец.

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



Тест-драйв

спасти ваше устройство, и открыть пакет (файл, открыть проект из меню, и выберите "Делфи" пакет для типа файла), после того, как ваш пакет открыт нажмите кнопку "компилировать" кнопку. Вы также можете открыть свой пакет, выбрав компонент из главном меню, а затем установить пакеты. Выберите пакет и нажмите кнопку "Редактировать".



теперь вы можете оставить TFirstComponent на форму, на самом деле, вы можете оставить столько, сколько вам нравится. Добавить две кнопки (btnStart и btnStop) и добавьте следующий код в вашу форму, а затем запустить тест приложение.



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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>процедура TForm1.btnStartClick(Отправитель: TObject)

<Б>начать

& покупка & покупка FirstComponent1.Старт

<Б>конец



<Б>процедура TForm1.btnStopClick(Отправитель: TObject)

<Б>начать

& покупка & покупка FirstComponent1.Остановить

и & фитоэстрогены & мочекаменная надпись := FirstComponent1.Истекшее время

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



при нажатии на кнопку "Пуск" будет отмечать время начала (по WinAPI GetTickCount-это команда, которая возвращает количество миллисекунд с момента запуска Windows).



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


виртуальные, динамические, абстрактные и Переопределить в

Вы, наверное, заметили в виртуальные декларацию после запуска, остановки и GetElapsedTime. Следующее упражнение будет объяснить их использует.



создать новый компонент, извлечь этот компонент из TFirstComponent (имя его TSecondComponent) и установить его.


<див класс='embed_block_0'> <див ИД="блок-google_admanager-1" класса="блок блок-google_admanager области-другие области-количество-1 Количество-1 блок-Без названия "> <див класс="блок-топ"> <див класс="блок-внутренний"> <див класс="содержание"> <див класс="блок-дно"> <див класс='embed_block_1'><див>
виртуальные и динамические идентификаторы компонент писателя, рассказывающие о Дельфи, метод может быть заменен потомку класса. Если мы Переопределить метод в классе, наш новый код будет выполняться вместо оригинального кода<.бр />


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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>защищены

& евро & евро <я><шрифта цвет="синий">{ Защищен объявления }

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

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



затем мы реализуем приведенный выше код следующим образом.



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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>функции
на TSecondComponent.GetElapsedTime: строку

<Б>вар

& евро & евро с: строка

<Б>начать

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

& евро & евро результат := Ы <шрифта цвет="синий">' миллисекунд или '

& евро & евро & евро & евро Формат(<шрифта цвет="синий">'%.2ф секунд,

& евро & евро & евро & евро & евро & евро [(StopTime - параметр starttime) / 1000])

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



наш новый код теперь называется замена первоначального GetElapsedTime, даже вызовы реализованы в TFirstComponent в GetElapsed время звоните прямо сейчас наш новый код (если мы создали экземпляр TSecondComponent то есть). Исходный код вызывается за счет использования унаследовал команду.



Примечание : если Вы не "перекроет" базовый метод (потому что база не была заявлена как виртуальные или потому что вы забыли). TSecondComponent буду называть ваш новый код, а код, встроенный в TFirstComponent будет по-прежнему продолжают называть исходный код TFirstComponent.



абстрактный идентификатор рассказывает Делфи не ожидать какой-либо код для именованного метода. Вы не должны создать экземпляр объекта с помощью абстрактных методов (таких как TStrings). Стандартная практика, чтобы создать потомок такого класса и переопределить все абстрактные методы (например, TStringList делает).



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



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



создать новый компонент, спускаются из TSecondComponent и имя его TThirdComponent. Сохранить агрегат, установить ваш компонент, и добавьте следующий код.

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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>Тип

& евро & евро такт = (stStarted, stStopped)

& покупка & покупка TStateChangeEvent = и процедура Отправитель : TObject состояние : такт) и для <Б>объект



& евро & евро TThirdComponent = <Б>класс(TSecondComponent)

& покупка & покупка и частные

& евро & евро & евро & евро <я><шрифта цвет="синий">{ частные объявления }

& евро & евро & евро & евро FState: такт

& евро & евро & евро & евро FOnStart,

& евро & евро & евро & евро FOnStop: TNotifyEvent

& евро & евро & евро & евро FOnStateChange: TStateChangeEvent

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

& евро & евро & евро & евро <я><шрифта цвет="синий">{ защищенный объявления }

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

& евро & евро & евро & евро <я><шрифта цвет="синий">{ публичных заявлений }

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

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

& евро & евро & евро & евро и процедура в начало <Б>переопределить

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

& евро & евро & евро & евро и недвижимости, его состояние: такт и ознакомиться в FState

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

& евро & евро & евро & евро <я><шрифта цвет="синий">{ опубликованные объявления }

& евро & евро & евро & евро и недвижимости в функции onstart: TNotifyEvent и ознакомиться в FOnStart <б>пишут FOnStart

& евро & евро & евро & евро и недвижимости в OnStateChange: TStateChangeEvent и ознакомиться в FOnStateChange

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

& евро & евро & евро & евро и недвижимости в то onstop: TNotifyEvent и ознакомиться в FOnStop <б>пишут FOnStop

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

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

и<р класса="step_content "><р класса="step_content ">



события не просто процедуры или функции (редко), которые относятся к классу (отсюда и "объекта" п. вы видите в TStateChangeEvent). Например, TNotifyEvent стандартная Тип события реализованы на Delphi, которая просто передает объект, который инициировал событие, это всегда хорошо, чтобы отправить "я" (Отправитель : TObject) в качестве первого параметра в любом случае одно и то же событие код может быть использован для нескольких компонентов.



TNotifyEvent определяется как

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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>Тип

& фитоэстрогены & мочекаменная TNotifyEvent = и процедура (Отправитель: TObject) <Б>объекта

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



чтобы вызвать событие из компонент просто при проверке, если событие было назначено и, если да, то называя его. Я переопределил методы запуска и остановки TSecondComponent для того, чтобы вызвать эти события, так как<.бр />


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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>процедура
на TThirdComponent.Старт

<Б>начать

& евро & евро <Б>наследство <я><шрифта цвет="синий">//это требует TSecondComponent.Старт

& покупка & покупка FState := stStarted

& евро & евро при, и назначена(начала) и тут в функции onstart(Самовыдвижение)

& евро & евро при назначена(OnStateChange) и тут в OnStateChange(личности, государства)

<Б>конец



<Б>процедура TThirdComponent.Остановить

<Б>начать

& евро & евро <Б>наследство <я><шрифта цвет="синий">//это требует TSecondComponent.Стоп

& покупка & покупка FState := stStopped

& евро & евро при назначены(то onstop) и тут в то onstop(Самовыдвижение)

& евро & евро при назначена(OnStateChange) и тут в OnStateChange(личности, государства)

<Б>конец



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

<Б>начать

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

& евро & евро <я><шрифта цвет="синий">//это ты инициализации свойства, и создать

& евро & евро <я><шрифта цвет="синий">//и объектов компонента могут использовать внутренне

& покупка & покупка FState := stStopped

<Б>конец



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

<Б>начать

& евро & евро <я><шрифта цвет="синий">//это где вы хотели уничтожить

& покупка & покупка //любые созданные объекты

& евро & евро унаследовал

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



Перекомпилировать пакет (не забудьте сохранить пакет в любое время вы добавляете новый компонент). После высаживания свой новый компонент на форму, Вы заметите, что есть три события. <Я>начала, <я>то onstop
, и <я>OnStateChange. Если вы посмотрите на Demo3 вы увидите, как я использовал эти события.



<и>начала задает Заголовок для "начала"

в то onstop как показывает прошедшее время

в OnStateChange включает / выключает соответствующие кнопка старт / стоп



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

<ТР>

& евро & евро & евро & евро <ТД>

<Б>процедура TForm1.ThirdComponent1Start(Отправитель: TObject)

<Б>начать

& покупка & покупка титр := <шрифта цвет="синий"> "начало"

<Б>конец



<Б>процедура TForm1.ThirdComponent1Stop(Отправитель: TObject)

<Б>начать

& покупка & покупка Заголовок := ThirdComponent1.Истекшее время

<Б>конец



<Б>процедура TForm1.ThirdComponent1StateChange(Отправитель: TObject состояние: такт)

<Б>начать

& евро & евро btnStart.Включено := ThirdComponent1.Состояние = stStopped

& фитоэстрогены & мочекаменная btnStop.Включено := ThirdComponent1.Состояние = stStarted

<Б>конец

& евро & евро & евро & евро и<р класса="step_content ">

<р класса="step_content ">

<р класса="step_content "><р класса="step_content ">



стандарты компонента письменной форме

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



<б><я>Создание и разрушение компонента:

объекты создаются с помощью конструктора и уничтожены с помощью деструктора. Цель главенствующего конструктора состоит из трех
и<р класса="step_content ">

  1. чтобы создать любые объекты, которые он содержит в себе (вложенные объекты)
  2. <р класса="step_content ">
    и<р класса="step_content ">
  3. для инициализации значений класса (свойства и т. д.)
  4. <р класса="step_content ">
    и<р класса="step_content ">
  5. чтобы вызвать исключение и остановить класса.
  6. <р класса="step_content ">
    и<р класса="step_content ">

    <р класса="step_content ">

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



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


    Стандартный составных частей:

    <и>краски: и

    Вы можете переопределить этот метод, чтобы предоставить свой собственный чертеж компонента.



    <и>загружается: и

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



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



    в ComponentState: это свойство очень полезно, когда вам нужно проверить, если компонент существует в настоящее время при проектировании/время выполнения, или, если его свойства являются на данный момент читается потокового процесса.



    Инкапсуляция компонентов правильно

    это стандартная написать свой компонент как TCustomMyClass а затем вывести компонент из этого базового класса. "Пользовательский" компонент вы пишете будет иметь большинство (если не все) его свойства / методы, объявленные в рамках своего участка.



    когда вы спускаетесь от вашего "пользовательского" класса вы просто переопределить свойства в Государственном или опубликовано в разделах.



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

    <ТР>

    & евро & евро & евро & евро <ТД>

    <Б>Тип

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

    & покупка & покупка и частные

    & евро & евро & евро & евро FSomeString: И строка

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

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

    & евро & евро & евро & евро и недвижимости на SomeString: строки и ознакомиться в FSomeString <б>пишут SetSomeString

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



    & покупка & покупка TMyClass = <Б>класс(TCustomMyClass)

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

    & евро & евро & евро & евро и недвижимости в SomeString

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

    & евро & евро & евро & евро и<р класса="step_content ">
    есть
    <р класса="step_content ">

    <р класса="step_content "><р класса="step_content ">



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



    обратите внимание, как SetSomeString была объявлена как виртуальная в пределах защищаемой зоны. Это также хороший этикет, так как позволяет спустился классы реагировать на изменения значения свойства путем переопределения процедура, которая устанавливает их. Это также применяется к событиям, где вы видите событие OnStateChange вы часто найдете способ DoStateChange, например:



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

    <ТР>

    & евро & евро <ТД>

    <Б>Тип

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

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

    & евро & евро & евро & евро FOnStateChange: TStateChangeEvent

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

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

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

Комментарий

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

Оценивать