Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 2
На сайте нет зарегистрированных пользователей

Пользователей: 13,362
новичок: uvapke
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Калькулятор на Delphi с переводом в другую систему исчисления + Блок схемы
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...
Сравнение двух бинарных деревьев на Turbo Pascal + отчет

Добавление свойств в компонент
Для того чтобы дополнить создаваемый компонент новым свойством, надо выполнить следующие шаги:
1. Определить название и тип свойства.
2. Объявить внутреннее поле объекта выбранного типа.
3. Объявить свойство.
4. Определить методы чтения/записи свойства (если они используются для доступа к значениям свойства).
5. При необходимости установить значение по умолчанию.
6. Определить средства сохранения/загрузки значения свойства.
Рассмотрим содержание этих шагов.
Для добавления поля к объекту в секции private класса объявляется переменная необходимого типа. Предположим, что в состав VCL входит некий гипотетический класс, описывающий автомобиль, - TAutomobile. Ставится задача создать компонент-наследник TNewAutomobile, имеющий собственное свойство Speed (скорость) целого типа. Объявление поля объекта с именем fSpeed следует поместить в секцию частных объявлений:
type
TNewAutomobile = class(TAutomobile)
private
{ Private declarations }
fSpeed:cardinal; //объявление поля объекта целого типа
end;



Для того чтобы свойство отобразилось в Инспекторе объектов, необходимо объявить его в секции published и указать способ выполнения операций чтения/записи данных в поле объекта:
type
TNewAutomobile = class(TAutomobile)
private
fSpeed: cardinal;
published
property Speed: cardinal read fSpeed write fSpeed;
end;



В составе строки объявления свойства присутствуют два ключевых слова read (чтение) и write (запись). Они указывают на способ чтения и записи значения свойства. В данном примере операции чтения и записи перенаправляются сразу в поле. Если отказаться от одного из ключевых слов, то будет создано свойство, доступное только для чтения или только для записи.
Простейший вид взаимодействия свойства и соответствующего ему поля называется прямым доступом. Приведенный пример демонстрирует использование прямого доступа при организации операций чтения/записи. Здесь любое изменение значения свойства Speed сразу передается в поле fSpeed. Но на практике прямой доступ применяется не часто.
При проектировании нового компонента обычно используется более универсальный способ доступа к значениям свойства, основанный на использовании методов чтения и записи значений свойств. Эти методы объявляются в секции private после описания поля объекта:
type
TNewAutomobile = class(TCustomControl)
private
fSpeed: cardinal;
procedure SetSpeed(Value:cardinal); //установка значения в поле
function GetSpeed:cardinal; //чтение значения из поля
published
property Speed: cardinal read GetSpeed write SetSpeed;
end;



Метод, отвечающий за запись, всегда является процедурой и, как правило, обладает единственным параметром. Второй параметр понадобится только при работе со свойством типа массив. Название параметра (Value) может быть любым, но обычно используют Value . Тип параметра должен совпадать с типом свойства. В качестве параметра Value внутреннему полю объекта передается новое значение. Например, в процедуре может проверяться корректность вводимых данных и в случае успеха полю присваивается новое значение:
procedure TNewAutomobile.SetSpeed(Value:cardinal);
begin
if Value<=300 then fSpeed:=Value else ShowMessage(‘Недопустимое значение');
end;



Метод, отвечающий за чтение, всегда оформляется в виде функции, которой не передаются параметры. Единственным исключением будут функции, осуществляющие чтение из свойства типа массив (в этом случае потребуется параметр, определяющий индекс элемента в массиве) и чтение с использованием команды index. Результат, возвращаемый функцией, должен иметь такой же тип, как и у соответствующего свойства:
function TNewAutomobile.GetSpeed:cardinal;
begin
Result:=fSpeed;
end;



Методы для чтения/записи свойства могут быть статическими и виртуальными, но не динамическими.
Свойство может быть смешанным. Это означает, что при чтении свойства вызывается метод, а при записи обращаются к переменной и наоборот:
property Data:integer read GetData write FData;
property Data:integer read FData write SetData;



Одной из возникающих при разработке новых компонентов задач является публикация свойства, скрытого в родительском классе. Например, потомки класса TWinControl наследуют более 70 свойств своего предка, но по умолчанию в Инспекторе объектов отображается всего лишь 9: Cursor, Height, HelpContext, Hint, Left, Name, Tag, Top и Width. Для того чтобы сделать унаследованные свойства доступными во время разработки, необходима повторная декларация этих свойств, но уже в секции published исходного кода компонента-потомка:
type
TMyComponent = class(TWinControl)

published
property Align; //свойство унаследовано от TControl
end;



Примечание.
Как уже упоминалось ранее, Инспектор объектов обеспечивает доступ только к свойствам, объявленным в секции published. Свойства, опубликованные в секции public, будут доступны только из кода приложения. Кроме того, при работе со свойствами следует учитывать две особенности компилятора Delphi, а именно:
1) при объявлении нового свойства с именем, совпадающем с именем уже имеющегося свойства, ранее определенное свойство «затеняется»;
2) свойства, которые имеют доступ только для чтения или только для записи, не отображаются в инспекторе объектов, даже если они объявлены в секции published.
Программные коды методов чтения/записи свойства размещаются в разделе реализации модуля компонента как обычные процедуры.
Установка значений свойств по умолчанию и задание средств сохранения/загрузки выполняется с помощью директив default, nodefault и stored (см. п. 1.6.1).

Пример 4. Создать компонент, который представляет собой модифицированную кнопку быстрого доступа SpeedButton. Модификация состоит в том, что в дополнение к стандартному изображению кнопки должны рисоваться внутренняя и внешняя рамки выбираемых цветов.
Решение данной задачи сводится к тому, что для обеспечения возможности настройки интерфейса кнопки следует:
1) создать два свойства: одно для представления цвета внутренней рамки, а другое – для цвета внешней рамки;
2) переопределить метод рисования компонента, в котором в дополнение к изображению кнопки SpeedButton будут рисоваться две рамки: внешняя и внутренняя.
Процесс разработки модуля компонента, как и во всех предыдущих примерах, начинается с вызова мастера компонента. В окне мастера выберите базовый класс TSpeedButton, задайте имя нового компонентного класса, например, TFramedButton. Остальные параметры можно оставить такими же, как в предыдущих примерах. Выполнив действия пункта 3 в примере 1, создайте заготовку модуля нового компонента.
Разработку программы модуля компонента следует начать с определения атрибутов новых свойств компонента и их описания.
Пусть цвет внутренней рамки определяется свойством с именем InFrameColor, а цвет внешней рамки – свойством OutFrameColor. Оба свойства принадлежат классу TColor, т. е. их значениями являются различные цвета. Свойства будут создаваться с возможностью чтения и записи их значений в специально отводимых полях FInFrameColor и FOutFrameColor. Будем считать, что чтение выполняется прямым обращением к полю, а запись – с помощью методов SetInFrameColor и SetOutFrameColor. Описания полей и методов размещаются в разделе private класса TFramedButton, и будут иметь следующий вид:
type
TFramedButton = class(TSpeedButton)
private
FInFrameColor:TColor;
FOutFrameColor:TColor;
procedure SetInFrameColor(Value:TColor);
procedure SetOutFrameColor(Value:TColor);



Программные тексты процедур SetInFrameColor и SetOutFrameColor помещаются в раздел implementation модуля и имеют незначительные отличия. Процедура SetInFrameColor представляется следующим образом:
procedure TFramedButton.SetInFrameColor(Value:TColor);
begin
If FInFrameColor<>Value then {если значение действительно новое}
Begin
FInFrameColor:=Value; {записывается новое значение свойства}
Invalidate; {так как свойство изменилось компонент перерисовывается}
end;
end;



Процедура SetOutFrameColor имеет аналогичный текст.
Для воспроизведения на новом компоненте внешней и внутренней рамок, как было отмечено выше, необходимо переопределить метод рисования компонента. Таким методом является метод Paint. Переопределяя этот метод для уже реализованных графических компонентов необходимо вызвать унаследованный родительский метод Paint. Для рисования на кнопке двух рамок можно использовать средства графики классов TCanvas и TBrush. Переопределение метода рисования для создаваемого компонента будет выглядеть следующим образом:
procedure TFramedButton.Paint;
begin
inherited Paint; {вызов родительского метода}
Canvas.Brush.Color:=OutFrameColor;
Canvas.FrameRect(rect(4,4,width-4,height-4)); {рисование внешней рамки}
Canvas.Brush.Color:=InFrameColor;
Canvas.FrameRect(rect(10,10,width-10,height-10)); {рисование внутренней рамки}
end;



Здесь рамки представляются в виде прямоугольников, для рисования которых используется метод FrameRect. Область прямоугольника задается с помощью процедуры rect, в которую передаются координаты x, y верхнего левого и правого нижнего углов прямоугольника.
Метод Paint следует описать как переопределяемый (т. е. с директивой override) в разделе protected создаваемого модуля, а текст поместить в раздел implementation.
Установите компонент FramedButton на вкладку New палитры компонентов Delphi, выполнив действия пункта 4 примера 1.
Выполните тестирование нового компонента, для чего создайте новое приложение, поместите на форму созданный компонент и другие стандартные компоненты (кнопки, метки и т. д.) для обеспечения приемлемого интерфейса приложения. Проверьте работу приложения, задавая различные значения цветов внешней и внутренней рамок кнопки с помощью Инспектора объектов.
Подготовьте и зарегистрируйте в среде Delphi значок для компонента FramedButton.




















Опубликовал Kest January 07 2010 14:48:53 · 1 Комментариев · 16661 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Han Viachko July 28 2019 14:09:34
Спасибо, нашёл что искал.smiley
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Аватары в комме...
Delphi 2005 Учимс...
Java Server Pages...
Delphix Sample [И...
WinPopup
Библия для програ...
ShadelLabel
Защита от спама ...
Dealer
CABfiles
Учебник для продв...
Preview
Billenium Effects...
Tenis [Исходник н...
AddPage [Исходник...
JanButtonsV
Программирование ...
Профессиональное ...
MiniTetris [Исход...
Панель Календарь

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97829
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5981
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Задача
Динамическое храни...
Создание уникально...
Заголовок страницы
Новое оружие ICQ: ...
Structured variabl...
Заключение
Интерфейс семафоро...
Профессиональная к...
Пошаговое выполнен...
На обрабатывающий ...
КЛАСС ИЛИ ЗАПИСЬ?
• Computer Configu...
База знаний - книги
Преимущества игры ...
Разберемся теперь ...
1. FTP использует ...
Создание рекламног...
Прозрачные команды...
Архитектура ISDN
Технические средст...
Практика
Выбор VPN для начи...
Необходимые типы д...
Файл HelloAndroidA...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?