Компонент записи, часть 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 ">
- чтобы создать любые объекты, которые он содержит в себе (вложенные объекты)
р><р класса="step_content ">
ир><р класса="step_content ">- для инициализации значений класса (свойства и т. д.)
р><р класса="step_content ">
ир><р класса="step_content ">- чтобы вызвать исключение и остановить класса.
р><р класса="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 ">
- чтобы создать любые объекты, которые он содержит в себе (вложенные объекты)
р><р класса="step_content ">
ир><р класса="step_content ">- для инициализации значений класса (свойства и т. д.)
р><р класса="step_content ">
ир><р класса="step_content ">- чтобы вызвать исключение и остановить класса.
р><р класса="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
By russiatips
Компонент записи, часть 1 : Несколько тысяч советов, которые сделают вашу жизнь проще.